Sei sulla pagina 1di 153

Guía para la “Teoría y la Técnica de la Música Electrónica”

Basada en el borrador de Miller Puckette escrito en diciembre de 2006

Capítulo 1
Sinusoides, amplitud y frecuencia

La música electrónica se hace casi siempre a través de un computador


sintetizando o procesando señales de audio digital. Estas son secuencias de
números:

..., x[n-1], x[n], x[n+1], ...

donde el índice n es llamado el número de la muestra, cuyo rango puede estar


entre algunos o todos los números enteros. Un solo número de la secuencia es
denominado muestra. Un ejemplo de una señal de audio digital es la Sinusoide:

x[n] = acos(!n + Á)

donde a es la amplitud, ! es la frecuencia angular y Á es la fase inicial. La


fase es función del número de muestra n, igual a (!n + Á). La fase inicial es la
fase en la muestra cero (n = 0).

Las sinusoides juegan un papel clave en el procesamiento de audio, pues si se


cambia una de ellas a la izquierda o a la derecha por cualquier número de
muestras, se consigue otra sinusoide. Esto hace fácil calcular el efecto de todo
tipo de operaciones con sinusoides. Nuestros oídos utilizan esta misma propiedad
especial para ayudarnos a analizar los sonidos que escuchamos, lo cual explica
porqué la sinusoides, y la combinación de sinusoides pueden ser utilizadas para
alcanzar muchos efectos musicales.

Las señales de audio digital no tienen ninguna relación intrínseca con el


tiempo, pero para escucharlas debemos escoger una velocidad de muestras, la cual
se designa usualmente con la variable R, designando el número de muestras que
hay en un segundo. El tiempo t está relacionado con la muestra n por Rt = n, o
t = n/R. Una señal sinusoidal con frecuencia angular ! tiene una frecuencia en
el tiempo real dada por

f = (!R)/(2¼)

en Hertz (ciclos por segundo), ya que un ciclo son 2¼ radianes y un segundo


equivale a R muestras

La amplitud de una señal en el mundo real puede ser expresada como una variación
en el tiempo del voltaje o de la presión de aire, pero las muestras de una señal
de audio digital son números sin unidades. Casualmente asumiremos aquí que hay
una seguridad numérica amplia de tal manera que podemos ignorar el redondeo de
errores, y que el formato numérico tiene un rango ilimitado, de tal manera que
las muestras pueden tomar el valor que queramos. Sin embargo la mayoría de los
equipos que manejan audio digital trabajan únicamente en un rango de valores
fijo para la entrada y para la salida, la mayoría usualmente entre -1 y 1. Los
procesadores modernos de programas de computación de audio digital usualmente
utilizan una representación de punto flotante para las señales. Esto nos permite
usar las unidades que sean más convenientes para cada tarea, en tanto la salida
final de audio se mantenga dentro del rango que maneja el equipo [Mat69, págs.4-
10].
1.1. Medidas de la amplitud.

La propiedad más importante de una señal de audio digital es su amplitud.


Desafortunadamente la amplitud de una señal de audio digital no tiene una
definición canónica. Estrictamente hablando, todas las muestras en una señal de
audio digital son ellas mismas amplitudes, además de hablar de la amplitud a de
una sinusoide como un todo. Es usual tener medidas de amplitud para las señales
de audio digital en general. La amplitud es mejor considerarla aplicada a una
ventana, a un rango fijo de muestras de una señal. Por ejemplo la ventana que
comienza con la muestra M y tiene una longitud N en una señal de audio x[n]
consiste en las muestras,

x[M],x[M + 1],....,x[M + N - 1]

Las dos medidas de amplitud utilizadas con más frecuencia son la amplitud pico,
la cual es simplemente la muestra más grande (en valor absoluto) en la ventana:

Apico{x[n]} = |x[n]|, n = M,...,M + N - 1

y la amplitud media cuadrática (RMS).

ARMS{x[n]} = √P{x[n]}

donde P{x[n]} es la potencia media, definida como:

P{x[n]} = (|x[M]|2 + ... + |x[M + N - 1]|2)

(En esta última fórmula los signos de valor absoluto no son necesario por el
momento pues estamos trabajando con señales de valor real, pero más tarde serán
importantes cuando consideremos las señales de valor comlejo). Ni la amplitud
pico ni la amplitud RMS pueden ser cero, y cualquiera de las dos pueden ser cero
si la señal misma es cero para cualquier valor de n de la ventana.

La amplitud RMS puede ser igual a la amplitud pico, pero nunca podrá excederla;
así mismo, la amplitud RMS puede ser tan pequeña como 1/√N veces la amplitud
pico, pero nunca menor que este valor.

Bajo condiciones razonables -si la ventana contiene por lo menos algunos


periodos y si la frecuencia angular está bien por debajo de un radián por
muestra <un valor por debajo de un radián por muestra es una fracción de radián
por muestra; bien por debajo, una fracción muy pequeña>- la amplitud pico de la
sinusoide de la página “1” es aproximadamente a y su amplitud RMS es cercana a
a/√2. La figura 1.2 muestra las amplitudes pico y RMS de dos señales de audio
digital.

1.2. Unidades de amplitud

Dos amplitudes usualmente se comparan mejor utilizando la razón entre ellas que
utilizando su diferencia. Decir que la amplitud de una señal es mayor que otra
por un factor de dos podría ser mejor información que decir que es mayor por 30
milivoltios. Esto es válido para cualquier tipo de amplitud (la amplitud pico y
la amplitud RMS). Para facilitar la comparación, usualmente expresamos las
amplitudes en unidades logarítmicas llamadas decibeles. Si a es la amplitud de
una señal (pico o RMS), entonces podemos definir el nivel d en decibeles (dB)
como:

d = 20*log10(a/a0)
donde a0 es la amplitud de referencia. Esta definición está ajustada de tal
manera que, si incrementamos la potencia de la señal por un factor de diez (y
así la amplitud se incrementa por un factor de √10), el logaritmo se
incrementará en 1/2, y el valor en decibeles irá hacia arriba (aditivamente) en
10.

Un incremento en la amplitud por un factor de dos corresponde a un incremento de


6.02 decibeles aproximadamente; doblar la potencia corresponde a un incremento
de 3.01 dB. La relación entre la amplitud lineal y la amplitud en decibeles está
graficada en la figura 1.3.

Utilizando a0 para denotar la amplitud de referencia, una señal con amplitud


lineal más pequeña que a0 tendrá una amplitud negativa en decibeles: a0/10 da
-20 dB, a0/100 da -40, etc. Una amplitud lineal de cero es más pequeña que
cualquier valor en dB, así que da un nivel en dB de -∞.

En audio digital una opción conveniente para tomar como referencia, asumiendo
que el equipo tenga una amplitud máxima de uno, es:

a0 = 10-5 = 0.00001

con lo que la amplitud máxima son 100 dB, y 0 dB es el silencio a un nivel de


audición razonable. De manera conveniente, el rango dinámico de audición humana
-la razón entre un volumen dañino y un silencio inaudible- es de 100 dB
aproximadamente.

La amplitud está relacionada de una manera inexacta con la intensidad de un


sonido. En general dos señales con la misma amplitud pico o RMS, no
necesariamente las escucharemos con igual intensidad. Al amplificar una señal en
3 dB, por ejemplo, apenas sí se podría decir que el sonido se siente un poco más
intenso.

Se ha estudiado mucho la supuesta naturaleza logarítmica del oído humano (y de


los otros sentidos), lo cual explica parcialmente porqué los decibeles son tan
útiles en la escala de amplitud [RMW02, pág.99].

La amplitud también está relacionada de una manera inexacta con las dinámicas
musicales. La dinámica es mejor pensarla como una medida del esfuerzo que como
intensidad o potencia. Su rango está sobre nueve valores: silencio, ppp, pp, p,
mp, mf, f, ff, fff. Estos están correlacionados de una manera más lejana con la
amplitud de una señal que con su intensidad [RMW02, págs.110-111].

1.3. Controlando la amplitud

Sin embargo la operación más frecuente en los sonidos electrónicos es cambiar


sus amplitudes. Por ejemplo, una estrategia simple para la síntesis de sonidos
es combinando sinusoides, lo cual puede ser generado evaluando la fórmula del
primer capítulo

x[n] = acos(!n + Á)

muestra por muestra. Pero la sinusoide tiene una amplitud nominal constante a,
y nos gustaría ser capaces de variarla en el tiempo.

En general, al multiplicar la amplitud de una señal x[n] por un factor y ≥ 0,


usted puede simplemente multiplicar cada muestra por y, dando como resultado
una nueva señal y*x[n]. Cualquier medida de amplitud pico o RMS de x[n] será
mayor o menor según el factor y. De una manera más general, usted puede cambiar
la amplitud en una cantidad y[n] que varíe muestra por muestra. Si y[n] no es
negativa y si varía con cierta lentitud, la amplitud del producto y[n]*x[n] (en
una ventana fija desde M hasta M + N - 1) será el valor de x[n], multiplicado
por el valor de y[n] en la ventana (el cual asumimos no cambia mucho en las N
muestras de la ventana).

En el caso más general donde tanto x[n] como y[n] tienen valores negativos y
positivos y/o cambian rápidamente, el efecto de su multiplicación no puede ser
descrito como el simple cambio de amplitud de uno de ellos; esta situación es
considerada posteriormente, en el capítulo 5.

1.4 Frecuencia

Las frecuencias, al igual que las amplitudes, son usualmente medidas sobre la
escala logarítmica, con el fin de enfatizar las proporciones entre ellas, lo que
usualmente provee una mejor descripción de la relación entre las frecuencias,
que la que hace la diferencia entre ellas. La razón entre las frecuencias de dos
notas musicales determina el intervalo musical entre ellas.

La escala musical occidental divide la octava (el intervalo musical asociado con
una relación de 2:1) en doce sub-intervalos iguales, cada uno de los cuales de
esta manera corresponde a una razón de 21/12. Por razones históricas este
intervalo es denominado un semitono. Una escala logarítmica conveniente para las
notas musicales es simplemente contar el número de semitonos desde una nota de
referencia -permitiendo fracciones que posibilitan especificar notas que no
corresponden con las notas musicales de la escala occidental. La escala de notas
logarítmica más utilizada es la de “notas MIDI”, en la cual la nota 69 está
asignada a una frecuencia de 440 ciclos por segundo -el A sobre el C medio. Para
hacer la conversión entre una nota MIDI m y una frecuencia en ciclos por
segundo f, se aplican las fórmulas de conversión Nota/Frecuencia:

m = 69 + 12*log2(f/440)

f = 440*2(m-69)/12

El C medio, correspondiente a la nota MIDI m = 60, sería f = 261,626 ciclos por


segundo.

El MIDI en sí es un viejo protocolo de equipos de cómputo el cual


desafortunadamente ha insinuado un gran convenio de diseño de programas de
computación. En los equipos de cómputo, el MIDI permite únicamente notas enteras
entre 0 y 127. Sin embargo, la escala en general está bien definida para
cualquier número “MIDI”, incluso los números negativos; por ejemplo una “nota
MIDI” de -4 es una cantidad de vibración presentable. La escala de notas no
puede, sin embargo, describir frecuencias iguales o menores que cero ciclos por
segundo. (Para una descripción clara del MIDI, sus posibilidades y limitaciones,
vea [Bal03, cap.6-8]).

Un semitono conforma una razón de aproximadamente 1,059 a 1, un seis por ciento


aproximadamente de incremento en la frecuencia. Los semitonos están además
divididos en cents, siendo cada cent un centésimo de un semitono. En la
práctica, se considera que con tres cents se hace una diferencia perceptible
mínima en el cambio de afinación de una nota musical. En el C medio esto viene a
equivaler a 1/2 ciclo por segundo aproximadamente.

1.5. Sintetizando una sinusoide

En la mayoría de los paquetes programación de síntesis audio más ampliamente


usados (Csound, Max/MSP, y Pd, por ejemplo), las operaciones de audio están
especificadas como redes de unidades generadoras [Mat69], las cuales pasan
señales de audio entre ellas mismas. El usuario del paquete de programas
especifica la red, a veces llamada un parche, la cual esencialmente corresponde
al algoritmo de síntesis que se utilizará, y entonces su preocupación se enfoca
en cómo controlar las diferentes unidades generadoras en el tiempo. En esta
sección utilizaremos diagramas de bloque abstractos para describir los parches,
pero en la sección de “ejemplos” (página “17”), escogeremos un ambiente de
implementación específico y mostraremos algunos detalles que dependen del
programa de cómputo.

Para mostrar cómo producir una sinusoide con amplitud variable en el tiempo,
necesitaremos introducir dos unidades generadoras. Primero, necesitamos una
sinusoide pura la cual está hecha con un oscilador. La figura 1.5 (parte a)
muestra una representación pictórica de un oscilador sinusoidal como un ícono.
La entrada es una frecuencia (en ciclos por segundo), y la salida es una
sinusoide cuya amplitud pico es uno.

La figura 1.5 (parte b) muestra cómo multiplicar la salida de un oscilador


sinusoidal por un factor de escala apropiado y[n] para controlar su amplitud.
Ya que la amplitud pico del oscilador es 1, la amplitud pico del producto es
y[n], asumiendo que y[n] cambia con suficiente lentitud y no tiene valores
negativos.

La figura 1.6 muestra cómo la sinusoide de la Figura 1.1 es afectada por el


cambio de amplitud de dos controladores de señal diferentes y[n]. El control de
la señal en la parte (a) tiene una discontinuidad y de esa manera da como
resultado la sinusoide de amplitud controlada mostrada en (b). Las partes (c) y
(d) muestran una posibilidad de variación menos brusca para y[n] y su
resultado. La intuición sugiere que el resultado mostrado en (b) no sonará como
una sinusoide que varía en su amplitud, si no como una sinusoide interrumpida
por un “pop” audible luego del cual continúa con menos intensidad. En general,
por razones que no pueden ser explicadas en este capítulo las señales y[n] que
controlan la amplitud en forma de rampa suave entre un valor y otro son menos
propensas a dar resultados parásitos (tales como el “pop”), que las que cambian
abruptamente.

Por el momento podemos dar dos reglas generales sin justificarlas. La primera,
que las sinusoides puras son las señales más sensibles a los efectos parásitos
de los cambios rápidos de amplitud. Así que cuando usted quiera examinar una
transición de amplitud, si esta trabaja para las sinusoides probablemente
trabajará para otras señales igual de bien. Segundo, que dependiendo de la señal
cuya amplitud usted esté cambiando, el control de amplitud requerirá entre de 0
a 30 milisegundos de tiempo “rampa” -cero para las señales más clementes (tales
como el ruido blanco), y 30 para las menos (como una sinusoide). Todo esto
depende también en una forma complicada, de los niveles de escucha y del
contexto acústico.

Funciones apropiadas de control y[n] pueden ser hechas utilizando un generador


de envolvente. La figura 1.7 muestra una red en la cual un generador de
envolvente se utiliza para controlar la amplitud de un oscilador. Los
generadores de envolvente varían ampliamente en su diseño, pero nos enfocaremos
en su tipo más simple, el cual genera segmentos de línea como se muestra en la
figura 1.6 (parte c). Si un segmento de línea está específicamente diseñado para
hacer de rampa entre dos valores de salida a y b sobre N número de muestras
comenzando en la muestra M, la salida es:

y[n] = a + ((b – a)*(n – M)/N), M ≤ n ≤ M + N - 1

La salida puede tener cualquier número de segmentos tales como este conectados
en los extremos sobre el rango completo del número de muestras n; los segmentos
planos, horizontales, pueden hacerse dejando que a = b.

Adicional al cambio de las amplitudes de los sonidos, el control de amplitud es


usual, especialmente en las aplicaciones en tiempo real, simplemente para
encender sonidos y para enmudecerlos: se enmudecen haciendo que la rampa de
amplitud vaya suavemente a cero. La mayoría de los paquetes de programas de
cómputo para síntesis también proveen fórmulas para detener por completo los
módulos desde los cómputos de las muestras, pero aquí utilizaremos control de
amplitud en su lugar.

El generador de envolvente existe desde la era análoga [Str95, pág.64] [Cha80,


pág.90], al igual que el resto de componentes de la figura 1.7; los osciladores
de frecuencia controlable fueron denominados osciladores controlados por voltaje
o VCO's, y el paso de multiplicación se hizo utilizando un amplificador
controlado por voltaje o VCA [Str95, págs.34-35] [Cha80, pág.84-89]. Los
generadores de envolvente se describen con mayor detalle en la sección 4.1.

1.6. Superponiendo señales

Si una señal x[n] tiene una amplitud pico o RMS A (en alguna ventana fija),
entonces la señal escalada k*x[n] (donde k ≥ 0) tiene una amplitud kA. La
potencia media de la señal escalada cambia por un factor de k2. La situación se
vuelve más complicada cuando dos señales diferentes se añaden simultáneamente;
conocer las amplitudes de las dos no es suficiente para conocer la amplitud de
la suma. Las dos medidas de amplitud deben por lo menos obedecer el triángulo de
las desigualdades; para cualquiera de dos señales x[n] y y[n],

Apico{x[n]} + Apico{y[n]} ≥ Apico{x[n] + y[n]}

ARMS{x[n]} + ARMS{y[n]} ≥ ARMS{x[n] + y[n]}

Si fijamos una ventana desde M hasta M + N – 1 como es usual, podemos escribir


la salida de la potencia media de la suma de las dos señales:

P{x[n] + y[n]} = P{x[n]} + P{y[n]} + 2*COV{x[n],y[n]}

donde hemos introducido la covariancia de dos señales:

COV{x[n],y[n]} = (x[M]y[M] + … + x[M + N – 1]y[M + N – 1])/N

La covariancia puede ser positiva, cero o negativa. Sobre una ventana


suficientemente grande, la covariancia de dos sinusoides con frecuencias
diferentes es insignificante comparada con la potencia media. Dos señales que no
tengan covariancia se les llama no correlacionadas (la correlación es la
covariancia normalizada que se encuentra entre -1 y 1). En general, para dos
señales no correlacionadas, la potencia de la suma es igual a la suma de las
potencias:

P{x[n] + y[n]} = P{x[n]} + P{y[n]}, siempre que COV{x[n],y[n]} = 0

Al ponerlo en términos de amplitudes, se tiene:

(ARMS{x[n] + y[n]})2 = (ARMS{x[n]})2 + (ARMS{y[n]})2

Esta es la ya conocida relación pitagórica. De esta manera las señales no


correlacionadas pueden ser tomadas como vectores que conforman un ángulo recto;
las señales correlacionadas positivamente forman un ángulo agudo entre ellas y
las correlacionadas negativamente forman un ángulo obtuso.

Por ejemplo, si dos señales no correlacionadas tienen ambas una amplitud RMS de
valor a, su suma tendrá una amplitud √2a. De otro lado, si las dos señales son
iguales, -la mayor correlación posible- la suma tendrá una amplitud 2a, el cual
es el valor máximo permitido, según el triángulo de las desigualdades.

1.7 Señales periódicas

Se dice que una señal x[n] se repite en un período ¿ si


x[n + ¿]= x[n]
para todo n. Tal señal deberá repetirse en períodos de 2¿ y así sucesivamente;
el ¿ más pequeño en el cual se repite la señal se denomina período de la señal.
En la discusión de los períodos de las señales de audio digital, rápidamente
llegamos a la dificutad de describir señales cuyo “período” no es un entero, de
tal manera que la ecuación anterior queda sin sentido. Por el momento
ignoraremos efectivamente esta dificultad suponiendo que la señal puede ser
interpolada de alguna manera entre las muestras de tal manera que esté bien
definida ya sea n un entero o no.

Una sinusoide tiene un período (en muestras) de 2¼/! donde ! es la frecuencia


angular. De una manera más general, cualquier suma de sinusoides con frecuencias
2¼k/! para enteros de k, se repetirá después de 2¼/! número de muestras. Tal
suma es llamada Serie de Fourier:

x[n] = a0 + a1cos(ωn + ϕ1) + a2cos(2ωn + ϕ2) + … + apcos(pωn + ϕp)

Más aún, si asumimos ciertas condiciones técnicas (en efecto que la señal
únicamente contiene frecuencias hasta una frontera finita), podemos representar
cualquier señal peródica con dicha suma. Esta es la variante discreta en el
tiempo del análisis de Fourier, que reaparecerá en el capítulo 9.

Las frecuencias angulares de las sinusoides anteriores son todas múltiplos


enteros de ω. Estas son llamadas los armónicos de ω, el cual es llamado a su
vez la fundamental. En términos de su afinación, los armónicos ω, 2ω,... son
intervalos de 0, 1200, 1902, 2400, 2786, 3102, 3369, 3600, ..., cents sobre la
fundamental; esta secuencia de tonos es a veces llamada serie armónica. Las
primeras seis notas de la serie son muy aproximadamente múltiplos de 100; en
otras palabras, los primeros seis armónicos de una nota en la escala occidental
caen muy cercanos a otras notas (pero no siempre de manera exacta) de la misma
escala; la tercera y la sexta se desvían únicamente en 2 cents y la quinta se
desvía por 14 cents.

Puesto de otra manera, la razón de frecuencias 3:2 (una quinta justa en la


terminología occidental) equivale casi exactamente a siete semitonos, 4:3 (una
cuarta justa) está muy cercano a cinco semitonos, y las razones 5:4 y 6:5
(tercera mayor y menor) están muy cercanas a de los cuatro y los tres semitonos,
respectivamente.

Se muestra una serie de Fourier (con sólo tres términos) en la figura 1.8. las
primeras tres gráficas son de sinusoides, cuyas frecuencias están en razones
1:2:3. El período común está marcado sobre los ejes horizontales. Cada sinusoide
tiene una amplitud y una fase inicial diferentes. La suma de las tres en la
parte inferior no es una sinusoide, pero sigue manteniendo la periodicidad
compartida por las tres sinusoides componentes.

Dejando la cuestión de la fase a un lado, podemos utilizar un banco de


osciladores sinusoidales para sintetizar sonidos periódicos o incluso cambiar su
forma suavemente a través de una sucesión de sonidos periódicos, especificando
la frecuencia fundamental y las (posiblemente variantes en el tiempo) amplitudes
de los parciales. La figura 1.9 muestra un diagrama de bloques para hacer esto.

Este es un ejemplo de síntesis aditiva; y de manera más general el término puede


ser aplicado a redes en las cuales la frecuencia de los osciladores son
controlables de manera independiente. Los primeros días de la música por
computador sonaron con la síntesis aditiva.

1.8 Acerca de los ejemplos con programas de cómputo


Los ejemplos de este libro utilizan Pure Data (Pd), y para entenderlos usted
debe aprender lo mínimo de Pd mismo. Pd es un ambiente para realizar rápidamente
aplicaciones musicales en el computador, con el fin principal de las ejecuciones
de música en vivo. Pd puede ser utilizado para otros medios, pero no iremos a
eso aquí.

Existen algunos otros ambientes de audio DSP por parches junto con Pd. El más
ampliamente utilizado es ciertamente Csound de Barry Vercoe [Bou00], el cual
difiere de Pd en que está basado en el texto (no basado en GUI). Esto es
ventajoso en algunos aspectos y desventajoso en otros. Csound está mejor
adaptado que Pd para procesos de vaciado y maneja la polifonía mucho mejor que
como lo hace Pd. De otro lado, Pd tiene una estructura de control de tiempo real
más desarrollada que Csound. Genealógicamente, Csound proviene de los llamados
lenguajes Music N [Mat69, págs.115-172].

Otra alternativa de código abierto de amplio uso es el SuperCollider de James


McCartney, el cual está también más orientado al texto que Pd, pero al igual que
Pd, está explícitamente diseñado para el uso en tiempo real. SuperCollider tiene
construcciones lingüísticas poderosas que lo hacen una herramienta más adecuada
que Csound para tareas como la escritura de lazos o el mantenimiento de
estructuras de datos complejas.

Finalmente, Pd tiene un hermano utilizado ampliamente, el programa comercial de


Cycling74 Max/MSP (los demás mencionados aquí son todos de código abierto).
Tanto principiantes como gerentes de sistemas a cargo de laboratorios de cómputo
mutiusuarios y multipropósito encontrarán Max/MSP mejor soportado y documentado
que Pd. Es posible aprender en Pd y aplicar lo aprendido en Max/MSP y viceversa,
e incluso es posible conectar parches de uno a otro, pero los dos no son
verdaderamente compatibles.

Introducción rápida a Pd

Los documentos de Pd son llamados parches. Ellos corresponden muy


aproximadamente a las cajas de los diagramas de bloques abstractos mostrados
anteriormente en este capítulo, pero en el detalle son diferentes, debido a que
Pd es un ambiente de implementación, no un lenguaje de especificación.

Un parche Pd, tal como los mostrados en la figura 1.10, consiste en un conjunto
de cajas conectadas en red. El borde de las cajas le dice cómo interpretar su
texto y cómo funcionan. En la parte (a) de la figura vemos tres tipos de cajas.
De arriba a abajo son:

• una caja de mensaje. Las cajas de mensajes, con un borde en forma de


bandera, interpretan el texto como un mensaje para enviar, siempre y
cuando la caja sea activada (por un mensaje de entrada o por un
dispositivo de señalización). El mensaje en este caso consiste simplemente
del número “21”.

• una caja de objetos. Las cajas de objetos tienen un borde rectangular;


interpretan el texto para crear objetos cuando usted carga un parche. Las
cajas de objetos pueden contener cientos de objetos de diferentes tipos
-incluyendo osciladores, generadores de envolventes, y otros módulos de
procesamiento de señal que se presentarán más tarde- dependiendo del texto
en su interior. En este caso la caja contiene un sumador. En gran parte de
los parches Pd, la mayoría de las cajas son del tipo “objeto”. La primera
palabra escrita en un objeto especifica su clase, la cual en este caso es
precisamente “+”. Cualquier palabra adicional (separada por un espacio)
que aparezca en la caja es llamada argumento de creación, y especifica el
estado inicial del objeto cuando se crea.

• una caja de número. Las cajas de número son un tipo particular de caja
GUI. Otros tipos incluyen botones para oprimir e interruptores de palanca;
estos vendrán más adelante en los ejemplos. La caja de número tiene un
borde con forma de tarjeta perforada, con una muesca en su esquina
superior derecha. Mientras que la apariencia de un objeto o caja de
mensaje queda fija cuando el parche está corriendo, el contenido (texto)
de la caja de número cambia para reflejar el valor actual de la caja.
Usted puede utilizar también una caja de números como control haciendo
click y arratrando arriba y abajo, o escribiendo valores en ella.

En la figura 1.10 (parte a) al hacer click en la caja de mensaje, esta envía el


mensaje “21” a una caja de objeto que le suma 13. las líneas que conectan las
cajas llevan datos de una caja a la siguiente; las salidas de las cajas están en
la parte inferior y las entradas en la parte superior.

La figura 1.10 (parte b) muestra un parche Pd que fabrica una sinusoide con
frecuencia y amplitud controlables. Las líneas de conexión del parche son de dos
tipos aquí; las delgadas se usan para llevar mensajes esporádicos, y las gruesas
(que están conectando el oscilador, el multiplicador y el objeto de salida dac~)
llevan señales de audio digital. Ya que Pd es un programa de tiempo real, las
señales de audio fluyen continuamente. De otro lado, los mensajes esporádicos
aparecen en específicos pero probablemente impredecibles instantes del tiempo.

Que una conexión lleve mensajes o señales depende de la conexión de la caja de


la cual proviene; así, por ejemplo, el objeto + da como salidas, mensajes, pero
el objeto *~ da como salida una señal. Las entradas de un objeto dado pueden
aceptar o no señales (pero siempre aceptan mensajes, incluso si es para
solamente convertirlos en señales). Como convención, las cajas de objetos con
entradas o salidas de señal son nombradas todas con una tilde al final (“~”)
como en “*~” y “osc~”.

Cómo encontrar y hacer funcionar los ejemplos

Para hacer funcionar los parches, primero debe descargar, instalar y hacer
funcionar Pd. Las instrucciones para hacer esto aparecen en la documntación HTML
de Pd en línea, que puede encontrar en http://crca.ucsd.edu/~msp/software.htm.

Este libro debe aparecer en http://crca.ucsd.edu/~msp/techniques.htm,


posiblemente con alguna revisiones. Escoja la revisión que corresponde al texto
que está leyendo (o tal vez sólo la última) y descargue el archivo que contiene
la revisión asociada de los ejemplos (puede descargar también un archivo de la
versión HTML de este libro para un acceso más fácil en su máquina). Los ejemplos
deberán quedar todos en un directorio aparte, ya que algunos de ellos dependen
de otros archivos en ese directorio y podrían no cargarse correctamente si ha
movido algunas cosas.

Si quiere copiar uno de los ejemplos a otro directorio para construir en el


(para lo cual es bienvenido), deberá incluir también el directorio de ejemplos
en la ruta de búsqueda de Pd (vea la documentación de Pd) o mirar qué otros n
archivos necesita y copiarlos también. Una buena manera de saber cuáles son es
poner a funcionar Pd desde el archivo reubicado y ver si Pd se queja de algo que
no puede encontrar.

Deben aparecer docenas de archivos en las carpetas de los “ejemplos”, incluyendo


los ejemplos mismos y los archivos de soporte. Los nombres de los archivos de
los ejemplos comienzan todos con una letra (A para el capítulo 1, B para el 2,
etc) y un número como en “A01.sinewave.pd”.

Los parches de ejemplo también se distribuyen con Pd pero tenga precaución


porque puede encontrar una versión diferente de los ejemplos que no corresponda
con el texto que está leyendo.

1.9 Ejemplos
Escalado de amplitud constante

El ejemplo A01.sinewave.pd, que se muestra en la figura 1.11, contiene


esencialmente el parche más simple posible para hacer un sonido, con sólo tres
cajas de objetos (también hay comentarios, y dos cajas de mensajes para encender
y apagar el procesador de audio “DSP” de Pd). Las tres cajas de objetos son:

osc~: oscilador sinusoidal. La entrada de la izquierda y la salida son señales


de audio digital. La entrada toma la frecuencia (que se puede variar en el
tiempo) en Hertz. La salida es una sinusoide en una frecuencia específica. Si no
hay nada conectado a la entrada de la frecuencia, el argumento de creación (440
en este ejemplo) se utiliza como la frecuencia. La salida tiene su pico de
amplitud uno. Usted puede ajustar una fase inicial enviando mensajes (no señales
de audio) a la entrada derecha. La entrada izquierda (la frecuencia) también
puede ajustarse para enviar mensajes y ajustar la frecuencia, ya que a cualquier
entrada que tome una señal de audio, también pueden enviársele mensajes que son
convertidos automáticamente en la señal de audio digital deseada.

*~: multiplicador. Existe de dos formas. Si se especifica una creación de


argumento (como en este ejemplo, que es 0,05), esta caja multiplica una señal de
audio digital (en la entrada izquierda) por el número; los mensajes en la
entrada derecha pueden también actualizar ese número. Si no se da ningún
argumento, esta caja multiplica las dos señales entrantes de audio digital.

dac~: dispositivo de salida de audio. Dependiendo de su equipo de cómputo, este


podría no actuar como un Convertidor Análogo/Digital tal y como su nombre lo
sugiere; pero en general, le permite enviar cualquier señal de audio digital a
la(s) salida(s) de audio de su computador. Si no hay creación de argumentos, el
comportamiento por defecto es entregar salida a los canales uno y dos de la
tarjeta de sonido; usted puede especificar números de canales alternativos (uno
o muchos) utilizando argumentos para su creación. Pd mismo puede configurarse
para utilizar dos o más canales de salida, o podría no tener el dispositivo de
audio abierto; consulte la documentación de Pd para estos detalles.

Las dos cajas de mensajes muestran una particularidad en la manera en que los
mensajes son analizados en las cajas de mensajes. Al principio en la figura 1.10
(parte a), el mensaje consistía únicamente del número 21. Cuando se hace click
en él, esa caja envía el mensaje “21” a su salida y por lo tanto, a cualquier
objeto conectado a ésta. En este ejemplo en particular, el texto de la caja de
mensaje comienza con un punto y coma. Este es un cierre entre mensajes (así, el
primer mensaje está vacío), después del cual la siguiente palabra se toma como
el nombre del receptor del siguiente mensaje. De esta manera el mensaje aquí es
“dsp 1” (o “dsp 0”) y el mensaje que se va a enviar, no para ninguno de los
objetos conectados -no hay ninguno, de todas maneras- si no para el objeto
llamado “pd”. Este objeto en particular se provee de manera invisible por el
programa Pd y usted puede enviar varios mensajes para controlar el estado global
de Pd, en este caso encendiendo el procesamiento de audio (“1”) y apagándolo
(“0”).

Control de amplitud en decibeles

El ejemplo A02.amplitude.pd muestra cómo hacer un control de amplitud crudo; los


elementos activos se muestran en la figura 1.12 (parte a). Hay una clase de
objeto nueva:

dbtorms: conversión de decibeles a amplitud lineal. “RMS” es un término errado;


debería llamarse “dbtoamp”, ya que este objeto realmente convierte decibeles a
cualquier unidad de amplitud lineal, sea esta RMS, pico u otra. Una entrada de
100 dB es normalizada a una salida de 1. Los valores más grandes que 100 están
bien (120 nos dará 10), pero valores menores o iguales a cero darán salida cero
(una entrada de cero, de otro lado, podría tener como salida un pequeño valor
positivo). Este es un objeto de control, pues los números que entran y salen son
mensajes, no señales (Un objeto correspondiente, dbtorms~, es el correlativo de
señal. Sin embargo, como objeto de señal este es costoso en tiempo de CPU y la
mayoría de las veces encontraremos una u otra manera de evitar su utilización.)

Las dos cajas de números están conectadas a la entrada y a la salida del objeto
dbtorms. La función de entrada es como un control; trabaje con el ratón en esta
(click y arrastre arriba y abajo) para cambiar la amplitud. Esta ha sido
ajustada para que quede en el rango de 0 a 80, con el fin de proteger sus
parlantes y sus oídos, y es prudente construir tales guardas en sus propios
parches.

La otra caja de números muestra la salida del objeto dbtorms. Es inútil trabajar
esta caja con el mouse ya que su salida no está conectada a ningún lado; aquí
sólo se muestra su entrada. Las cajas de números pueden ser útiles como control,
indicador o ambos, aunque si las está utilizando para ambas cosas, puede haber
un trabajo extra por hacer.

Control de amplitud suavizado con un generador de envolvente

Según se muestra en la figura 1.6 una de las maneras de suavizar los cambios de
amplitud en una señal, sin clicks, es multiplicarla por la salida de un
generador de envolvente tal como se muestra en el diagrama de bloques de la
figura 1.7. Esto se puede implementar en Pd utilizando el objeto line~:

line~: generador de envolvente. La salida es una señal que ejecuta una pendiente
lineal desde un valor a otro, en el tiempo, según lo determinen los mensajes
recibidos. La entrada toma mensajes que especifican los valores finales (entrada
izquierda) y los tiempos que se demora (entrada derecha). Debido a una regla
general para los mensajes de Pd, un par de números enviados a la entrada
izquierda son suficientes para para especificar de manera conjunta un valor
final y un espacio de tiempo. El tiempo se mide en milisegundos (tomando en
cuenta la velocidad de las muestras), y el valor final no tiene unidades, o sea
que su rango de salida podría ser según la entrada a la que estuviese conectado.

El ejemplo A03.line.pd demuestra la utilización de un objeto line~ para


controlar la amplitud de una sinusoide. La parte activa se muestra en la figura
1.12 (parte b). Las seis cajas de mensajes están todas conectadas al objeto
line~, y son activadas al hacer click en ellas; la primera caja de la parte
superior, por ejemplo, especifica que la rampa de line~ (comenzando donde fuere
que estuviera su valor de salida antes de recibir el mensaje) al valor 0,1 en un
lapso de dos segundos. Luego de que transcurren estos dos segundos, a no ser de
que otro mensaje haya llegado mientras tanto, la salida permanecerá en 0,1. Los
mensajes pueden llegar antes de que culmine el tiempo de los dos segundos, en
cuyo caso el objeto line~ abandona su vieja trayectoria y toma la nueva.

Dos mensajes pueden llegar a line~ al mismo tiempo o con tan poco espacio de
tiempo entre ellos que no se efectúe el cómputo DSP; en este caso, el primer
mensaje no tiene efecto, debido a que line~ no habrá cambiado su salida aún para
seguir ese primer mensaje, y su salida corriente, sin cambio, se utiliza
entonces como punto de partida para el segundo segmento. Una excepción a esta
regla es que si line~ llega a un valor cero, el valor de la salida es ajustado
inmediatamente al nuevo valor y los segmentos subsiguientes comenzarán desde ese
nuevo valor; así, al enviar dos pares, el primero con un valor de tiempo cero y
el segundo par con un valor de tiempo diferente de cero, uno puede especificar
independientemente los valores iniciales y finales de un segmento en la salida
de line~.

El tratamiento de la entrada derecha de line~ es inusual para los objetos Pd


pues olvida los valores viejos; un mensaje con un solo número tal como “0.1” es
siempre equivalente al par “0.1 0”. Casi cualquier otro objeto retendrá el valor
previo por la entrada derecha, en lugar de reajustarlo a cero.
El ejemplo A04.line2.pd muestra la salida del objeto line~ gráficamente.
Utilizando los mensajes de las diversas cajas, usted puede recrear los efectos
mostrados en la figura 1.6.

Triada mayor

El ejemplo A05.output.subpatch.pd, cuyos ingredientes activos se muestran en la


figura 1.12 (parte c), presenta tres sinusoides con frecuencias en razones
4:5:6, de tal forma que las dos más bajas están separadas por una tercera mayor,
las dos superiores por una tercera menor y la superior y la inferior por una
quinta. La frecuencia más baja es 440, igual al A sobre el C medio, o MIDI 69.
Las demás están cuatro y siete semitonos más altas, respectivamente. Las tres
tienen amplitudes iguales.

El control de amplitud en este ejemplo está manejado por un nuevo objeto llamado
output~. Este no es un objeto de Pd, si no que es un parche Pd alojado en un
archivo, “output.pd”. (Puede ver lo que hay en output~ abriendo el menú de
propiedades de la caja y seleccionando “open”.) Usted tiene dos controles, uno
para la amplitud en dB (100 significa “ganancia unitaria”), y un botón “mute”.
El proceso de audio de Pd es encendido automáticamente cuando ajusta el nivel de
entrada -este podría no ser el mejor comportamiento en general, pero es
apropiado para estos parches de ejemplo <en la versión extendida este parche
está modificado -mejorado>. El mecanismo para incluir un parche Pd dentro de
otro como una caja de objetos se discute en la sección 4.7.

Conversión entre frecuencia y nota

El ejemplo A06.frequency.pd (figura 1.13) muestra el objeto Pd que convierte


notas a frecuencia (mtof que significa “MIDI a frecuencia”) y su inverso ftom,
Introducimos también dos clases de objetos, send y receive.

mtof, ftom: convierten notas MIDI a unidades de frecuencia de acuerdo con las
Fórmulas de Conversión Nota/Frecuencia. Las entradas y salidas son mensajes (los
objetos “tilde” equivalentes existen, sin embargo, al igual que dbtorms~ son
costosos en tiempo de CPU). La salida del objeto ftom es 1500 si la entrada es
cero o negativa; y de otra manera, si usted da un valor de -1500 o menor a mtof
su salida es cero.

receive, r: los mensajes receive no son locales. El objeto receive, el cual


puede abreviarse “r”, espera mensajes externos enviados por un objeto send o por
una caja de mensajes que utilice redireccionamiento (el “;” discutido antes en
el ejemplo A01.sinewave.pd). El argumento (tal como “frecuency” y “pitch” en
este ejemplo) es el nombre al cual se enviarán los mensajes. Objetos receive
múltiples pueden compartir el mismo nombre, en cuyo caso cualquier mensaje
enviado con ese nombre llegará a todos éstos.

send, s: El objeto send, que puede ser abreviado “s”, envía mensajes a los
objetos receive.

Dos nuevas propiedades de cajas de números se utilizan aquí. Anteriormente las


hemos utilizado como cajas de control y de indicación; aquí las dos cajas de
números hacen ambas funciones. Si una caja de números tiene un valor numérico en
su entrada, esta no sólo muestra el número si no que también repite el número en
su salida. Sin embargo a una caja de número también puede ser enviado un mensaje
de “ajuste”, tal como se hace con “set 55” en el ejemplo. Este deberá ajustar el
valor de la caja de número a 55 (y mostrarlo) pero no hará que sea 55 el valor
numérico de la salida. En este caso los números que llegan desde dos objetos
receive están formateados (utilizando cajas de mensaje) para leer “set 55” en
lugar de “55” u otro número de la misma manera. (La palabra especial “$1” se
reemplaza por el número de entrada.) Esto se hace debido a que de otra manera
obtendríamos un lazo infinito: la frecuencia cambiará la nota y esta cambiará la
frecuencia y así por siempre o hasta que algo se dañe.

Más síntesis aditiva

La triada mayor (ejemplo A06.frequency.pd) muestra una manera de combinar


sinusoides, sumándolas. Hay muchas otras maneras de organizar conjuntos de
sinusoides, de las cuales veremos dos. El ejemplo A07.fusion.pd (figura 1.14)
muestra cuatro osciladores, cuyas frecuencias están en razones 1:2:3:4, con
amplitudes relativas 1, 0,1, 0,2 y 0,5. las amplitudes están ajustadas
multiplicando las salidas de los osciladores (el objeto *~ debajo de los
osciladores).

Los osciladores segundo, tercero y cuarto se encienden y apagan mediante el


interruptor de palanca. Este es un control gráfico, al igual que la caja de
número introducida anteriormente. El interruptor de palanca cambia a 1 y a 0
alternativamente cada que se hace click en él con el ratón. Este valor es
multiplicado efectivamente por la suma del segundo, tercer y cuarto oscilador,
hacéndolos que se enciendan y se apaguen.

Incluso cuando todos los osciladores están combinados (con el interruptor de


palanca en la posición “1”), el resultado se fusiona en un solo tono,
escuchándose la nota dada por el primer oscilador de la izquierda. En efecto,
este parche suma una serie de Fourier de cuatro términos que generan una onda
periódica compleja.

El ejemplo A08.beating.pd (figura 1.15) muestra otra posibilidad, en la cual


seis osciladores están afinados en tres pares de fercuencias vecinas, por
ejemplo 330 y 330,2 Hertz. Estos pares entran y salen de fase uno con otro, de
tal manera que la amplitud de su suma cambia en el tiempo. Con el nombre de
beating <batido o vibrato> este fenómeno es utilizado con fercuencia para
efectos musicales.

Los osciladores se pueden combinar de otras maneras similares simplemente


sumando sus salidas, y se puede obtener un amplio rango de sonidos diferentes.
El ejemplo A09.frequency.mod.pd (que no se muestra aquí) muestra la síntesis por
modulación de la frecuencia, en la cual un oscilador controla la frecuencia de
otro oscilador. Esto se describirá de manera más completa en el capítulo 5.

Ejercicios

1. Una sinusoide x[n] = acos(!n + Á) tiene una fase inicial Á = 0 y una


frecuencia angular ! = π/10. Cuál es su periodo en muestras? Cuál es la fase en
la muestra n = 10?

2. Dos sinusoides tienen periodos de 20 y 30 muestras, respectivamente.


Cuál es el periodo de la suma de los dos?

3. Si 0 dB corresponden a una amplitud de 1, cuántos dB corresponden a


amplitudes de 1,5, 2, 3 y 5?

4. Dos señales no correlacionadas de amplitud RMS 3 y 4 se suman; cuál es


la amplitud RMS de la suma?

5. Cuántas señales no correlacionadas, todas con amplitud igual, debería


usted adicionar para lograr una señal 9 dB más grande en amplitud?

6. Cuál es la frecuencia del C medio a 44.100 muestras por segundo?

7. Dos sinusoides suenan un C medio (MIDI 60) y un C sostenido medio (MIDI


61). Cuál es la diferencia, en Hertz, entre sus frecuencias?
8. Cuántos cent hay en el intervalo entre el séptimo y el octavo armónico
de una señal periódica?

9. Si una señal de audio x[n], n = 0,...,N - 1 tiene una amplitud pico de


1, cuál es la amplitud RMS mínima posible? Cuál es la máxima posible?
Capítulo 2

Tabla de ondas y muestreadores

En el capítulo 1 tratamos a las señales de audio como si fluyeran de manera


continua con una velocidad de muestreo. La velocidad de las muestras no es
realmente una cualidad de la señal de audio, si no que especifica qué tan rápido
fluyen las muestras al interior del computador. Pero las señales de audio, en el
fondo, no son si no secuencias de números y en la práctica aquí no es un
requerimiento que tengan que ser “tocadas” secuencialmente. Otro punto de vista
complementario es que ellas pueden ser almacenadas en la memoria y, más tarde,
pueden ser leídas en cualquier orden -hacia adelante, hacia atrás, atrás y
adelante o demanera totalmente aleatoria. Un rango inexhaustivo de nuevas
posibilidades se abre.

Por muchos años (aproximadamente entre 1950 y 1990), la cinta magnética sirvió
como el principal medio para almacenar sonidos. Las cintas pasaban hacia atrás y
hacia adelante a través de captadores magnéticos para reproducir las señales en
tiempo real. Más o menos desde 1995, la forma predominante para almacenar
sonidos ha sido guardarlos como señales de audio digital, que pueden ser
reproducidas con mayor libertad y facilidad que las cintas magnetofónicas.
Muchas formas de utilización que datan de la era de la cinta magnética todavía
son de uso corriente, incluyendo el corte, la duplicación, el cambio de
velocidad y el reversar en el tiempo. Otras técnicas tales como la conformación
de ondas han tenido su propio desarrollo en la era digital.

Suponga que tenemos almacenadas señales de audio digital, las cuales son sólo
una secuencia de muestras (por ejemplo, números) x[n] para n = 0,...,N – 1,
donde N es la longitud de la secuencia. Entonces, si tenemos una señal de
entrada y[n] (la cual podemos imaginar fluyendo en el tiempo real), podemos
utilizar sus valores como índices para leer los valores de la señal almacenada
x[n]. Esta operación, llamada lectura de tabla de onda nos da una nueva señal
z[n], que se calcula como:

z[n] = x[y[n]]

Representamos esquemáticamente esta operación como se muestra en la figura 2.1.

Viene dos complicaciones. La primera que los valores de entrada y[n], podrían
quedar por fuera del rango 0,...,N – 1, en cuyo caso la tabla de onda x[n] no
tiene valores y la expresión para la salida z[n] queda indefinida. En esta
situación podemos escoger recortar la entrada, es decir, sustituir por 0
cualquier valor negativo y por N – 1 cualquier valor N o mayor que este.
Alternativamente, podemos preferir envolver completamente la entrada de extremo
a extremo. Adoptaremos aquí la convención de que las muestras por fuera del
rango están siempre recortadas. Cuando necesitemos envolver completamente,
introduciremos otra operación de procesamiento de señal que lo hará por
nosotros.

La segunda complicación es que los valores de entrada no necesariamente son


enteros; en otras palabras, ellos podrían caer entre los puntos de la tabla de
onda. Por el momento, sin embargo, sólo redondearemos hacia el valor entero
inferior más cercano del valor de la entrada. A esto lo llamamos lectura de
tabla de onda sin interpolación, y su definición completa es:

x[by[n]c] si 0 ≤ y[n] < N – 1

z[n] = x[0] si y[n] < 0


x[N – 1] si y[n] ≥ N – 1
(donde by[n]c significa “el entero más grande que no excede el valor de y[n]”).

Pictóricamente, utilizamos y[0] (un número) como un sitio sobre el eje


horizontal de la tabla de onda que se muestra en la figura 2.1, y la salida
z[0] el valor que obtengamos en el eje vertical; igual para y[1] y z[1] y así
sucesivamente. El rango “natural” para la entrada y[n] es 0 ≤ y[n] < N. Este
rango es diferente del usual de una señal de audio en la salida del computador,
la cual va de -1 a 1 en nuestras unidades. Veremos más adelante que el rango de
valores de entrada utilizable desde 0 hasta N para la lectura sin interpolación,
se estrecha ligeramente si se utiliza la búsqueda con interpolación.

La figura 2.2 (parte a) muestra una tabla de onda y el resultado de utilizar dos
diferentes señales de entrada como índices de búsqueda dentro de esta. La tabla
de onda contiene 40 puntos, los cuales se numeran de 0 a 39. En la parte (b),
una onda diente de sierra se utiliza como señal de entrada y[n]. Una onda
diente de sierra no es nada más que una función de rampa que se repite de
extremo a extremo. En este ejemplo el rango de la diente de sierra es de 0 a 40
(lo cual se muestra en el eje vertical). La onda diente de sierra de esta manera
lee la tabla de onda de izquierda a derecha -comenzando en el punto 0 hasta el
punto final 39- haciéndolo nuevamente cada vez que se repite. En los cincuenta
punto que se muestran en la figura 2.2 (parte b) la onda diente de sierra hace
dos ciclos y medio. Su período es de veinte muestras, o en otras palabras, la
frecuencia (en ciclos por segundo) es R/20.

La parte (c) de la figura 2.2 muestra el resultado de aplicar la lectura de


tabla de onda utilizando la tabla x[n], para la señal y[n]. Ya que la entrada
de la diente de sierra simplemente lee el contenido de la tabla de onda de
izquierda a derecha, repetidamnte a una velocidad constante de precesión, el
resultado será una nueva señal periódica cuya forma de onda (su forma) es
derivada de x[n] y cuya frecuencia está determinada por la onda diente de
sierra y[n].

Las partes (d) y (e) muestran un ejemplo donde la tabla de onda es leída de
manera no uniforme; debido a que la señal de entrada va incrementalmente de 0 a
N y luego se a regresa a 0, vemos que la tabla de onda aparece primero hacia
adelante, conserva su valor en su punto final y luego va hacia atrás. La tabla
es leída de izquierda a derecha y luego, más rápidamente, es leída de derecha a
izquierda. Al igual que en el ejemplo previo, la señal de entrada controla la
velocidad de precesión mientras las amplitudes de salida son las mismas de la
tabla de onda.

2.1 El oscilador tabla de onda

La figura 2.2 sugiere una manera fácil para sintetizar cualquier forma de onda
fija deseada a la frecuencia que queramos, utilizando el diagrama de bloque que
se muestra en la figura 2.3. El bloque superior es un oscilador -no el oscilador
sinusoidal que vimos anteriormente, si no uno que produce ondas diente de sierra
en lugar de aquél. Sus valores de salida, tal como se indica a la izquierda del
bloque, deben ir desde 0 hasta el tamaño de la tabla de onda N. Este se utiliza
como índice dentro del bloque de lectura de la tabla de onda (que se introdujo
en la figura 2.1), resultando una forma de onda periódica. La figura 2.3 (parte
b) adiciona un generador de envolvente y un multiplicador para controlar la
amplitud de la salida de la misma manera a como lo hace para el oscilador
sinusoidal mostrado en la figura 1.7. Usualmente se utiliza una tabla de onda
con amplitud 1 (pico o RMS), de tal manera que la amplitud de la salida es
precisamente de la misma magnitud que la salida del generador de envolvente.

Los osciladores tabla de onda son utilizados con frecuencia para sintetizar
sonidos con espectro estático, específico. Para hacer esto usted puede pre-
calcular N muestras de cualquier tipo de onda de período N (frecuencia angular
(2¼/N) adicionándole los elementos de la serie de Fourier. El cálculo para el
ajuste de la tabla de onda al principio podría ser significante, pero este puede
realizarse de manera anticipada al proceso de síntesis, el cual a su vez podría
tener lugar en tiempo real.

Mientras la síntesis aditiva directa de ondas complejas, como se mostró en el


capítulo 1, es en principio infinitamente flexible como una técnica para
producir tímbricas que varían en el tiempo, la síntesis de tabla de onda es
mucho menos costosa en términos de computación, pero requiere el cambio de
tablas de onda para variar el timbre. Una técnica intermedia, más flexible y
costosa que la simple síntesis de tabla de onda pero menos flexible y menos
costosa que la síntesis aditiva, es crear mezclas que varíen con el tiempo entre
un pequeño número de tablas de onda. Si el número de tablas de onda es de dos
únicamente, se trata en efecto de un cruzamiento atenuado entre las dos tablas
de onda, tal como se diagrama en la figura 2.4. Suponga que deseamos usar alguna
señal 0 ≤ x[n] ≤ 1 para controlar las fuerzas relativas entre los dos tipos de
onda, de tal manera que si x[n] = 0 obtenemos la primera y si x[n] = 1
obtenemos la segunda. Denotando las dos señales para el cruzamiento atenuado
como y[n] y z[n], calculamos la señal

(1 - x[n])y[n] + x[n]z[n]

o de manera equivalente y usualmente más eficiente para calcular,

y[n] + x[n](z[n] - y[n])

Este cómputo se diagrama en la figura 2.4.

Cuando se utiliza esta técnica para el cruzamiento atenuado entre osciladores de


tabla de onda, es deseable mantener las fases de los parciales correspondientes
iguales a través de las tablas de onda, de tal manera que sus amplitudes se
combinen aditivamente cuando se estén mezclando. De otro lado, si se están
utilizando tablas de onda arbitrarias (extraídas, por ejemplo, de un sonido
grabado) habrá un efecto de fase cuando las diferentes formas de onda se
mezclen.

Este esquema puede extenderse en cadena sucesiva para poder moverse a lo largo
de un camino continuo entre una sucesión de timbres. Alternativamente, o en
combinación con una cadena extensa, el cruzamiento atenuado puede utilizarse
para interpolar entre dos timbres diferentes, por ejemplo como una función de la
dinámica musical. Para hacer esto usted deberá preparar dos o más formas de
ondas de una sola voz sintetizada ejecutada con dinámicas diferentes, e
interpolar entre ellas de manera sucesiva como una función de la salida dinámica
que usted requiera.

2.2 Muestreo

El “muestreo” no es más que grabar una señal en vivo dentro de una tabla de
onda, y luego ejecutarla de nuevo. (En las muestras comerciales la tabla de onda
entera es usualmente denominada “muestra” pero para evitar confusión usaremos la
palabra “muestra” para significar un solo número en una señal de audio digital.)

En su forma más sencilla, un “muestreador” es simplemente un oscilador de tabla


de onda, como se muestra en la figura 2.3, Sin embargo, en una discusión
anterior imaginamos al oscilador funcionando a una frecuencia tan alta que la
percibimos como una nota, por lo menos desde los 30 Hz aproximadamente. Para el
caso del muestreo, la frecuencia es casi siempre menor de 30 Hz y así el
período, de por lo menos 1/30 de segundo, es suficientemente largo como para
escuchar los ciclos individuales como eventos separados.

Regresando a la figura 2.2, suponga que en lugar de una tabla de onda de 40


puntos x[n] es un segundo de grabación con una velocidad de muestras original
de 44100, de tal manera que tiene 44100 puntos; y digamos que y[n] en la parte
(b) de la figura tiene un período de 22050 muestras. Esto nos lleva a una
frecuencia de 2 Hertz. Pero lo que escuchamos no es un sonido o tono musical a 2
ciclos por segundo (es demasiado lento para escucharlo como un tono) si no que
estamos escuchando la grabación original x[n] ejecutada de manera repetida al
doble de la velocidad. Acabamos de re-inventar el muestreo.

En general, si asumimos que la velocidad de las muestras R de la grabación es


la misma que la velocidad de las muestras a la salida, que la tabla de ondas
tiene N número de muestras e indexamos ésta con una onda diente de sierra cuyo
período consta de M número de puntos, la muestra es acelerada o desacelerada
por un factor de N/M, igual a Nf/R si f es la frecuencia en Hertz de la diente
de sierra <esta fórmula hace que varíe la afinación original de la tabla de onda
cuando la diente de sierra cambia de frecuencia, pues si tiene una frecuencia
mayor, ocupará menos muestras y la afinación de la tabla de onda subirá, y
viceversa>. Si denotamos el factor de transposición por t (de tal manera que
por ejemplo, t = 3/2 significa una transposición de una quinta perfecta hacia
arriba), y si denotamos la transposición en semitonos por h, entonces obtenemos
las Fórmulas de Transposición para Tablas de Onda en Lazo

t = N/M = Nf/R
h = 12log2(N/M) = 12log2(Nf/R)

Con frecuencia se conoce la transposición deseada en semitonos (h) y la fórmula


se debe resolver para f o para N:

f = (2h/12R)/N
N = (2h/12R)/f

Hasta ahora hemos utilizado una diente de sierra como onda de entrada y[t] ,
pero tal como se sugiere en las partes (d) y (e) de la figura 2.2, podemos
utilizar cualquier onda que queramos como señal de entrada. En general, la
transposición será dependiente del tiempo y está controlada por la manera en que
cambia la señal de entrada.

La transposición múltiple t y la transposición en semitonos h están


determinadas entonces por las Fórmulas de Transposición Momentáneas para las
Tablas de Onda:

t[n] = |y[n] – y[n - 1]|


h[n] = 12log2|y[n] - y[n - 1]|

(Aquí las barras que cierran “|” significan valor absoluto). Por ejemplo si
y[n] = n, entonces z[n] = x[n] de tal manera que escucharemos la tabla de onda
con su tono original y esto es lo que la fórmula predice ya que, en este caso,

y[n] - y[n - 1] = 1

De otro lado si y[n] = 2n entonces la tabla de onda se transpone una octava


hacia arriba, lo cual es consistente con

y[n] - y[n - 1] = 2 <2n - (2n - 2)>

Si los valores de y[n] decrecen con n, usted escuchará la muestra hacia atrás,
pero la fórmula de transposición dará todavía un multiplicador positivo. Todo
esto de acuerdo con la primera Fórmula de Transposición para las Tablas de Ondas
en Lazo; si una diente de sierra va de 0 a N, f veces por segundo, la
diferencia de las muestras sucesivas es precisamente Nf/R excepto en la muestra
al principio de cada nuevo ciclo.

Es bien sabido que al transponer una grabación también se transpone su timbre


-este es el efecto “chipmunk”. No solamente cualquier periodicidad (tal como
cuando se eleva a un tono) es transpuesta, si no también las frecuencias de los
sobretonos. Algunos timbres, notablemente aquellos de sonidos vocales, tienen
rangos de frecuencia carcaterísticos en los cuales los sobretonos son más
fuertes que los otros más cercanos.

Tales rangos de frecuencia también son transpuestos y esto es escuchado como un


cambio en el timbre. En un lenguaje que será más preciso en la sección 5.1,
decimos que la envolvente espectral es transpuesta junto con el tono o los
tonos.

Tanto en esta como en la sección precendente, consideramos la ejecución de las


tablas de onda de manera periódica. En la sección 2.1 la reproducción es
repetida tan velozmente, que se eleva a un “tono”, es decir entre 30 y 4000
veces por segundo, aproximadamente la tesitura de un piano. En esta sección
asumiremos una tabla de onda de un segundo de longitud, y en este caso factores
de transposición “razonables” (menos de cuatro octavas arriba) podrán elevar a
una velocidad de repetición por debajo de 30, usualmente mucho menor y hacia
abajo, tan grave como se quiera.

El número 30 es significativo por otra razón: es aproximadamente el máximo


número de eventos separados que puede discernir el oído en un segundo; por
ejemplo, 30 fonemas vocales, o notas melódicas o ataques de un redoblante están
cerca de lo que más podemos esperar discernir en un segundo antes de que nuestra
habilidad para distinguirlos falle.

Existe un continuo entre muestreadores y osciladores de tabla de onda, de tal


forma que el parche de la figura 2.3 puede ser tratado como un muestreador (si
la frecuencia de repetición es de menos de 20 Hertz aproximadamente) o como un
oscilador de tabla de onda (si la frecuencia es de aproximadamente 40 Hertz). Es
posible movernos continuamente entre los dos regímenes. Es más, no es necesario
ejecutar una tabla de onda completa en un lazo; con un poco más de aritmética
podemos escoger subsegmentos de la tabla de onda, y estos pueden cambiar en
longitud y localización continuamente cuando se ejecuta la tabla de onda.

La práctica de ejecutar muchos pequeños segmentos de una tabla de onda en rápida


sucesión es usualmente llamada síntesis granular.

La figura 2.5 muestra cómo construír un muy simple muestreador de lazo. En la


figura, si la frecuencia es f y el tamaño del segmento en número demuestras es
s, el factor de transposición de la salida está dado por t = fs/R, donde R es
la velocidad de muestra a la cual fue grabada la tabla de onda (la cual no
necesita ser igual a la velocidad de muestras a la cual trabaja el diagrama de
bloque.) En la práctica, esta ecuación deberá resolverse o para f o para s para
obtener una transposición deseada.

En la figura, un oscilador diente de sierra controla la localización de la


lectura de la tabla de onda, pero los valores inferiores y superiores de la
diente de sierra no están especificados de manera estática tal como lo estaban
en la figura 2.3; en lugar de esto, el oscilador de diente de sierra simplemente
tiene valores de 0 a 1 y este rango se ajusta para seleccionar un segmento
deseado de las muestras en la tabla de onda.

Sería bueno especificar la localización del segmento l sea desde su extremo


izquierdo (su frontera más baja) o desde el punto medio del segmento; en
cualquier caso especificamos la longitud s como un parámetro separado. En el
primer caso, comenzamos multiplicando la diente de sierra por s,de tal manera
que el rango quede de 0 a s; luego adicionamos l de tal manera que ahora el
rango vaya de l a l + s. Para especificar la localización a partir del punto
medio del segmento, primero sustraemos 1/2 de la diente de sierra (así su rango
queda de -1/2 a 1/2), y luego, tal como se hizo antes, multiplicamos por s (de
tal manera que el rango queda entre -s/2 y s/2) y añadimos l para que el rango
quede de l-s/2 a l+s/2.

En el muestreador de lazo, debemos mantener la continuidad entre el comienzo y


el final de los segmentos de la tabla de onda; nos ocuparemos de esto en la
próxima sección.

Un detalle adicional es que, si el tamaño del segmento y su localización están


cambiando en el tiempo (podrían ser señales de audio digital también, por
ejemplo), afectarán el factor de transposición, y la afinación o el timbre de la
señal de salida podrían ondular hacia arriba y hacia abajo como consecuencia de
esto. La forma más simple para evitar este problema es sincronizar los cambios
en los valores de s y l con las discontinuidades regulares de la diente de
sierra; ya que la señal salta de manera discontinua, la transposición no está
realmente definida aquí de ninguna manera, y, si está haciendo envolvente para
esconder la discontinuidad, el efecto de cambio en s y l también queda oculto.

2.3 Muestreadores de envolvente

En las secciones previas consideramos la lectura de una tabla de onda ya fuera


de manera esporádica o de manera repetida para hacer un muestreador. En la
mayoría de las aplicaciones reales debemos trabajar para que las muestras
inicien y paren de manera limpia, de tal manera que la señal de salida no salte
de manera discontinua al comienzo y al final de las muestras. Esta
discontinuidad puede sonar como un “click” o como un “thump” dependiendo de la
tabla de onda.

La manera más fácil de hacerlo, asumiendo que la tabla de onda se ejecutará


desde el principio hasta el fin, es simplemente prepararla con anticipación de
tal manera que su amplitud entre gradualmente al inicio y se atenúe de igual
manera al final. Esto es posible hacerlo incluso cuando se graban las muestras
de la tabla de onda en vivo, multiplicando la señal de entrada por una
envolvente segmento de línea, que tenga la misma longitud de la grabación.

En muchas situaciones es inconveniente o imposible pre-envolver la tabla de onda


-por ejemplo si quisiéramos reproducir sólo una parte de ésta o si quisiéramos
cambiar la pendiente de la envolvente dinámicamente. En la sección 1.5 vimos
cómo controlar la envolvente de los osciladores sinusoidales utilizando la
multiplicación por una función rampa (también conocida como generador de
envolvente), y reconstruimos esta noción en los osciladores de tabla de onda de
las figuras 2.3 y 2.4. Esto también funciona para iniciar y finalizar las
muestras evitando discontinuidades, pero con una gran diferencia: toda vez que
en la síntesis de tabla de onda éramos libres de asumir las formas de ondas
lineales de extremo a extremo, de tal manera que podíamos escoger cualquier
tiempo para esta envolvente, en el caso del muestreo, al utilizar formas de onda
no preparadas, estamos obligados a tener valor cero del generador de envolvente
al momento de alcanzar el final de la tabla de onda por primera vez. Esta
situación se grafica en la figura 2.6.

En situaciones donde una tabla de onda arbitraria debe repetirse tantas veces
como se requiera, la forma más sencilla de hacer que el lazo trabaje de manera
continua es arreglar las cosas para que el cambio de amplitud se sincronice con
el lazo, utilizando una tabla de onda aparte (la envolvente). Esto se puede
implementar según se muestra en la figura 2.7. Un solo oscilador diente de
sierra se utiliza para calcular los índices de lectura de las dos tablas, la que
contiene el sonido grabado y la que hace la forma de la envolvente. De lo que
más debemos preocuparnos es que las entradas para ambas tablas de onda tengan su
propio rango correspondiente.
En muchas situaciones es deseable combinar dos o más copias del muestreador de
lazo de la tabla de onda a la misma frecuencia y a una relación de fase
específica. Esto puede hacerse de tal manera que cuando una de ellas en
particular llegue al final del segmento, otra u otras estén en la mitad de ese
segmento, de tal manera que todas en conjunto hacen un sonido continuo. Para
lograrlo, requerimos una manera de generar dos o más ondas diente de sierra con
la relación de fase deseada para utilizarlas en lugar del oscilador de la parte
superior de la figura 2.7. Podemos comenzar con una sola onda diente de sierra y
luego producir las otras con una relación de fase fija con la primera. Si
queremos una diente de sierra que esté, digamos, a ciclos por delante de la
primera, simplemente añadimos el parámetro a y luego tomamos la parte
fraccional, que es la nueva diente de sierra que queríamos, tal como se muestra
en la figura 2.8.

2.4 Estiramiento del timbre

El oscilador tabla de onda de la sección 2.1, que extendimos en la sección 2.2


para encerrar ondas de tablas de onda arbitrarias tales como sonidos grabados,
puede adicionalmente extenderse de una manera complementaria, que denominaremos
estiramiento del timbre por razones que desarrollaremos en esta sección. Hay
muchas otras maneras de extender la síntesis de tablas de onda como por ejemplo
la modulación de la frecuencia y la conformación de onda, pero las dejaremos
para capítulos posteriores.

La idea central del estiramiento del timbre es reconsiderar la idea del


oscilador tabla de onda como un mecanismo para ejecutar una tabla de onda (o
parte de ésta) almacenada de extremo a extremo. No hay razón para que el final
de un ciclo deba coincidir con el comienzo del siguiente. En lugar de esto
podríamos buscar la manera de espaciar las copias de la onda insertando
silencios alternativamente; o, yendo en la dirección opuesta, las copias de la
onda podrían estar tan juntas que se traslapen. El único parámetro disponible en
la sección 2.1 -la frecuencia- ha sido utilizado hasta aquí para controlar dos
aspectos separados de la salida: el período al cual comenzamos las nuevas copias
de la onda, y la longitud de cada copia individual. La idea del estiramiento del
timbre es controlar las dos de manera independiente.

La figura 2.9 muestra el resultado de ejecutar una tabla de onda de tres maneras
diferentes. En cada caso la onda de salida tiene un período de 20; en otras
palabras, la frecuencia de salida es R/20, siendo R la velocidad de salida de
las muestras <si R = 44100, la frecuencia de salida es 2205 Hz; así el período
de 20 muestras se hace en 1/2205 segundos> En la parte (a) de la figura, cada
copia de la onda es ejecutada en 20 muestras, de tal manera que la forma de la
onda queda exactamente dentro del ciclo, sin espacios ni traslapes. En la parte
(b) aunque el período sigue siendo 20, la onda se comprime en el medio a la
mitad del período (10 muestras); o, en otras palabras, el ciclo de trabajo -la
cantidad relativa de tiempo en el cual la onda llena el ciclo- es del 50 por
ciento. Durante el 50 por ciento restante la salida es cero.

En la parte (c) la onda es estirada a 40 muestras, y ya que ésta se repite


todavía cada 20 muestras, las ondas se traslapan dos a uno. El ciclo de trabajo
es, de esta manera, del 200 por ciento.

Suponga ahora que el ciclo de tarea del 100 por ciento de la onda tiene una
serie de Fourier (sección 1.7) igual a:

x100[n] = a0 + a1cos(!n + Á1) + a2cos(2!n + Á2) + ...

donde ! es la frecuencia angular (igual a ¼/10 en nuestro ejemplo ya que el


período es 20 <es decir, se recorre la distancia de 2¼ en 20 muestras, así la
frecuencia angular es 2¼/20 = ¼/10>.) Para simplificar este ejemplo no nos
preocuparemos de dónde debe terminar la serie, y la dejaremos ir al infinito.

Nos gustaría relacionar esta con las series de Fourier de las otras dos ondas
del ejemplo, con el fin de mostrar cómo cambiando el ciclo de trabajo, cambia el
timbre. Para el caso del ciclo con el 50 por ciento de ciclo de trabajo
(denominamos la señal x50[n]) observamos que la onda, si la replicamos con una
fase equivalente a la mitad del período y adicionamos otra, nos da exactamente
la onda original al doble de la frecuencia:

x100[2n] = x50[n] + x50[n + ¼/!]

<como si a la onda que ocupa la mitad del período le pusiéramos otra en la otra
mitad vacía del período; se obtiene una onda una octava más aguda -al doble de
la frecuencia> donde ! es la frecuencia angular (y así ¼/! es la mitad del
período) de ambas señales. De esta manera, si escribimos la serie de Fourier de
x50[n] como:

x50[n] = b0 + b1cos(!n + µ1) + b2cos(2!n + µ2) + ...

y sustituimos las series de Fourier para todos los tres términos de arriba,
tenemos:

a0 + a1cos(2!n + Á1) + a2cos(4!n + Á1) + ...

= b0 + b1cos(!n + µ1) + b2cos(2!n + µ2) + ...


+ b0 + b1cos(!n + ¼ + µ1) + b2cos(2!n + 2¼ + µ2) + ...

= 2b0 + 2b2cos(2!n + µ2) + 2b4cos(4!n + µ4) + ...

y así

a0 = 2b0, a1 = 2b2, a2 = 2b4

sucesivamente: en cuanto a los parciales pares de x50, se obtienen estirando los


de x100 el doble, al alejarse. <recordar que en la gráfica se compara la magnitud
de a1 con la de b2, no con la de b1> (No sabemos nada aún de los parciales
impares de x50, los cuales podrían estar en línea con los parciales pares o no,
dependiendo de factores que no podemos controlar todavía. Basta con decir, por
el momento, que si las ondas se conectan suavemente con el eje horizontal en
ambos extremos, los parciales impares actuarán globalmente como los pares. Para
hacer esto con mayor exactitud necesitaremos análisis de Fourier, el cual es
desarrollado en el capítulo 9.)

De manera similar, x100 y x200 están relacionadas de la misma manera:

x200[2n] = x100[n] + x100[n + ¼/!]

de tal manera que, si las amplitudes de las series de Fourier de x200 se denotan
como c0, c1, ..., obtenemos:

c0 = 2a0, c1 = 2a2, c2 = 2a4, ...

de tal manera que los parciales de x200 son aquellos de x100 comprimidos a la
mitad, y hacia la izquierda.

Vemos que comprimir la onda por un factor de 2 tiene el efecto de estirar la


serie de Fourier por dos, y de otro lado, estirar la onda por un factor de dos
comprime la serie de Fourier por dos. Siguiendo el mismo argumento, en general
al estirar la onda por un factor cualquiera posible f comprime los sobretonos,
en frecuencia, por el recíproco 1/f -por lo menos aproximadamente, y esta
aproximación es buena si la onda se “comporta bien” en sus extremos. (Como lo
veremos más adelante, la onda puede forzarse para comportarse razonablemente
bien envolviéndola como se muestra en la figura 2.7.)

La figura 2.10 muestra el espectro de las tres ondas -o en otras palabras la


onda en sus tres ciclos de trabajo- de la figura 2.9. En la figura se enfatiza
la relación entre los tres espectros, trazando curvas a través de cada espectro,
las cuales, por inspección, tienden a convertirse en la misma curva, únicamente
estiradas de manera diferente; cuando el ciclo de trabajo aumenta, la curva se
comprime a la izquierda (todas la frecuencias caen) y se amplifican (se estira
hacia arriba).

Las curvas continuas tienen una interpretación muy simple. Imagine comprimir la
onda en un muy pequeño ciclo de trabajo, por decir del 1 por ciento. El contorno
se estirará por un factor de 100. Yendo hacia atrás, esto nos permitiría
interpolar entre cada par de puntos consecutivos del 100 por ciento del contorno
del ciclo de trabajo (el original) 99 puntos nuevos. Como ya se ve en la figura
el ciclo de tarea del 50 por ciento define la curva con el doble de resolución
de la curva original. En el límite, si el ciclo de trabajo se hace muy pequeño,
el espectro se llena más y más densamente; el límite es el espectro “real” de la
onda.

Este espectro “real” se escucha únicamente a muy bajos ciclos de trabajo, sin
embargo. En el ejemplo del 200 por ciento de ciclo de trabajo desaparece el pico
en el espectro ideal (continuo) debido a que el pico cae por debajo del primer
armónico. En general los ciclos de trabajo altos son una muestra ideal de la
curva a más bajas resoluciones <Al estirar la onda a ciclos de trabajo cada vez
más bajos -menos del 100%-, se escuchan armónicos cada vez más altos, estos se
fortalecen y el espectro se amplía; pero al subir los ciclos de trabajo por
encima del 100% los armónicos altos pierden fortaleza y los más bajos son los
que se fortalecen>.

El estrechamiento del timbre es una técnica extremadamente poderosa para generar


sonidos con un espectro variable. En combinación con las posibilidades de
mezclar las ondas (sección 2.1) y de poder escoger entre un sin fin de ondas
variables de sonidos grabados en muestras (sección 2.2), es posible generar todo
tipo de sonidos. Por ejemplo, el diagrama de bloque de la figura 2.7 nos da una
manera de grabar y estirar formas de onda de una tabla de onda grabada. Cuando
el parámetro “frecuencia” f es suficientemente alto como para escucharse como
un tono, el parámetro “tamaño” s puede tomarse para controlar el estiramiento
del timbre, vía la fórmula t = fs/R de la sección 2.2 <tomar este parámetro
para controlar el estiramiento del timbre no cumple exactamente con el cometido
inicial del estiramento, pues al dar a s un valor menor que el de N (número de
muestras de la tabla) se recorta la tabla, y el cambio del espectro sonoro
obedecerá tanto a dicho recorte como al acortamiento del ciclo de trabajo>, con
lo que ahora reinterpretamos t como el factor por el cual se estira el timbre
<se había presentado en esa sección 2.2 como “factor de transposicón”>.

2.5 Interpolación

Como se mencionó anteriormente, los esquemas de interpolación son utilizados


normalmente para incrementar la exactitud de la lectura de tabla. Haremos aquí
un cálculo algo simplificado de los efectos de los tamaños de la tabla de onda y
de los esquemas de interpolación en el resultado de la lectura de tabla.

Para hablar del error en la lectura de tabla de onda, debemos ver la tabla de
onda como una versión en muestras de una función subyacente. Cuando buscamos un
valor de esa función subyacente que está entre los puntos de la tabla de onda,
el error es la diferencia entre el resultado de la lectura de la tabla de onda y
el valor “ideal” de la función en ese punto. Los estudios más relevantes del
error en la lectura de tabla de onda asumen que la función subyacente es una
sinusoide (ver página 1). Podemos entender entonces lo que sucede con otras
tablas de onda considerándolas como superposiciones (sumas) de sinusoides.

La seguridad de la lectura de una tabla de onda conteniendo una sinusoide


depende de dos factores: de la calidad del esquema de interpolación, y del
período de la sinusoide. En general mientras más largo es el período de la
sinusoide, el resultado es más exacto.

En el caso de una tabla de onda sintetizada, podemos conocer sus componentes


sinusoidales al especificarlos -en cuyo caso basta con escoger un tamaño de
tabla de onda apropiado al momento de calcular la tabla de onda, para que se
ajuste con el algoritmo de interpolación y encontrar así el nivel deseado de
exactitud. En el caso de sonidos grabados, el análisis de exactitud podrían
dirigirnos a ajustar la velocidad de las muestras de la grabación, ya sea
ajustando la salida o a hacer un nuevo muestreo.

El error de interpolación para una tabla de onda sinusoidal puede tener dos
componentes: el primero, que la señal continua (el resultado teórico de leer la
tabla de onda continuamente en el tiempo, tal como si la velocidad de las
muestras fuera infinita) podría no ser una sinusoide pura; y el segundo, que la
amplitud podría ser errónea. (Es posible tener errores de fase también, pero
únicamente por descuido.)

En el desarrollo únicamente consideraremos esquemas de interpolación polinomial


tales como el redondeo, la interpolación lineal y la interpolación cúbica. Estos
esquemas dan valores al evaluar polinomios (de grado cero, uno y tres
respectivamente) en los intersticios entre los puntos de la tabla de onda. La
idea es que para cualquier índice x, escojamos un punto de referencia cercano
x0, y hagamos que la salida se calcule por algún polinomio:

yINT(x) = a0 + a1(x – x0) + a2(x – x0)2 + ... + an(x – x0)n

Usualmente escogemos el polinomio que pasa a través de los puntos n + 1 más


cercanos de la tabla de onda. Interpolación de 1 punto (polinomio de grado cero)
significa dejar a0 igual al punto más cercano de la tabla de onda. Para la
interpolación de dos puntos, dibujamos un segmento de línea entre los dos puntos
de la tabla de onda a cada lado del punto deseado x. Podemos hacer que x0 sea el
entero más cercano a la izquierda de x (lo que escribimos como ⎣x⎦) y entonces
la fórmula para la interpolación lineal es:

yINT(x) = y[x0] + (y[x0 + 1] – y[x0]).(x – x0)

el cual es un polinomio, como en la fórmula previa, con

a0 = y[x0]
a1 = y[x0 + 1] – y[x0]

En general usted puede ajustar un polinomio de grado n -1 a través de cualquier


número de puntos n, en tanto sus valores x sean todos diferentes.

La figura 2.11 muestra el efecto de utilizar interpolación lineal (dos puntos)


para rellenar una sinusoide de periodo 6. De los tres trazos que se dibujan,
desde arriba hacia abajo, aparecen: la sinusoide original, el resultado de la
interpolación lineal entre los 6 puntos del período utilizado para representar
la sinusoide y, finalmente, otra sinusoide, ligeramente más pequeña en amplitud,
la cual es la que mejor coincide con la onda de los seis segmentos. El error
introducido al reemplazar la sinusoide original por la versión con interpolación
lineal tiene dos componentes: el primero, un cambio en la amplitud (que es poco
perceptible) y el segundo, una distorsión en la forma de la onda (la cual es muy
perceptible).

La gráfica inferior en la figura muestra la diferencia entre la onda interpolada


y la sinusoide que mejor le encaja. Esta es una señal residual de todas aquellas
energías que están en los sobretonos de la sinusoide original. Si el número de
puntos se incrementa, el error disminuye en magnitud. Ya que el error es la
diferencia entre una sinusoide y una secuencia de aproximación de segmentos, la
magnitud del error es aproximadamente proporcional al cuadrado de la diferencia
de fase entre cada par de puntos, o en otras palabras, inversamente proporcional
al cuadrado del número de puntos de la tabla de onda. Puesto de otra manera, el
error en la tabla de onda decrece 12 dB cada vez que la tabla dobla su tamaño.
(Esta regla es buena únicamente para tablas con 4 puntos o más.)

La interpolación de cuatro puntos (cúbica) trabaja de manera similar. La fórmula


para la interpolación es:

yINT(x) = -f(f – 1)(f – 1)/6.y[x0 - 1] + (f + 1)(f – 1)(f – 2)/2.y[x0] -(f


+ 1)f(f – 2)/2.y[x0 + 1] + (f + 1)f(f – 1)/6.y[x0 + 2]

donde f = x – x0 es la parte fraccional del índice. Para tablas con 4 o más


puntos, doblar el número de puntos de la tabla tiende a mejorar el error RMS en
24 dB. La tabla 2.1 muestra el error RMS calculado para sinusoides en varios
períodos, para 1, 2 y 4 puntos de interpolación. (Una cantidad ligeramente
diferente se mide en [Moo90, pág.164]. Aquí, los errores en amplitud y fase se
pueden añadir llegando a resultados ligeramente más pesimistas. Ver también
[Har87].)

El dominio de entrada disponible para la lectura de la tabla depende del número


de puntos de interpolación. En general, cuando usamos k-puntos de interpolación
en una tabla con N puntos, el rango está sobre un intervalo de N + 1 – k
puntos. Si k = 1 (es decir, sin ningún tipo de interpolación), el dominio es de
0 a N (incluyendo el punto final en 0 pero excluyendo el que queda en N)
asumiendo que los valores de entrada están truncados (tal como se hace para leer
tabla no interpolada en Pd). El dominio es de -1/2 a N - 1/2 si, en cambio,
redondeamos la entrada al entero más cercano en lugar de interpolar. En
cualquier caso el dominio se estira sobre una longitud de N puntos.

Para la interpolación de dos puntos, la entrada debe quedar entre el primer y el


último puntos, esto es, entre 0 y N - 1. De esta manera N puntos son
suficientes para definir la función sobre un dominio de longitud N – 1. Para
interpolación de cuatro puntos, no podemos tener valores de entrada entre 0 y 1
(no podemos tener los dos puntos requeridos a la izquierda de la entrada) y
tampoco podemos tenerlos para el espacio entre los dos últimos puntos (N – 2 y
N – 1). Así en este caso el dominio va de 1 a N – 2 y tiene una longitud N – 3.

Las ondas periódicas almacenadas en tablas de onda requieren tratamiento


especial en los extremos de la tabla. Por ejemplo, suponga que queremos
almacenar una sinusoide pura de longitud N. Para leer una tabla sin
interpolación, es suficiente ajustar, por ejemplo,

x[n] = cos(2¼n/N), n = 0, ..., N - 1

Para interpolación de dos puntos, necesitamos N + 1 puntos:

x[n] = cos(2¼n/N), n = 0, ..., N

En otras palabras debemos repetir el primer punto (n = 0) al final, de tal


manera que el último segmento de N - 1 a N alcance a regresar al valor inicial.

Para la interpolación de cuatro puntos, el ciclo debe ajustarse para iniciar en


el punto n = 1 , ya que no podemos obtener valores de interpolación apropiados
para valores de entrada menores que uno. Si, entonces, un ciclo de la tabla de
onda se arregla de 1 a N, debemos suplir los puntos extra para 0 (copiado de
N), y también N + 1 y N + 2 copiados de 1 y 2, para hacer una tabla de longitud
N + 3. Para la misma sinusoide de arriba, la tabla deberá contener:

x[n] = cos(2¼(n - 1)/N), n = 0, ..., N + 2

2.6 Ejemplos

Oscilador tabla de onda

El ejemplo B01.wavetables.pd, mostrado en la figura 2.12, implementa un


oscilador tabla de onda, el cual reproduce desde una tabla de onda denominada
“table10”. Dos nuevos objetos Pd se muestran aquí. El primero es la tabla de
onda misma, que aparece a la derecha en la figura. Usted puede arrastrar el
ratón sobre la tabla de onda para cambiar su forma y escuchar el cambio en el
sonido resultante. No se muestra en la figura pero se demuestra en el parche Pd
la facilidad para calcular tablas de onda automáticamente con amplitudes
específicas de los parciales, lo cual es a veces preferible a dibujar ondas a
mano. Usted también puede leer y escribir tablas (texto o sonido) en archivos
para intercambiar datos con otros programas. La otra novedad es un objeto de la
clase:

tabosc4~: un oscilador tabla de onda. El “4” indica que esta clase utiliza
interpolación de 4 puntos (cúbica). En el ejemplo, el nombre de la tabla,
“table10”, está especificado como un argumento para la creación del objeto
tabosc4~. (Usted también puede cambiar dinámicamente de tablas de onda enviando
el mensaje apropiado al objeto.)

Las tablas de onda utilizadas por tabosc4~ deben tener siempre un período igual
a una potencia de dos; pero como se mostró antes, la tabla de onda debe tener
tres puntos extras envolviendo los extremos. Las longitudes de tabla disponibles
son así de la forma 2m + 3, tales como 131, 259, 515, etc.

Los osciladores tabla de onda no están limitados a utilizarse como osciladores


de audio. El parche B02.wavetable.FM.pd (que no se muestra aquí) utiliza un par
de osciladores de tabla de onda en serie. La salida del primero es utilizado
como la entrada del segundo, y de esta manera controla su frecuencia, la cual
cambia periódicamente en el tiempo.

Lectura de tabla de onda en general

El objeto tabosc4~, aunque es práctico y eficiente, es algo especializado y para


muchas de las aplicaciones descritas en este capítulo necesitaremos algo más
general. El ejemplo B03.tabread4.pd (figura 2.3) demuestra la técnica de
estiramiento de timbre discutida en la sección 2.4. Este es un ejemlo simple de
una situación donde tabosc4~ no sería suficiente. Hay nuevos objetos aquí:

tabread4~: lectura de tabla de onda. Al igual que con tabosc4~ la tabla se lee
utilizando interpolación de 4 puntos. Pero aunque tabosc4~ toma una frecuencia
como entrada y automáticamente lee la forma de onda en patrón repetido,
tabread4~ es más sencillo y espera el índice de lectura de tabla de onda como
una entrada. Si se quiere utilizarlo para hacer algo repetitivo, como en este
ejemplo, la entrada misma debe ser una onda repetida. Al igual que tabosc4~ (y
todos los demás objetos de lectura y escritura de tablas), usted puede enviar
mensajes para seleccionar cuál tabla utilizar.

tabwrite~: graba una señal de audio en una tabla de onda. En este ejemplo
tabwrite~ se utiliza para mostrar la salida (aunque más tarde lo utilizaremos
para otro tipo de cosas.) Cada vez que recibe un mensaje “bang” del ícono botón
sobre éste, tabwrite~ comienza a escribir muestras sucesivas de su entrada en la
tabla nombrada.

El ejemplo B03.tabread4.pd muestra cómo combinar un objeto phasor~ y uno


tabread4~ para hacer un oscilador tabla de onda. La salida de phasor~ tiene un
rango de valores de 0 a 1. En este caso la tabla de onda de entrada, denominada
“waveform12”, es de 131 elementos de logitud. El dominio para el objeto
tabread4~ es así de 1 a 129. Para ajustar el rango de phasor~ según esto, lo
multiplicamos por la longitud del dominio (128) de tal manera que vaya de 0 a
128, y luego adicione 1, deslizando el intervalo de manera efectiva a la
derecha, en un punto. Este reescalado se hace con los objetos *~ y +~ entre
phasor~ y tabread4~.

Con solamente estas cuatro cajas habríamos reinventado en escencia el objeto


tabosc4~. En este ejemplo, sin embargo, la multiplicación no es por una
constante 128 si no por una cantidad variable controlada por el parámetro
“squeeze”. La función de las cuatro cajas a la derecha del parche es suministrar
al objeto *~ los valores para escalar a phasor~. Para esto se hace uso de una
nueva clase de objeto:

pack: se compone de una lista de dos o más elementos. La creación de los


argumentos establece el número de estos, sus tipos (usualmente números) y sus
valores iniciales. Las entradas (serán según la cantidad que se especifique en
la creación de argumentos) actualizan los valores de los mensajes de los
argumentos, y, si se cambia la entrada de la izquierda (o si simplemente se
dispara con un mensaje “bang”), el mensaje va a la salida.

En este parche los argumentos son inicialmente 0 y 50, pero la caja de número
actualizará el valor del primer argumento, de tal manera que, según se muestra,
el mensaje más reciente que salió del objeto pack fue “206 50”. El efecto de
esto sobre el objeto line~ que está debajo es una pendiente al valor 206 en 50
milisegundas; en general la salida del objeto line~ es una señal de audio que de
manera suave sigue los cambios esporádicos en los valores de la caja de número
etiquetada “squeeze”.

Finalmente 128 es adicionado al valor “squeeze”; si “squeeze” toma valores no


negativos (tal como lo fuerza la caja de número en este parche), el
multiplicador de ajuste de rango hace que phasor~ se multiplique por 128 o más.
Si este valor es mayor que 128 el efecto es que la función “phasor” re-escalada
gaste alguna fracción de su ciclo atorada al final de la tabla de onda (lo cual
recorta su entrada a 129). El resultado es que la onda es leída sobre alguna
fracción del ciclo. Como se muestra, la onda es comprimida a 128/(128+206) de un
ciclo, de tal forma que el espectro se estira por un factor de casi 1/2 <de esta
manera se logra la escencia del estiramiento de la tabla de onda, y realmente no
se modifica directamente el parámetro s (y por lo tanto la onda misma no se
recorta) según se proponía en el diagrama de bloques, si no que, dejando el
tamaño de la muestra fijo (128 muestras) se modifica la longitud de la diente de
sierra desde un mínimo dado por ese tamaño y de allí en adelante, según el
número “squeeze” que se le sume, lo que da como resultado los ciclos de trabajo
menores que 1>.

Para simplificar, este parche es sutilmente diferente del ejemplo de la sección


2.4 en el que las ondas son comprimidas hacia el comienzo de cada ciclo y no
hacia la mitad. Esto tiene el efecto de cambiar ligeramente la fase de varios
parciales de la onda cuando se estira y cuando se comprime; si el factor de
compresión cambia rápidamente, la deriva correspondiente de la fase sonará como
una ligera variación en el tono. Esto se puede evitar utilizando un arreglo
ligeramente más complicado: sustraer 1/2 de phasor~, multiplicarlo por 128 o más
y luego añadir 65 en lugar de uno.

Utilizando una tabla de onda como un muestreador

El ejemplo B04.sampler.pd (figura 2.14) muestra cómo utilizar una tabla de onda
como un muestreador. En este ejemplo el índice dentro de la muestra (la tabla de
onda) es controlado al accionar el ratón sobre la caja de número que se
encuentra en la parte superior. Una escala conveniente para la caja de número es
de centésimas de segundo; para convertirlo a muestras (tal como lo requiere la
entrada de tabread4~) multiplicamos por 44100 muestras/s por 0.01 s para obtener
441 muestras por unidad, antes de aplicar pack y line~ de la misma manera que lo
utilizamos en ejemplo previo. La transposición que usted escucha depende de qué
tan rápido mueva el ratón arriba y abajo. Este ejemplo ha introducido un nuevo
tipo de objeto:

hip~: un filtro simple pasa-altos (corta-graves). El argumento proporciona la


frecuencia que se elimina en ciclos por segundo. Utilizamos esto aquí para
eliminar la salida constante (frecuencia cero) cuando la entrada se situa en una
sola muestra (cada que usted no esté cambiando de manera activa el sitio de
lectura con el ratón). Los filtros se discuten en el capítulo 8.

Los objetos pack y line~ en este ejemplo no se incluyen únicamente para hacer el
sonido más continuo, si no que son esenciales para hacer el sonido entendible.
Si el índice de lectura de la tabla de onda cambia simplemente cada que el ratón
se mueve un pixel (por decir, veinte a quince veces por segundo) la gran mayoría
de las muestras tendrán el mismo índice que la muestra anterior (las otras
44100+ muestras, sin contar aquellas donde el ratón se ha movido). De esta
manera la velocidad de precesión será casi siempre cero. En lugar de cambiar las
transposiciones, usted escuchará arena de 20 a 50 ciclos por segundo. (Trate de
encontrar cómo suena esto!)

Muestreadores de lazo

En la mayoría de las situaciones, usted querrá una forma más automática para
especificar los sitios de lectura de la tabla de onda, que hacerlo con el
movimiento del ratón; por ejemplo, usted podría querer ser capaz de ejecutar una
muestra en una transposición fija; usted podría tener varias muestras
reproduciéndose a la vez (u otras cosas que requieran de atención), o usted
podría querer cambiar rápidamente entre muestras o ir a sitios pre-fijados de la
tabla de onda. En los pocos ejemplo siguientes desarrollaremos un lector de
muestras enlazadas automático, el cual, aun cuando es una de las múltiples
posibilidades, es una poderosa y muy utilizada.

Los parches B05.sampler.loop.pd y B06.sampler.loop.smooth.pd muestran cómo hacer


esto: el primero de la manera más sencilla posible y el segundo (que se muestra
en la figura 2.15, parte a) incorporando una segunda onda para envolver el
sonido según se describe en la sección 2.3. Un nuevo tipo de objeto se introduce
aquí:

cos~: calcula el coseno de 2¼ veces la entrada de la señal (de tal manera que de
0 a 1 hace un ciclo completo). A diferencia de la tabla que lee objetos en Pd,
cos~ maneja la envolvente de tal manera que no hay limitación de rango en su
entrada.

En la figura 2.15, (parte a), un objeto phasor~ proporciona los índices de la


tabla de onda (a la derecha) y la fase para la función de envolvente de mitad de
coseno a la izquierda. Estas dos se multiplican y el producto es filtrado por un
filtro pasa-altos, y enviado a la salida de audio. La lectura de la tabla de
onda es directa; el fasor es multiplicado por un parámetro “chunk size” <”tamaño
de segmento”>, adicionado a 1, y utilizado como un índice para tabread4~. El
parámetro tamaño de segmento se multiplica por 441 para convertirlo de
centésimos de segundo a muestras. Esto corresponde exactamente al diagrama de
bloque que se muestra en la figura 2.5, con una localización de segmento de 1.
(la localización del segmento no puede ser 0 debido a que 1 es el índice mínimo
para el cual trabaja tabread4~.)

El camino de la señal a la izquierda en el ejemplo corresponde a la técnica de


lectura de tabla de onda envolvente mostrado enla figura 2.7. Aquí la onda
diente de sierra está ajustada al rango (-1/4, 1/4) (al sustraer y multiplicar
por 0.5), y luego lo envía a cos~. Este lee la función coseno en el rango (-¼/2,
¼/2), dándole de esta manera la mitad positiva de la onda.

La parte (b) de la figura 2.15 introduce un tercer parámetro, el “read point”


<“punto de lectura”> el cual especifica en qué punto de la muestra debe comenzar
el lazo. (En la parte (a) siempre se comenzaba al inicio). El cambio necesario
es simple: adicionar el valor de control para el “punto de lectura”, en
muestras, para el índice de la tabla de ondas y proceder como antes. Para evitar
discontinuidades en el índice suavizamos el valor del punto de lectura
utilizando los objetos pack y line~ tal como lo hicimos en el primer ejemplo
del muestreador (figura 2.14).

Esto pone de relieve un importante aunque sutil asunto. La Fórmula de la


Transposición Momentánea (página “33”) predice que mientras el tamaño del
segmento y el punto de lectura no estén cambiando en el tiempo, la transposición
es la frecuencia por el tamaño del segmento (como siempre, utilizando unidades
apropiadas, Hertz y segundos, por ejemplo, de tal manera que el producto es sin
dimensiones). Sin embargo, al variar el tamaño del segmento y el punto de
lectura en el tiempo se afectará la transposición momentánea, usualmente de
maneras muy notables, tal como se puede escuchar en el ejemplo
B07.sampler.scratch.pd. El ejemplo B08.sampler.nodoppler.pd (el que se muestra
en la figura) muestra una forma posible de controlar este efecto, introduciendo
un nuevo tipo de objeto:

samphold~: una unidad de muestra y retención. (Esta será familiar para los
usuarios de los sintetizadores análogos, pero con un giro digital; para más
detalles ver la sección 3.7.) Esta almacena una sola muestra de la entrada de la
mano izquierda y la envía a la salida de manera repetida hasta que actue la
entrada de la derecha (que es también una señal de audio digital llamada el
gatillo) para sobre-escribir la muestra almacenada con una nueva -de nuevo desde
la entrada izquierda. La unidad adquiere una nueva muestra siempre y cuando el
valor numérico del gatillo caiga desde una muestra a la siguiente. Está diseñada
para que funcione bien con los objetos phasor~, para facilitar los disparos en
fase con las envolventes.

El ejemplo B08.sampler.nodoppler.pd utiliza dos objetos samphold~ para


actualizar los valores de tamaño de segmento y de punto de lectura, exactamente
cuando el phasor~ realice la envolvente, momento en el cual la envolvente coseno
es cero y así el efecto del cambio instantáneo no pueda escucharse. En esta
situación podemos utilizar la Fórmula de Transposición para Tablas de Onda en
Lazo, que es más sencilla, para relacionar la frecuencia, el tamaño del segmento
y la transposición. Esto se demuestra en el ejemplo B09.sampler.transpose.pd
(que no se muestra).

Muestra enlazada traslapada

Tal como se describió en la sección 2.3, a veces es deseable utilizar dos o más
muestras enlazadas traslapadas para producir un sonido razonablemente continuo
sin tener que envolver de manera muy aguda en los extremos del lazo. Esto es
especialmente útil en situaciones donde el segmento que está enlazado es corto,
una décima de segundo o menos. El ejemplo B10.sampler.overlap.pd, que se muestra
en la figura 2.16 (parte a), realiza dos lazos de muestras con medio ciclo de
diferencia de fase entre ellas. Los nuevos tipos de objetos son:

loadbang: proporciona una salida con el mensaje “bang” al cargar el parche. Es


utilizado en este parche para asegurar que la división de la transposición por
el tamaño del segmento tiene un factor de transposición válido en caso de que
“tamaño del segmento” se mueva con el ratón en primer lugar.

expr: evalúa expresiones matemáticas. Las variables aparecen como $f1, $f2, y
así se corresponden con las entradas de los objetos. Las operaciones matemáticas
se permiten, con paréntesis para agrupar, y se suministran muchas librerías de
funciones tales como la potenciación, la cual se muestra en este ejemplo como
“pow” (función de potenciación).

wrap~: envuelve el intervalo de 0 a 1. Así, por ejemplo, 1.2 lo convierte en


0.2; 0.5 queda tal cual; y -0.6 lo convierte en 0.4.

send~, s~, receive~, r~: versiones de señal de audio de send y receive. Una
señal de audio enviada a un objeto send~ aparece en la salida de cualquiera y
de todos los objetos receive~ con el mismo nombre. A diferencia de send y
receive, usted no puede tener más de un objeto send~ con el mismo nombre (para
ese tipo de conexión ver los objetos throw~ y catch~).

En el ejemplo, parte de la maquinaria de lectura de la tabla de onda se duplica,


utilizando cálculos idénticos para “chunk-size-samples” (la secuencia de
mensajes) y para “read-pt” (una señal de audio suavizada como antes). Sin
embargo, el elemento “phase” de la señal de audio, en la otra copia, es
reemplazado por “phase2”. La parte superior de la figura muestra el cálculo de
las dos fases de la señal: la primera como la salida del objeto phasor~, y la
segunda adicionando 0.5 y envolviéndola, adicionándole así 0.5 ciclos (¼
radianes) a la fase. Las dos fases de las señales son utilizadas cada una, con
los mismos ajustes de rango según se hicieron, para calcular el índice en la
tabla de onda y del objeto cos~, y para controlar también los dos objetos
samphold~. Finalmente, los resultados de las dos copias se adicionan para
enviarlas a la salida de audio.

Precesión automática del punto de lectura

El ejemplo B11.sampler.rockafella.pd, que se muestra en la parte (b) de la


figura 2.16, adapta las ideas que se mostraron antes para una situación donde el
punto de lectura es computado automáticamente. Aquí hacemos la precesión del
punto de lectura a través de la muestra en un lazo, permitiéndonos acelerar y
desacelerar la reproducción, independientemente de la transposición.

Este ejemplo muestra una debilidad del procedimiento, que consiste en que si la
velocidad de precesión relativa es cercana a uno (que es el caso de la velocidad
normal de escucha de la tabla de onda grabada), y si tampoco hay mucha
transposición, es preferible utilizar granos más grandes y frecuencias más bajas
de repetición en concordancia (manteniendo el producto constante para alcanzar
la transposición deseada.) Sin embargo, si el tamaño del grano queda demasiado
grande, ya no es conveniente cuantizar los cambios de control a la fase de la
envolvente, pues estos podrían estar demasiado aparte como para permitir un
tiempo de respuesta razonable para los cambios de control.

En este parche quitamos el objeto samphold~ que había controlado el punto de


lectura (pero dejamos el del tamaño de segmento el cual es mucho más difícil de
cambiar en medio del lazo). En su lugar utilizamos el porcentaje de precesión
(conocido) del punto de lectura para corregir la frecuencia de la diente de
sierra, de tal manera que mantenemos la transposición deseada. Esto en cambio
hace que cuando el factor de transposición y la precesión están muy cercanos el
uno de la otra (haciendo entonces algo muy cercano a un simple cambio de
velocidad), la frecuencia caerá a un valor cercano a cero, y así habremos
incrementado la naturalidad del resultado al mismo tiempo.

En este parche pasamos de manejar puntos de lectura, tamaños de segmento, etc.,


en número de muestras para utilizar segundos, haciendo la conversión a número de
muestras (y cambiando por uno) justo antes del objeto tabread4~. La tabla de
onda contiene un sonido de un segundo de duración, y asumiremos que el tamaño
nominal del segmento no será mayor que 0.1 segundos, de tal manera que podemos
dejar con seguridad que el rango del punto de lectura vaya de 0 a 0.9; el tamaño
“real” del segmento variará, y puede llegar a ser bastante largo, debido al
movimiento del punto de lectura.

El control de la precesión ajusta la frecuencia de un fasor de amplitud 0.9, y


de esta manera la precesión debe multiplicarse por 0.9 para ajustar la
frecuencia del fasor (así, para obtener una precesión de uno la amplitud y la
frecuencia del punto de lectura son ambas 0.9, de tal manera que la pendiente,
al ser iguales la amplitud sobre la frecuencia, es uno). La salida es denominada
“read-pt” como antes, y es utilizada para ambas copias del lector de la tabla de
onda.

La precesión p y el tamaño del segmento c se conocen, y si denotamos la


frecuencia del fasor de la parte de arriba (la original) por f, el factor de
transposición queda dado por:

t = p + cf

y resolviendo para f da:

f = (t - p)/c = (2h/12 - p)/c

donde h es la transposición deseada en semitonos. Esta es la fórmula utilizada


en el objeto expr.

Ejercicios

1. Si una tabla de onda con 1000 muestras se reproduce con transposición de una
unidad, a una velocidad de lectura de muestras de 44100 Hertz, qué tanto dura el
sonido?

2. Una tabla de onda de un segundo de duración es ejecutada en 0.5 segundos. A


qué intervalo se transpone el sonido?

3. Asumiendo todavía la tabla de onda de un segundo, si la reproducimos


periódicamente (en un lazo), a cuántos Hertz deberíamos hacer el lazo para
transponer el sonido original en medio tono?

4. Queremos reproducir una tabla de onda (grabada a R = 44100) en un lazo a 10


veces en cada segundo, de tal manera que el sonido original almacenado en la
tabla de onda sea transpuesto una quinta perfecta (ver página “12”). Qué
longitud de segmento, en número de muestras debería ser el que se reproduce?

5. Suponga que desea utilizar el estiramiento de onda para una tabla de onda que
contiene una onda periódica de período 100. Usted desea escuchar el espectro no
transpuesto a un período de 200 muestras. Por qué factor de tarea debería usted
comprimir la onda?

6. La primera mitad de una tabla de onda contiene un ciclo de una sinusoide de


amplitud pico uno. La segunda mitad contiene ceros. Cuál es la fortaleza del
segundo parcial de la tabla de onda.

7. Una sinusoide se almacena en una tabla de onda con período 4 de tal manera
que los primeros cuatro elementos son 0, 1, 0, -1, correspondiendo a los índices
0, 1, 2 y 3. Qué valor obtenemos con la entrada 1.5: (a) utilizando
interpolación de dos puntos? (b) utilizando interpolación de 4 puntos? (c) cuál
es el valor de la sinusoide original aquí?
8. Si todo el contenido de una tabla de onda cae entre los valores -1 y 1, cuál
es el rango de salidas posibles de la lectura de tabla de onda utilizando
interpolación de 4 puntos?
Capítulo 3

Cómputos de audio y de control

3.1 El teorema del muestreo

Hemos hecho una discusión de las señales de audio como si ellas fueran capaces
de describir cualquier función en el tiempo, como si sabiendo los valores que la
función tiene en los números enteros, pudiéramos determinar de alguna manera los
valores que toma entre éstos. Esto no es realmente cierto. Por ejemplo, suponga
alguna función f (definida para los números reales) que tiene valor uno para
todos los enteros:

f(n) = 1, n = ...,-1,0,1,...

Podríamos creer que f(t) = 1 para todos los reales t. Pero sin embargo, f es
uno para los enteros y cero para todo lo demás -esa es una función perfectamente
buena también, y nada de los valores de la función en los números enteros la
distingue de la más simple f(t) = 1. Pero la intuición nos dice que la función
constante está en el espíritu de las señales de audio digital, visto que esconde
un secreto entre las muestras. Una función que “se deja tomar en muestras”
debería ser aquella para la cual podemos utilizar un esquema de interpolación
razonable para deducir sus valores en los no-enteros, partiendo de los valores
en sus enteros.

Se acostumbra en este punto de las discusiones de la música por computador


invocar el famoso Teorema de Nyquist. Este dice (de manera resumida) que si una
función es una combinación finita o infinita de sinusoides, ninguna de cuyas
frecuencias angulares excede ¼, entonces, por lo menos teóricamente, está
totalmente determinada por los valores de la función en los enteros. Una forma
posible de reconstruir la función podría ser como un límite del mayor y el más
alto orden polinomial para la interpolación.

La frecuencia angular ¼ llamada la Frecuencia de Nyquist corresponde a R/2


ciclos por segundo si R es la velocidad de las muestras. El período
correspondiente es de dos muestras. La frecuencia de Nyquist es lo mejor que
podemos hacer en el sentido que cualquier sinusoide real de frecuencia más alta,
es igual en los enteros, a aquella cuya frecuencia es menor que la de Nyquist, y
es esta la frecuencia más baja que tendremos para la reconstrucción con el
proceso de interpolación ideal. Por ejemplo, una sinusoide con frecuencia
angular entre ¼ y 2¼, por decir ¼ + !, puede ser escrita como

cos((¼ + !)n + Á) = cos((¼ + !)n + Á - 2¼n)


= cos((! - ¼)n + Á)
= cos((¼ - !)n - Á)

para todos los enteros n. (Si n no fuera un entero, el primer paso debería
fallar.) Así, una sinusoide con frecuencia entre ¼ y 2¼, es igual, por lo menos
en lo que se refiere a los números enteros, a otra con frecuencia entre 0 y ¼;
usted simplemente no puede tener las dos aparte. Y ya que cualquier operación de
conversión en el equipo de cómputo deberá hacer lo “correcto” y reconstruir la
sinusoide de más baja frecuencia, cualquiera que usted trate de sintetizar con
frecuencia más alta llegará a sus parlantes con la frecuencia errada
-específicamente usted escuchará la frecuencia única entre 0 y ¼ a la que cae la
frecuencia en la forma descrita anteriormente. Este fenómeno es llamado
foldover <sobre-doblado>, debido a que la media línea de frecuencias de 0 a ∞
se dobla de acá para allá, en longitudes de ¼ sobre el intervalo de 0 a ¼. La
palabra aliasing <alias> significa la misma cosa. La figura 3.1 muestra que las
sinusoides de frecuencias angulares ¼/2 y 3¼/2, no se pueden distinguir una de
la otra al ser leídas como señales de audio digital.

Concluimos entonces que cuando, por ejemplo, estamos computando valores de una
seriede Fourier (página “12”), ya sea como una tabla de onda o como una señal en
tiempo real, mejor dejamos por fuera cualquier sinusoide de la suma, cuya
frecuencia exceda ¼. Pero el cuadro en general no es así de simple, ya que la
mayoría de la técnicas diferentes a la de la síntesis aditiva no son señales
limitadas por bandas ordenadas (aquellas cuyos componentes paran a alguna
frecuencia limitada). Por ejemplo una onda diente de sierra de frecuencia ! de
la forma puesta por el objeto phasor~ de Pd, pero que considerada como una
función continua f(t), se expande a:

f(t) = 1/2 – 1/¼(sen(!t) + sen(2!t)/2 + sen(3!t)/3 + ... )

la cual goza arbitrariamente de altas frecuencias; y más aún el parcial cien es


únicamente 40 dB más débil que el primero. A cualquier valor muy bajo de !, los
parciales por encima de ¼ se escucharán presentes -y, debido al sobre-doblado,
se escucharán a las frecuencias incorrectas. (Esto no significa que no se
deberían utilizar ondas diente de sierra como generadores de fase -la lectura a
pasos de la tabla de onda corrige mágicamente el sobre-doblado de la diente de
sierra- pero uno debería pensarlo dos veces antes de utilizar una onda diente de
sierra como fuente de sonido digital.)

Muchas técnicas de síntesis, incluso si no están estrictamente limitadas en sus


bandas, dan parciales que pueden ser apagados más rápidamente que 1/n como en
el ejemplo de la diente de sierra, y de esta manera son más apropiadas
trabajarlas digitalmente. En cualquier caso, siempre es buena idea mantener en
la mente la posibilidad del sobre-doblado, y entrenar sus oídos para
reconocerlo.

La primera línea de defensa contra el sobre-doblado es simplemente utilizar


velocidades altas de muestreo; es una buena práctica utilizar sistemáticamente
las velocidades de muestreo más altas que pueda manejar su computador con
facilidad. La velocidad práctica más alta variará de acuerdo a si lo que sea que
está trabajando en el computador es en tiempo real o no, las limitantes de
tiempo y de memoria de la CPU, y/o los dispositivos de entrada y salida, y a
veces incluso las limitaciones impuestas por los programas de cómputo.

Un tratamiento no muy técnico de la teoría del muestreo se da en [Bal03]. Más


detalles se pueden encontrar en [Mat69, págs.1-30].

3.2 Control

Ya hemos discutido acerca de las señales de audio digital, las cuales son sólo
secuencias x[n] definidas para enteros n, los cuales corresponden a puntos
espaciados regularmente en el tiempo. Este puede ser un esquema para describir
las técnicas de síntesis, pero las aplicaciones reales de música electrónica
usualmente suponen otros cómputos que deben ser realizados en puntos irregulares
en el tiempo. En esta sección desarrollaremos un marco para describir lo que
llamaremos cómputos de control. Siempre requeriremos que cualquier cómputo se
corresponda con un específico tiempo lógico. El tiempo lógico controla cuál
muestra de audio irá en primer lugar a la salida para reflejar el resultado de
los cómputos.

En un sistema de tiempo no real (tal como Csound en su forma clásica), esto


significa que el tiempo lógico procede desde cero hasta la longitud de la salida
del archivo de sonido. Cada “tarjeta de puntuación” tiene un tiempo lógico
asociado (el tiempo en la puntuación), y actúa una vez el cómputo del audio ha
alcanzado ese tiempo. Así los cálculos de audio y de control (la salida de las
muestras y el manejo de las tarjetas de notas) se manejan cada uno por turnos,
incrementándose con todo el tiempo lógico.
En un sistema de tiempo real, el tiempo lógico, el cual corresponde todavía al
tiempo para la salida de la muestra siguiente de audio afectada, está siempre
ligeramente adelantado al tiempo real, el cual está medido por la muestra que
sale en ese momento del computador. Los cómputos de control y de audio son
llevados a cabo de manera alterna, seleccionados por el tiempo lógico.

La razón para utilizar el tiempo lógico y no el tiempo real en los cálculos de


la música por computador es mantener los cómputos independientes del tiempo de
ejecución del computador, el cual puede variar por una cantidad de razones,
incluso para dos cálculos aparentemente idénticos. Cuando estamos haciendo el
cálculo de un nuevo valor para la señal de audio o procesando alguna entrada de
control, el tiempo real puede pasar, pero nosotros requerimos que el tiempo
lógico sea el mismo a través del cálculo completo, como si tomara lugar
instantáneamente. Como resultado de esto, los cómputos en la música electrónica,
si se han hecho de la manera correcta, son determinísticos: dos corridas de los
mismos cálculos del mismo audio en tiempo real o no real, teniendo cada una las
mismas entradas, deberán tener resultados idénticos.

La figura 3.2 (parte a) muestra esquemáticamente cómo están alineados el tiempo


lógico y los cómputos de las muestras. Las muestras de audio están calculadas en
períodos regulares (marcados por líneas onduladas), pero antes del cálculo de
cada muestra hacemos todos los cálculos de control que podrían afectarla
(marcados con segmentos de línea rectos). Hacemos primero los cómputos de
control asociados con los tiempos lógicos empezando de cero hasta uno, pero sin
incluir ese valor; entonces computamos la primera muestra de audio (de índice
cero) en el tiempo lógico uno. Hacemos luego todos los cálculos de control hasta
el tiempo lógico 2, pero sin incluir ese valor, luego la muestra de índice uno,
y así sucesivamente. (Adoptamos aquí ciertas convenciones para el etiquetado que
podrían haber sido escogidas de manera diferente. Por ejemplo, no hay razón
fundamental para que el control debe ilustrarse entrando “antes” que los
cómputos de audio pero es más fácil pensarlo de esa manera.)

La parte (b) de la figura muestra la situación cuando queremos computar la


salida del audio en bloques de más de una muestra a la vez. Utilizando la
variable B para denotar el número de elementos en un bloque (en la figura B =
4), el primer cálculo de audio tendrá com salida las muestras de audio
0,1, ...B – 1 todas a la vez en un bloque computado en el tiempo lógico B.
Debemos realizar los cómputos de control relevantes para todos los períodos de
tiempo B, con anticipación. Hay un retraso de las muestras B entre el tiempo
lógico y la aparición del audio en la salida.

La mayor parte de los programas de música calculan el audio por bloques. Esto se
hace para incrementar la eficiencia de las operaciones de audio individuales
(tal como lo hacen las unidades generadoras de Csound y Max/MSP y los objetos
tilde de Pd). La unidad generadora o el objeto tilde incurren en gasto cada vez
que se hacen funcionar, igual a aproximadamente veinte veces el costo del
cómputo de una muestra en promedio. Si el tamaño del bloque es uno, esto
significa un gasto de 2000%; si es sesenta y cuatro (como lo es en Pd por
defecto), el gasto es de sólo el 30%.

3.3 Secuencias de control

Los cálculos de control pueden provenir de una variedad de fuentes, tanto


internas como externas, para el cómputo general. Los ejemplos de los cálculos de
control engendrados internamente incluyen secuenciación (cuyos cálculos de
control pueden tener lugar en tiempos predeterminados) o la detección de la
salida del audio (casos de búsqueda de ceros cruzando en una señal). Los
engendrados externamente pueden venir de aparatos tales como controladores MIDI,
el ratón y el teclado, paquetes de red y otros. En cualquier caso, los cálculos
de control pueden ocurrir a intervalos irregulares, a diferencia de las muestras
de audio las cuales corresponden a una marca fija de reloj de muestras.
Necesitaremos una manera para describir cómo fluye la información entre los
cómputos de control y de audio, para lo cual nos basaremos en la noción de una
secuencia de control. Esta es simplemente un conjunto de números -posiblemente
vacía- que aparece como un resultado de los cálculos de control, ya sea regular
o irregularmente espaciada en el tiempo lógico. La secuencia de control más
simple posible no tiene otra información que una secuencia de tiempo:

...,t[0],t[1],t[2],...

Aunque es mejor dar los valores de tiempo en muestras, sus valores no están
cuantizados; ellos pueden ser números reales arbitrarios. Requerimos que estén
organizados en orden no decreciente:

... ≤ t[0] ≤t [1] ≤ t[2] ≤ ...

Cada ítem de la secuencia es llamado un evento.

Las secuencias de control se pueden mostrar gráficamente como aparecen en la


figura 3.3. Una línea numerada muestra el tiempo y una secuencia de flechas
señala los puntos de tiempo asociados con cada evento. La secuencia de control
que se muestra no tiene datos (es una secuencia de tiempo). Si queremos mostrar
datos en la secuencia de control los escribiremos en la base de cada flecha.

Una secuencia de control numérica es la que contiene un número por cada punto en
el tiempo, de tal manera que aparece como una secuencia de pares ordenados:

...,(t[0],x[0]), (t[1],x[1]), ...

donde los t[n] son los puntos en el tiempo y los x[n] son los valores de la
señal en esos tiempos.

Una secuencia de control de números es casi análoga a un “controlador MIDI”,


cuyos valores cambian irregularmente, por ejemplo cuando un control físico se
mueve por parte de un ejecutante. Otras fuentes posibles de secuencias de
control pueden tener las velocidades de cambio más altas posibles y/o mayor
precisión. De otro lado, una secuencia de tiempo podría ser una secuencia de
golpes de pedal, los cuales (no obstante la implementación MIDI) no deberían
considerarse conteniendo valores, si no tiempos.

Las secuencias de control numéricas son como señales de audio, pues ambas son
sólo valores numéricos variando en el tiempo. Pero toda vez que las señales
audio van a una velocidad constante (y así los valores de tiempo no requieren
estar especificados para cada muestra), las secuencias de control son
impredecibles -a veces son parejas, a veces disparejas, a veces no aparecen.

Vamos a mostrar lo que sucede cuando tratamos de convertir una secuencia de


control numérico en una señal de audio. Como antes, escogeremos un bloque de
tamaño B = 4. Consideraremos como una secuencia de control una onda cuadrada de
período 5.5:

(2,1),(4.75,0),(7.5,1),(10.25,0),(13,1),...

y demostramos tres maneras en que podría convertirse en señal de audio. La


figura 3.4 (parte a) muestra la conversión más simple y más-rápida-posible. Cada
muestra de audio a su salida refleja simplemente el valor más reciente de la
señal de control. De esta manera las muestras de 0 a 3 (las cuales son
computadas en el tiempo lógico 4 debido al tamaño del bloque) son de valor 1
según el punto (2,1). Las cuatro muestras siguientes también son uno ya que de
los dos puntos, (4.75,0) y (7.5,1), el más reciente tiene también el valor 1.

La conversión más-rápida-posible es la más apropiada para controlar secuencias


que no cambian con frecuencia, en comparación al tamaño del bloque. Sus
principales ventajas son la simplicidad para el cálculo y la respuesta más
rápida posible a los cambios. Según se ve en la figura, cuando los cambios de la
secuencia de control son muy rápidos (cercanos al orden del tamaño del bloque),
la señal de audio pueden no tener mucha semejanza con la esporádica. (Si, como
en este caso, la secuencia de control viene en intervalos de tiempo regulares,
podemos utilizar el teorema del sampleo para analizar el resultado. Aquí, la
frecuencia de Nyquist asociada con la velocidad del bloque R/B es menor que la
frecuencia de entrada de la onda cuadrada, y así la salida produce un alias a
una nueva frecuencia que es más baja que la frecuencia de Nyquist.)

La parte (b) muestra el resultado de la conversión de la muestra-más-cercana.


Cada nuevo valor de la secuencia de control en el tiempo t afecta la salida de
las muestras comenzando desde el índice btc (el entero más grande que no exceda

a t). Este es el equivalente a usar la conversión más-rápida-posible a un


tamaño de bloque de 1; en otras palabras, la conversión de la muestra-más-
cercana esconde el efecto de los tamaños de bloque más grandes. Esta es mejor
que la conversión más-rápida-posible en los casos en los que la secuencia de
control podría cambar rápidamente.

La parte (c) muestra la conversión esporádica-a-audio, de nuevo a la muestra más


cercana, pero ahora utilizando también la interpolación de dos puntos para un
incremento adicional en la precisión del tiempo. Conceptualmente podemos
describir esto como sigue. Suponga que el valor de la secuencia de control fue
al final igual a x, y que el punto siguiente es (n + f, y), donde n es un
entero y f es la parte fraccional de valor del tiempo (así 0 ≤ f < 1). El
primer punto afectado en la salida del audio será la muestra en el índice n.
Pero en lugar de ajustar la salida a y como antes, ajustamos esta a

fx + (1 - f)y

en otras palabras, a una aproximación ponderada del valor previo y del valor
nuevo, cuyos pesos favorecen más al nuevo valor si el tiempo del valor
esporádico es anticipado, más cercano a n. En el ejemplo que se muestra, la
transición de 0 a 1 en el tiempo 2 da

0 • x + 1 • y = 1,

mientras la transición de 1 a 0 en el tiempo 4.75 da:

0.75 • x + 0.25 • y = 0.75

Esta técnica proporciona una representación todavía más cercana de la señal de


control (por lo menos la porción que queda por debajo de la frecuencia de
Nyquist), a expensas de mayor cómputo y un retraso ligeramente mayor.

Las secuencias de control numérico pueden convertirse también a señales de audio


utilizando funciones rampa para suavizar las discontinuidades. Se utilizan con
frecuencia cuando una de estas secuencias debe controlar una amplitud, como se
describió en la sección 1.5. En general hay tres valores para especificar el
ajuste de una función rampa en movimiento: el tiempo de inicio y el valor al que
se quiere llegar (especificado por la secuencia de control) y el tiempo para
llegar al valor, que usualmente se expresa como un retraso después del tiempo de
inicio.

En tales situaciones es casi siempre suficientemente seguro ajustar los tiempos


del comienzo y del final para que coincida con la primera muestra de audio
computada en un tiempo lógico posterior, una opción que corresponde al escenario
de más-rápida-posible anterior. La figura 3.5 (parte a) muestra el efecto de la
rampa desde 0, comenzando en el tiempo 3, a un valor de 1 en el tiempo 9,
comenzando el regreso de inmediato a 0 en el tiempo 15, con un tamaño de bloque
B = 4. Los tiempos 3, 9 y 15 están truncados a 0, 8 y 12 respectivamente.

En situaciones reales el tamaño del bloque podría ser del orden de un


milisegundo, y el ajuste de los puntos finales de las rampas con las fronteras
del bloque funciona bien para controlar las amplitudes; alcanzar un objetivo en
una fracción de milisegundo antes o después raramente hace audible una
diferencia. Sin embargo otros usos de las rampas son más sensibles a la
cuantización del tiempo en los extremos. Por ejemplo si queremos hacer algo
repetitivo de unos pocos milisegundos, la variación en el segmento hará audible
una aperiodicidad.

Para situaciones tales como esta, podemos mejorar el algoritmo de generación de


la rampa para iniciar y detener en muestras arbitrarias, como se muestra en la
figura 3.5 (parte b), por ejemplo. Aquí los extremos de los segmentos de línea
coinciden exactamente con las muestras requeridas 3, 9 y 15. Podemos ir incluso
más allá y ajustar para muestras fraccionadas, haciendo que los segmentos de
línea toquen los valores 0 y 1 en puntos específicos sobre la línea de números.

Por ejemplo, suponga que queremos repetir un sonido grabado de una tabla de onda
100 veces por segundo, cada 441 muestras a la velocidad de muestreo usual. Los
errores de redondeo debidos a los bloques de 64 muestras podrían desafinar la
reproducción en casi un tono completo, e incluso redondear a fronteras de una
muestra puede introducir variaciones de cerca del 2%, o tres cents. Esta
situación debería llevar a la exactitud de sub-muestras en la conversión
esporádica-a-audio.

3.4 Conviertiendo de señales de audio a secuencias de control numérico

A veces necesitamos hacer la conversión en otra dirección, de una señal de audio


a la señal esporádica. Para ir en esa dirección, de alguna manera proveemos una
serie de tiempos lógicos (una secuencia de tiempo), así como una señal de audio.
A la salida queremos una secuencia de control que combine con los valores
tomados de la señal de audio. Hacemos esto cuando queremos incorporar el valor
de la señal como parte de los cómputos de control.

Por ejemplo, podríamos estar controlando la amplitud de una señal utilizando el


objeto line~ como en el ejemplo A03.line.pd (página “21”). Suponga que queremos
apagar el sonido a una velocidad fija, en lugar de hacerlo en un tiempo fijo. De
esta manera podríamos querer re-utilizar la red para otro sonido y querer
mutearlo tan rápido como fuera posible sin artefactos audibles; podemos
probablemente hacerlo en forma de rampa a cero en menos tiempo si la amplitud en
ese instante es más baja. Para hacer esto debemos confeccionar un mensaje en el
objeto line~ para enviarlo a cero en una cantidad de tiempo que calcularemos con
base en el valor de su salida en ese momento. Esto requiere antes que nada, que
“sampleemos” la salida del objeto line~ (una señal de audio) a una secuencia de
control.

El mismo asunto del retraso de tiempo y exactitud aparece también para la


conversión de datos esporádicos a audio. De nuevo, habrá un compromiso entre
inmediatez y exactitud.

Suponga como antes que estamos calculando en bloques de audio de 4 muestras, y


suponga que en el tiempo lógico 6 queremos buscar el valor de una señal de
audio, y utilizarla para cambiar el valor de otra. Como se muestra en la figura
3.2 (parte b), el valor más recientemente calculado de la señal será para el
índice 3, y el primer índice al cual nuestros cálculos pueden afectar la señal
es 4. Podemos de esta manera llevar el asunto completo con un retraso de
únicamente una muestra. Sin embargo, no podemos escoger exactamente cuál muestra
-la actualización sólo puede ocurrir en las fronteras del bloque.

Como antes, podemos negociar inmediatez por mayor exactitud en el tiempo. Si


esto sucede exactamente en la muestra en la que llevamos el cómputo audio-a-
control-a-audio, leemos la muestra del índice 2 y la actualizamos en el índice
6. Entonces, si queremos hacer la misma cosa de nuevo en el tiempo lógico 7,
leemos desde el índice 3 y actualizamos en el índice 7 y así sucesivamente. En
general, si el tamaño del bloque es B, y para cualquier índice n, podemos leer
siempre la muestra en el índice n - B y afectarla en el índice n. Existe así un
retraso de B muestras en el cómputo audio a control a audio, que es el precio
en el que se incurre por ser capaces de nombrar a n exactamente.

Si queremos ir más allá, para ser capaces de especificar la fracción de una


muestra, entonces (como antes) podemos utilizar interpolación -con un ligero
incremento en el retraso. En general, como en el caso de la conversión
esporádica-a-audio, en la mayoría de los casos la solución más simple es la
mejor, pero ocasionalmente tenemos que hacer trabajo extra.

3.5 Secuencias de control en diagramas de bloque

La figura 3.6 muestra cómo las secuencias de control se expresan en diagramas de


bloque, utilizando la conversión control-a-señal y señal-a-control como
ejemplos. Las secuencias de control están representadas utilizando puntos
(opuesto a las señales de audio que aparecen como flechas sólidas).

El bloque señal <signal> convierte de una secuencia de control numérico a una


señal de audio. El tipo exacto de conversión no se especifica a este nivel de
detalle; en los ejemplos Pd el tipo de operador de la conversión determinará
esto.

El bloque instantánea <snapshot> convierte la señal de audio de nuevo a


secuencia de control numérico. Adicional a la señal de audio, se requiere una
señal de control separada para especificar la secuencia de tiempo a la cual se
toman las muestras de la señal audio.

3.6 Detección de evento

Además de tomar instantáneas, un segundo modo de pasar información de señal de


audio a cómputos de control es la detección de evento. Aquí derivamos la
información de tiempo de la señal de audio. Un ejemplo es la detección de
umbral, en la cual la entrada es una señal de audio y la salida es una secuencia
de tiempo. Consideraremos el ejemplo de detección de umbral con algún detalle
aquí.

Una razón típica para usar la detección de umbral es encontrar cuándo inicia
algún tipo de actividad y cuándo se detiene, tal como un ejecutante tocando un
instrumento. Supondremos que ya hemos hecho una medición continua de una
actividad en forma de una señal de audio. (Esto puede ser hecho por ejemplo,
utilizando un seguidor de envolvente). Lo que queremos es un par de secuencias
de tiempo, una que marque el tiempo de inicio de la actividad y otra marcando la
parada.

La figura 3.7 (parte a) muestra una realización simple de esta idea. Asumimos
que la señal de entrada es como se muestra en la gráfica continua. Una línea
horizontal marca el valor constante del umbral. La secuencia de tiempo marcada
“onset” <“encendido”> contiene un evento cada vez que la señal cruza el umbral
de abajo hacia arriba; la que está marcada como “turnoff” <“apagado”> marca los
cruces en la dirección contraria.

En muchas ocasiones tendremos encendidos y apagados indeseables causados por


pequeños rizos en la señal cercanos al umbral. Esto se evita con deboucing,
<apagado del rebote> el cual puede ser hecho por lo menos de dos maneras. En la
primera, como se muestra en la parte (b) de la figura, podemos ajustar dos
umbrales: uno alto para marcar los encendidos y otro bajo para los apagados. En
este esquema la regla es que únicamente reportamos el primer encendido después
de cada apagado y, viceversa, únicamente reportamos un apagado después de cada
encendido. Así, la tercera vez que la señal cruza el umbral alto en la figura no
reporta encendido, debido a que no se ha apagado desde la vez anterior. (Al
iniciar, actuamos como si la salida más reciente hubiera sido de apagado, de tal
manera que el primer encendido sí se reporta.)

Una segunda aproximación al filtrado de múltiples encendidos y apagados, se


muestra en la parte (c) de la figura, es asociar un período muerto a cada
encendido. Este es un intervalo de tiempo constante que sucede después de cada
encendido reportado, durante el cual rechazamos el reporte de más encendidos y
apagados. Luego de que el período finaliza, si la señal ha caído por debajo del
umbral en el transcurso de ese tiempo, reportamos de manera tardía un apagado.
Los períodos muertos se pueden asociar también con los apagados, y los dos
períodos pueden tener valores diferentes.

Las dos estrategias de filtrado pueden utilizarse separada o simultáneamente. Es


usualmente necesario adaptar los valores de umbral y/o los tiempos muertos
manualmente para cada situación específica en la cual se usa el umbral.

El umbral a veces se utiliza com el primer paso en el diseño de estrategias de


alto nivel para arreglar la respuesta de los computadores a las entradas
audibles de ejecutantes musicales. Un ejemplo sencillo podría ser el de detener
una secuencia de procesos pre-planificados, cada detención provocada por un
encendido de sonido después de un período específico de relativo silencio, tal
como lo podríamos ver si un músico ejecutara una secuencia de frases separadas
por silencios.

Detectores más sofisticados (construidos por lo mejor de la detección de umbral)


podrían detectar sonido o silencio continuo en un rango esperado de duraciones,
o secuencias rápidas de alternancia entre tocar y no tocar, o períodos de tiempo
en los cuales el porcentaje de tiempo de ejecución con respecto al de silencios
está por encima o por debajo de un umbral, o muchas otras características. Estas
podrían detener reacciones predeterminadas o figurar en una improvisación.

3.7 Señales de audio como control

De la tradición de la síntesis análoga viene una elegante y antigua aproximación


para los problemas de control, que puede utilizarse como una alternativa para
las secuencias de control que hemos estado tratado en este capítulo. En lugar o
adicional al uso de las secuencias de control, podemos utilizar las mismas
señales de audio para controlar la producción de otras señales de audio. Dos
técnicas específicas de la síntesis análoga se prestan bien para este
tratamiento: la secuenciación análoga y la muestra-y-retención.

El secuenciador análogo [Str95, págs.70-79][Cha80, págs.93,304-308] era


utilizado con frecuencia para lograr una secuencia de sonidos repetida regular o
semi-regularmente. La secuencia misma típicamente repite una secuencia de
voltajes, junto con una señal de disparo la cual es pulsada cada que hay una
transición entre los voltajes. Uno utilizaba los voltajes para tonos o para los
parámetros tímbricos, y el disparador para controlar uno o más generadores de
envolvente. Lograr secuencias enlazadas de valores predeterminados en audio
digital es tan simple como el envío de un objeto phasor~ a un lector de tabla no
interpolada. Si usted quiere, por decir, cuatro valores en la secuencia, escale
el valor de la salida de phasor~ para tomar valores de 0 a 3.999... de tal
manera que el primer cuarto de ciclo lea el punto 0 de la tabla y así
sucesivamente.

Para disparar repetidamente, el primer paso es sintetizar otra diente de sierra


que corra en sincronía con la salida de phasor~, pero cuatro veces más rápido.
Esto se hace utilizando una variante de la técnica de la figura 2.8, en la cual
utilizamos un operador de suma y un operador de envolvente para lograr el cambio
de fase deseado. La figura 3.8 muestra el efecto de multiplicar una onda diente
de sierra por un entero, y luego envolverla para conseguir una diente de sierra
a un múltiplo de la frecuencia original.

A partir de aquí es fácil conseguir una envolvente que se repita con lectura de
tabla de onda, por ejemplo (utilizando un lector de tabla de onda esta vez, en
lugar de una secuencia de voltajes). Toda la generación de la onda y las
técnicas de alteración utilizadas para hacer sonidos a una cierta altura también
pueden ser usados en este caso.

La otra técnica de control común derivada del control de los sintetizadores


análogos es la unidad de muestra-y-retención [Str96, págs.80-83][Cha80, pág.92].
Se coge una señal de entrada, se toman ciertos valores instantáneos de ésta, y
se “congelan” estos valores para su salida. Los valores particulares que se
toman se seleccionan por una entrada de “disparo” secundaria. En puntos
específicos del tiempo determinados por la entrada de disparo, se toma un valor
de la entrada principal que es enviado a la salida de manera continua hasta el
siguiente punto en el tiempo, cuando es reemplazado por un nuevo valor de la
entrada principal.

En el audio digital es a veces útil tomar la muestra de un nuevo valor sobre los
bordes de caída de la señal de disparo, es decir, cada vez que el valor
corriente de la señal de disparo es más pequeño que el valor previo, según se ve
en la figura 3.9. Esto es especialmente conveniente útil con un disparador
diente de sierra, cuando queremos tomar muestras de señales en sincronía con un
proceso conducido por oscilador. El objeto muestra-y-retención de Pd fue
presentado previamente en el contexto del muestreo (ejemplo
B08.sampler.nodoppler.pd, página “53”).

3.8 Operaciones en secuencias de control

Hemos discutido cómo hacer la conversión entre secuencias de control y


secuencias de audio. Adicional a esta posibilidad, existen cuatro tipo de
operaciones que usted puede ejecutar sobre las secuencias de control para lograr
otras secuencias de control. Estas operaciones con las secuencias de control no
tienen operacones correspondientes en las señales de audio. Su existencia
explica en gran parte porqué es útil introducir una estructura de control
completa paralelamente con la de la señal de audio.

El primer tipo consiste en las operaciones de retraso, las cuales modifican los
valores de tiempo asociados con una secuencia de control. En los sistemas de
tiempo real los retrasos no pueden tener valores negativos. Una secuencia de
control se puede retrasar en una cantidad constante o, alternativamente, usted
pude retrasar cada evento de manera separada por diferentes cantidades.

Dos tipos de retraso se utilizan en la práctica: simple y compuesto. Ejemplos de


cada uno de estos se muestran en la figura 3.10. Un retraso simple actúa sobre
una secuencia de control programando cada evento, tal como viene, para un tiempo
en el futuro. Sin embargo, si otro evento llega a la entrada antes de que el
primer evento salga, el primer evento es olvidado en favor del segundo. En el
retraso compuesto, cada evento a la entrada produce una salida, incluso si otros
eventos llegan antes de que aparezca la salida.

Una segunda operación en las secuencias de control es la mezcla: toma dos


secuencias de control y combina todos los eventos en uno nuevo. La figura 3.11
(parte a) muestra cómo esta y las otras operaciones son presentadas en diagramas
de bloques.

La parte (b) de la figura muestra el efecto de mezcclar dos secuencias. Las


secuencias pueden contener más de un evento a la vez. Si dos secuencias que se
van a mezclar contienen eventos simultáneos, la secuencia mezclada los contiene
a ambos, en un orden bien definido.
Un tercer tipo de operación sobre las secuencias de control es la selección.
Selección en una secuencia de control significa buscar en los datos asociados y
permitir pasar únicamente ciertos elementos. La parte (c) muestra un ejemplo en
el cual los eventos (los cuales tienen cada uno un número asociado) pasan
únicamente si el número es positivo.

Finalmente, está el concepto de resincronización de una secuencia de control con


otra, como se muestra en la parte (d). Aquí una secuencia de control (la fuente)
proporciona valores que son puestos en la secuencia de tiempo de otra secuencia
(la sync). El valor dado a la salida es siempre el más reciente viniendo de la
secuencia fuente. Note que cualquier evento de la fuente puede aparecer más de
una vez (según se sugiere en la figura), o de otro lado, podría no aparecer.

De nuevo tenemos que considerar lo que sucede cuando las dos secuencias
contienen cada una un evento al mismo tiempo. Debería la secuencia “sync” ser
considerada como la que ocurre antes de la fuente (de tal manera que la salida
proporciona el valor del evento previo de la fuente), o debería el evento de la
fuente ser considerado como el primero de tal manera que su valor vaya a la
salida al mismo tiempo? Cómo se podrá solucionar esto es una cuestión de diseño,
por lo cual los diversos ambientes de los programas de computación toman
diversas posiciones. (En Pd esto es controlado explícitamente por el usuario).

3.9 Operaciones de control en Pd

Hemos utilizado Pd principalmente para el procesamiento de señales de audio,


aunque ya antes, como en la figura 1.10, hemos tenido que hacer la distinción
entre la noción de señales de audio y de secuencias de control en Pd: las
conexiones delgadas llevan secuencias de control y las gruesas llevan audio. Las
secuencias de control en Pd aparecen como secuencias de mensajes. Los mensajes
pueden contener datos (la mayoría usualmente, uno o más números) o no. Una
secuencia de control numérico (sección 3.3) aparece como una conexión (delgada)
que lleva números como mensajes.

Los mensajes sin datos hacen secuencias de tiempo. Así usted puede ver mensajes
sin datos, que en Pd llevan el símbolo (arbitrario) de “bang”.

Los cuatro tipos de operaciones de control descritos en la sección previa pueden


ser expresados en Pd como se muestra en la figura 3.12. Los retrasos se logran
utilizando dos objetos de retraso explícito:

del, delay: retraso simple. Usted puede especificar el tiempo de retraso con la
creación de un argumento o por vía de la entrada derecha. Un “bang” en la
entrada izquierda ajusta el retraso, el cual entonces da como salida un “bang”
después de un retraso en milisegundos. El retraso es simple en el sentido de que
envía un disparo a un retraso que ya ha sido ajustado y lo re-ajusta a un nuevo
valor de tiempo, cancelando el que había sido programado con anterioridad.

pipe: retraso compuesto. Los mensajes que llegan a la entrada izquierda aparecen
en la salida después del retraso especificado, el cual se ajusta por la creación
del primer argumento. Si hay más creación de argumentos, ellos especifican una o
más entradas para los datos numéricos o simbólicos que contendrán los mensajes.
Cualquier número de mensajes puede ser almacenado por pipe de manera simultánea,
y los mensajes pueden ser re-organizados para su salida, dependiendo de los
tiempos de retraso dados para éstos.

La mezcla de secuencias de control en Pd se logra no con objetos explícitos, si


no con el mismo mecanismo de conexiones de Pd. Esto se muestra en la parte (b)
de la figura con cajas de números como un ejemplo. En general, siempre y cuando
se haga más de una conexión para una entrada de control, las secuencias de
control se mezclarán.

Pd ofece algunos objetos para la selección de secuencias de control, de los


cuales se muestran dos en la parte (c) de la figura:

moses: selecciona un rango numérico. Los mensajes numéricos que llegan a la


entrada izquierda aparecerán en la salida izquierda si son más pequeños que un
valor de umbral (ajustado en la creación de argumentos, o por la entrada de la
derecha), y de lo conrario, salen por la entrada derecha.

select, sel: selecciona números específicos. Los mensajes numéricos que llegan a
la entrada izquierda producen un “bang” en la salida únicamente si coinciden
exactamente con un valor de prueba. El valor de prueba es ajustado ya sea por la
creación de argumentos o por la entrada derecha.

Finalmente Pd se encarga de la resincronización de las secuencias de control


implícitamente en sus mecanismos de conexión, según se ilustra en la parte (d)
de la figura. La mayoría de los objetos con más de una entrada sincronizan todas
las demás entradas partiendo de la entrada del extremo izquierdo. Así, el objeto
float mostrado en la figura resincroniza su entrada del lado-derecho (la cual
toma números) con la de su lado-izquierdo. Al enviar un “bang” a la entrada
izquierda se tiene como salida el número float más reciente que ha sido recibido
de antemano.

3.10 Ejemplos

Muestreo y sobre-doblado

El ejemplo C01.nyquist.pd (figura 3.13, parte a) muestra un oscilador ejecutando


una tabla de onda barriendo frecuencias desde 500 hasta 1423. La tabla de onda
consiste únicamente del parcial 46, el cual de esta manera varía de 23000 a
65458 Hertz <46*500=23000, 46*1423=65458>. Con una velocidad de lectura de
muestras de 44100 estas dos frecuencias teóricamente suenan a 21100 y 21358
Hertz <44100-21000=23100, 44100-65458=-21358; la operación es una resta con
respecto a 44100 = 2¼>, pero en el barrido entre una y otra el doblado
desciende, pasando por cero y luego asciende.

Las otras dos formas de onda están provistas para mostrar los interesantes
efectos del batido entre parciales que, aunque “deberían” estar muy apartados,
se encuentran vecinos ellos mismos a través del sobre-doblado. Por ejemplo, a
1423 Hertz el segundo armónico es 2846 mientras que el armónico 33 suena a
1423*33-44100 = 2859 Hertz -una fuerte disonancia.

Otros ejemplos menos extremos pueden producir sobre-doblado audible en formas


menos bruscas. Usualmente sigue siendo desagradable, y vale la pena aprender a
escucharlo. El ejemplo C02.sawtooth-foldover.pd (no ilustrado aquí) demuestra
esto para una diente de sierra (el objeto phasor~). Para tablas de onda que
contienen grabaciones de audio, el error de interpolación puede generar sobre-
doblado extra. Los efectos de esto pueden variar ampliamente; el sonido a veces
se describe como “crujiente” o como “salpicado”, dependiendo de la grabación, la
transposición y el algoritmo de interpolación.

Convirtiendo controles a señales

El ejemplo C03.zipper.noise.pd (figura 3.13, parte b) demuestra el efecto de


convertir una secuencia de control actualizada lentamente a una señal de audio.
Este ejemplo presenta un nuevo objeto:

line: un generador de rampa con control de salida. Al igual que line~, line toma
pares de números (objetivo, tiempo) como parejas y ejecuta una rampa en
dirección al objetivo, en la cantidad de tiempo dada; sin embargo, a diferencia
de line~, la salida es una secuencia de control numérico, apareciendo, por
defecto, en intervalos de 20 milisegundos.

En el ejemplo usted puede comparar el sonido al elevarse y al caer la amplitud


controlada por la salida de line con la controlada por la señal de audio
generada por line~.

La salida de line es convertida a una señal de audio en la entrada del objeto


*~. La conversión está implicada aquí al conectar una secuencia de control
numérico a una entrada de señal. En Pd, las conversiones implícitas desde las
secuencias de control numérico a las secuencias de audio están hechas con el
modo más-rápida-posible mostrado en la figura 3.4 (parte a). La salida del
objeto line se convierte en una señal en escalera con 50 escalones por segundo.
El resultado se denomina comúnmente “ruido zipper”.

Mientras que las limitaciones del objeto line para generar señales de audio eran
claramente audibles incluso sobre períodos de tiempo de 300 milisegundos, la
variante de señal del objeto no produce problemas hasta períodos de tiempo que
pueden ser mucho más cortos. El ejemplo C04.control.to.signal.pd (figura 3.13,
parte c) demuestra el efecto de utilizar line~ para generar una onda triangular
de 250 Hertz. Aquí los efectos mostrados en la figura 3.5 vienen al caso. Ya que
line~ siempre alinea segmentos de línea con las fronteras de los bloques, la
duración exacta de los segmentos de línea varía, y en este ejemplo la variación
(del orden de milisegundos) es una fracción significante de su longitud.

Un objeto más preciso (y más costoso, en términos del tiempo de computación) se


provee para estas situaciones:

vline~: generador de segmento de línea exacto. Este tercer miembro de la familia


“line” tiene a la salida una señal de audio (parecida a line~), pero alinea los
extremos de la señal a los puntos de tiempo requeridos, con la exactitud de una
fracción de muestra. (La exactitud está limitada únicamente por el formato
numérico del punto flotante utilizado por Pd.) Aún más, muchos segmentos de
línea pueden estar especificados dentro de un solo bloque de audio; vline~ puede
generar ondas en períodos por debajo de las dos muestras (más allá de lo cual
sólo conseguirá sobre-doblado).

El objeto vline~ puede también utilizarse para convertir secuencias de control


numérico a secuencias de audio en los modos muestra-más-cercana e interpolación-
de-dos-puntos, según se muestra en la figura 3.4 (parte b y c). Para conseguir
la conversión muestra-más-cercana, simplemente dele a vline~ un tiempo de rampa
de cero. Para interpolación lineal, dele un tiempo de rampa de una muestra
(0.0227 milisegundos si la velocidad de las muestras es de 44100 Hertz).

Reproductor de tabla de onda sin lazo

Un área de aplicación que requiere de cuidadosa atención para el control de


señales de frontera de secuencia/audio es la lectura de muestras. Hasta ahora
nuestros lectores de muestras se han ceñido al asunto de enlazarse
perpetuamente. Esto permite una rica variedad de sonidos a los que se puede
acceder haciendo cambios continuos en parámetros tales como tamaño del lazo y
forma de la envolvente. Sin embargo muchos usos del muestreo requieren que
surjan características internas de la tabla de onda en momentos de tiempo
predecibles y que se puedan sincronizar. Por ejemplo, los sonidos de percusión
grabada son ejecutados usualmente desde el comienzo en una relación de tiempo
determinada con el resto de la música.

En esta situación, las secuencias de control están mejor adaptadas que las
señales de audio como disparadores. El ejemplo C05.sampler.oneshot.pd (figura
3.14) muestra una forma posible de lograr esto. Los cuatro objetos tilde de la
parte inferior izquierda forman la red para el procesamiento de la señal en la
reproducción. Un objeto vline~ genera una señal de fase (precisamente un índice
de lectura de tabla) para el objeto tabread4~; este reemplaza al phasor~ del
ejemplo B03.tabread4.pd (página “49”) y sus derivados.

La amplitud de la salida de tabread4~ está controlada por un segundo objeto


vline~ para prevenir discontinuidades en la salida en caso de que un nuevo
evento comience mientras el evento previo todavía suena. El objeto “cutoff” de
vline~ tiene como salida una rampa a cero (esté sonando o no), de tal manera
que, una vez la salida es cero, el índice de la tabla de onda puede ser cambiado
de manera discontinua.

Para iniciar una “nota” nueva, primero el objeto “cutoff” de vline~ es llevado a
cero por una rampa; después, luego de un retraso de 5 milisegundos (al cabo del
cual el punto vline~ ha alcanzado el cero) la fase se reajusta. Esto se hace con
dos mensajes: primero, la fase se ajusta a 1 (sin valor de tiempo, de tal manera
que salta a 1 sin rampa). El valor de “1” especifica el primer punto de lectura
de la tabla de onda, ya que estamos utilizando interpolación de 4 puntos.
Segundo, en la misma caja de mensajes, la fase va en rampa a 441,000,000 en un
período de tiempo de 10,000,000 milisegundos. (En Pd los números muy grandes se
muestran usando notación exponencial, estos dos aparecen como 4.41e+08 y 1e+07.)
El cociente es 44.1 (en unidades por milisegundos) dando una transposición de
uno. El objeto vline~ de la parte superior (que genera la fase) recibe estos
mensajes vía el objeto “r phase” que está sobre él.

El ejemplo asume que la tabla de onda es llevada a cero suavemente en rampa en


el otro extremo, y la porción inferior derecha del parche muestra cómo grabar
una tabla de onda así (en este caso de cuatro segundos de duración). Aquí un
objeto line~ regular (y computacionalmente más barato) es suficiente. Aunque la
tabla de onda debería ser de por lo menos 4 segundos de duración para este
trabajo, usted puede grabar tablas de onda más cortas simplemente recortando el
objeto line~ antes. La única dificultad es que, si está leyendo y escribiendo
simultáneamente de la misma tabla, debería evitar situaciones en las que las
operaciones de lectura y escritura ataquen la misma porción de la tabla de onda
a la vez.

Los objetos vline~ que rodean a tabread fueron escogidos por sobre line~ debido
a que los redondeos de este último de los puntos de quiebre de las fronteras del
bloque más cercano (típicamente 1.45 milisegundos) pueden hacer audibles las
aperiodicidades en el sonido si la tabla de onda es repetida a más de 10 o 20
veces por segundo, y prevendría un hermoso y periódico sonido a altas
frecuencias de repetición.

Regresaremos a la lectura de muestras basadas en vline~ en el siguiente capítulo


para adicionar transposición, envolventes y polifonía.

Señales a control

El ejemplo C06.signal.to.control.pd (que no se ilustra) demuestra la conversión


de las señales de audio a secuencias de control nuevamente, vía un objeto tilde
presentado aquí.

snapshot~: convierte la señal de audio a mensaje de control. Siempre da la


muestra de audio computada más recientemente (con la conversión más-rápida-
posible) de tal manera que el tiempo de lectura de muestras varía en hasta un
bloque de audio.

Es deseable con frecuencia sensar la amplitud de la señal de audio en lugar del


pico en una sola muestra; el ejemplo C07.envelope.follower.pd (que tampoco se
muestra) presenta otro objeto que hace esto:

env~: seguidor de envolvente RMS. A su salida hay mensajes de control que dan la
amplitud RMS en tiempos cortos (en decibeles) de la señal de audio que entra.
Una creación de argumentos le permite seleccionar el número de muestras
utilizadas para el cálculo de RMS; números más pequeños dan una salida más
rápida (y posiblemente menos estable).

Secuenciador estilo análogo


El ejemplo C08.analog.sequencer.pd (figura 3.15) realiza la secuenciación
análoga y la generación de envolvente descrita en la sección 3.7. La tabla
“sequence”, con nueve elementos, contiene una secuencia de frecuencias. El
objeto phasor~ en la parte superior ejecuta los ciclos a través de la tabla de
secuencia a 0.6 Hertz. La lectura de tabla sin interpolación (tabread~ en lugar
de tabread4~) se utiliza para leer las frecuencias en pasos discretos. (Tales
situaciones, en las que preferimos lectura de tabla sin interpolación son
raras.)

El objeto wrap~ convierte la diente de sierra de amplitud 9 a una amplitud de


una unidad, según se describió antes en la figura 3.8, tras lo cual se usa para
obtener una función de envolvente de una segunda tabla de onda. Aquí la tabla de
onda consiste en seis períodos de una sinusoide. Los granos se suavizan
multiplicando por una función coseno elevada (cos~ y + 1).

El ejemplo C09.sample.hold.pd (que no se ilustra aquí) muestra una unidad de


muestra-y-retención, otro recurso útil para hacer tareas de control en el
dominio de la señal de audio.

Sintetizador estilo MIDI

El ejemplo C10.monophonic.synth.pd (figura 3.16) también implementa un


sintetizador monofónico orientado hacia las notas, pero en este caso orientado
también hacia el control MIDI. Aquí las tareas de generación de envolvente y
secuencia de notas son manejadas utilizadando secuencias de control en lugar de
señales de audio. Objetos de control nuevos se requieren en este ejemplo:
notein: entrada de nota MIDI. Tres salidas dan la altura, la velocidad y el
canal de entrada MIDI de los eventos nota-encendida y nota-apagada (con los
eventos nota-apagada apareciendo como eventos nota-encendida con velocidad
cero). Las salidas aparecen en el orden acostumbrado de derecha a izquierda.

stripnote: filtra los mensajes nota-apagada. Pasa pares (nota, velocidad)


siempre y cuando la velocidad no sea cero, eliminando los otros. A diferencia de
notein, stripnote no utiliza entrada o salida de hardware MIDI directamente.

trigger, t: copia un mensaje a la salida en el orden de derecha a izquierda, con


conversión del tipo de mensaje a la salida. La creación de argumentos (“b” y “f”
en este ejemplo) especifica dos salidas, una que proporciona mensajes “bang” y
la otra mensajes “float” (es decir, números). Se crea una salida por cada
argumento creado. Las salidas aparecen en el orden normal de Pd de derecha a
izquierda.

Los objetos de control del parche alimentan las frecuencias del objeto phasor~
siempre y cuando se reciba un mensaje MIDI de nota-encendida. El control de la
amplitud (vía objetos line~) es más difícil. Cuando un mensaje nota-encendida se
recibe, el objeto sel 0 tiene como salida la velocidad a la derecha (debido a
que la entrada no coincide con 0), esta se divide por la velocidad máxima MIDI
de 127 y se empaca en un mensaje para line~ con un tiempo de 100 ms.

Sin embargo, cuando se recibe un mensaje nota-apagada, es apropiado parar el


sonido únicamente si la altura de la nota-apagada coincide con la altura que
está sonando a través del instrumento. Por ejemplo, suponga que los mensajes
recibidos son “60 127”, “72 127”, “60 0” y “72 0”. Cuando la nota-encendida en
la altura 72 llega, la altura del sonido debe cambiar a 72 y entonces el mensaje
“60 0” se debe ignorar, con la nota sonando hasta el mensaje “72 0”.

Para lograr esto, primero almacenamos la velocidad en el objeto float de la


parte superior. En segundo lugar, cuando la altura MIDI de la nota llega, se
almacena también (el objeto float de la parte inferior) y luego la velocidad se
examina de nuevo contra cero (la salida “bang” de t b f vuelve a llamar la
velocidad que es enviada a sel 0). Si es cero, el segundo paso es volver a
llamar la altura y examinarla (con el objeto select) contra la altura de la
nota-encendida que se recibió más reciente. Únicamente si son iguales (de tal
manera que el “bang” aparece en la salida de la izquierda de select) hace que el
mensaje “0 1000” vaya al objeto line~. <la nota tarda 1 segundo en dejar de
sonar>.

Ejercicios

1. Cuántos parciales de un sonido La 440 pueden representarse digitalmente a una


velocidad de muestras de 44100 Hertz?

2. Qué frecuencia debería escuchar si sintetizó una sinusoide a 88000 Hertz a


una velocidad de muestras de 44100?

3. Suponga que está sintetizando un sonido a 44100 Hertz, y está computando


bloques de audio de 64 muestras. Un evento de control se programa para que
ocurra pasado exactamente un tiempo de un segundo, utilizando el esquema más-
rápida-posible. En qué número de muestra ocurre el evento?

4. Leyendo a 44100 muestras por segundo, queremos tocar un sonido Do medio


repitiendo una onda fija cada N muestras. Qué valor de N deberíamos escoger, y
cuántos cents (página “7”) quedaremos por fuera del “verdadero” Do medio?

5. Dos ondas diente de sierra, de una unidad de amplitud, tienen frecuencias de


200 y 300 Hertz respectivamente. Cuál es la periodicidad de la suma de las dos?
Cuál es si usted envuelve la suma para obtener un rango de 0 a 1? Al hacer esto
hay algún cambio dependiendo de la fase relativa entre ambas?

6. Dos ondas diente de sierra con igual frecuencia y amplitud pero con un
desfase de medio ciclo, se suman. Cuál es la forma de la onda y cuál es su
amplitud y su frecuencia?

7. Cuál es el nivel relativo, en decibeles, del tercer armónico de una diente de


sierra (tres veces la fundamental) comparado con el de la fundamental?

8. Suponga que sintetiza una diente de sierra de 44000 Hertz a una velocidad de
muestras de 44100 Hertz. Cuál es la onda resultante?

9. Usando las técnicas de la sección 3.7, dibuje un diagrama de bloques para


generar dos sinusoides con fase fija a 500 y 700 Hertz.

10. Dibujar un diagrama de bloques mostrando cómo utilizar el umbral para


detectar cuándo una señal de audio excede a otra en un cierto valor. (Podría
querer hacer esto para detectar y filtrar la realimentación de los parlantes a
los micrófonos.)
Capítulo 4

Automatización y admnistración de las voces

A veces queremos controlar los objetos musicales o los eventos como agregados,
en lugar de hacerlo individualmente. Los agregados podrían tomar la forma de una
serie de eventos espaciados en el tiempo, en los cuales los detalles de los
eventos siguen un arco más grande (por ejemplo las notas de una melodía). O los
individuales podrían sonar simultáneamente como las voces en un acorde o los
parciales en un sonido complejo. A veces algunas o todas las propiedades de los
elementos individuales son mejor inferidas de las propiedades que tiene el todo.

Una rica colección de herramientas e ideas surgen en el repertorio de la música


electrónica para describir comportamientos individuales de los agregados. En
este capítulo cubrimos dos clases de tales herramientas: los generadores de
envolvente y los bancos de sonidos. Los generadores de envolvente automatizan el
comportamiento en el tiempo, y los bancos de voces lo hacen sobre los agregados
de procesos simultáneos (tales como los generadores de señal).

4.1 Generadores de envolvente

Un generador de envolvente (a veces y con más justicia, llamado un generador de


transiente) hace que una señal de audio se eleve suavemente y luego caiga para
controlar la fortaleza de una nota musical. Los generadores de envolvente fueron
tocados anteriormente en la sección 1.5. El control de la amplitud por
multiplicación (figura 1.4) es la forma más directa y ordinaria para utilizarlo,
pero hay muchos otros usos posibles.

Los generadores de envolvente han tenido muchas formas a lo largo de los años,
pero el más simple y perenne favorito es el generador de envolvente ADSR. “ADSR”
es un acrónimo de “Attack, Decay, Sustain, Release” <Ataque, Decaimiento,
Sostenimiento y Liberación>, los cuatro segmentos de la salida del generador. El
generador ADSR es encendido y apagado por una secuencia de control llamada
“disparo”. Al “encender” con el disparador el generador ADSR este ejecuta sus
segmentos de ataque, decaimiento y sostenimiento. Al “apagar” con el disparador
inicia el segmento de liberación. La figura 4.1 muestra la representación en
diagrama de bloques de un generador de envolventes.

Hay cinco parámetros controlando el generador ADSR. El primero, un parámetro de


nivel ajusta el valor de la salida al final del segmento de ataque (que es
normalmente el valor más alto de salida del generador ADSR). El segundo y el
tercero son los parámtros de ataque y decaimiento que dan el tiempo de duración
de estos segmentos respectivamente. El cuarto es un parámetro de sostenimiento
que da el nivel del segmento sostenimiento, como una fracción del parámetro de
nivel. Finalmente el parámetro liberación proporciona la duración de dicho
segmento. Estos cinco valores, junto con los tiempos de encendido y apagado en
el disparo, determinan totalmente la salida del generador ADSR. Por ejemplo la
duración de la porción del sostenimiento es igual al tiempo entre los “disparos”
de encendido y apagado, menos las duraciones de los segmentos de ataque y
decaimiento.

La aplicación clásica de una envolvente ADSR es usándola en un teclado o


secuenciador musical controlado por voltaje, para hacer notas musicales con un
sintetizador. Al oprimir y liberar una tecla (por ejemplo) se deberían generar
los disparos de “encendido” y “apagado”. El generador ADSR debería controlar
entonces la amplitud de la síntesis de tal manera que las “notas” inicien y
terminen con las teclas. Adicional a la amplitud, el generador ADSR puede ser
utilizado (y usualmente se hace) para controlar el timbre, lo cual puede hacer
evolucionar el timbre de manera natural en el transcurrir de cada nota.

4.2 Formas de amplitud lineales y curvas


Suponga que desea iniciar gradualmente una señal en el transcurso de diez
segundos -eso es, usted quiere multiplicarla por una señal de control de
amplitud y[n] la cual se eleva de 0 a 1 en valor sobre 10R muestras donde R es
la velocidad de las muestras. La opción más obvia podría ser la de una rampa
lineal: y[n] = n/(10R). Pero esta no dará como resultado la producción de un
incremento suave en la intensidad percibida. En el primer segundo y[n] se eleva
de -∞ dB a -20 dB, en los siguientes cuatro a otros 14 dB y en los cinco
restantes, únicamente un restante de 6 dB. En la mayor parte del período de diez
segundos el incremento en la amplitud será barely no-sé perceptible.

Otra posibilidad sería elevar y[n] exponencialmente, de tal manera que se eleve
a una velocidad constante en decibeles. Se deberá fijar la amplitud inicial en
lo inaudible, por decir 0 dB (si fijamos la unidad a 100 dB). Ahora tenemos el
problema opuesto: para los primeros cinco segundos el control de la amplitud se
elevará de 0 dB (inaudible) a 50 dB (pianísimo); esta parte del inicio de la
nota debería tomarse únicamente el primer segundo aproximadamente.

Una progresión más natural debería ser sin embargo considerar el inicio de la
nota como una sucesión de dinámicas, 0-ppp-pp-p-mp-mf-f-ff-fff, tomando cada
paso aproximadamente un segundo.

Una entrada de nota idealmente debería obedecer a una escala entre la


logarítmica y la lineal. Una opción algo arbitraria, pero útil en la práctica,
es la curva cuártica:

y[n] = (n/N)4

donde N es el número de muestras sobre el cual está la entrada (en el ejemplo


anterior este número es 10R). Así en el primer segundo de los diez estaríamos
elevándonos a -80 dB, a los cinco segundos a -24, y a los nueve, a casi -4 dB.

La figura 4.3 muestra las tres funciones de transferencia de amplitud:

f1(x) = x (lineal)

f2(x) = 102(x -1) (dB a lineal)

f3(x) = x4 (cuártica)

La segunda función hace la conversión de dB a lineal, arreglada de tal manera


que el rango de entrada, de 0 a 1, corresponde a 40 dB. (Este rango de entrada
de 40 dB corresponde a un rango de dinámica razonable, permitiendo 5 dB por cada
8 pasos en la dinámica.) La curva cuártica imita bien la curva exponencial (dB)
para las amplitudes más altas, pero cae más rápidamente en las amplitudes
pequeñas, llegando al cero real correctamente (toda vez que la curva exponencial
cae únicamente a 1/100).

Podemos pensar las tres curvas de las funciones de transferencia que se


muestran, desde un control abstracto (con rango de 0 a 1) a una amplitud lineal.
Después de escoger una función de transferencia f apropiada, podemos calcular
la señal de control correspondiente; si queremos elevarnos sobre una rampa de N
muestras desde el silencio hasta la unidad de ganancia, la señal de control
deberá ser:

y[n] = f(n/N)

Un diagrama de bloques para esto se muestra en la figura 4.4. Introducimos aquí


un nuevo tipo de bloque para representar la aplicación de función de
transferencia. Por ahora no nos preocuparemos de su implementación; dependiendo
de la función deseada, esto debería ser mejor hacerlo aritméticamente o
utilizando la lectura de tablas.

4.3 Cambios de control continuos y discontinuos

Los algoritmos de síntesis varían ampliamente en su capacidad para tratar con


los cambios de control discontinuos. Hasta ahora en este capítulo hemos asumido
que los controles deben cambiar continuamente, y que el generador de envolvente
ADSR se convierte en el que idealmente realiza tales controles. Puede incluso
suceder que la amplitud máxima de una nota sea menor que el valor corriente de
su predecesora (utilizando el mismo generador) y la envolvente ADSR simplemente
descenderá la rampa (en lugar de ascender) a un nuevo valor para un ataque.

Esto no es necesariamente deseable, siempre y cuando, en situaciones donde un


generador de envolvente esté encargado de algunos aspectos del timbre: sin
embargo, por ejemplo no queremos que la agudeza de una nota decrezca durante el
ataque a una más suave, si no que salte a un valor más bajo de tal forma que
siempre pueda elevarse durante el ataque.

Esta situación también puede suceder con las envolventes de afinación: se puede
querer deslizar la altura de una nota a la siguiente, o se puede querer que la
trayectoria de la afinación de cada nota inicie de nuevo en un punto
independiente del sonido previo.

Dos situaciones se presentan cuando queremos hacer cambios discontinuos a los


parámetros de síntesis: podemos hacerlo simplemente sin interrupción (por
ejemplo haciendo un cambio discontinuo en la altura); o en cambio, no podemos,
como en el caso de un índice de tabla de onda (el cual hace un cambio
discontinuo en la salida). Hay incluso parámetros que posiblemente no pueden
cambiarse de manera continua; por ejemplo, una selección entre un conjunto de
tablas de onda. En general, los cambios discontinuos de la fase en un oscilador
o de la amplitud de una señal ocasionará un artefacto audible, pero los
incrementos de fase (tales como alturas) pueden ir por saltos sin malos
resultados.

En los casos en los que un cambio de parámetro no se puede hacer de manera


continua por una u otra razón, existen por lo menos dos estrategias para
realizar el cambio limpiamente: el muteo y el cambio-y-rampa.

4.3.1 Muteo

La técnica del muteo se aplica a una envolvente en una salida de amplitud, la


cual es rápidamente llevada en rampa a cero antes de que el parámetro cambie y
luego es restaurada más tarde. Puede ser o no el caso de que los cambios
discontinuos resultarán en una señal que se eleve lentamente desde cero
posteriormente. En la figura 4.5 (parte a), tomamos el ejemplo de una envolvente
de amplitud (la salida de la señal de un generador de ADSR), y asumimos que el
cambio discontinuo está al iniciar una nueva nota desde la amplitud cero.

Para cambiar la salida del generador ADSR de manera dicontinua, lo reajustamos.


Esta es una operación diferente del disparo; el resultado es hacer que salte a
un nuevo valor, después del cual se puede simplemente dejarlo ahí o redisparar
el generador ADSR.

Debajo de la salida del generador ADSR vemos el muteo apropiado de la señal, el


cual llega en rampa a cero para preparar la discontinuidad. La cantidad de
tiempo que dejamos para el muteo debe ser pequeña (de tal manera que interrumpa
el sonido previo en tan poco como sea posible) pero no tan pequeña que cause
artefactos audibles en la salida. Un ejemplo de trabajo de este tipo de muteo se
mostró ya en la página “81”; allí dejamos 5 milisegundos para el descenso de la
rampa. La señal del muteo se multiplica por la salida del proceso para eliminar
el click.
La figura 4.5 (parte b) muestra la situación en la cual suponemos que el cambio
discontinuo está entre dos valores que posiblemente no son cero. Aquí la señal
de muteo debe no únicamente bajar la rampa como antes (con anticipación a la
discontinuidad) si no que también debe subirla posteriormente. El tiempo de la
bajada de la rampa no necesita ser igual al de la subida; estos se pueden
escoger, como siempre, escuchando el sonido a la salida.

En general, el muteo presenta la dificultad de que usted debe comenzar la


operación del muteo con anticipación al cambio de control deseado. En ajustes en
tiempo real, esto usualmente requiere que nosotros intencionalmente retrasemos
el cambio de control. Esta es otra razón para mantener el tiempo de muteo tan
bajo como sea posible. (Es más, es mala idea tratar de minimizar el retraso
condicionalmente, omitiendo el período de descenso de la rampa cuando este no se
requiere; un retraso constante es mucho mejor que uno que varíe, incluso si este
es más pequeño en promedio.)

4.3.2 Interruptor-y-rampa

La técnica interruptor-y-rampa también busca remover discontinuidades resultado


de los cambios de control discontinuos, pero lo hace de manera diferente:
sintetizando una discontinuidad opuesta la cual adicionamos para cancelar la
original. La figura 4.6 muestra un ejemplo en el cual un sonido percusivo (una
sinusoide envuelta) comienza una nota en la mitad de la nota previa. El ataque
del sonido no deriva de la envolvente de amplitud, si no de la fase inicial de
la sinusoide, como es usualmente apropiado para sonidos percusivos. La gráfica
inferior en la figura muestra una señal de audio compensadora con una
discontinuidad opuesta, la cual puede ser sumada a la superior para remover la
discontinuidad. Las ventajas de esta técnica sobre el muteo son, primero, que
aquí no se requiere de retraso entre la decisión de hacer un ataque y el sonido
del ataque; y segundo, que cualquier artefacto que aparezca con esta técnica es
más probable que se pueda enmascarar con la aparición de un nuevo sonido.

La figura 4.7 muestra cómo la técnica interrupción-y-rampa puede realizarse en


un diagrama de bloques. La caja marcada con comillas (“...”) puede contener
cualquier algoritmo de síntesis, el cual queremos interrumpir discontinuamente
de tal manera que re-inicie de cero (como por ejemplo lo hace en la parte (a) de
la figura previa). Al mismo tiempo que disparamos los cambios de control
necesarios (ejemplificados por el generador ADSR de la parte superior), también
reiniciamos y disparamos otro generador ADSR (en la mitad a la derecha) para
cancelar la discontinuidad. La discontinuidad es menos que el último valor de
salida de la síntesis, justo antes de reajustarse a cero.

Para hacer esto medimos el nivel al que el generador de envolvente ADSR debe
saltar. Este es su propio nivel corriente (que no debería ser cero). Los dos son
sumados (con el objeto +~ en la parte inferior), y luego se toma una
instantánea. La generador de envolvente de cancelación (a la derecha) es
reiniciado continuamente a este nuevo valor, y luego disparado para descender la
rampa a cero. La salida del objeto +~ (la suma de la salida del sintetizador y
de la señal de cancelación de discontinuidad) es la señal de-click-ada.

4.4 Polifonía

En la música, el término polifonía es usualmente utilizado para significar “más


de una voz separadas cantando o tocando en diferentes tonos una de la otra”.
Cuando hablamos de instrumentos musicales electrónicos utilizamos el término
para decir “mantener varias copias del mismo proceso en paralelo”. Usualmente
llamamos cada copia una “voz” manteniendo la analogía, aun cuando las voces no
necesitan ser tocadas de manera separada con sonidos distintos.

En este lenguaje, un piano es un instrumento polifónico, con 88 “voces”. Cada


voz del piano es capaz normalmente de tocar exactamente una nota. Aquí nunca se
pregunta cuál voz usar para tocar una nota en una altura determinada, y tampoco
se pregunta por la ejecución de varias notas simultáneamente en la misma altura.

Muchos instrumentos musicales electrónicos polifónicos se aprovechan de manera


más flexible del manejo de las voces. La mayoría de los programas de síntesis
(como Csound) utilizan un esquema de asignación dinámica de voces, esto es, en
efecto, que una nueva voz se crea por cada nota en la partitura. En sistemas
tales como Max o Pd, los cuales están orientados para el uso interactivo en
tiempo real, un banco de voces es localizado con anticipación, y el trabajo que
se debe hacer (tocar notas o lo que sea), se distribuye entre las voces en el
banco.

Esto se diagrama en la figura 4.8, donde cada una de las voces produce una señal
de salida, las cuales se suman todas para producir la salida total de las voces
del banco. Frecuentemente las voces individuales requerirán algunas salidas
separadas; por ejemplo, ellas podrían tener salidas por varios canales de tal
manera de que puedan ser panoramizadas individualmente; o podrían tener envíos
de efectos individuales de tal manera que cada una puede tener su propio nivel
de envío.

4.5 Asignación de las voces

Es frecuentemente deseable automatizar la selección de las voces para asociarlas


con tareas individuales (tales como notas para tocar). Por ejemplo, un músico
tocando el teclado no puede escoger en la práctica cuál voz suena con cada nota.
Para automatizar la selección de las voces necesitamos un algoritmo de
asignación de las voces, para usarse como se muestra en la figura 4.9.

Armados con un algoritmo apropiado de asignación de las voces, la fuente de


control no necesita preocuparse con el detalle de qué voz se ocupa de qué tarea;
a los generadores de notas algorítmicos y a los secuenciadores frecuentemente se
les confía esto. De otro lado, la escritura musical para ensambles
frecuentemente especifica explícitamente cuál instrumento toca qué nota, de tal
manera que las notas se conectarán una con la otra de extremo a extremo de la
manera que queremos. Un algoritmo sencillo de asignación de voces trabaja como
se muestra en la figura 4.10. Aquí suponemos que el banco de voces tiene
únicamente dos voces, y tratamos de asignar voces para las tareas a, b, c y d.
Las cosas van sin sobresaltos hasta que llega la tarea d, porque entonces vemos
que no hay voces libres (están tomadas por b y c). Podríamos ahora elegir
realizar o no la tarea d o tomar la voz de la tarea b o c. En la práctica, la
mejor opción es tomar una. En este ejemplo en particular, escogimos tomar la voz
de la tarea más antigua, b.

Si conocemos la longitud de las tareas b y c por fuera de la ejecución de la


tarea d, podremos ser capaces de escoger mejor cuál voz tomar. En este ejemplo
podría haber sido mejor tomar la de la c, ya que d y b deben sonar juntas en el
final y no la d únicamente. En algunas situaciones esta información estará
disponible cuando debamos tomar la decisión, y en otras (la entrada de un
teclado en vivo, por ejemplo), no.

4.6 Etiquetas de las voces

Suponga ahora que estamos utilizando en banco de voces para tocar notas, como en
el ejemplo de arriba, pero suponga que las notas a, b, c y d tienen todas la
misma altura y aún más, que tienen otros parámeros idénticos. Cómo podemos
diseñar una secuencia de control de tal manera que cuando cualquier nota se
apague, sepamos cuál fue?

Esta cuestión no viene al caso si la fuente de control es un teclado debido a


que es imposible tocar más de una nota simultáneamente con una sola tecla. Pero
podría fácilmente presentarse algorítmicamente, o simplemente como resultado de
la mezcla de dos secuencias de teclados juntas. Aún más, el apagado de las notas
es únicamente el ejemplo más simple de un problema más general, el cual es cómo,
una vez terminada una tarea en un banco de voces, podemos recobrarla para la
misma voz con el fin de guiar su evolución como una función de las entradas en
tiempo real, o de cualquier otro factor que no es posible predecir.

Para tratar con situaciones como esta podemos adicionar una o más etiquetas al
mensaje de inicio de la nota (o en general, a una tarea). Una etiqueta es
cualquier conjunto de datos con el cual podemos identificar más tarde la tarea,
los cuales podemos utilizar depués para buscar la voz a la que fue asignada.

Tomando de nuevo el ejemplo de la figura 4.10, hay una forma en la que podríamos
escribir aquellas cuatro tareas como una secuencia de control:

tiempo-de-inicio tiempo-de-finalización nota ...

1 3 60 ...
2 8 62 ...
4 6 64 ...
5 8 65 ...

En esta representación no necesitamos etiquetas debido a que cada mensaje (cada


línea de texto) contiene toda la información que requerimos para especificar la
tarea completa. (Aquí hemos asumido que las tareas a, ..., d son de hecho notas
musicales con alturas 60, 62, 64 y 65.) En efecto, estamos representando cada
tarea como un evento singular en una secuencia de control (sección 3.3).

De otro lado, si suponemos ahora que no conocemos con anticipación la longitud


de cada nota, una mejor representación podría ser esta otra:

tiempo etiqueta acción parámetros

1 a start 60 ...
2 b start 62 ...
3 a end
4 c start 64 ...
5 d start 65 ...
6 c end
7 b end
8 d end

Aquí cada nota ha sido dividida en dos eventos separados para iniciar y para
finalizar. Las letras a, ..., d son utilizadas como etiquetas; sabemos cuál
inicio va con con cuál final ya que sus etiquetas son las mismas. Note que la
etiqueta no necesariamente está del todo relacionada con la voz que se utilizará
para tocar cada nota.

El MIDI normalizado no suministra etiquetas; en el uso normal, la altura de una


nota sirve también como su etiqueta (de tal manera que las etiquetas están
siendo re-utilizadas continuamente.) Si dos notas tienen la misma altura deben
ser dirigidas de manera separada (para deslizar sus alturas en direcciones
diferentes, por ejemplo) y el canal MIDI debe ser usado como una etiqueta
(adicional a la nota).

En los programas de computación de música en tiempo real es usualmente necesario


pasar alternativamente entre los eventos-por-tarea y el etiquetado anterior, ya
que la primera representación está mejor dispuesta para almacenar una edición
gráfica, mientras que la segunda está mejor dispuesta para las operaciones en
tiempo real.

4.7 Encapsulado Pd

Los ejemplos para este capítulo utilizarán el mecanismo de encapsulado Pd el


cual permite la construcción de parches que pueden ser reutilizados cualquier
número de veces. Una o más caja de objetos en Pd pueden ser subparches, los
cuales son parches separados encapsulados dentro de las cajas. Vienen en dos
tipos: subparches encendido-apagado y abstracciones. En cualquier caso el
subparche aparece como una caja de objeto en otro parche denominado padre.

Si usted escribe “pd” o “pd mi-nombre” dentro de una caja de objeto, este crea
un subparche encendido-apagado. Los contenidos de este subparche son salvados
como parte del parche padre, en un archivo. Si hace algunas copias de un
subparche, puede cambiarlas individualmente. De otro lado puede invocar una
abstracción escribiendo dentro de la caja el nombre de un parche Pd salvado como
un archivo (sin la extensión “.pd”). En esta situación Pd leerá ese archivo
dentro del subparche. De esta manera los cambios en el archivo se propagarán
donde quiera que la abstracción se invoque.

Un subparche (sea encendido-apagado o abstracción) puede tener diferentes


entradas o salidas que aparecen en la caja del parche padre. Esto se especifica
utilizando los siguientes objetos:

inlet, inlet~: crea entradas para la caja de objeto que contiene al subparche.
La versión inlet~ crea una entrada de señal de audio, mientras que inlet crea
crea una para secuencias de control. En cualquier caso, lo que sea que llegue a
la entrada de la caja en el parche padre, llega al inlet o al inlet~ en el
subparche.

outlet, outlet~: objetos correspondiente para las salidas de los subparches.

Pd provee un mecanismo de paso-de-argumento para que usted pueda parametrizar


invocaciones diferentes de una abstracción. Si en una caja de objeto usted
escribe “$1”, esto significa “el primer argumento creado en mi caja del parche
padre”, de manera similar para “$2” y así sucesivamente. El texto en una caja de
objeto se interpreta en el momento en que se crea la caja, a diferencia del
texto en una caja de mensaje. En las cajas de mensajes el mismo “$1” significa
“el primer argumento del mensaje que acabo de recibir” y es interpretado siempre
y cuando llegue un nuevo mensaje.

Un ejemplo de una abstracción utilizando entradas, salidas y parametrización, se


muestra en la figura 4.11. En la parte (a), un parche invoca el objeto
plusminus, y la salida es la suma y la diferencia de 8 y 5.

El objeto plusminus no está definido por Pd, pero sí está definido por el parche
que reside en el archivo denominado “plusminus.pd”. Este parche se muestra en la
parte (b) de la figura. El objeto inlet y los dos objetos outlet corresponden a
las entradas y las salidas del objeto plusminus. Los dos argumentos “$1” (para
los objetos + y -) son reemplazados por 5 (el argumento creado del objeto
plusminus).

Hemos visto ya una abstracción en los ejemplos: el objeto output~ introducido en


la figura 1.10 (página “16”). En ese ejemplo se ve también que una abstracción
puede mostrar controles como parte de su caja en el parche padre; vea la
documentación de Pd para una descripción de esta característica.

4.8 Ejemplos

Generador de envolvente ADSR

El ejemplo D01.envelope.gen.pd (figura 4.12) muestra cómo el objeto line~ puede


ser utilizado para generar una envolvente ADSR para controlar un parche de
síntesis (en la figura se muestra únicamente la envolvente ADSR). El botón
“attack” tiene dos efectos cuando se presiona. El primero (a la izquierda en la
figura) es ajustar el objeto line~ con su segmento de ataque, con una meta de 10
(la amplitud pico) sobre 200 milisegundos (el tiempo de ataque). Segundo, el
botón de ataque ajusta un objeto delay 200, de tal manera que después de que el
segmento de ataque haya pasado, el segmento de decaimiento pueda iniciar. El
segmento de decaimiento cae a 1 (el nivel de sostenimiento) luego de otros 2500
milisegundos (el tiempo de decaimiento).

El botón “release” envía el mismo objeto line~ a cero en más de 500 milisegundos
(el tiempo de liberación). También, en caso de que el objeto delay 200 esté
activo en el momento de que el botón “release” se presiona, un mensaje “stop” es
enviado a este. Esto previene al generador ADSR de lanzar su segmento de
decaimiento después de lanzar el segmento de liberación.

En el ejemplo D02.adsr.pd (figura 4.13) encapsulamos el generador ADSR en una


abstracción Pd (denominada adsr) de tal manera que se pueda replicar con
facilidad. El diseño de la abstracción adsr hace posible controlar los cinco
parámetros ya sea suministrando argumentos creados o conectando secuencias de
control en sus entradas.

En este ejemplo, los cinco argumentos creados (1, 100, 200, 50 y 300)
especifican el nivel pico, el tiempo de ataque, el tiempo de decaimiento, el
nivel del sostenimiento (como un porcentaje del nivel pico), y el tiempo de
liberación. Hay seis entradas de control: la primera para disparar el generador
ADSR, y las otras para actualizar los valores de los cinco parámetros. La salida
de la abstracción es una señal de audio.

Esta abstracción está realizada como se muestra en la figura 4.14. (Puede abrir
este subparche haciendo click en el objeto adsr del parche.) Los únicos objetos
de señal son line~ y outlet~. Los tres objetos pack corresponden a los tres
objetos de mensaje de la figura 4.12 anterior. De izquierda a derecha, ellos se
ocupan de los segmentos de ataque, decaimiento y liberación.

El segmento de ataque va a un objetivo especificado como “$1” (el primer


argumento creado de la abstracción) en “$2” milisegundos; estos valores se
pueden sobreescribir enviando números a las entradas “peak level” y “attack”. El
segmento de liberación es similar pero más sencillo, ya que el objetivo es
siempre cero. La parte difícil es el segmento de decaimiento, que debe ajustarse
después de un retraso igual al tiempo de ataque (el objeto del $2). El nivel de
sostenimiento es calculado a partir del nivel pico y del porcentaje de
sostenimiento (multiplicando los dos y dividiendo por 100).

La entrada del disparador, si envía un número diferente de cero, dispara un


arranque (los segmentos de ataque y decaimiento), y si envía cero, dispara el
segmento de liberación. Aún más, el generador ADSR puede ser reiniciado en cero
enviando un disparo negativo (lo cual genera también un arranque).

Funciones de transferencia para control de amplitud

La sección 4.2 describió el uso de las envolventes ADSR para controlar la


amplitud, para lo cual los segmentos exponencial o de curva cuártica usualmente
proporcionan resultados sonoros más naturales que los segmentos lineales. Los
parches D03.envelope.dB.pd y D04.envelope.quartic.pd (el último mostrado en la
figura 4.15) demuestra el uso de segmentos decibel y cuártico. Adicional a la
amplitud, en el ejemplo D04.envelope.quartic.pd la frecuencia del sonido está
controlada también, utilizando formas lineales y cuárticas para su comparación.

Ya que convertir decibeles a unidades de amplitud lineal es una operación


costosa (por lo menos comparada con la de un oscilador o la de un generador de
rampa), el ejemplo D03.envelope.dB.pd utiliza lectura de tabla para implementar
la función de transferencia necesaria. Esto tiene la ventaja de la eficiencia,
pero la desventaja de que debemos decidir el rango de los valores admisibles con
anticipación (que son aquí de 0 a 120 dB).

Para los segmentos cuárticos como en el ejemplo D04.envelope.quartic.pd no se


requiere lectura; simplemente elevamos al cuadrado la señal de salida del objeto
line~, dos veces, sucesivamente. Para compensar la elevación a la cuarta
potencia, el valor meta enviado al objeto line~ debe ser la raíz cuarta del
valor deseado. Así, los mensajes que hacen la rampa de frecuencia o amplitud son
primero desempacados para separar el valor meta del intervalo de tiempo, se toma
la raíz cuarta del valor meta (por la vía de la sucesión de dos raíces
cudradas), ylos dos se envían luego al objeto line~. Hemos hecho uso aquí de un
nuevo objeto Pd:

unpack: desempaca una lista de números (y/o símbolos) y los distribuye en


salidas separadas. Como es usual las salidas aparecen en orden de derecha a
izquierda. El número de las salidas y sus tipos están determinadas por los
argumentos creados. (Ver también pack, página “50”).

Los dos parches siguientes, D05.envelope.pitch.pd y D06.envelope.portamento.pd,


utilizan el primero, un generador de envolvente ADSR para hacer una envolvente
de altura y el segundo, un solo objeto line~, también como control de la altura,
para hacer portamento. En ambos casos los segmentos exponenciales son deseables,
y se calculan utilizando lectura de tabla.

Síntesis aditiva: la campana de Risset

El mecanismo de abstracción de Pd, que utilizamos antes para hacer un generador


de envolvente re-utilizable, es también útil para hacer bancos de voces.
Utilizaremos aquí abstracciones para organizar bancos de osciladores para
síntesis aditiva. Hay muchas formas posibles de organizar bancos de osciladores,
además de las que se muestran aquí.

La organización más simple y directa de las sinusoides es formar parciales y


adicionarlos a una nota. El resultado es monofónico, en el sentido que el parche
ejecutará una sola nota a la vez, la cual, sin embargo consistirá de algunas
sinusoides cuyas frecuencias y amplitudes individuales dependen de aquellas cuya
nota estamos tocando, y también de su lugar individual en una serie armónica (o
inarmónica) de series de sobretonos.

El ejemplo D07.aditive.pd (figura 4.16) utiliza un banco de 11 copias de una


abstracción denominada partial (figura 4.17) en una imitación de un instrumento
campana bien conocido de Jean-Claude Risset. Tal como se describe en [DJ85, pág.
94] el sonido de la campana tiene 11 parciales, cada uno con su propia amplitud,
frecuencia y duración relativas.

Para cada nota, la abstracción partial computa una envolvente de amplitud simple
(cuártica) consistente únicamente de un segmento de ataque y de decaimiento; sin
segmento de sostenimiento o de liberación. Esto se multiplica por una sinusoide
y el producto se adiciona en un bus de suma. Dos nuevos tipos de objetos son
introducidos para implementar el bus de suma:

catch~: define y da salida a un bus de suma. El argumento creado (“sum-bus” en


el ejemplo) le da al bus de suma un nombre para que el objeto throw~ en la parte
inferior se pueda referir a este. Usted puede tener tantos buses de suma como
quiera (y por lo tanto objetos catch~) pero deben tener todos nombres
diferentes.

throw~: adición a un bus de suma. El argumento creado selecciona cuál bus de


suma utilizar.

La interface de control es cruda: las cajas de números controlan la frecuencia


“fundamental” de la campana y su duración. Al enviar un mensaje “bang” al objeto
s trigger comienza la nota. (la nota entonces decae sobre el período de tiempo
controlado por el parámetro de duración; no hay disparo separado para detener la
nota). No hay control de amplitud excepto vía el objeto output~.

Los cuatro argumentos para cada invocación de la abstracción partial


especifican:

1. la amplitud. Es la amplitud del parcial en su pico, al final del ataque y


al comienzo del decaimiento de la nota.

2. la duración relativa. Esta está multiplicada por la duración general de la


nota (controlada en el parche principal) para determinar la duración de la
porción de decaimiento de la sinusoide. Los parciales individuales pueden
tener así diferentes tiempos de decaimiento de tal forma que algunos
parciales mueren más rápido que otros, bajo el control general del parche
principal.

3. la frecuencia relativa. Al igual que con la duración relativa, esta


controla cada frecuencia de los parciales como un múltiplo de la frecuencia
general controlada en el parche principal.

4. la desafinación. Una frecuencia en Hertz que se añade al producto de la


frecuencia global y la frecuencia relativa.

A interior de la abstracción partial, la amplitud es tomada simplemente de


manera directa del argumento “$1” (multiplicando por 0.1 para ajustar las
amplitudes individuales altas); la duración es calculada del objeto r duration,
multiplicándolo por el argumento “$2”. La frecuencia es computada como fp + d
donde f es la frecuencia global (que viene del objeto r frequency), p es la
frecuencia relativa del parcial, y d es la frecuencia de desafinación.

Síntesis aditiva: control de la envolvente espectral

El siguiente parche de ejemplo, D08.table.spectrum.pd (figura 4.18), muestra una


aplicación muy diferente de la síntesis aditiva. Aquí las sinusoides son
manejadas por la abstracción spectrum-partial mostrada en la figura 4.19. Cada
parcial computa su propia amplitud periódicamente (cuando es disparada por el
objeto poll-table), utilizando un objeto tabread4. Los contenidos de la tabla
(los cuales tienen un rango nominal de 50 dB) son convertidos a unidades
lineales y utilizados como un control de amplitud en la forma usual.

<En el banco de osciladores de D08.table.spectrum.pd, se diferencia uno de


otro por un solo argumento que puede hacer las veces de número de parcial
(spectrum-partial 1, spectrum-partial 2, etc). Ese número se multiplica por
la frecuencia, dando como resultado un múltiplo entero de esta última. Esa
frecuencia-múltiplo se convierte a unidades MIDI a las que se resta el número
whammybar (que está en las mismas unidades), lo que actúa como un filtro. Sin
embargo, la línea de amplitudes dibujada en spectrum-tab es la que actúa en
primer lugar como filtro inicial, aumentando o disminuyendo amplitudes en
determinadas frecuencias.>

Un ejemplo similar, D09.shepard.tone.pd (que no se muestra), fabrica un sonido


Shepard usando la misma técnica. Aquí las frecuencias de las sinusoides barren
en un rango fijo, saltando desde el final al comienzo y repitiendo. La
envolvente espectral está ordenada para tener un pico en la mitad del rango de
afinación y caer hasta ser inaudible en los extremos del rango de tal manera que
escuchamos un barrido continuo pero no el salto. El resultado es un famoso
acertijo auditivo, un sonido indefinidamente ascendente o descendente.

<En D09.shepard.tone.pd la fase desciende de 10000 a 0 para volver a iniciar,


de dos en dos (ver el -2), cada 50 milisegundos. Ese número se recibe dentro
de cada subparche y se le suma la fase relativa, que es el único argumento
creado para cada subparche. El rango resultante de las fases se normaliza
entre -1 y 1 mediante la operación fase-total*0.0002-1. Este número se
utiliza para computar el descenso de la frecuencia en cada subparche que en
su punto máximo es 120+60 (“interval” menos ”pitch”) y en su mínimo -120+60
(120 es un intervalo elegido). Pero también ayuda a computar el descenso en
la amplitud con la fórmula de tipo gaussiano 1/(e^(fase-total*fase-
total*10)). Aquí 10 es un módulo elegido para obtener una forma determinada
para la caída de amplitud. Este uso doble y simultáneo de lo que llamamos
fase-total permite hacer coincidir la llegada a la nota central (60 en este
caso) con la máxima amplitud sonora 1.>

La técnica de sintetizar a una envolvente espectral específica puede ser


generalizada de muchas maneras: la envolvente puede ser hecha para variar en el
tiempo ya sea como el resultado de un análisis de una señal en vivo, o por el
cálculo de un conjunto de reglas composicionales, o por el cruzamiento atenuado
entre un conjunto de envolventes espectrales prediseñadas o por el pandeo-de-
frecuencias de envolventes, para nombrar algunas pocas posibilidades.

Síntesis polifónica: el muestreador

Nos movemos ahora a un ejemplo utilizando la asignación dinámica de voces tal


como se describió en la sección 4.5. En los ejemplos de la síntesis aditiva
mostrados previamente, cada voz es utilizada para un propósito fijo. En el
presente ejemplo, asignamos las voces desde un banco según se necesiten para
ejecutar las notas en una secuencia de control.

El ejemplo D11.sampler.poly.pd (figura 4.20) muestra el sampleador polifónico,


que usa la abstracción sampvoice (cuyo interior se muestra en la figura 4.21).
Las técnicas para alterar la afinación y otros parámetros en un muestrador de un
disparo se ven en el ejemplo D10.sampler.notes.pd (que no se muestra) el cual a
su vez deriva del muestrador de un disparo del capítulo previo
(C05.sampler.oneshot.pd, mostrado en la figura 3.14.)

Los objetos sampvoice están organizados en un tipo diferente de bus de suma al


de los anteriores; aquí, cada uno adiciona su propia salida a la señal en su
entrada, y pone la suma en su salida. En la parte inferior de los ocho objetos,
la salida de esta manera mantiene la suma de todos los ocho objetos. Este tiene
la ventaja de ser más explícito que los buses throw~ / catch~, y es preferible
cuando el atestamiento visual no es un problema.

La tarea principal del parche es, sin embargo, distribuir los mensajes “note” a
los objetos sampvoice. Para hacer esto debemos introducir algunos nuevos objetos
Pd:

mod: Módulo de enteros. Por ejemplo, 17 mod 10 da 7, -2 mod 10 da 8. Existe


también un objeto de división de enteros denominado div; dividir 17 por 10 vía
div da 1, y -2 por 10 da -1.

poly: Asignador de voces polifónico. Los argumentos creados dan el número de


voces en el banco y una bandera (1 si la voz que se toma se necesita, 0 si no).
Las entradas son una etiqueta numérica a la izquierda y una bandera a la derecha
indicando el inicio o la parada de una voz con la etiqueta dada (los números que
no son cero significan “start” y cero, “stop”). Las salidas son, a la izquierda,
el número de la voz, la etiqueta de nuevo al centro, y la bandera inicio/parada
a la derecha. En las aplicaciones MIDI, la etiqueta puede ser la nota y la
bandera inicio/parada puede ser la velocidad de la nota.

makenote: Suministra mensajes retrasados de nota-apagada para que coincidan con


los mensajes nota-encendida. Las entradas son una etiqueta y bandera de
inicio/parada (“nota” y “velocidad” cuando se usa MIDI) y la duración deseada en
milisegundos. Los pares etiqueta/bandera se repiten para las dos salidas tal
como ellas son recibidas; luego, después del retraso, la etiqueta es repetida
con la bandera cero para detener la nota después de la duración deseada.

Los mensajes “note” contienen campos para nota, amplitud, duración, número de
muestra, sitio de inicio en la muestra, tiempo de aparición y tiempo de
decaimiento. Por ejemplo, el mensaje
60 90 1000 2 500 10 20

(si es recibido por el objeto r note) significa tocar una nota a la altura 60
(en unidades MIDI), amplitud 90 dB, un segundo de longitud, desde la tabla de
onda denominada “sample2”, comenzando en el punto 500 milisegundos en la tabla
de onda, con tiempos de aparición y de decaimiento de 10 y 20 milisegundos.

Luego de desempacar el mensaje en sus siete componentes, el parche crea una


etiqueta para la nota. Para hacer esto, primero el objeto t b f da como salida
un disparo después de que el último de los siete parámetros aparece
separadamente. La combinación de los objetos +, f, y mod actúa como un contador
que se repite después de un millón de veces, escencialmente generando un número
único correspondiente a la nota.

El paso siguiente es utilizar el objeto poly para determinar cuál voz ejecuta
qué nota. El objeto poly espera mensajes separados para iniciar y detener las
tareas (es decir, las notas). De esta manera la etiqueta y la duración son
alimentados primero al objeto makenote, cuyas salidas incluyen una bandera
(“velocidad”) a la derecha y una etiqueta de nuevo a la izquierda. Por cada
etiqueta que recibe makenote, se genera la salida de dos pares de números, uno
para iniciar la nota, y el otro, después de un retraso igual a la duración de la
nota, para detenerla.

Habiendo tratado poly de separar esta entrada, ahora tenemos que desnudar los
mensajes correspondientes a los finales de las notas, puesto que nosotros
realmente necesitamos únicamente mensajes combinados de “nota” con campos de
duración. El objeto stripnote hace esta tarea. Finalmente, el número de voz que
hemos calculado es antepuesto a los siete parámetros con los que comenzamos (el
objeto pack), de tal manera que la salida del objeto pack aparece así:

4 60 90 1000 2 500 10 20

donde “4” es el número de la voz a la salida del objeto poly. El número de la


voz es utilizado para enrutar el mensaje hacia la voz deseada utilizando el
objeto route. El objeto sampvoice apropiado obtiene entonces la lista original
iniciando con “60”.

<El objeto poly distribuye las voces de manera inteligente, para que su uso
sea óptimo. Es decir, tiene en este ejemplo hasta 8 voces a las cuales les
puede asignar tareas en tanto la polifonía le exija echar mano de más de una
voz. Si la polifonía exige de más voces, por la manera en que está
estructurada la pieza, se genera un recorte de voces>

Dentro del objeto sampvoice (figura 4.21), el mensaje es utilizado para


controlar los objetos tabread4~ y rodear los objetos line~ y vline~. El control
tiene lugar con un retraso de 5 milisegundos como en el primer ejemplo de
muestreador. Aquí, sin embargo debemos almacenar los siete parámetros de la nota
(antes aquí no había parámetros). Esto se hace utilizando los seis objetos f,
más la entrada derecha del objeto delay de la derecha. Estos valores son usados
después del retraso de 5 milisegundos. Esto se hace en tándem con el mecanismo
de muteo descrito en la página “95”, utilizando otro objeto vline~.

Cuando han pasado los 5 milisegundos, el objeto vline~ a cargo de la generación


del índice de la tabla de onda consigue poner sus órdenes en marcha (y
simultáneamente, el número de la tabla de onda es ajustado para el objeto
tabread4~ y la envolvente de amplitud del generador comienza su ataque.) El
índice de la tabla de onda debe ajutarse discontinuamente para iniciar el
índice, luego hace la rampa hacia un índice final en un intervalo de tiempo
apropiado para obtener la transposición deseada. El índice de inicio en muestras
es precisamente 44.1 veces la localización del inicio en milisegundos, más uno,
para permitir la tabla de cuatro puntos de interpolación. Este viene a ser el
tercer número en la lista empacada generada por el objeto pack en el centro del
parche de voces.

Arbitrariamente decidimos que la rampa tendrá diez mil segundos (este es el


“1e+07” que aparece en la caja de mensaje enviada al índice de la tabla de onda
del generador), esperando que sea esta la mayor duración de cualquier nota que
vayamos a tocar. El índice del final es el índice del inicio, más el número de
muestras de la rampa. Con un factor de transposición de uno, nos deberemos mover
441,000,000 de muestras durante 10,000,000 de milisegundos, o proporcionalmente
más o menos, dependiendo del factor de transposición. El factor de transposición
es computado por el objeto mtof, dividido por 261.62 (la frecuencia
correspondiente a la nota MIDI 60) de tal manera que una “altura” especificada
como 60 resulte en un factor de transposición de uno.

Estos y otros parámetros son combinados en un mensaje vía el objeto pack de tal
manera que las cajas de mensajes siguientes puedan generar los mensajes de
control requeridos. La única novedad es el objeto makefilename, el cual
convierte números tales como “2” a símbolos tales como “sample2” de tal manera
que el objeto tabread4~ de la tabla de onda se puede ajustar.

En la parte inferior del parche de voces veremos cómo un bus de suma se


implementa dentro de un subparche; un objeto inlet~ va haciendo la suma de todas
las voces precedentes, haciendo que la salida de la voz corriente se adicione en
la entrada, y el resultado se envíe a la siguiente voz, vía el objeto outlet~.

<En sampvoice.pd el objeto pack de la parte inferior empaca las variables 1


amplitud (dB), 2 tiempo de entrada (milisegundos), 3 sitio de inicio (en número
de muestras), 4 factor de transposición, 5 número de la muestra o archivo de
audio. Así, los mensajes por debajo del objeto pack inferior hacen las funciones
de:
1er mensaje: ir a 0 en 5 milisegundos, para el vline~ que en este caso
apaga los procesos previos al disparo de la nota;
2o mensaje: ir al valor 3, sitio de inicio e ir al valor 4, factor de
transposición para el vline~ que hace la lectura de la tabla
3er mensaje: ubica el número del archivo de audio
4o mensaje: ir a 1 en 5 milisegundos, para el vline~ que en este caso
mutea el proceso de la envolvente en las discontinuidades, (esto debería ser
siempre y cuando se trate de repetir la misma voz antes de que la envolvente
termine su trabajo)
5o mensaje: ir a 0 e ir al valor 1, amplitud (dB) en el tiempo de entrada
(milisegundos), valor 2. Estos valores son desempacados para ser computados en
curva cuártica con vline~.>

Ejercicios

1. Qué entrada para una función de transferencia de cuarta potencia da una


salida de -12 dB, si una entrada de 1 da una salida de 0 dB?

2. Un generador de envolvente se eleva desde cero a un valor pico durante su


segmento de ataque. Cuántos decibeles menos que el pico tiene la salida
alcanzada en la mitad del camino del ataque, asumiendo una salida lineal? Y
asumiendo una salida de cuarta potencia?

3. Qué ley exponencial de función de transferencia (es decir, qué opción de n


para la función f(x) = xn) debería utilizar si usted desea que el valor en el
punto medio sea de -12 dB?

4. Suponga que desea hacer un cruzamiento atenuado de dos señales, es decir, que
mientras una señal va entrando, la otra va decayendo. Si tienen igual potencia y
no están correlacionadas un cruzamiento atenuado lineal daría como resultado una
caída de 3 decibeles en la mitad del cruzamiento. Qué ley de potencia debería
utilizar para mantener la potencia constante a lo largo del cruzamiento?

5. Un acorde de tres notas, que dura 1.5 segundos, suena iniciando una vez cada
segundo. Cuántas voces se requieren para sintetizarlo sin que se anule ninguna
nota?

6. Suponga que un parche de síntesis da salida entre -1 y 1. Mientras una nota


está sonando, una nueva nota ha iniciado utilizando la técnica de toma-de-voz
con “descenso-de-rampa”. Cuál es la salida máxima?
Capítulo 5

Modulación

Habiendo tomado un recorrido de dos capítulos al interior de los aspectos de


control y de la organización en la música electrónica, retornamos a la
descripción de la síntesis de audio y las técnicas de procesamiento. Ya hemos
visto métodos aditivos y de tabla de ondas. En este capítulo introduciremos tres
técnicas de las llamadas “modulación”: modulación de la amplitud, modulación de
la frecuencia y conformación de ondas. El término “modulación” se refiere de
manera muy general a cualquier técnica que sistemáticamente altere la forma de
una onda, curvando su gráfica vertical u horizontalmente. La modulación se
utiliza de manera amplia para la construcción de sonidos con varias familias de
espectros, para lo cual debemos desarrollar alguna terminología antes de ir a
las técnicas.

5.1 Taxonomía de los espectros

La figura 5.1 muestra una manera de visualizar el espectro de una señal de


audio. El espectro describe, hablando en términos generales, cómo está
distribuida en frecuencias la potencia de la señal. (Se pueden dar definiciones
más precisas que la que se da aquí, pero requieren de más conocimiento
matemático).

La parte (a) de la figura muestra el espectro de una señal armónica, la cual es


una señal periódica cuya frecuencia fundamental está en el rango de las
afinaciones perceptibles, aproximadamente entre 50 y 4000 Hertz. Las series de
Fourier (página “12”) dan una descripción de una señal periódica como una suma
de sinusoides. Las frecuencias de estas sinusoides están en relación 0 : 1 :
2 ... (El término constante en las series de Fourier puede ser pensado como una
sinusoide,

a0 = a0cos(0 • !n),
cuya frecuencia es cero.)

En una señal armónica la potencia mostrada en el espectro está concentrada en un


subconjunto pequeño de ejes de frecuencia (un conjunto discreto consiste de
muchos puntos aislados, sólo en cantidad finita, y en un intervalo cualquiera
delimitado). Llamamos a esto un espectro discreto. Aún más, las frecuencias
donde la potencia de la señal está en razones 0 : 1 : 2... son las que aparecen
de una señal periódica. (No es necesario que todos los armónicos de la
frecuencia estén presentes; algunos armónicos pueden tener amplitud cero.) Para
una señal armónica el gráfico del espectro muestra las amplitudes de los
parciales de las señales. Conociendo las amplitudes y las fases de todos los
parciales se determina completamente la señal original.

La parte (b) de la figura muestra un espectro que también es discreto, de tal


manera que la señal puede considerarse de nuevo como una suma de series de
parciales. En este caso, sin embargo, no hay frecuencia fundamental, es decir,
no hay un submúltiplo común de todos los parciales. Esta es llamada una señal
inarmónica. (Los términos armónico e inarmónico pueden utilizarse para describir
tanto las señales como su espectro.)

Cuando tratamos con el espectro discreto, reportamos la amplitud de un parcial


en una forma ligeramente no intuitiva. Cada componente sinusoidal,

acos(!n + Á)

cuenta únicamente como si tuviera amplitud a/2 en tanto que la frecuencia


angular ! es no cero. Pero para un componente de frecuencia cero, para el cual
! = Á = 0, la amplitud está dada por a -sin dividirla por 2. (Los componentes
con frecuencia cero son llamados usualmente componentes DC; “DC” es
históricamente un acrónimo de “direct current” <“corriente directa”>). Estas
convenciones para las amplitudes en los espectros simplificarán más tarde las
matemáticas en este capítulo; una razón profunda para estas se dará en el
capítulo 7.

La parte (c) de la figura muestra una tercera posibilidad: el espectro podría no


estar concentrado en un conjunto discreto de frecuencias, si no que podría estar
disperso entre todas las frecuencias posibles. Este puede ser llamado un
espectro continuo o de ruido. Los espectros no necesariamente caen en categorías
continuas o discretas; los sonidos reales, en particular, están usualmente entre
ambos.

Cada una de las tres partes de la figura muestra una curva continua llamada
envolvente espectral. En general los sonidos no tienen una envolvente espectral
singular, bien definida; puede haber muchas maneras de dibujar una curva suave a
través del espectro. De otro lado, una envolvente espectral puede especificarse
intencionalmente; en cuyo caso, usualmente se aclara cómo hacer el espectro
conforme a esto. Para un espectro discreto, por ejemplo, podríamos simplemente
leer, en la envolvente espectral, la amplitud deseada de cada parcial y hacerlo
así sucesivamente.

A veces la altura de un sonido puede inferirse de su espectro. Para los


espectros discretos, la altura está codificada primariamente en las frecuencias
de los parciales. Las señales armónicas tienen una altura determinada por su
frecuencia fundamental; para la inarmónicas, la altura puede ser clara, ambigua
o estar ausente del todo, según reglas complejas y que aún no se entienden por
completo. Un espectro de ruido puede tener también una altura perceptible si la
envolvente espectral contiene uno o más picos estrechos. En general la fortaleza
de un sonido y su timbre dependen más de su envolvente espectral que de las
frecuencias en el espectro, si bien la diferencia entre espectro continuo y
discreto puede escucharse también como un timbre distinto.

El timbre, así como la afinación, puede evolucionar durante la vida de un


sonido. Hemos estado hablando de los espectros como entidades estáticas, sin
considerar si cambian o no en el tiempo. Si la altura y el timbre de una señal
cambian en el tiempo, podemos pensar en el espectro como la descripción del
comportamiento momentáneo de una señal que varía en el tiempo.

Esta manera de ver los sonidos está muy simplificada. El comportamiento real de
la altura y del timbre tiene muchos aspectos que no se pueden explicar en los
términos de este modelo. Por ejemplo, la cualidad tímbrica llamada “lo áspero”
es a veces tomada como si reflejara cambios rápidos en la envolvente espectral
en el tiempo. La descripción simplificada que se desarrolla aquí es útil no
obstante, en las discusiones acerca de cómo construír espectros discretos o
continuos para una amplia variedad de propósitos musicales, tal como lo
comenzaremos a mostrar en el resto de este capítulo.

5.2 Multiplicando señales de audio

Hemos estado añadiendo rutinariamente señales de audio, y multiplicándolas por


señales con variaciones lentas (utilizadas, por ejemplo, como envolventes de
amplitud) desde el capítulo 1. Para entender completamente el álgebra de las
señales de audio, debemos considerar también la situación donde dos señales de
audio, ninguna de las cuales puede asumirse que cambia lentamente, son
multiplicadas. Es clave comprender lo que sucede en la Fórmula de Producto de
Cosenos:

cos(a)cos(b) = [cos(a + b) + cos(a - b)]/2


para ver porqué esta fórmula es cierta, podemos usar la fórmula para el coseno
de una suma de ángulos:

cos(a + b) = cos(a)cos(b) - sen(a)sen(b)

para evaluar el lado derecho de la fórmula de producto de cosenos; lo que


entonces simplifica el lado izquierdo.

Podemos utilizar esta fórmula para ver qué sucede cuando multiplicamos dos
sinusoides (página “1”):

cos(®n + Á)cos(¯n + »)
= [cos((® + ¯)n + (Á + »)) + cos((® - ¯)n + (Á - »))]/2

En palabras, al multiplicar dos sinusoides se consigue un resultado con dos


parciales, uno con la suma de las dos frecuencias originales, y otro con su
diferencia. (Si la diferencia ® - ¯ es negativa, simplemente se cambian las dos
sinusoides originales y la diferencia queda positiva). Estos dos nuevos
componentes se denominan bandas laterales.

Esto nos proporciona una técnica para cambiar las frecuencias de un sonido,
denominadad modulación de anillo, la cual se muestra en su forma más simple en
la figura 5.2. Un oscilador provee una señal portadora, la cual simplemente se
multiplica por la entrada. El término “modulación de anillo” es utilizado de
manera más general para indicar la multiplicación de dos señales cualquiera,
pero aquí sólo la consideraremos utilizando una señal portadora sinusoidal. (La
técnica de modulación de anillo data de la era análoga [Str95]; los
multiplicadores digitales reemplazan ahora tanto el VCA (sección 1.5) como el
modulador de anillo.)

La figura 5.3 muestra una variedad de resultados que se pueden obtener


multiplicando una sinusoide (modulante) de frecuencia angular ® y amplitud pico
2a por una sinusoide (portadora) de frecuencia angular ¯ y amplitud pico 1:

[2acos(®n)]•[cos(¯n)]

(Por simplicidad los términos de la fase son omitidos.) Cada parte de la figura
muestra la señal de la modulación y el resultado en el mismo espectro. La señal
de modulación aparece como una frecuencia singular, ®, a la amplitud a. El
producto en general tiene dos componentes de frecuencias, cada una a una
amplitud de a/2.

<Sin las fases iniciales, la fórmula queda:


[2acos(®n)]•[cos(¯n)] = 2a[cos(®n + ¯n) + cos(®n - ¯n)]/2
= a[cos((® + ¯)n) + cos((® - ¯)n)]>

Las partes (a) y (b) de la figura muestran los casos “generales” donde ® y ¯
son diferentes de cero y diferentes entre ellos. Las frecuencias de los
componentes de las salidas son ® + ¯ y ® - ¯. En la parte (b), ya que ® - ¯ <
0, obtenemos un componente de frecuencia negativa. Debido a que el coseno es una
función par, tenemos

cos((® - ¯)n) = cos((¯ - ®)n)


así el componente negativo es exactamente equivalente al de la frecuencia
positiva ¯ - ®, a la misma amplitud.

En el caso especial donde ® = ¯, la segunda banda lateral (la diferencia) tiene


frecuencia cero. En este caso la fase será significante así que reescribimos el
producto con fases explícitas, reemplazando ¯ por ®, para obtener:
2acos(®n + Á)cos(¯n + ») =
= acos(2®n + (Á + »)) + acos(Á - »).
El segundo término tiene frecuencia cero; su amplitud depende de la fase
relativa de las dos sinusoides y tiene rango de +a a -a ya que la diferencia de
fase Á - » varía de 0 a ¼ radianes. Esta situación se muestra en la parte (c)
de la figura 5.3.

Finalmente, la parte (d) muestra una señal portadora cuya frecuencia es cero. Su
valor es la constante a (no 2a; la frecuencia cero es un caso especial). Aquí
obtenemos únicamente una banda lateral, de amplitud a/2, la usual.

Podemos usar la regla distributiva de la multiplicación para encontrar qué


sucede cuando multiplicamos las señales que consisten de más de un parcial cada
una.

Por ejemplo, en la situación anterior podemos reemplazar la señal de la


frecuencia ® con la suma de varias sinusoides, tales como:

a1cos(®1n) + ... + akcos(®kn)

Al multiplicar por la señal de la frecuencia ¯ se obtienen parciales a


frecuencias iguales en:

®1 + ¯, ®1- ¯, ..., ®k + ¯, ®k - ¯k

Como antes, si cualquier frecuencia es negativa tomamos su valor absoluto.

La figura 5.4 muestra el resultado de multiplicar una señal periódica compleja


(con algunos componentes afinados en razón 0:1:2: ...) por una sinusoide. La
envolvente espectral y las frecuencias de los componentes del resultado son
cambiadas de acuerdo a reglas relativamente sencillas.

El espectro resultante es escencialmente el espectro original combinado con su


reflexión con respecto al eje vertical. Este espectro combinado se desplaza
luego a la derecha por la frecuencia portadora. Finalmente, si algunos
componentes del espectro cambiado están todavía a la izquierda del eje vertical,
son reflejados alrededor de este para hacer frecuencias positivas nuevamente.

En la parte de (b) de la figura, la frecuencia portadora (la frecuencia de la


sinusoide) está por debajo de la frecuencia fundamental de la señal compleja. En
este caso, el cambio es por una distancia relativamente pequeña, de tal manera
que se vuelve a doblar el espectro en los extremos, y casi se sitúan las dos
mitades una sobre la otra. El resultado es una envolvente espectral
aproximadamente igual a la original (aunque con la mitad de su altura) y un
espectro dos veces más denso.

Un caso especial, que no se muestra, es utilizar una frecuencia portadora de la


mitad de la fundamental. En este caso, los pares de parciales caerán encima uno
del otro, y tendrán razones 1/2 : 3/2 : 5/2: ..., para dar una señal de sólo
parciales impares una octava por debajo de la original. Este es un muy simple y
efectivo divisor de octava para una señal armónica, asumiendo que usted conoce o
puede encontrar su frecuencia fundamental. <¯ = ®/2; ® + ¯ = 3®/2 y ® - ¯ =
-®/2, etc> Si usted quiere parciales pares tanto como los impares (para la
señal de octava baja), simplemente mezcle la señal original con la modulada.

La parte (c) de la figura muestra el efecto de utilizar una frecuencia modulante


mucho más alta que la frecuencia fundamental de la señal compleja. Aquí el
efecto del desdoblado es mucho más claramente visible (únicamente un parcial, el
de la izquierda, ha de reflejarse para hacer su frecuencia positiva). La
envolvente espectral está ahora ampliamente desplazada de la original; este
desplazamiento es usualmente un efecto más fuertemente audible que el de la
relocalización de parciales.

Como otro caso especial, la frecuencia portadora puede ser un múltiplo de la


fundamental de las señales periódicas complejas; entonces los parciales caen
sobre los otros parciales de la misma fundamental, y el único efecto es el
cambio en la envolvente espectral.

5.3 Conformación de onda

Otra forma de modulación de la señal, llamada conformación de onda, es pasarla a


través de una función no lineal escogida apropiadamente. Un diagrama de bloque
para hacer esto se muestra en la figura 5.5. La función f() (llamada la función
de transferencia) distorsiona la onda que entra dándole otra forma. La nueva
forma depende de la forma de la onda entrante, de la función de transferencia, y
también -de manera crucial- de la amplitud de la señal de entrada. Dado que la
amplitud de la onda que entra afecta la forma de la onda que sale (y de hecho el
timbre), esta nos da una manera fácil de hacer una familia de timbres que varían
continuamente, simplemente variando el nivel de entrada de la transformación.
Por esta razón es imprescindible incluir un control de amplitud general como
parte de la operación de conformación de onda, tal como se muestra en el
diagrama de bloques.

La amplitud de la onda de entrada es llamada el índice de conformación de onda.


En muchas situaciones, un índice pequeño conduce a una distorsión relativamente
pequeña (de tal manera que la salida prácticamente es parecida a la entrada) y
los índices más grandes dan un timbre más rico y distorsionado.

La figura 5.6 muestra un ejemplo familiar de conformación de onda, en el cual


f() da la cantidad para una función de corte. Este ejemplo muestra claramente
cómo la amplitud de entrada -el índice- puede afectar la forma de la salida. La
función de corte pasa de su entrada a su salida sin cambio, siempre y cuando
aquélla <la entrada> esté en el intervalo entre -0.3 y 0.3. Así mientras la
entrada no exceda 0.3 en valor absoluto, la salida es igual a la entrada. Pero
cuando la entrada se pasa del límite, la salida se mantiene dentro de este; y
mientras la amplitud de la entrada sea mayor, el efecto de esta acción de
recorte es progresivamente más severo. En la figura, la entrada es una sinusoide
que decae. La salida evoluciona desde una onda casi cuadrada al comienzo, hasta
una sinusoide pura al final. Este efecto será muy bien conocido por quien haya
tocado un instrumento a través de un amplificador con distorsión. Mientras más
fuerte es la entrada, más distorsionada es la salida. Por esta razón, el proceso
de conformación de onda es a veces llamado distorsión.

La figura 5.7 muestra una manera mucho más fácil y sencilla para analizar la
situación, en la cual la función de transferencia simplemente eleva al cuadrado
la entrada:

f(x) = x2

Para una entrada sinusoidal,

x(n) = acos(!n + Á)

tenemos que

f(x[n]) = a2(1 + cos(2!n + 2Á))/2

Si la amplitud a es igual a uno, el resultado es precisamente el resultado de


una modulación de anillo de una sinusoide con una sinusoide de la misma
frecuencia, descrito en la sección previa: la salida es una sinusoide DC (de
frecuencia cero) más una sinusoide al doble de la frecuencia original. Sin
embargo, en este ejemplo de conformación de onda, a diferencia de la modulación
de anillo, la amplitud de la salida crece con el cuadrado de la entrada.

Manteniendo la misma función de transferencia, consideramos el efecto de


enviarle una combinación de dos sinusoides con amplitudes a y b, y frecuencias
angulares ® y ¯. Por simplicidad, omitiremos los términos de la fase inicial.
Tenemos:

x(n) = acos(®n) + bcos(¯n)

y reemplazando esto en f() da

f(x[n]) = a2(1 + cos(2®n))/2 + b2(1 + cos(2¯n))/2 +


+ ab[cos(® + ¯)n) + cos(® - ¯)n)]

Los dos primeros términos son precisamente los que obtendríamos al enviar las
dos sinusoides separadamente. El tercer término es dos veces el producto de los
dos términos de entrada el cual proviene del término cruzado de la mitad, en la
expansión,

f(x + y) = x2 + 2xy + y2

Este efecto, llamado intermodulación, se vuelve más y más dominante mientras el


número de términos en la entrada se incrementa; si hay k sinusoides en la
entrada, hay únicamente k términos “directos” en el producto, pero hay (k2 –
k)/2 términos de intermodulación.

En contraste con la modulación de anillo, la cual es una función lineal de su


señal de entrada, la conformación de onda es no lineal. Mientras éramos capaces
de analizar procesos lineales considerando su acción por separado en todos los
componentes de la entrada, en este caso no lineal también debemos considerar las
interacciones entre los componentes. Los resultados son muchos más complejos -a
veces mucho más ricos sonoramente, pero, de otro lado, mucho más difíciles de
entender o predecir.

En general, podemos mostrar que una entrada periódica, sin importar lo compleja
que sea, se repetirá en el mismo período después del proceso de conformación de
onda: si el período es ¿ de tal manera que

x[n + ¿] = x[n]

y temporalmente ajustamos el índice a = 1,

f(x[n + ¿]) = f(x[n])

(En algunos casos especiales la salida se puede repetir en un submúltiplo de ¿,


de tal manera que obtenemos un armónico de la entrada como resultado; esto
sucede por ejemplo en la figura 5.4.)

Las combinaciones de sonidos periódicos en intervalos constantes pueden


ocasionar productos distorsionados en los subarmónicos. Por ejemplo, si las dos
señales periódicas x y y forman un intervalo de cuarta musical (períodos con la
relación 4:3), entonces la suma de los dos se repite a una velocidad más baja
por el subarmónico común. En ecuaciones, tendríamos:

x[t + ¿/3] = x[t]


y[t + ¿/4] = y[t]

lo cual implica
x[t + ¿] + y[t + ¿] = x[t] + y[t]

<¿ es igual a una fracción enésima de ¿ que se repite cada n veces, por
ejemplo: ¿ = 3¿/3>

y así la suma distorsionada f(x + y) se deberá repetir después de un período ¿:

f(x + y)[n + ¿] = f(x + y)[n]

Esto ha sido experimentado por todos los guitarristas eléctricos que han
ajustado el amplificador a “overdrive” y tocado las cuerdas B y E al aire,
juntas: la distorsión produce a veces sonidos en la nota de la cuerda de E
grave, dos octavas por debajo de la aguda.

Para lograr un análisis algo más explícito del efecto de la conformación de onda
en una señal de entrada, a veces es útil escribir la función f como una función
finita o infinita de una serie de potencias:

f(x) = f0 + f1x + f2x2 + f3x3 + ...

Si la señal de entrada x[n] es una sinusoide de una unidad de amplitud, cos(!


n), podemos considerar la acción de los términos de arriba separadamente:

f(a•x[n]) = f0 + af1cos(!n)+ a2f2cos2(!n) + a3f3cos3(!n) + ...

<Notar que en este paso se introduce el término (índice) a según el


diagrama de bloques de la figura 5.5, en donde ese término permite la
modificación de la amplitud de la onda de entrada>

Debido a que los términos de las series son multiplicados sucesivamente por
potencias más altas del índice a, un valor más bajo de a enfatizará los
primeros términos más pesadamente, y un valor más alto hará énfasis en los
últimos.

Los términos de los espectros individuales se pueden encontrar aplicando la


fórmula del producto coseno repetidamente:

1 = cos(0)
x[n] = cos(!n)
x2[n] = 1/2 + cos(2!n)/2
x3[n] = cos(-!n)/4 + 2cos(!n)/4 + cos(3!n)/4
x4[n] = cos(-2!n)/8 + 3cos(0)/8 + 3cos(2!n)/8 + cos(4!n)/8
5
x [n] = cos(-3!n)/16 + 4cos(-!n)/16 + 6cos(!n)/16 + 4cos(3!n)/16 +
cos(5!n)/16

< por ejemplo, x3[n] = cos(!n)*cos(!n)*cos(!n)


= cos(!n)*(1/2 + cos(2!n)/2)
= 2cos(!n)/4 + cos(3!n)/4 + cos(-!n)/4>

y así sucesivamente. En los numeradores de las fracciones se reconoce el


triángulo de Pascal. El Teorema del Límite Central de la probabilidad implica
que cada k-ésima fila puede ser aproximada a una curva Gaussiana cuya
desviación normal (una medida de su ancho) es proporcional a la raíz cuadrada de
k. <Son “gaussianas” que se van ensanchando a medida que sus alturas van
decreciendo>

Los términos con frecuencias negativas (que se muestran separadamente por


claridad) se combinan con los positivos; la envolvente espectral se dobla sobre
sí misma de la misma manera que en el ejemplo de la figura 5.4 de la modulación
de anillo.

Si los coeficientes fk son todos números positivos o cero, así mismo son todas
las amplitudes de las sinusoides en la expansión de arriba. En este caso todas
las fases quedan coherentes en tanto a varía y así logramos una ampliación del
espectro (y posiblemente un incremento drástico de la amplitud) con el
incremento de los valores de a. De otro lado, si algunos de los fk son positivos
y otros son negativos, las expansiones diferentes se interferirán
destructivamente; esto dará una evolución espectral de un sonido más complicado.

Note también que las ampliaciones sucesivas contienen únicamente parciales pares
o parciales impares. Si la función de transferencia (en forma de series)
contiene únicamente potencias pares:

f(x) = f0 + f2x2 + f4x4 + ...

entonces el resultado, teniendo únicamente parciales pares, sonará una octava


más aguda que la sinusoide de entrada. Si se muestran únicamente los parciales
impares en la expansión de f(x), entonces la salida contendrá únicamente
parciales impares. Si f no se puede expresar exactamente como una serie de
potencias (por ejemplo la función corte de la figura 5.3), sigue siendo cierto
que si f es una función par, es decir, si

f(-x) = f(x)

usted conseguirá únicamente armónicos pares y si f es una función impar,

f(-x) = -f(x)

conseguira armónicos impares.

Muchos trucos matemáticos han sido propuestos para utilizar conformación de onda
y generar espectros específicos. En cambio de eso, usted puede generar
sinusoides puras en cualquier armónico de la fundamental utilizando un polinomio
Chebisev como una función de transferencia, y desde ahí, usted puede construír
cualquier espectro estático deseado (el ejemplo E05.chebychev.pd demuestra
esto.) Generar familias de espectros aplicando la conformación de onda en una
sinusoide de amplitud variable puede convertirse en algo complicado, sin embargo
algunos casos especiales interesantes han sido encontrados, y de éstos se
desarrollan en detalle algunos en el capítulo 6.

5.4 Modulación de frecuencia y de fase

Si una sinusoide está produciendo una frecuencia que varía lentamente en el


tiempo, la escuchamos como si tuviera variaciones de altura. Pero si la altura
cambia tan rápidamente que nuestros oídos no pueden seguir el cambio, -por
ejemplo, si el cambio mismo ocurre en o por encima de la frecuencia fundamental
de la sinusoide- escuchamos un cambio tímbrico. Los timbres generados de esta
manera son ricos y de una amplia variedad. El descubrimiento de John Chowning de
esta posibilidad revolucionó el campo de la música por computador. Desarrollamos
aquí la modulación de frecuencia, usualmente llamada FM, como un caso especial
de conformación de onda; el análisis dado aquí es algo diferente.

La técnica FM en su forma más sencilla se muestra en la figura 5.8 (parte a).


Una sinusoide de frecuencia modulada es aquella cuya frecuencia varía
sinusoidalmente, con alguna frecuencia angular !m alrededor de una frecuencia
central !c de tal manera que las frecuencia instantáneas varían entre (1 - r)!c
y (1 + r)!c, con los parámetros !m controlando la variación de la frecuencia y r
controlando la profundidad de la variación. Los parámetros !c, !m y r son
llamados la frecuencia portadora, la frecuencia de modulación y el índice de
modulación respectivamente.

<En un caso de modulación lenta !m = 1 Hz -ondas sinusoidales-, la onda


con !c (supongámosla a 220 Hz) suena como un vibrato, con una duración de un (1)
segundo. La amplitud se controla desde el oscilador modulador. El documento de
Chowning (La Síntesis de Espectros Complejos por medio de la Modulación de la
Frecuencia) dice “La cantidad en que la portadora varía alrededor de su
promedio, o (lo que es lo mismo) la desviación pico de la frecuencia, es
proporcional a la amplitud de la onda de modulación”.>

Es costumbre utilizar una formulación más simple, escencialmente equivalente, en


la cual la fase de la sinusoide portadora, en lugar de la frecuencia, es
modulada sinusoidalmente. (Esto da un resultado equivalente ya que la frecuencia
instantánea es la velocidad de cambio de la fase, dado que la velocidad de
cambio de una sinusoide es precisamente otra sinusoide.) La formulación de la
modulación de fase se muestra en la parte (b) de la figura.

Podemos analizar el resultado de la modulación de fase como sigue, asumiendo que


el oscilador modulante y la tabla de ondas son ambas sinusoidales, y que las
frecuencias portadora y de modulación no están variando en el tiempo. La señal
resultante puede escribirse como

x[n] = cos(acos(!mn) + !cn)

El parámetro a que toma el lugar del anterior parámetro r, es de esta manera


llamado el índice de modulación; también controla la extensión de la variación
de la frecuencia relativa a la frecuencia portadora !c. Si a = 0, no hay
variación de la frecuencia y la expresión se reduce a la sinusoide portadora,
sin modificaciones; en tanto a se incrementa la onda se va haciendo más
compleja.

Para analizar el espectro resultante podemos re-escribir la señal como,

x[n] = cos(!cn)*cos(acos(!mn)) - sen(!cn)*sen(acos(!mn))

Podemos considerar el resultado como una suma de dos generadores de


conformadores de onda, cada uno operando una sinusoide de frecuencia !m y con un
índice de conformación de onda a y cada anillo modulado, con una sinusoide de
frecuencia !c. La función de conformación de onda f está dada por f[x] = cos[x]
para el primer término, y por f[x] = sen[x] para el segundo.

Retornando a la figura 5.4 podemos predecir que el espectro lucirá así.

Los dos espectros armónicos a la salida del proceso de conformación de onda son

cos(acos(!mn))

sen(acos(!mn))

y tienen respectivamente armónicos afinados a

0, 2!m, 4!m,...

!m, 3!m, 5!m,...


y cada uno está multiplicado por una sinusoide a la frecuencia portadora. Habrá
así un espectro centrado a la frecuencia portadora !c con bandas laterales tanto
de múltiplos pares como impares de la frecuencia de modulación !m, aportados
respectivamente por los términos seno y coseno de la conformación de onda de
arriba. Cuando el índice de modulación a cambia, controla la fortaleza relativa
de los diversos parciales. Los parciales mismos están situados en las
frecuencias

!c + m!m

donde

m = ...-2,-1,0,1,2,...

Al igual que con cualquier situación donde dos señales periódicas se


multiplican, si hay algún supermúltiplo de los dos períodos, el producto
resultante se repetirá al cabo de ese largo período. Así, si los dos períodos
son k¿ y m¿, donde k y m son primos relativos, ambos se repiten al cabo de un
intervalo de tiempo de km¿. En otras palabras, si los dos tienen frecuencias que
son ambas múltiplos de alguna frecuencia común, de tal manera que !m = k! y !c =
m!, de nuevo con k y m primos relativos, el resultado se repetirá a una
frecuencia del submúltiplo común !. De otro lado, si no se encuentra ningún
submúltiplo común !, o si sólo los submúltiplos son más bajos que cualquier
altura discernible, entonces el resultado será inarmónico.

Mucho más de la FM se puede encontrar en libros de texto [Moo90, p.316] [DJ85,


pp.115-139] [Bou00] y literatura investigativa. Algunas de las posibilidades se
muestran en los siguientes ejemplos.

<Ver: http://www.eumus.edu.uy/revista/nro1/jure.html >

5.5 Ejemplos

Modulación de anillo y espectros

El ejemplo E01.spectrum.pd sirve para presentar una herramienta de medición del


espectro que utilizaremos; de aquí saltamos al segundo ejemplo,
E02.ring.modulation.pd, el cual muestra el efecto del proceso de modulación de
anillo de un espectro armónico (el cual se trabajó teóricamente en la sección
5.2 y se mostró en la figura 5.4). En el ejemplo consideramos una señal cuyos
armónicos (del 0 hasta el 5) tienen todos amplitud de una unidad.

Los armónicos se pueden encender y apagar separadamente utilizando interruptores


de palanca. Cuando todos están encendidos, la envolvente espectral tiene el pico
en DC (debido a que la señal constante cuenta el doble en tanto se fortalecen
las otras sinusoides), tiene una región plana desde los armónicos 1 hasta 5, y
luego desciende a cero.

En la porción de la generación de la señal del parche (parte (a) de la figura),


sumamos los seis parciales y multiplicamos la suma por el único oscilador
portador. (Las seis señales se suman implícitamente conectándolas todas a la
misma entrada del objeto *~.) El valor de la fundamental en la parte superior es
computado para alinearlo bien con el análisis espectral, cuyos resultados se
muestran en la parte (b) de la figura.

El análisis espectral (el cual utiliza técnicas que no describiremos hasta el


capítulo 9) muestra la localización de las sinusoides (asumiendo un espectro
discreto) sobre el eje horizontal y sus magnitudes sobre el eje vertical. Así la
presencia de un pico en DC de magnitud uno en el espectro de la señal de entrada
predice, en la figura 5.3, que debería haber un pico en el espectro de salida,
en la frecuencia portadora, de altura 1/2. De manera similar, las otras dos
sinusoides en la señal de entrada, que tienen una altura de 1/2 en el espectro,
hacen levantar dos picos cada una, de altura 1/4, en la salida. Una de estas
cuatro ha sido reflejada con respecto al borde izquierdo de la figura (tomando
el valor absoluto de su frecuencia negativa).

Divisor de octava y sumador de formante

Como se sugirió en la sección 5.2, cuando se considera el resultado de modular


una señal armónica compleja (es decir, periódica) por una sinusoide, un
interesante caso especial es ajustar el oscilador portador a 1/2 de la
frecuencia fundamental, lo cual hace caer el sonido resultante una octava con
sólo una relativamente pequeña deformación de la envolvente espectral. Otro caso
especial es modular con una sinusoide a varias veces la frecuencia fundamental,
lo cual en efecto desplaza la envolvente espectral sin cambiar la frecuencia
fundamental del resultado. Esto se demuestra en el ejemplo E03.octave.divider.pd
(figura 5.10). La señal que procesamos aquí es una grabación de voz hablada.

Los subparches pd looper y pd delay esconden detalles. El primero es un


muestreador de lazo como el que se presentó en el capítulo 2. El segundo es un
retraso de 1024 muestras, que utiliza objetos que serán presentados luego en el
capítulo 7. Presentaremos un nuevo tipo de objeto aquí:

fiddle~: seguidor de altura. La entrada toma una señal para ser analizada, y
mensajes para cambiar sus ajustes. Dependiendo de los argumentos creados fiddle~
puede tener un número variable de salidas ofreciendo información diversa acerca
de la señal de entrada. Como se muestra aquí, con solamente un argumento creado
para especificar el tamaño de la ventana, la tercera salida intenta reportar la
altura de la entrada y la amplitud de esa porción de la entrada que se repite
(por lo menos de manera aproximada) en la altura reportada. La salida de éstas
es una lista de dos números. La altura, en unidades MIDI, se reporta como cero
si no se logra identificar.

En este parche la tercera salida es desempacada en su componentes de altura y


amplitud, y el componente de altura es filtrado por el objeto moses de tal
manera que sólo se utilizan las estimaciones de altura exitosas (las que no son
cero). Estas son convertidas a unidades de frecuencia por el objeto mtof.
Finalmente las frecuencias estimadas son o reducidas en 1/2 o multiplicadas por
15, dependiendo del multiplicador seleccionado para proveer la modulación de la
frecuencia. En el primer caso obtenemos un divisor de octava y en el segundo,
armónicos altos adicionales que deforman las vocales.

Conformación de onda y sonidos diferenciados

El ejemplo E04.difference.tone.pd (figura 5.11) presenta la conformación de


onda, demostrando la no linealidad del proceso. Dos sinusoides (de 300 y 225
Hertz, o en una razón de 4 a 3) se suman y luego se recortan, utilizando un
nuevo tipo de objeto:

clip~: cortador de señal. Cuando la señal está entre los límites especificados
por los argumentos del objeto clip~, pasa sin cambio alguno; pero cuando cae por
debajo del límite inferior o se eleva por encima del límite superior, es
reemplazada por el límite. El efecto de recorte de una señal sinusoidal se
mostró gráficamente en la figura 5.6.

Mientras la amplitud de la suma de sinusoides sea menos del 50 por ciento, la


suma no excede el valor absoluto de uno y el objeto clip~ permite pasar el par
de sinusoides sin cambio hacia la salida. Tan pronto la amplitud excede el 50
por ciento, la no linealidad del objeto clip~ da a luz productos distorsionados
(a las frecuencias 300m y 225n para los enteros m y n), y al ser múltiplos de
75, es esta frecuencia la fundamental del sonido resultante. Visto de otra
manera, el período común más corto de las dos sinusoides es de 1/75 de segundo
(lo cual representa cuatro períodos del sonido a 300 Hertz y tres períodos del
sonido a 225 Hertz), de tal manera que se repite 75 veces por segundo.
La frecuencia del sonido a 225 Hertz en el parche se puede variar. Si es movida
ligeramente por fuera de 225, se producen sonidos de batido. Otros valores
encuentran otros subarmónicos comunes que también dan sonidos inarmónicos
enriquecidos.

Conformación de onda utilizando polinomios Chebichev

El ejemplo E05.chebichev.pd (figura 5.12) demuestra cómo puede utilizar


conformación de onda para generar armónicos puros. Nos limitaremos a un ejemplo
específico en el cual nos gustaría generar el quinto armónico puro,

cos(5!n)

por conformación de onda de una sinusoide

x[n] = cos(!n)

Necesitamos encontrar un función de transferencia apropiada f(x). Primero vamos


a la fórmula para la función de conformación de onda f(x) = x5 (página “131”),
la cual nos da el primer, tercer y quinto armónico:

16x5 = cos(5!n) + 5cos(3!n) + 10cos(!n)

A continuación añadimos un múltiple apropiado de x3 para cancelar el tercer


armónico:

16x5 - 20x3 = cos(5!n) - 5cos(!n)

y luego por un múltiplo de x para cancelar el primer armónico:

16x5 - 20x3 + 5x = cos(5!n)

Así, para nuestra función de conformación de onda escogimos

f(x) = 16x5 - 20x3 + 5x

Este procedimiento nos permite aislar cualquier armónico deseado; las funciones
resultantes f son conocidas como polinomios Chebichev.

Para incorporar esto en un instrumento de conformación de onda, simplemente


construimos un parche que trabaje como en la figura 5.5, computando la expresión

x[n] = f(a[n]cos(!n))

donde a[n] es un índice apropiado que puede variar como una función del número
de muestra n. Cuando a es de valor uno, aparece el quinto armónico puro. Otros
valores de a dan espectros variables los cuales, en general, tienen el primer y
tercer armónico, así como también el quinto.

Con una apropiada combinación de polinomios de Chebichev podemos solucionar


cualquier superposición de componentes a la salida de la onda (de nuevo,
mientras el índice de conformación de onda sea uno). Pero la promesa real del
proceso de conformación de onda -que simplemente cambiando el índice podemos
fabricar espectros que evolucionen en formas interesantes pero controlables- no
está dirigida, por lo menos directamente, al procedimiento de Chebichev.

Conformación de onda utilizando la función exponencial

Regresamos de nuevo a los espectros computados en la página “131”,


correspondientes a las funciones de conformación de onda de la forma f(x) = xk.
Notamos con placer que no solamente están todas en fase (de tal manera que
pueden superponerse con resultados predecibles) si no también que los espectros
se propagan en tanto k se incrementa. También, en series de la forma,

f(x) = f0 + f1x + f2x2 + ...,

un índice más alto de modulación prestará un mayor peso relativo a los términos
de más alta potencia de la expansión; tal como lo vimos anteriormente, si el
índice de modulación es a los diversos términos xk son multiplicados por f0,
af1, a2f2 y así sucesivamente.

Suponga ahora que queremos organizar los diferentes términos en la expansión de


arriba para dominar el resultado de una manera predecible, como una función del
índice a. Para escoger el ejemplo más sencillo posible, suponga que queremos
que f0 sea el término más grande para 0 < a < 1, luego lo retomamos para el
término de crecimiento más rápido af1 con 1 < a < 2, el cual es también retomado
por el término a2f2 para 2 < a < 3 y así sucesivamente, de tal manera que cada
n-ésimo término se toma sobre el índice n. Para hacer que esto suceda sólo
requerimos que

f1 = f0, 2f2 = f1, 3f3 = f2,...

y así, escogiendo f0 = 0, obtenemos f1 = 1, f2 = 1/2, f3 = 1/6, y en general,

fk = 1/(1*2*3*...*k)

Estos son los coeficientes de la serie de potencias para la función

f(x) = ex

donde e = 2.7, la constante de Euler.

Antes de conectar ex como una función de transferencia, es inteligente planear


cómo tratar con la amplitud de la señal, ya que ex crece rápidamente con el
incremento de x. Si le vamos a conectar una sinusoide de amplitud a la salida
máxima será ea, pero con la fase cero. Una opción sencilla y natural es
simplemente dividir por ea para reducir el pico a uno, dando:

f(acos(!n)) = eacos(!n) / ea = ea(cos(!n)-1)

Esto se realiza en el ejemplo E06.exponential.pd. Los espectros resultantes para


a = 0.4 y 16 se muestran en la figura 5.13. Mientras el índice de conformación
de onda crece, progresivamente se presenta menos energía en la fundamental; la
energía es incrementalmente propagada sobre los parciales.

Conformación de onda sinusoidal: paridad e imparidad

Otra interesante clase de función de transferencia de conformación de onda son


las sinusoides:

f(x) = cos(x + Á)

que incluyen las funciones seno y coseno (las cuales se consiguen haciendo Á =
0 y Á = -¼/2, respectivamente). Estas funciones, siendo la primera par y la
otra impar dan como resultado espectros armónicos pares e impares, los cuales se
convierten en:

cos(acos(!n)) = J0(a)-J2(a)cos(2!n)+2J4(a)cos(4!n)-2J6(a)cos(6!n)±...
sen(acos(!n)) = 2J1(a)cos(2!n)-2J3(a)cos(3!n)+2J5(a)cos(5!n)∓...

Las funciones Jk(a) son las funciones de Bessel del primer tipo, utilizadas por
los ingenieros para resolver problemas acerca de las vibraciones o de flujo de
calor en discos. Para otros valores de Á, podemos expandir la expresión para f:

f(x) = cos(x)cos(Á) - sen(x)sen(Á)

de tal manera que el resultado es una mezcla entre armónicos pares e impares,
con Á controlando las amplitudes relativas de las dos. Esto se demuestra en
parche E07.evenodd.pd, mostrado en la figura 5.14.

<En el parche, es necesario abrir el subparche “make-table” y cambiar


“array1” en las tres veces que aparece, por “E07” para que se pueda realizar la
lectura de la tabla.>

Modulación de fase y FM

El ejemplo E08.phase.mod.pd de la figura 5.15, muestra cómo utilizar Pd para


realizar las verdaderas modulación de frecuencia (parte a) y modulación de fase
(parte b). Estas corresponden al diagrama de bloques de la figura 5.8. Para
lograr la modulación de la fase, el oscilador portador se divide en sus
componentes de lectura de fase y de coseno. La señal es de la forma

x[t] = cos(!cn + acos(!mn))

donde !c es la frecuencia portadora, !m es la frecuencia de modulación, y a es


el índice de modulación- todas en unidades angulares.

Podemos predecir el espectro expandiendo el coseno externo:

x[t] = cos(!cn)cos(acos(!mn)) - sen(!cn)sen(acos(!mn))

Conectando en la expansión de la página “141” y simplificando productos:

x[t] = J0(a)cos(!cn)
+ J1(a)cos((!c + !m)n + ¼/2) + J1(a)cos((!c - !m)n + ¼/2)
+ J2(a)cos((!c + 2!m)n + ¼/2) + J2(a)cos((!c - 2!m)n + ¼/2)
+ J3(a)cos((!c + 3!m)n + 3¼/2) + J3(a)cos((!c - 3!m)n + 3¼/2) + ...

Así los componentes están centrados alrededor de la frecuencia portadora !c con


bandas laterales extendiéndose en una u otra dirección, cada una espaciada !m de
la siguiente. Las amplitudes son funciones del índice de modulación, y no
dependen de las frecuencias. La figura 5.16 muestra algunos espectros de
modulación de fase de dos operadores, medidos utilizando el ejemplo
E09.FM.spectrum.pd.

La modulación de fase puede así ser vista como una forma de conformación de onda
modulada, de anillo. De esta manera podemos utilizar las estrategias descritas
en la sección 5.2 para generar combinaciones particulares de frecuencias. Por
ejemplo, si la frecuencia portadora es la mitad de la frecuencia de modulación,
obtiene un sonido con armónicos impares, exactamente como en el ejemplo de la
división de octava (figura 5.10).

La modulación de la frecuencia no requiere estar restringida a portadoras


puramente sinusoidales u osciladores de modulación. Un camino bastante recorrido
es aplicar el efecto de modulación de fase sobre el propio espectro de
modulación de fase. Hay entonces dos índices de modulación (llamémoslos a y b)
y dos frecuencias de modulación (!m y !p) y la onda es:
x[n] = cos(!cn + acos(!mn) + bcos(!pn))

Para analizar el resultado, sólo re-escribimos la serie FM original de arriba,


reemplazando todos los !cn por !cn + bcos(!pn). La tercera banda lateral
positiva quedará, por ejemplo:

J3(a)cos((!c + 3!m)n + 3¼/2 + bcos(!pn))

Esto mismo es precisamente otro espectro FM, con sus propias bandas laterales de
frecuencias

!c + 3!m + k!p, k = 0,±1,±2,...

con amplitudes J3(a)Jk(b) y fase (3+k)¼/2. El ejemplo E10.complex.FM.pd (que no


se muestra aquí) ilustra esto graficando los espectros de un instrumento FM con
dos moduladores.

Desde los primeros tiempos los investigadores han buscado combinaciones de


fases, frecuencias e índices de modulación, para instrumentos simples y
compactos de modulación de fase, que manejen imitaciones de sonidos de
instrumentos familiares. Esto se convirtió en una gran industria, con la
introducción comercial de los sintetizadores FM.

Ejercicios

1. Un sonido tiene fundamental de 440. Cómo se le podría aplicar la modulación


de anillo para que diera un sonido de 110 Hertz con únicamente parciales
impares? Podría luego llenarlo con los pares si quisiera?

2. Una sinusoide con frecuencia 400 y amplitud pico de unidad es elevada al


cuadrado. Cuáles son las amplitudes y las frecuencias de los componentes de la
nueva señal?

3. Qué frecuencias portadoras y modulantes le debería dar a un instrumento FM de


dos operadores para que entregue frecuencias de 618, 1000 y 2618 Hertz? (esta es
una característica prominente de Stiria de Chowning.)

4. Dos sinusoides con frecuencia 300 y 400 Hertz y amplitud pico uno (de tal
manera que la amplitud RMS ≈ 0.707) se multiplican. Cuál es la amplitud RMS del
producto?

5. Suponga que quiso hacer una FM un poco más complicada, modulando el oscilador
modulante, de la siguiente manera:

6. A una sinusoide de frecuencia ! se le aplica la modulación de anillo con


otra sinusoide de exactamente la misma frecuencia. Qué diferencia de fase hará
que el componente DC del resultado desaparezca?
Capítulo 6

Diseño de espectros

Tal como se sugirió al comienzo del capítulo previo, una poderosa forma de
sintetizar sonidos musicales es especificar –y luego realizar- trayectorias
específicas de alturas de sonido (o más específicamente, frecuencias de
parciales), a lo largo de las trayectorias de la envolvente espectral [Puc01].
La envolvente espectral es utilizada para determinar la amplitud de los
parciales individuales, como una función de sus frecuencias, y se toma para
controlar el timbre del sonido (que posiblemente varíe en el tiempo).

Un ejemplo simple podría ser imitar una cuerda que se pulsa, construyendo un
sonido con parciales armónicamente espaciados, en el cual la envolvente
espectral inicie rica pero luega muera exponencialmente con las frecuencias más
altas decayendo más rápido que las bajas, de tal manera que el timbre suene
melodioso en el tiempo. Los modelos de evolución espectral para varios
instrumentos acústicos ya se han propuesto [GM77] [RM69]. Un ejemplo más
complicado es la voz hablada o cantada, en la cual las vocales aparecen como
envolventes espectrales, los diptongos y las consonantes aparecen como
variaciones en el tiempo de las envolventes espectrales, y otras consonantes
aparecen como ruido conformado espectralmente.

Las envolventes espectrales se pueden obtener del análisis de sonidos grabados


(que se desarrolla en el capítulo 9) o de criterios puramente sintéticos.
Especificar una envolvente espectral desde el inicio para cada frecuencia
posible podría ser tedioso, y en la mayoría de los casos se la podría querer
describir en términos de sus característica sobresalientes. La forma más popular
de hacer esto es especificar el tamaño y la forma de los picos de la envolvente
espectral llamados formantes. La figura 6.1 muestra una envolvente espectral con
dos formantes. Aunque las formas de los dos picos en la envolvente espectral son
diferentes, estos se pueden describir en términos generales por las coordenadas
de cada ápice (que proporcionan el centro de frecuencia y su amplitud), y el
ancho de banda de cada formante. Una medida típica del ancho de banda podría ser
el ancho del pico a un nivel de 3 decibles por debajo de su cima. Note que si el
pico está en (o cerca al) eje f = 0, esperamos que caiga a la izquierda de la
misma manera a como lo hace (en realidad) a la derecha.

Suponga que queremos generar un sonido armónico con una colección específica de
formantes. Independientemente de la frecuencia fundamental que se desee,
queremos que el espectro tenga picos con centros de frecuencias, amplitudes y
anchos de banda prescritos. Retornando a los espectros de modulación de fase
mostrados en la figura 5.16, vemos que, con los índices de modulación más
pequeños posibles, el resultado tiene un solo pico espectral bien definido.
Podemos imaginar adicionar varios de estos <picos espectrales>, todos
compartiendo una frecuencia fundamental (modulante) pero con frecuencias
portadoras afinadas en diferentes armónicos para seleccionar los diversos
centros de frecuencia <la frecuencia portadora = centro de frecuencia>, y con
índices de modulación apropiados para dar los anchos de banda deseados. Esto lo
exploró Chowning por primera vez, organizando formantes generados por la
modulación de fase, para sintetizar voces cantadas. En este capítulo
estableceremos un marco general para construir espectros armónicos con los
formantes deseados, y con la posibilidad de variarlos en el tiempo.

6.1 El modelo portador/modulador

Vimos anteriormente cómo utilizar la modulación de anillo para modificar el


espectro de una señal periódica, ubicando picos espectrales en diferentes
lugares (ver la figura 5.4 en la página “125”). Para hacer esto debemos generar
señales periódicas cuyos espectros tengan su máximo en DC y caigan
monolíticamente con el decrecimiento de la frecuencia. Al fabricar una señal con
un formante en la frecuencia cero -sin más formantes que este- podemos utilizar
la modulación de anillo para desplazar el formante hacia cualquier armónico que
queramos. Utilizando la conformación de ondas para generar el formante inicial,
el producto de la modulación de anillo será de la forma

x[n] = cos(!cn)f(acos(!mn))

donde !c (la frecuencia portadora) se ajusta para ser el centro de frecuencia


del formante y f(acos(!mn)) es una señal con frecuencia fundamental determinada
por !m, que se produce utilizando una función de conformación de onda f y un
índice a. Este segundo término es la señal a la cual le queremos dar un
formante en DC con un ancho de banda controlable. Un diagrama de bloque para la
síntesis de esta señal se muestra en la figura 6.2.

Mucho antes, en la sección 2.4 introdujimos la técnica de estiramiento del


timbre, como parte de la discusión de la síntesis de tabla de ondas. Esta
técnica, que genera timbres variables y complejos, se puede tomar dentro del
mismo marco general. La salida para la tabla de onda envuelta para un ciclo es:

x(Á) = T(cÁ)*W(aÁ),

donde Á, la fase, satisface -¼ ≤ Á ≤ ¼ <Á no es frecuencia angular; estas son


funciones del ángulo, no de la frecuencia angular>. Aquí T es la función
almacenada en la tabla de ondas, W es la función de ventana, y c y a son el
estiramiento y un índice de modulación para la función de ventana <esta función
ventana es una envolvente con valores cero en sus extremos para evitar ruido
entre el final y el inicio de la lectura de la tabla T>. La figura 6.3 muestra
cómo realizar esto en la forma de un diagrama de bloques. Comparando esto con la
figura 2.7, vemos que la única nueva característica significante es la adición
del índice a.

En esta organización, como en la previa, el primer término especifica el


emplazamiento de la energía en el espectro -en este caso con el parámetro c
estirando el espectro de la tabla de ondas. Este es el papel que llevaba
previamente <la función T almacenada en la tabla de onda> cuando se seleccionó
como la frecuencia portadora en la modulación de anillo.

Ambas (la conformación de ondas por modulación de anillo y la síntesis de tabla


de ondas estirada) pueden ser consideradas casos particulares de la aproximación
a un caso más general que computa funciones de la forma,

x[n] = c(!n)ma(!n)

donde c es una función periódica que describe la señal portadora y ma es una


función de un modulador periódico que depende del índice a. Las funciones de
modulación que nos han interesado usualmente <envolvente de tablas de onda>
tomarán la forma de trenes de pulsos <ventana de Hann, curva campana,
distribución de Cauchy>, y el índice a tomará el control del ancho del pulso;
valores más altos de a <diente de sierra más parada, lo que propicia una
lectura de tabla de onda de la envolvente más rápida> darán pulsos más estrechos
<más “cortos”; el índice a además de estrechar los pulsos cuando crece,
fortalece los armónicos más altos de la función>. En el caso de la tabla de
onda, la función de modulación debe ser cero en los puntos de la fase de la
envolvente, para suprimir cualquier discontinuidad en la función portadora
cuando la fase hace la envolvente. La señal portadora dará lugar a un único pico
espectral (un formante) en el caso de la conformación de onda con modulación de
anillo; las tablas de onda pueden tener un espectro más complicado.

En la sección siguiente haremos un desarrollo de las dos formas de modulación de


la señal presentadas aquí, y en la siguiente, miraremos más de cerca a la señal
portadora.

6.2 Trenes de pulsos

Los trenes de pulsos se pueden generar ya sea utilizando la formulación de la


conformación de onda o la del estiramiento de tabla de ondas. La formulación de
la conformación de onda es más fácil de analizar y controlar, y la
consideraremos en primer lugar.

6.2.1 Trenes de pulso vía conformación de onda

Cuando utilizamos conformación de onda la configuración del formante está


determinada por un término de modulación

ma(n) = f(acos(!mn))

Para valores pequeños del índice a el término de la modulación varía sólo


ligeramente con respecto al valor constante f(0), de tal manera que la mayor
parte de la energía está concentrada en DC. En tanto a se incrementa la energía
se esparce progresivamente hacia los armónicos más elevados de la fundamental
!. Dependiendo de la función f, este proceso puede ser llevado a cabo ordenada
o desordenadamente. Puede quererse un esparcimiento ordenado al principio y
luego no, dependiendo de si nuestro objetivo es un espectro predecible o un
amplio rango de espectros (que son de esta manera difíciles de predecir).

La función de conformación de onda f(x) = ex, analizada en la página “140”,


proporciona resultados que se comportan bien, simples y predecibles. Después de
normalizar apropiadamente, obtenemos los espectros mostrados en la figura 5.13.
Una ligera re-escritura del modulador de conformación de onda para esta opción
de f (y tomando en cuenta la renormalización) da:

ma(n) = ea(cos(!n) - 1)

<a(cos(!mn) – 1) = -a(1 - cos(!mn)) = -2a(sen2(!mn/2)); identidad


trigonométrica>
2
= e-[bsen(!n/2)] <en el libro hace falta el término n en el exponente>

donde b2 = 2a de tal manera que b es proporcional al ancho de banda. Esto puede


re-escribirse como

ma(n) = g[bsen(!n/2)]

con
2
g(x) = e-x

Excepto por un factor de normalización perdido, esta es una distribución


gaussiana, usualmente llamada “curva campana” <será norma que una función
exponencial se convierta en una curva campana, cuando la variable x es de tipo
sinusoidal>. Las amplitudes de los armónicos están dadas por las funciones de
Bessel tipo “I” <es decir, se llama “tren de pulsos” porque la “curva campana”
funciona como una envolvente de tabla de onda; casi cero en sus extremos>.

Otra opción es la distribución de Cauchy (también sin normalizar):

h(x) = 1/(1 + x2)

la cual hace aparecer un espectro de armónicos cayendo exponencialmente:


h[bsen(!n/2)] = G · (1/2 + Hcos(!n) + H2cos(2!n) + ...)

donde G y H son funciones del índice b (fórmulas explícitas se dan en


[Puc95a]).

Tanto en esta como en la gaussiana del caso anterior, el ancho de banda <del
formante> (contado en picos, es decir, en unidades de !) es aproximadamente
proporcional al índice b, y la amplitud del término DC (la cima del espectro)
es aproximadamente igual a 1/(1 + b) <a esta deducción se debe llegar después
de un análisis de las funciones mucho más profundo; hay que recordar que b2 es
proporcional al parámetro a por lo menos para el caso de la curva campana>.
Para cualquiera de las dos funciones de conformación de onda (g ó h) si b es
más grande que aproximadamente 2, la conformación de onda de ma(!n) <la onda
resultante> es aproximadamente una lectura (hacia adelante o hacia atrás) de la
función de transferencia, de tal manera que la onda resultante aparece como
pulsos cuyas anchuras decrecen mientras los anchos de banda especificados se
incrementan.

6.2.2 Trenes de pulsos vía estiramiento de tabla de ondas

En la formulación de tabla de ondas, un tren de pulsos puede ser hecho por una
tabla de onda estirada:

Ma(Á) = W(aÁ),

donde -¼ ≤ Á ≤ ¼ es la fase, es decir, al valor !n se le aplica una envolvente


para quedar entre -¼ y ¼. La función W deberá ser cero en y más allá de los
puntos -¼ y ¼, y elevarse a su máximo en 0. Una opción posible para la función
W es

W(Á) = (cos(Á) + 1)

lo cual se grafica en la parte (a) de la figura 6.4. Esta se conoce como la


función de la ventana de Hann; que vendrá de nuevo en el capítulo 9.

Al realizar repiticiones de esta como una onda, obtenemos una sucesión de copias
de la función W (sampleada apropiadamente), cuyo ciclo de trabajo es 1/a
(partes b y c de la figura). Si no desea que las copias se traslapen, el índice
a debe ser como mínimo 1. Si usted quiere permitir el traslape, la estrategia
más simple es duplicar el diagrama de bloque (figura 6.3), como se describió en
la sección 2.4 y se efectuó en la sección 2.6 <este procedimiento de duplicación
no se describió como tal, si no que se efectuó en la sección 2.6, con el ejemplo
B13.sampler.overlap.pd>.

6.2.3 Espectros resultantes

Antes de considerar señales más complejas que vayan con las moduladoras tal como
lo hemos visto, es instructivo ver qué ondas y espectros nos da la
multiplicación por una sinusoide pura. La figura 6.5 muestra el resultado de
multiplicar dos trenes de pulsos diferentes por una sinusoide en el sexto
parcial:

cos(6!n)Ma(!n)

donde el índice de modulación a es dos en ambos casos. En la parte (a) Ma es la


función de ventana de Hann, estirada; la parte (b) muestra una conformación de
onda vía la distribución de Cauchy no normalizada. Se muestra un período de cada
onda.

En ambas situaciones vemos, en efecto, el sexto armónico (la señal portadora)


envuelto dentro de un paquete de onda centrado en la mitad del ciclo, donde la
fase de la sinusoide es cero <en la parte (a) se ven en primera instancia 5
ciclos de la portadora en su sexto parcial únicamente, pero hay dos medios
ciclos a lado y lado cuyas amplitudes no se alcanzan a destacar por encima de la
línea horizontal; el resto del ciclo queda en cero -a lado y lado-; en (b) se
alcanzan a visualizar dos ciclos de la portadora, pues las amplitudes de la
ventana de Cauchy permiten esto>. Al cambiar la frecuencia de la sinusoide,
cambia el centro de frecuencia del formante; al cambiar el ancho del paquete (la
parte de la onda durante la cual la sinusoide es fuerte) cambia el ancho de
banda. Note que la función de ventana de Hann estirada es cero al comienzo y al
final del período, a diferencia del paquete al que se le ha aplicado la
conformación de onda.

La figura 6.6 muestra cómo la configuración del formante depende del método de
producción. La forma de la tabla de onda estirada <ventana de Hann> (parte (a)
de la figura) se comporta bien en las vecindades del pico, pero de manera
extraña a partir de una distancia del parcial cuatro desde el pico, pasado lo
cual vemos los llamados lóbulos laterales, picos extras falsos a una amplitud
más baja que la del pico central. Tal como el análisis de la sección 2.4
predice, el formante completo, los lóbulos laterales y todo <el espectro!>, se
estira y se contrae de manera inversa a como el tren de pulsos es contraído y
estirado en el tiempo.

El primero y más fuerte de los lóbulos laterales en cualquiera de los lados es


de aproximadamente 32 dB más bajo en amplitud que el pico principal. Los demás
lóbulos laterales caen más lentamente cuando se expresan en decibeles; las
amplitudes decrecen con el cuadrado de la distancia desde el pico central de tal
manera que el sexto lóbulo lateral a la derecha, a una distancia tres veces
mayor que la del primero desde la frecuencia central, es aproximadamente veinte
decibeles más bajo. El efecto de estos lóbulos laterales es usualmente audible
como un ligero zumbido en el sonido.

Esta configuración del formante puede ser hecha arbitrariamente gorda (es decir
con un ancho de banda alto) <recordar que este parámetro es proporcional al
parámetro b>, pero hay un límite en lo delgada que pueda ser, ya que el ciclo
de trabajo de la onda no puede exceder el 100%. En su ciclo de trabajo máximo la
fortaleza del formante cae a cero a la distancia de dos armónicos del pico
central. Si se requiere un ancho de banda aún más bajo, las ondas se pueden
traslapar, tal como se describió en la sección 2.6.

Las partes (b) y (c) de la figura muestran los formantes generados utilizando la
conformación de onda con modulación de anillo, con funciones gaussianas y de
Cauchy. El índice de modulación es dos en ambos casos (el mismo que para la
ventana de Hann de la parte a), y el ancho de banda es comparable al del ejemplo
de la ventana de Hann. En estos ejemplos no hay lóbulos laterales, y es más, el
índice de modulación puede ser llevado a cero, resultando una sinusoide pura; no
hay límite inferior en el ancho de banda. De otro lado, debido a que la onda no
alcanza el cero al final del ciclo, este tipo de tren de pulso no puede ser
utilizado para ser ventana de una tabla de onda arbitraria, tal como lo puede
ser el tren de pulsos de Hann.

El ejemplo de Cauchy es particularmente útil para el diseño de espectros, ya que


la configuración del formante es un triángulo isósceles, cuando se grafica en
decibeles. De otro lado, el ejemplo gaussiano reúne más energía hacia el
formante, y cae más rápidamente en las colas, de tal manera que tiene un sonido
más limpio y ofrece mayor protección contra el sobre-doblado.

6.3 Modulación de anillo móvil

Retornamos ahora a la señal portadora, buscando maneras de hacerla más


controlable. En particular nos gustaría poder deslizar la energía espectral
continuamente arriba y abajo en la frecuencia <sin que se escuchen “choques” o
discontinuidades>. Llevar en rampa la frecuencia del oscilador portador no
logrará esto, ya que los espectros no serán armónicos excepto cuando la
portadora sea un múltiplo entero de la frecuencia fundamental.

Con la tabla de ondas estirada podemos lograr esto sencillamente haciendo la


lectura de muestras de una sinusoide y transponiéndola a la “altura” deseada. La
altura transpuesta no es escuchada como algo periódico ya que la tabla de ondas
misma es leída periódicamente a la frecuencia fundamental <recordar que el
objetivo del estiramiento es independizar el período al cual comienza la lectura
de una tabla de onda y la longitud de esa tabla de onda; dos parámetros que
usualmente están controlados únicamente por la frecuencia>. En lugar de esto, la
sinusoide es transpuesta como una envolvente espectral.

La figura 6.7 muestra una señal portadora producida de esta manera, afinada para
producir un formante a 1.5 veces la frecuencia fundamental. La señal no tiene
discontinuidad en la frecuencia de la fase envolvente, pero tiene una
discontinuidad en el traslape <en la “conexión” entre el final del uno y el
inicio del otro>, la cual, si no se remueve aplicando una modulación apropiada
de la señal, podría llegar a tener componentes muy audibles en frecuencias
altas.

Utilizando esta idea podemos hacer una descripción completa de cómo utilizar el
diagrama de bloque de la figura 6.3 para producir el formante deseado. La tabla
a leer en el lado izquierdo podría contener una sinusoide (ubicada
simétricamente, de tal manera que la fase es cero en el centro de la tabla de
ondas). La tabla de ondas de la derecha deberá contener una ventana de Hann u
otra función de ventana apropiada. Siendo la frecuencia fundamental !, la
frecuencia central del formante !c, y el ancho de banda !b, obtenemos el
parámetro “estiramiento” para el cociente de frecuencia central, definido como
!c/!, y el índice de modulación como el cociente ancho de banda, !b/!.
La señal de salida es simplemente una muestra de una onda coseno a la frecuencia
central deseada, repetida en el período deseado (no relacionados en general) y a
la que se aplica una ventana para tomar las discontinuidades en las fronteras
del período.

Aunque no somos capaces de derivar este resultado todavía (necesitaremos el


análisis de Fourier), este se convertirá en que, en el lóbulo principal del
formante, las fases son todas cero en el centro de la onda (es decir, los
componentes son todos coseno si consideramos que la fase debe ser cero en el
centro de la onda). Esto significa que podemos superponer cualquier número de
estos formantes para construir un espectro más complejo y las amplitudes de los
parciales se combinarán por adición. (Los lóbulos laterales no se comportan así:
ellos son de signo opuesto alternativamente y producirán patrones de
cancelación; pero usualmente los podemos ignorar como una señal residual,
pequeña e incontrolable).

Este método nos conduce a una interesante generalización, que es tomar una
secuencia de tablas de ondas grabadas, alinear todas las fases de sus
componentes con las de los cosenos, y utilizarlas en lugar de la función coseno
como señal portadora. La alineación de la fase es necesaria para permitir la
atenuación cruzada entre las muestras, de tal manera que la envolvente espectral
pueda cambiar con suavidad. Si, por ejemplo usamos retazos de una muestra vocal
como entrada, obtenemos un sorpendentemente efectivo vocoder; ver la sección
9.6.

Otra técnica para fabricar señales portadoras que se puedan deslizar


continuamente arriba y abajo en la frecuencia mientras se mantiene la frecuencia
fundamental es simplemente hacer atenuación cruzada entre los armónicos. La
señal portadora es entonces:

c(Á) = c(!n) = pcos(k!n) + qcos((k + 1)!n)


donde p + q = 1 y k es un entero, y todos los tres se escogen de tal manera que

(k + q)* ! = !c

de tal manera que el centro espectral de masa de los dos cosenos esté ubicado en
!c. (Note que hacemos que la adición de las amplitudes de los dos cosenos sea
uno, en lugar de ajustar la potencia total a uno; hacemos esto porque el
modulador operará coherentemente con la fase sobre ellos.) Para lograr esto
ajustamos k y q para que sean parte entera y parte fraccional, respectivamente,
del cociente del centro de frecuencia !c/!.

La forma más simple de hacer una interfaz de control para esta técnica de
síntesis podría ser utilizar rampas para actualizar ! y !c, y luego computar q
y k como señales de audio que van en rampa, variando suavemente ! y !c.
Extrañamente sin embargo, a pesar del hecho de que k, p y q son funciones
discontinuas de !c/!, la portadora c(Á) se convierte para variar continuamente
con !c/!, y así si el centro de frecuencia !c va en rampa de valor en valor, el
resultado es un cambio continuo en el centro de frecuencia. Sin embargo se
requiere más trabajo si se necesitan cambio discontinuos en el centro de
frecuencia. No es irracional querer esto pues es análogo a cambiar la frecuencia
de un oscilador de manera discontinua.

Hay una buena manera de acomodarlo. El truco para actualizar k y q es notar que
c(Á) = 1 siempre que Á sea un múltiplo de 2¼, sin importar cuáles valores de k,
p y q escojamos, y siempre que p + q = 1. Por lo tanto podemos hacer cambios
discontinuos en k, p y q una vez por período (cuando la fase es un múltiplo de
2¼) sin hacer discontinuidades en la señal portadora.

En el caso específico de FM, si queremos podemos ir atrás y modificar la


formulación original a:

pcos(n!2t + rcos(!1t)) + qcos((n + 1)!2t + rcos(!1t))

Esto nos permite adicionar glisandos (los cuales son escuchados como diptongos)
a la técnica original de la síntesis vocal basada en la modulación de fase, de
Chowning.

6.4 Generador de formantes alineados en fase (PAF)

Combinando las dos señales portadoras de dos cosenos con el generador de pulsos
por conformación de onda, resulta un generador de formantes alineados en fase,
usualmente llamado por su acrónimo PAF. (El PAF es tema de una patente de 1994
perteneciente al IRCAM.) La fórmula combinada es,

x[n] = g(asen(!n/2))[pcos(k!n) + qcos((k + 1)!n)]

<donde g(asen(!n/2)) es el modulador (generador de pulsos por conformación de


onda) y pcos(k!n) + qcos((k + 1)!n) son las señales portadoras>

Aquí la función g puede ser la función de conformación de onda gaussiana o de


Cauchy, ! es la frecuencia fundamental, a es el índice de modulación que
controla el ancho de banda y k, p y q controlan la frecuencia central del
formante.

La figura 6.8 muestra el PAF como un diagrama de bloques, separado en una


sección de generador de fase, una sección portadora y una sección moduladora. La
sección de la generación de fase da a la salida una señal diente de sierra en la
frecuencia fundamental. El modulador fue hecho por conformación de onda normal
con una ligera modificación. La fórmula para las señales del modulador tienen
una entrada sinusoidal a la mitad de la frecuencia fundamental, es decir
sen(!/2), y esto normalmente nos hace utilizar una diente de sierra a la mitad
de la frecuencia fundamental. Sin embargo, debido a que la función de
conformación de onda es par, podemos sustituír por el valor absoluto de la
sinusoide:

|sen(!/2)|

la cual se repite a la frecuencia ! (la primera mitad del ciclo es igual a la


segunda mitad.) Podemos calcular esto simplemente utilizando una sinusoide de
medio ciclo como una función de lectura de una tabla de onda (con la fase de
-¼/2 a ¼/2), y esta es la sinusoide rectificada que pasamos a la función de
conformación de onda.

Aunque la función de la tabla de onda está dibujada en valores positivos y


negativos (de -10 a 10), de hecho estamos utilizando únicamente el lado positivo
para la lectura, llevando de 0 a b el índice de modulación. Si el índice de
modulación excede el rango de la tabla (aquí lo ajustamos para que se detenga en
10 como un ejemplo), la lectura de la tabla será recortada. La tabla debe
extenderse suficientemente lejos hacia la cola de la función de conformación de
onda, de tal manera que el efecto del recorte resulte inaudible.

La señal portadora es una suma ponderada de dos cosenos, cuyas frecuencias se


incrementan multiplicándolas (por k y k + 1 respectivamente) y aplicándoles
envolventes. De esta manera todas las fases de la lectura están controladas por
el mismo oscilador diente de sierra.

Las cantidades k, q y el índice de tabla de onda b se calculan como se muestra


en la figura 6.9. Estas son funciones de la frecuencia fundamental dada, de la
frecuencia central del formante y del ancho de banda, que son parámetros
originales del algoritmo. La cantidad p que no se muestra en la figura es
precisamente 1 – q.

Tal como se describió en la sección previa, las cantidades k, p y q deberán


cambiar únicamente en los puntos de envoltura de la fase, es decir en períodos
de 2¼/!. Ya que el cálculo de k, etc depende del valor del parámetro !, se
sigue que ! mismo deberá ser actualizado cuando la fase sea un múltiplo de 2¼;
de otra manera, un cambio en ! podría enviar el centro de frecuencia (k + q)/!
a un valor incorrecto por una fracción (muy notable) del período. En efecto,
todos los cálculos del parámetro deberán ser sincronizados a la fase del
oscilador original.

Tener un control de la fase del oscilador que actualice su propia frecuencia es


un ejemplo de retroalimentación, que significa en general el uso de la salida de
un proceso como una de sus entradas. Cuando procesamos señales de audio digital
a una velocidad fija de lectura de muestras (tal y como lo estamos haciendo),
nunca es posible tener la salida actual del proceso como una entrada, debido a
que el tiempo que podríamos necesitar aún no lo hemos calculado. Lo mejor que
podemos esperar es utilizar la muestra previa de la salida -en efecto,
adicionando una muestra de retraso. En ambientes de bloques (tales como Max, Pd
y Csound) la situación se vuelve más complicada, pero dejaremos la discusión
para el capítulo siguiente (y simplemente deseo esquivar el problema en los
ejemplos y al final de este capítulo).

La amplitud del pico central en el espectro del generador PAF es aproximadamente


1/(1 + b); en otras palabras, cercana a la unidad cuando b es menor que uno, y
cayendo de manera inversa con valores más grandes de b. Para los valores de b
aproximándose a diez por debajo, la fortaleza de la señal puede no variar mucho,
ya que la introducción de otros parciales, incluso a amplitudes más bajas,
desajusta el decrecimiento de la amplitud del parcial central. Sin embargo, si
se utiliza PAF para generar formantes con amplitudes pico específicas, la salida
deberá multiplicarse por 1 + b (o incluso, si es necesario, por una
aproximación del factor de corrección, cuyo valor exacto depende de la función
de conformación de onda). Esta corrección de amplitud debe aplicarse en rampa y
no por muestra-y-sostenimiento.

Debido a que la expansión de la señal de conformación de onda (moduladora)


consiste de todos los términos coseno (es decir, debido a que todos tienen fase
inicial cero), como lo son los dos componentes de la portadora, se sigue de la
fórmula del producto de cosenos que los componentes del resultado son todos
coseno también. Esto significa que cualquier número de generadores PAF, si están
fabricados para compartir el mismo oscilador de generador de fase, estarán todos
en fase y al combinarlos el resultado será la suma de los espectros
individuales. De esta manera podemos hacer versiones de formantes múltiples como
se muestra en la figura 6.10.

La figura 6.12 muestra una salida posible de un par de formantes generados de


esta manera; el primer formante está centrado en la mitad de los parciales 3 y
4, y el segundo en parcial 12, con amplitud y ancho de banda menores. Se utilizó
la función de conformación de onda de Cauchy, la cual produce espectros
traslapados linealmente (visto en dB). Los dos se superponen aditivamente, de
tal manera que la envolvente espectral es una curva suave entre un formante y el
otro. El formante más bajo también adiciona su propia reflexión alrededor del
eje vertical, de tal manera que aparece ligeramente curvado delante de allí.

El generador PAF puede alterarse si se desea fabricar espectros inarmónicos


deslizando los parciales adelante y atrás en su frecuencia. Para hacer esto,
adicionamos un segundo oscilador para la fase de los dos cosenos de la
portadora, pero no para la fase de la porción moduladora del diagrama, ni para
controlar la fase de las unidades de muestra-y-sostenimiento. En cambio, la
estrategia de muestra-y-sostenimiento para suavizar la actualización de los
parámetros funciona todavía; y aún más, los generadores PAF comparten la misma
porción de generación de fase con lo que seguirán en fase uno con otro.

La técnica de superposición de espectros no trabaja de manera predecible para la


modulación de fase como sí lo hace el generador PAF; la salida de los parciales
de la modulación de fase tiene relaciones de fase complicadas y parecen
difíciles de combinar de manera coherente. En general la modulación de fase dará
patrones más complicados de evolución espectral, toda vez que el PAF es más
fácil de predecir y convertir en efectos específicos deseados.

6.5 Ejemplos

Tren de pulsos de tabla de ondas

El ejemplo F01.pulse.pd (figura 6.13) genera un tren de pulsos de altura


variable, utilizando la lectura de una tabla de onda estirada. La figura 6.14
muestra dos productos intermedios del parche y su salida. El parche lleva a cabo
la labor de la manera más simple posible, ubicando el pulso en el ángulo (fase)
¼ en lugar de 0; en los ejemplos posteriores esto se solucionará adicionando
0.5 a la fase y aplicando una envolvente.

La fase inicial se ajusta para que vaya de -0.5 a 0.5 y se escala luego por un
multiplicador que es uno como mínimo, dando como resultado la señal de la figura
6.14 (parte a); esta corresponde a la salida del objeto *~, el quinto de abajo
hacia arriba en el parche. La gráfica en la parte (b) muestra el resultado de
recortar la onda diente de sierra al intervalo -0.5 y 0.5, usando el objeto
clip~ <la formulación con la función de corte (clip~) es básica para obtener los
diferentes ciclos de trabajo de una onda; se aplica clip~ a la función diente de
sierra phasor~, con un modificador de amplitud para esta>. Si el multiplicador
que escala es el mínimo (uno) <en el parche aparece como “index”, pero en la
explicación también se le identifica como “bandwidth” (ancho de banda)>, la
diente de sierra deberá ir desde -0.5 a 0.5 en cualquier caso y el recorte no
tendrá efecto. Para cualquier valor del multiplicador mayor que uno, la salida
recortada se sitúa en el valor -0.5, hace la rampa hasta 0.5, y luego se
estaciona en 0.5. Mientras más alto sea el multiplicador, más rápidamente la
onda hace la rampa y más tiempo demora el recorte inferior y superior.

El objeto cos~ convierte luego esta onda en un pulso. Las entradas -0.5 y 0.5
van a -1 (están en un ciclo aparte); así que en el punto medio de la onda la
entrada es 0 y la salida es, por lo tanto, 1. La salida por lo tanto se sitúa en
-1, dibuja un ciclo completo de la función coseno y luego regresa a -1 para
quedar en silencio. La proporción de tiempo que la onda gasta trazando la
función coseno es uno dividido por el multiplicador; así, es 100% para un
multiplicador de uno, 50% para 2 y así sucesivamente. Finalmente, la salida del
pulso se ajusta para que sus valores estén entre 0 y 1; es lo que se grafica en
la parte (c) de la figura <estamos ante un pulso con forma coseno: ventana de
Hann>.

Generador de formantes sencillo

Los siguientes tres ejemplos demuestran el sonido de un pulso con anchura


variable, grafican su espectro, y hacen el contraste con el generador de pulsos
por conformación de onda. Saltando al ejemplo F05.ring.modulation.pd (figura
6.15), mostramos la manera más simple de combinar el generador de pulsos con un
oscilador de modulación de anillo para fabricar un formante. El tren de pulsos
de los ejemplo previos está contenido en el subparche pd pulse-train. Este se
multiplica por un oscilador cuya frecuencia está controlada como un múltiplo de
la frecuencia fundamental. Si el múltiplo es un entero, se obtiene un sonido
armónico. No se ha intentado controlar las fases relativas de los componentes
del tren de pulsos ni de las sinusoides portadoras.

El ejemplo siguiente, F06.packets.pd (figura 6.16), muestra cómo combinar el


tren de pulsos de la tabla de onda estirada con una muestra de sinusoide para
realizar formantes móviles, como se describió en la sección 6.3. El generador de
pulsos está como antes, pero ahora la señal portadora es una sinusoide quebrada.
Dado que su fase es la fase fundamental multiplicada por el cociente del centro
de frecuencia, el incremento de la fase muestra por muestra es el mismo que para
la sinusoide de la frecuencia central. Sin embargo cuando se aplica una
envolvente a la fase, la fase de la portadora salta a un sitio diferente en el
ciclo, <pues la sinusoide de la portadora no es continua> tal como se ilustró en
la figura 6.7. Aunque el cociente del ancho de banda !b/! debe ser por lo menos
uno, el cociente del centro de frecuencia !c/! puede llegar hasta cero si se
desea <en este parche se evidencia de nuevo que al recortar el ciclo de trabajo,
también se recorta la onda, cosa que no se estipuló cuando se enunció la teoría
del estiramiento de onda>.

Señal portadora de dos cosenos

El ejemplo F08.two.cosines.pd (figura 6.17) muestra cómo fabricar una señal


portadora que realice un cruzamiento atenuado entre armónicos para hacer centro
de frecuencias continuamente variables. El cociente del centro de frecuencia
aparece como la salida de un objeto line~. Esta es separada en dos partes
fraccionales (utilizando el objeto wrap~) y su parte entera (al sustraer la
parte fraccional de la original). Estas están etiquetadas como q y k de acuerdo
con el tratamiento de la sección 6.3.

La fase -una onda diente de sierra a la frecuencia fundamental- es multiplicada


por k y k + 1 (el último adicionando la diente de sierra original a la
primera), y se toman los cosenos de ambos; ellos están de esta manera a k y k +
1 veces la frecuencia fundamental y no tienen discontinuidades en los puntos de
la envolvente de fase. Los siguientes pocos objetos en el parche computan la
suma ponderada pc1 + qc2, donde c1 y c2 son las dos sinusoides y p = 1 - q , al
evaluar una expresión equivalente, c1 = q(c2 - c1). Esto nos da la frecuencia
móvil deseada de la señal portadora.

El ejemplo F09.declickit.pd (que no se muestra aquí), muestra cómo adicionando


un objeto samphold~ después del objeto line~ controlando la frecuencia central,
usted puede evitar discontinuidades en la señal de salida incluso si la
frecuencia central deseada cambia discontinuamente. En el ejemplo el cociente de
frecuencia central alterna entre 4 y 13.5. Al efectuar la rampa multiplicada por
un valor por debajo de casi 20 milisegundos se presentan artefactos audibles
cuando se utiliza el objeto line~ solo, el cual desaparece cuando se añade el
objeto samphold~. (Una desventaja de hacer muestra-y-sostenimiento para el
cociente de la frecuencia, es que para frecuencias fundamentales muy bajas, los
cambios pueden escucharse como pasos discretos. Así en situaciones donde la
frecuencia fundamental es baja y la frecuencia central no necesita cambiarse muy
rápidamente, puede ser mejor omitir el paso de muestra-y-sostenimiento.)

Los siguientes dos ejemplos demuestran el uso de los osciladores portadores con
cruzamiento atenuado como parte de la técnica clásica de modulación de fase de
dos operadores. El mismo oscilador de modulación se suma de manera separada a
las fases de los dos cosenos. Los espectros resultantes pueden ser hechos para
viajar arriba y abajo en frecuencia, pero debido a las complicadas relaciones de
fase entre los picos vecinos en el espectro de modulación de fase, sin importar
cómo alinee los dos espectros, usted nunca puede evitar cancelaciones de fase
cuando se traslapan.

El generador PAF

El ejemplo F12.paf.pd (figura 6.18) es una realización del generador PAF,


descrito en la sección 6.4. El control de la entrada especifica la frecuencia
fundamental, la frecuencia central, y el ancho de banda, todo en “unidades” MIDI
<no hay unidades MIDI en ese parche; se está refiriendo al parche
F13.paf.control.pd>. Los primeros pasos tomados en la realización son dividir la
frecuencia central por la fundamental (para obtener el cociente de la frecuencia
central) y el ancho de banda por la fundamental para obtener el índice de
modulación para el mecanismo de conformación de onda. Al cociente de la
frecuencia central se le aplica muestra-y-sostenimiento de tal manera que esta
se actualiza únicamente en períodos de la fundamental.

El oscilador uno (el objeto phasor~) corre a la frecuencia fundamental. Este es


utilizado para controlar el objeto samphold~ que sincroniza las actualizaciones
con el cociente del centro de frecuencia (etiquetado “C.F. relative to
fundamental” en la figura), y para computar fases para los dos objetos cos~ que
operan como se mostró antes en la figura 6.17.

La porción de conformación de onda del parche utiliza una sinusoide de medio


período como una función de lectura (para compensar el doblaje de frecuencia
debido a la simetría de la función de lectura). Para obtener medio ciclo de la
función seno, multiplicamos la fase por 0.5 y sustraemos 0.25, de tal manera que
el ajuste de la fase corre de -0.25 a 0.25, una vez cada período. Esto lee la
mitad positiva del ciclo definido por el objeto cos~.

La amplitud de la mitad de la sinusoide se ajusta luego por un índice de


modulación (el cual es precisamente el cociente del ancho de banda !b/!). La
tabla (“bell-curve”) contiene una curva gaussiana no normalizada, en muestras,
desde -4 a 4 sobre 200 puntos (25 puntos por unidad), de tal manera que el
centro de la tabla, en el punto 100, corresponde al pico central de la curva
campana. Por fuera del intervalo -4 a 4 los valores de la curva gaussiana son
prácticamente nulos.

La figura 6.19 muestra cómo se prepara la tabla de ondas gaussiana. Se requirió


de un nuevo objeto de control:
until~: Cuando la entrada izquierda, “start”, se dispara, da como salida
disparos secuenciales (sin que ningún tiempo transcurra entre ellos)
iterativamente, hasta que la entrada derecha, “stop”, sea disparada. El mensaje
“bang” de parada se debe originar de alguna manera desde la salida de los
objetos until; de otra manera la salida enviará mensajes por siempre, congelando
cualquier otro objeto que pudiera romper el lazo.

Tal como se utilizó aquí, un lazo conducido por un objeto until cuenta de 0 a
199, incluído. El lazo de conteo se mantiene por los objetos “f” y “+ 1”, cada
uno de los cuales alimenta al otro. Pero debido a que la salida del objeto “+ 1”
va a la entrada derecha de “f”, su resultado (una unidad más grande) únicamente
surgirá del “f” la siguiente vez que sea disparado por “until”. De esta manera,
cada disparo desde “until” incrementa el valor en uno.

Es importante el orden con el cual inicia el lazo: el objeto “t b b” de la parte


superior (iniciales de “trigger bang bang”) deben enviar primero un cero a “f”,
con el fin de darle inicio, y luego se ajusta el objeto until enviando disparos,
incrementando el valor, hasta detenerse. Para detenerlo cuando el valor alcance
199, un objeto select examina el valor, y cuando ve que coincide, dispara la
entrada “stop” del objeto until.

Entre tanto, por cada número de 0 a 199 que sale del objeto “f” creamos mensajes
de pares ordenados para el objeto “tabwrite”. Primero, a la derecha, va el
índice mismo, de 0 a 199. Luego, para la entrada izquierda, el primer objeto
expr ajusta el índice para que vaya de -4 a 4 (iba previamente de 0 a 199) y el
segundo evalúa la función gaussiana.

En este parche no tenemos totalmente solucionado el punto de actualizar el


cociente del centro de frecuencia en los tiempos apropiados. Siempre que la
frecuencia portadora sea cambiada en el paso muestra-y-sostenimiento se retrasa
apropiadamente la actualización del cociente. Pero si, en lugar de la suma, la
fundamental misma cambia abruptamente entonces, por una fracción de un período,
la frecuencia del objeto phasor~ y el cociente quedan por fuera de sincronía. Pd
no permite que la salida de samphold~ se conecte a la entrada de phasor~
nuevamente sin la inclusión de un retraso explícito (ver el capítulo siguiente)
y no hay una manera sencilla de modificar el parche para resolver este problema.

Asumiendo que de alguna manera hicimos que la entrada del objeto phasor~ quedara
en sincronía con sus propios puntos de aplicación de envolvente, deberíamos
hacer entonces lo mismo con el cociente ancho-de-banda/fundamental en el lado
derecho del parche. En el escenario corriente, sin embargo, no hay problema en
actualizar ese valor continuamente.

Una solución práctica para este problema de actualización podría ser simplemente
re-escribir el parche entero en C como un elemento Pd; esto también significa la
utilización de mucho menos tiempo de CPU que el del parche mostrado, y es una
solución más práctica en general -siempre y cuando no quiera experimentar
embelleciendo o haciendo otros cambios en el algoritmo. Tales embellecimientos
podrían incluír: adicionar un cambio inarmónico arriba y abajo en los parciales;
permitiendo cambiar entre las actualizaciones suaves y de muestra-y-
sostenimiento de la frecuencia central; adicionar controles de ganancia
separados para parciales pares e impares introduciendo gravilla por la
modulación irregular de la fase; permitiendo mezclas de dos o más funciones de
conformación de onda; o fabricar ataques marcados alineando la fase del
oscilador con los tiempos de un generador de envolvente de amplitud.

Un detalle final acerca de la amplitud está al orden: debido a que la amplitud


de los parciales más fuertes decrece aproximadamente como 1/(1 + b), donde b es
el índice de modulación, es a veces (pero no siempre) deseable corregir la
amplitud de la salida multiplicándola por 1 + b. Esto es únicamente una opción
si b se actualiza de manera suave (como en este ejemplo), pero no cuando se
hace con muestra-y-sostenimiento. Una situación en la cual esto es apropiado es
en la simulacion de cuerdas pulsadas (al ajustar el centro de frecuencia a la
fundamental, comenzando con índice de modulación alto y haciéndolo caer
exponencialmente); debería ser apropiado escuchar la fundamental cayendo, no
elevándose en su amplitud, cuando la cuerda decae.

Tablas de onda estiradas

En lugar de utilizar conformación de onda, la síntesis de formantes también es


posible utilizando el estiramiento de tabla de ondas, como se demuestra en el
ejemplo F14.wave.packet.pd (que no se muestra aquí). La técnica es
escencialmente la del ejemplo B10.sampler.overlap.pd (que se describió en la
sección 2.6), con un lector de coseno en lugar de la tabla de onda más general,
pero con la adición de un control para ajustar el ciclo de tarea de las
envolventes de amplitud. Las unidades están ajustadas para ser compatibles con
las del ejemplo previo.

Ejercicios

1. Un tren de pulsos consiste en ventanas de Hann (cosenos elevados), de extremo


a extremo, sin ningún espacio entre ellas. Cuál es el espectro resultante?

2. Para sintetizar un formante con centro de frecuencia de 2000 Hertz y


fundamental de 300 Hertz, qué valores deberían tomar k y q (según la
terminología de la figura 6.8)?

3. Cómo podría modificar el diagrama de bloques de la figura 6.8 para producir


únicamente armónicos impares?
Capítulo 7

Variaciones en el tiempo y retrasos

A las 5 de alguna tarde, ponga su grabación favorita de Ramones en la pista 5.


El sábado siguiente ejecute la misma grabación a las 5:00:01, un segundo más
tarde en el día. Las dos ejecuciones sonarán idealmente lo mismo. Cambiar todo
un segundo (o, si usted prefiere, algunos días y un segundo) no tiene efecto
físico en el sonido.

Pero suponga ahora que usted ejecuta la grabación a las 5:00 y a las 5:00:01 del
mismo día (en dos sistemas de reproducción diferentes, ya que la música dura más
de un segundo). Ahora el sonido es muy diferente. La diferencia, cualquiera que
sea, claramente no reside en ninguno de los dos sonidos individuales, si no en
la interferencia entre ambos. Esta interferencia puede percibirse por lo menos
de cuatro maneras diferentes:

Cánon: Combina dos copias de una señal con una diferencia de tiempo
suficiente para que la señal cambie apreciablemente, podríamos escuchar las
dos como secuencias de sonidos separados, comparando efectivamente la señal
actual con su previa. Si la señal es una melodía, la variación en el tiempo
podría ser comparable con la duración de una o más notas.

Eco: Cuando la variación en el tiempo está entre 30 milisegundos y un segundo


aproximadamente, la segunda copia de la señal puede sonar como un eco de la
primera. Un eco puede reducir la inteligibilidad de la señal (especialmente
si es voz hablada), pero usualmente no combiará la “forma” general de las
melodías o frases.

Filtro: Cuando la variación en el tiempo está por debajo de los 30


milisegundos aproximadamente, las copias están demasiado cercanas unas de
otras en el tiempo para ser percibidas separadamente, y el efecto dominante
es que algunas frecuencias se destacan y otras son suprimidas. Esto cambia la
envolvente espectral del sonido.

Alteración de la calidad del salón: Si la segunda copia es ejecutada con


menos volumen que la primera, y especialmente si añadimos más copias
retrasadas con amplitudes reducidas, el resultado puede ser la imitación de
los ecos que aparecen en un salón o en otro espacio acústico.

El sonido de un arreglo dado de copias retrasadas de una señal puede combinar


dos o más de estos efectos.

Matemáticamente, el efecto de una variación del tiempo en una señal puede


describirse como un cambio de fase de cada una de las componentes sinusoidales
de la señal. El cambio de fase de cada componente es diferente dependiendo de su
frecuencia (así como de la extensión de la variación en el tiempo). En el resto
de este capítulo usualmente consideraremos superposiciones de sinusoides en
diferentes fases <ángulos>. Hasta aquí hemos descrito sinusoides reales en
nuestros análisis, pero en este y en los posteriores capítulos las fórmulas
serán más complicadas y necesitaremos herramientas matemáticas más complejas
para manejarlas. En la sección preliminar de este capítulo desarrollaremos los
conocimientos requeridos.

7.1 Números complejos

Los números complejos se escriben como:

Z = a + bi

donde a y b son números reales e i = √-1. (En este libro usaremos las letras
mayúsculas tales como Z para denotar los números complejos. Los números reales
aparecen en letras romanas o griegas en minúscula, excepto para fronteras de
enteros, usualmente escritas como M o N.) Debido a que los números tienen dos
componentes, usamos el plano cartesiano (en lugar de una línea de números) para
graficarlos, como se muestra en la figura 7.1. Las cantidades a y b son
denominadas parte real y parte imaginaria de Z, y se escriben:

a = re(Z)
b = im(Z)

Si Z es un número complejo, su magnitud (o valor absoluto), escrito como |Z|,


es precisamente la distancia en el plano desde el origen al punto (a,b):

|Z| = √(a2 + b2)

y su argumento, escrito /(Z), es el ángulo del eje positivo a al punto (a,b):

/(Z) = arctan(b/a)

Si conocemos la magnitud y el argumento de un número complejo (los llamaremos r


y µ) podemos reconstruir las partes real e imaginaria:

a = rcos(µ)
b = rsen(µ)

Un número complejo puede ser estar escrito en términos de sus partes real e
imaginaria a y b, como Z = a + bi, o alternativamente en la forma polar, en
términos de r y µ:

Z = r • [cos(µ) + isen(µ)]

Las formulaciones rectangular y polar son intercambiables; las ecuaciones arriba


muestran cómo computar a y b partiendo de r y µ y viceversa.

La razón principal para utilizar números complejos en la música electrónica es


debido a que ellos mágicamente automatizan los cálculos trigonométricos.
Frecuentemente debemos sumar ángulos para hablar de los cambios de fase de una
señal según el progreso del tiempo (o según varía en el tiempo, como en este
capítulo). Así, si usted multiplica dos números complejos, el argumento del
producto es la suma de los argumentos de los dos factores. Para ver cómo sucede
esto, multiplicaremos dos números Z1 y Z2 escritos en la forma polar:

Z1 = r1 • [cos(µ1) + isen(µ1)]
Z2 = r2 • [cos(µ2) + isen(µ2)]

dando:

Z1Z2 = r1r2 • [cos(µ1)cos(µ2) – sen(µ1)sen(µ2) + i(sen(µ1)cos(µ2) +


cos(µ1)sen(µ2))]

El signo menos delante del término sen(µ1)sen(µ2) viene de multiplicar i por sí


mismo, lo cual nos da -1. Podemos reconocer la fórmula de la suma de senos y
cosenos y simplificar:

Z1Z2 = r1r2 • [cos(µ1 + µ2) + isen(µ1 + µ2)]

Por inspección se sigue que el producto Z1Z2 tiene como magnitud r1r2 y como
argumento µ1 + µ2.
Podemos utilizar esta propiedad de los números complejos para adicionar y
sustraer ángulos (multiplicando y dividiendo los números complejos con los
argumentos apropiados) y tomar luego el seno y el coseno del resultado para
extraer las partes real e imaginaria.

7.2 Sinusoides complejas

Volviendo a la fórmula de la sinusoide (real) de la página “1”:

x[n] = acos(!n + Á)

Esta es una secuencia de cosenos de ángulos (llamados fases) que se incrementa


aritméticamente con la muestra número n. Todos los cosenos se ajustan al factor
a. Podemos re-escribir esto como la parte real de una secuencia de números
complejos mucho más fácil y sencilla de manipular, utilizando las propiedades de
sus argumentos y magnitudes.

Suponga que el número complejo Z tiene magnitud uno y argumento !, de tal


manera que puede escribirse como:

Z = cos(!) + isen(!)

Entonces para cualquier entero n, el número Zn debe tener magnitud uno también
(según la multiplicación de las magnitudes) y argumento n! (por la adición de
los argumentos). Así,

Zn = cos(n!) + isen(n!)

Esto también es cierto para valores negativos de n, por ejemplo,

1/Z = Z-1 = cos(!) - isen(!)

La figura 7.2 muestra gráficamente cómo las potencias de Z quedan envueltas en


un círculo unitario, que es el conjunto de todos los números complejos de
magnitud uno. Ellos forman una secuencia geométrica:

..., Z0,Z1,Z2,...

y tomando la parte real de cada término obtenemos una sinusoide real con fase
inicial cero y amplitud uno:

...,cos(0),cos(!),cos(2!),...

Aún más, suponga que multiplicamos los elementos de la secuencia por alguna
constante (compleja) A con magnitud a y argumento Á. Esto daría

...,A,AZ,AZ2,...

Las magnitudes son todas a y el argumento del enésimo término es !n + Á, de tal


manera que la secuencia es igual a:

AZn = a • [cos(n! + Á) + isen(n! + Á)]

y la parte real es precisamente la sinusoide real:

re(AZn) = a • cos(n! + Á)

El número complejo A contiene la amplitud real a y la fase inicial Á; el número


complejo Z de magnitud uno controla la frecuencia que es precisamente su
argumento !.
La figura 7.2 también muestra la secuencia A, AZ, AZ2,...; en efecto esta es la
misma secuencia, 1, Z1, Z2,..., pero amplificada y rotada de acuerdo con la
amplitud y la fase inicial. En una sinusoide compleja de esta forma A es
llamada la amplitud compleja.

Utilizar los números complejos para representar las amplitudes y las fases de
las sinusoides puede clarificar manipulaciones que de otro modo parecerían sin
motivo. Por ejemplo, suponga que queremos conocer la amplitud y la fase de la
suma de dos sinusoides con la misma frecuencia. En el lenguaje de este capítulo,
escribimos las sinusoides como:

X[n] = AZn, Y[n] = BZn

donde A y B contienen las fases y las amplitudes de las dos señales. La suma es
entonces igual a:

X[n] + Y[n] = (A + B)Zn

que es una sinusoide cuya amplitud es igual a |A + B| y cuya fase es igual a /


(A + B). Esto es claramente una manera mucho más fácil de manipular amplitudes
y fases que utilizando las propiedades de los senos y los cosenos.
Eventualmente, por supuesto, tomaremos la parte real de los resultados; lo que
se puede dejar usualmente para el final de lo que sea que estemos haciendo.

7.2 Variaciones en el tiempo y cambios de fase

Comenzando con cualquier señal X[n] (real o compleja), podemos fabricar otras
señales variando el tiempo de la señal X por un entero (positivo o negativo) d:

Y[n] = X[n - d]

de tal manera que la muestra d-ésima de Y es la muestra 0 de X y así


sucesivamente. Si el entero d es positivo, entonces Y es una copia retrasada de
X. Si d es negativo, entonces Y anticipa X; lo que puede realizarse para un
sonido grabado, pero no se puede practicar en operaciones en tiempo real.

La variación del tiempo es una operación lineal (considerada como una función de
la señal de entrada X); si usted varía el tiempo por una suma X1 + X2 obtiene el
mismo resultado que si variara el tiempo de manera separada y lo adicionara
posteriormente.

La variación del tiempo tiene además otra propiedad, si se varía el tiempo de


una sinusoide de frecuencia !, el resultado es otra sinusoide de la misma
frecuencia; la variación del tiempo nunca introduce frecuencias que no
estuvieran presentes en la señal de entrada antes de ser variada. Esta
propiedad, llamada invariancia del tiempo, hace fácil el análisis del efecto de
los cambios de las variaciones de tiempo -y las combinaciones lineales de esta-
considerando de manera separada lo que hacen las operaciones en las sinsoides
individuales.

Aún más, el efecto de una variación en el tiempo en una sinusoide es simple:


sólo cambia la fase. Si utilizamos una sinusoide compleja, el efecto sigue
siendo simple. Si por ejemplo

X[n] = AZn

entonces

Y[n] = X[n - d] = AZ(n-d) = Z-dAZn = Z-dX[n]


así la variación en el tiempo de una sinusoide compleja en d muestras es lo
mismo que escalarla por Z-d -es precisamente un cambio de amplitud por un número
complejo en particular). Ya que |Z| = 1 para una sinusoide, el cambio en la
amplitud no cambia la magnitud de la sinusoide, únicamente su fase.

El cambio de fase es igual a -d!, donde ! = /(Z) es la frecuencia angular de la


sinusoide. Esto es exactamente lo que deberíamos esperar ya que la sinusoide
avanza ! radianes por muestra y está desplazada (es decir, retrasada) en d
muestras.

7.3 Redes de retrasos

Si consideramos que nuestras muestras de audio digital corresponden a sucesivos


momentos en el tiempo, entonces variar el tiempo de la señal en d muestras
corresponde a un retraso de d/R unidades de tiempo, donde R es la velocidad de
las muestras. La figura 7.3 muestra un ejemplo de una red de retrasos lineal: un
ensamble de unidades de retraso, posiblemente con operaciones de escalado de
amplitud, combinada con el uso de la adición y la sustracción. La salida es una
función lineal de la entrada, en el sentido de que adicionar a la entrada es lo
mismo que procesar cada una separadamente y sumar los resultados. Es más, las
redes de retrasos lineales no crean nuevas frecuencias que no estuvieran
presentes en la entrada, en tanto la red permanece invariante en el tiempo, de
tal manera que las ganancias y los tiempos de retraso no cambian con el tiempo.

En general hay dos maneras de pensar las redes de retrasos. Podemos pensar en el
dominio del tiempo, en el cual dibujamos ondas como función del tiempo (o del
índice n), y consideramos los retrasos como cambios en el tiempo.
Alternativamente podemos pensar en el dominio de la frecuencia, en el cual
dosificamos la entrada con una sinusoide compleja (de tal manera que su salida
será una sinusoide de la misma frecuencia) y reportamos el cambio de amplitud o
de fase forjado por la red, como una función de la frecuencia.

Miraremos ahora la red de retrasos de la figura 7.3 en cada una de las dos
maneras.

La figura 7.4 muestra el comportamiento de la red en el dominio del tiempo.


Inventamos algún tipo de función de examen apropiada como entrada (es un pulso
rectangular de 8 muestras de ancho en este ejemplo) y graficamos la entrada y la
salida como funciones de la muestra n. Esta red de retrasos en particular
adiciona a la entrada una copia retrasada de esta misma.

Una función de examen utilizada con frecuencia es un impulso, que es un pulso de


sólo una muestra. La utilidad de esto es que, si conocemos la salida de la red
para un impulso, podemos encontrar la salida para cualquier otra señal de audio
digital -puesto que cualquier señal x[n] es una suma de impulsos, uno de altura
x[0], el siguiente una muestra después con altura x[1], y así sucesivamente.
Luego, cuando las redes se vuelvan más complicadas, nos moveremos utilizando
impulsos como señales de entrada para mostrar su comportamiento en el dominio
del tiempo.

De otro lado, podemos analizar la misma red en el dominio de la frecuencia


considerando una señal de examen (de valor complejo),

X[n] = Zn

donde Z tiene una unidad de magnitud y argumento !. Ya sabemos que la salida es


otra sinusoide compleja con la misma frecuencia, esto es,

HZN <la N en el exponente debería ser minúscula>


para algún número complejo H (el cual queremos encontrar). De esta manera
escribimos la salida directamente como la suma de la entrada y de su copia
retrasada:

Zn + Z-dZn = (1 + Z-d)Zn

y encontramos por inspección que:

H = (1 + Z-d)

Podemos entender el comportamiento en el dominio de la frecuencia de esta red de


retrasos estudiando cómo el número complejo H varía como una función de la
frecuencia angular !. Estamos especialmente interesados en su argumento y
magnitud -los cuales nos dan la fase relativa y la amplitud de la sinusoide que
viene saliendo. Trabajaremos este ejemplo en detalle para mostrar cómo la
aritmética de los números complejos puede predecir lo que sucede cuando las
sinusoides se combinan aditivamente.

La figura 7.5 muestra el resultado, en el plano complejo, cuando las cantidades


1 y Z-d se combinan aditivamente. Para adicionar los números complejos sumamos
sus partes real e imaginaria separadamente. Así, el número complejo 1 (parte
real 1, parte imaginaria 0) se adiciona de manera coordinada al número complejo
Z-d (parte real cos(-d!), parte imaginaria sen(-d!)). Esto se muestra
gráficamente haciendo un paralelogramo, con esquinas en el origen y en los dos
puntos que van a ser sumados, y cuya cuarta esquina es la suma H.

Como se muestra en la figura, el resultado puede ser entendido al hacer simetría


alrededor del eje real: en lugar de 1 y Z-d, es más fácil sumar las cantidades
Zd/2 y Z-d/2 debido a que son simétricas con respecto al eje real (horizontal).
(Estrictamente hablando, no tenemos definidas apropiadamente las cantidades Zd/2
y Z-d/2, estamos utilizando esas expresiones para denotar números complejos
unitarios cuyos argumentos son los de Zd y Z-d, de tal manera que al elevarlos
al cuadrado nos da Zd y Z-d.) Re-escribimos la ganancia como:

H = Z-d/2(Zd/2 + Z-d/2)

El primer término es un cambio de fase de -d!/2. El segundo término se entiende


mejor en la forma rectangular:

Zd/2 + Z-d/2
= (cos(!d/2) + isen(!d/2)) + (cos(!d/2) – isen(!d/2))
= 2cos(!d/2)

Esta cantidad real puede ser positiva o negativa; su valor absoluto da la


magnitud de la salida:

|H| = 2|cos(!d/2)|

La cantidad |H| es llamada la ganancia de la red de retrasos a la frecuencia


angular !, y está graficada en la figura 7.6. La ganancia con respecto a la
frecuencia de una red de retrasos (esto es, la ganancia en función de la
frecuencia) es llamada la respuesta a la frecuencia de la red.

Ya que la red tiene mayores ganancias en unas frecuencias que en otras, puede
ser considerada como un filtro que puede ser utilizado para separar ciertos
componentes de los demás, en un sonido. Debido a la forma de esta expresión
particular de la ganancia como una función de !, este tipo de red de retrasos
es llamado filtro peine (sin recirculación).

La salida de la red es una suma de dos sinusoides de amplitud igual, y cuyas


fases difieren en !d. La respuesta a la frecuencia que resulta está en acuerdo
con el sentido común: si la frecuencia angular ! se ajusta de tal manera que un
número entero de períodos se fije en d muestras, es decir, si ! es un múltiplo
de 2¼/d, <2¼ es un período en radianes y si d es el número de muestras que toma
un período, 2¼/d equivale a uno> la salida del retraso es exactamente igual a
la de la señal original, y de esta manera las dos se combinan para hacer una
salida con dos veces la amplitud original. De otro lado, si por ejemplo tomamos
! = ¼/d de tal manera que el retraso es la mitad del período, entonces la
salida del retraso está fuera de fase y cancela la entrada de manera exacta.

Esta red de retrasos en particular tiene una interesante aplicación: si tenemos


una señal de entrada periódica (o casi periódica), cuya frecuencia fundamental
es de ! radianes por muestra, podemos ajustar el filtro peine de tal manera que
los picos en la ganancia estén alineados con los armónicos pares y los impares
caigan donde la ganancia es cero. Para hacer esto escogemos d = ¼/!, es decir,
ajustamos el tiempo de retraso a exactamente la mitad del período de la señal de
entrada. De esta manera obtenemos una nueva señal cuyos armónicos son 2!, 4!,
6!,..., y de esta manera tiene una nueva frecuencia fundamental que es dos
veces la frecuencia original. Excepto por un factor de dos, las amplitudes de
los armónicos que quedan siguen todos la envolvente espectral del sonido
original. Tenemos ahora una herramienta para elevar a una octava un sonido que
entra, sin cambiar la envolvente espectral. Este multiplicador de octava es lo
inverso al divisor de octava presentado en el capítulo 5.

Los dominios del tiempo y de la frecuencia ofrecen formas complementarias de


mirar la misma red de retrasos. Cuando los retrasos en la red son más pequeños
que la habilidad de del oído para distinguir eventos en el tiempo
-aproximadamente 20 milisegundos- la situación de dominio en el tiempo se vuelve
menos relevante para entender la red de retrasos, y nos volcamos principalmente
hacia el dominio en la frecuencia. De otro lado, cuando los retrasos son más
grandes que aproximadamente 50 milisegundos, los picos y los valles en los
dibujos que muestran ganacia vs frecuencia (tales como el de la figura 7.6) se
apiñan de manera tan estrecha, que el dominio en la frecuencia se vuelve menos
importante. Ambos son sin embargo, válidos en el rango completo de los posibles
tiempos de retrasos.

7.4 Redes de retrasos con recirculación

A veces es deseable conectar las salidas de uno o más retrasos de una red de
nuevo a sus mismas o a otras entradas. En lugar de obtener uno o algunos pocos
ecos del sonido original como en el ejemplo anterior, podemos potencialmente
obtener un número infinito de ecos, cada uno retroalimentándose dentro de la red
para engendrar aún más.

El ejemplo más simple de una red con recirculación es el filtro peine con
recirculación cuyo diagrama se muestra en la figura 7.7. Al igual que en el
anterior, el filtro peine simple, la señal de entrada es enviada a la línea de
retraso con una longitud de d muestras. Pero ahora la salida de la línea de
retrasos también retroalimenta su entrada; la entrada de los retrasos es la suma
de la salida original más la salida retrasada. La salida es multiplicada por un
número g antes de regresar a alimentar la entrada.

El comportamiento en el dominio del tiempo del filtro peine con recirculación se


muestra en la figura 7.8. Aquí consideramos el efecto de enviar un impulso a la
red. Obtenemos de nuevo el impulso original, más una serie de ecos, cada uno en
turno a d muestras después del previo, y multiplicados cada vez por la ganancia
g. En general, una salida de una red de retrasos dado un impulso como su
entrada es llamada la respuesta al impulso de la red.

Note que hemos escogido una ganancia g que es menor que uno en valor absoluto.
Si escogemos una ganancia mayor que uno (o menor que -1), cada eco tendrá una
magnitud mayor que la previa. En lugar de caer exponencialmente como lo hacen en
la figura, <los ecos> crecerán exponencialmente. Una red con recirculación cuya
salida eventualmente cae a cero luego de que su entrada ha finalizado es llamada
estable; una red cuya salida crece sin límites es denominada inestable.

Podemos analizar también el filtro peine con recirculación en el dominio de la


frecuencia. La situación ahora es más difícil de analizar utilizando sinusides
reales, y así tenemos la primera gran recompensa al haber introducido los
números complejos, los cuales simplifican mucho el análisis.

Si como antes, alimentamos la entrada con la señal,

X[n] = Zn

con |Z| = 1, podemos escribir la salida como

Y[n] = (1 + gZ-d + g2Z-2d + ...)X[n]

Aquí los términos en la suma vienen de la serie de ecos discretos. Se sigue que
la amplitud de la salida es:

H = 1 + gZ-d + (gZ-d)2 +...

Esta es una serie geométrica; podemos sumarla utilizando la técnica normalizada.


Primero multiplicamos a ambos lados por gZ-d para obtener:

gZ-dH = gZ-d + (gZ-d)2 + (gZ-d)3 + ...

y al sustraer la ecuación original da:

H - gZ-dH = 1

Se resuelve entonces para H:

H = 1/(1 - gZ-d)

Un método más rápido (pero ligeramente menos intuitivo) para obtener el mismo
resultado es examinar la red recirculante misma para obtener una ecuación para
H, como sigue. Llamemos una entrada X[n] y la salida Y[n]. La señal que entra a
la línea de retraso es Y[n], y al pasar esta a través de la línea de retrasos y
multiplicar da

Y[n] • gZ-d

Esto, más la entrada es justamente la señal de salida de nuevo, así:

Y[n] = X[n] + Y[n] • gZ-d

y dividiendo por X[n] y utilizando H = Y[n]/X[n] da:

H = 1 + HgZ-d

Esta es equivalente a la anterior ecuación para H.

Nos gustaría hacer ahora una gráfica de respuesta a la frecuencia (la ganancia
como función de la frecuencia) tal como se hizo para los filtros peine sin
recirculación en la figura 7.6. Esto requiere hacer de nuevo un dibujo en el
plano complejo. Podríamos estimar la magnitud de H igual a:

|H| = 1/|1 - gZ-d|


donde utilizamos la propiedad multiplicativa de las magnitudes para concluír que
la magnitud de un recíproco (complejo) es el recíproco de una magnitud (real).
La figura 7.9 muestra la situación gráficamente. La ganancia |H| es el
recíproco de la longitud del segmento que va del punto 1 al punto gZ-d. La
figura 7.10 muestra una gráfica de la respuesta a la frecuencia |H| como una
función de la frecuencia angular ! = /(Z).

La figura 7.9 se puede usar para analizar cómo debería comportarse


cualitativamente la respuesta a la frecuencia |H(!)| como una función de g. La
altura y el ancho de banda de los picos dependen ambos de g. El valor máximo
que puede tener |H| es cuando

Z-d = 1

Esto ocurre en las frecuencias ! = 0, 2¼/d, 4¼/d,... tal como sucede en el


filtro peine anterior. En estas frecuencias la ganancia llega a

|H| = 1/(1 - g)

El siguiente asunto importante es el ancho de banda de los picos en la respuesta


a la frecuencia. Nos gustaría encontrar sinusoides Wn, con frecuencia /(W), que
logren un valor de |H| de 3 decibeles aproximadamente por debajo del valor
máximo. Para hacer esto, retornamos a la figura 7.9 y tratamos de ubicar W de
tal manera que la distancia del punto 1 al punto gW-d sea aproximadamente √2
veces la distancia de 1 a g (ya que √2:1 es una razón de aproximadamente 3
decibeles).

Hacemos esto arreglando la parte imaginaria de gW-d de tal manera que sea casi 1
- g o su negativo, haciendo casi un triángulo isósceles rectángulo entre los
puntos 1, 1 - g, y gW-d. (Estamos suponiendo que g es casi 2/3, de otra manera
esta aproximación no es muy buena). La hipotenusa de un triángulo rectángulo
isósceles es siempre √2 veces el lado, y así la ganancia cae por ese factor
comparado con su máximo.

Ahora otra aproximación: hacemos que la parte imaginaria de gW-d sea


aproximadamente el ángulo en radianes cortando desde el eje real:

±(1 - g) ≈ im(gW-d) ≈ /(W-d)

Así la región de cada pico que abarca los 3 decibeles desde el valor máximo es
aproximadamente

(1 - g)/d

(en radianes) a cualquiera de los lados del pico. El ancho de banda se estrecha
(y los picos del filtro se vuelven más agudos) en tanto g se aproxima a su
máximo valor de 1.

Al igual que con el filtro peine sin recirculación de la sección 7.3, los
dientes del peine están más cercanos para valores más grandes del retraso d. De
otro lado un retraso de d = 1 (el más corto posible) da únicamente un diente (a
frecuencia cero) por debajo de la frecuencia de Nyquist ¼ (el diente siguiente,
a 2¼, corresponde de nuevo a la frecuencia de cero por el sobre-doblado). Así
el filtro peine con recirculación y con d = 1 es precisamente un filtro pasa-
bajos. Las redes de retrasos con retrasos de una muestra serán la base para el
diseño de muchos otros tipos de filtros digitales en el capítulo 8.

7.5 Conservación de la potencia y redes de retrasos complejas


Las mismas técnicas trabajarán para analizar cualquier red de retrasos, aunque
para redes más complicadas es más difícil caracterizar los resultados, o diseñar
la red para tener las propiedades específicamente deseadas. Otro punto de vista
puede a veces ser útil para esta situación, particularmente cuando se requiere
de respuesta a la frecuencia plana, ya sea por sí misma o para asegurar que una
red con recirculación compleja permanece estable a ganancias de
retroalimentación cercanas a uno.

El hecho central que usaremos es que si cualquier red de retrasos, con una o más
entradas y salidas, está construída de tal manera que su potencia de salida
(promediada en el tiempo) siempre es igual a su potencia de entrada, esa red
debe tener una respuesta plana a la frecuencia. Esto es casi una tautología; si
usted pone una sinusoide a cualquier frecuencia en una de las entradas, obtendrá
sinusoides de la misma frecuencia a la salida, y la suma de la potencia en todas
las salidas será igual a la potencia de la entrada, de tal manera que la
ganancia, definida apropiadamente, es exactamente uno.

Para trabajar con redes de retrasos que conservan la potencia requeriremos una
definición explícita de “potencia promedio total”. Si hay únicamente una señal
(llamémosla x[n]), la potencia promedio está dada por:

P(x[n]) = [|x[0]|2 + |x[1]|2 +...+ |x[N - 1]|2]/N

donde N es un número suficientemente grande como para que las fluctuaciones en


la amplitud sean despreciables. Esta situación trabaja bien tanto para señales
complejas como para las reales. La potencia promedio total para algunas señales
de audio digital es precisamente la suma de las potencias individuales de las
señales:

P(x1[n],...,xr[n]) = P(x1[n]) +...+ P(xr[n])

donde r es el número de señales que se combinan.

Igualmente un amplio rango de redes de retrasos interesantes tienen la propiedad


de que la potencia total de la salida iguala la potencia total de la entrada;
son llamadas unitarias.

Para comenzar con estas, ponemos cualquier número de retrasos en paralelo, como
se muestra en la figura 7.11. Cualquiera que sea la potencia total de las
entradas, la potencia total de las salidas ha de ser igual a esta.

Una segunda familia de transformaciones con conservación de la potencia está


compuesta de rotaciones y reflexiones de las señales x1[n],...,xr[n],
considerándolas, en cada punto n fijo del tiempo, como las coordenadas r de un
punto en un espacio r-dimensional. La rotación o reflexión deben ser uno, lo
que deja el origen (0,...,0) fijo.

Para cada número de muestra n, la contribución total a la potencia promedio es


proporcional a

|x1|2 +...+ |xr|2

Esta es precisamente la distancia pitagórica desde el origen al punto


(x1,...,xr). Debido a que las rotaciones y las reflexiones son transformaciones
que preservan la distancia, la distancia desde el origen antes de hacer la
transformación debe ser igual a esa distancia después de hacerla. Es así como la
potencia total de un conjunto de señales debe ser preservada por rotación.

La figura 7.12 muestra una matriz de rotación operando en dos señales. En la


parte (a) la transformación se muestra de manera explícita. Si las señales de
entrada son x1[n] y x2[n] las salidas son:

y1[n] = cx1[n] - sx2[n]


y2[n] = sx1[n] + cx2[n]

donde c y s están dados por

c = cos(µ)
s = sen(µ)

para un ángulo de rotación µ. Considerados como puntos en el plano cartesiano,


el punto (y1,y2) es precisamente el punto (x1,x2) rotado en el sentido contrario
a las agujas del reloj, en un ángulo µ. Los dos puntos están así a la misma
distancia del origen:

|y1|2 + |y2|2 = |x1|2 + |x2|2

y así las dos señales a la salida tienen la misma potencia de las dos señales a
la entrada.

Para una descripción alternativa de la rotación en dos dimensiones, considere


los números complejos X = x1 + x2i y Y = y1 + y2i. La transformación anterior
permite obtener

Y = XZ

donde Z es un número complejo con magnitud uno y argumento µ. Ya que |Z| = 1,


se sigue que |X| = |Y|.

Si ejecutamos una rotación sobre un par de señales y luego invertimos una de


ellas (pero no la otra), el resultado es una reflexión. Esta también preserva la
potencia total de la señal, ya que podemos invertir cualquiera o el conjunto
total de las señales sin cambiar la potencia total. En dos dimensiones, una
reflexión aparece como una transformación de la forma

y1[n] = cx1[n] + sx2[n]


y2[n] = sx1[n] - cx2[n]

Una matriz de rotación útil y especial se obtiene haciendo µ = ¼/4, de tal


manera que s = c = √1/2. Esto nos permite simplificar el cómputo como se
muestra en la figura 7.13 (parte a) debido a que cada señal necesita únicamente
ser multiplicada por la cantidad única s = c.

Las rotaciones o reflexiones más complicadas con más de dos señales de entrada
pueden fabricarse al repetir la rotación y/o la reflexión de ellas por pares.
Por ejemplo, en la figura 7.13 (parte b), cuatro señales están combinadas en
pares, en dos etapas sucesivas, de tal manera que al final cada señal de entrada
va a alimentar todas las salidas. Podemos hacer lo mismo con ocho señales
(usando tres etapas) y así sucesivamente. Es más, si utilizamos el ángulo
especial ¼/4, todas las señales de entrada contribuyen de manera pareja en cada
una de las salidas.

Cualquier combinación de retrasos y matrices de rotación, aplicada en sucesión a


un conjunto de señales de audio, resultará en una respuesta a la frecuencia
plana, ya que cada operación individual lo hace. Esto ya nos permite generar una
infinidad de redes de retrasos, pero a la larga, ninguna de ellas con
recirculación. Una tercera operación, mostrada en la figura 7.14, nos permite
hacer redes con recirculación que aún gozan de respuestas a la frecuencia
planas.
La parte (a) de la figura muestra la organización general. Se asume que la
transformación R es cualquier combinación de retrasos y matrices de mezcla que
preservan la potencia total. Las señales x1,...,xk entran a la red de retrasos
unitaria, y las señales y1,...,yk, emergen. Algunas otras señales w1,...,wj
(donde j no es necesariamente igual a k) aparecen a la salida de la
transformación R y son regresadas a su entrada.

Si R está en efecto preservando la potencia, la potencia total de la entrada


(la potencia de las señales x1,...,xk más w1,...,wj deben igualar la potencia de
salida (la potencia de las señales y1,...,yk más w1,...,wj), y sustrayendo todas
las w de la igualdad encontramos que las potencias totales de salida y entrada
son iguales.

Si hacemos j = k = 1 de tal manera que hay una sola de cada x, y y w, y siendo


la transformación R una rotación en un ángulo µ seguido por un retraso de d
muestras a la salida W, el resultado es el bien conocido filtro pasa-todo. Con
algunos malabares, y haciendo c = cos(µ), podemos mostrar que es equivalente a
la red mostrada en la parte (b) de la figura. Los filtros pasa-todo tienen
muchas aplicaciones, algunas de las cuales visitaremos más tarde en este libro.

7.6 Reverberación artificial

La reverberación es ampliamente utilizada para mejorar el sonido de las


grabaciones, pero tiene un rango amplio de otras aplicaciones musicales [DJ85,
págs.289-340]. La reverberación en espacios reales, naturales aparece por un
complicado patrón de reflexiones sonoras y los otros objetos que definen el
espacio. Es una gran sobresimplificación imitar este proceso utilizando redes de
retrasos discretas con recirculación. Sin embargo el modelado de la
reverberación utilizando líneas de retrasos con recirculación, puede, con mucho
trabajo, lograr buenos resultados.

La idea central es idealizar cualquier salón (u otro espacio reverberante) como


una colección de líneas de retrasos paralelos que modelan la memoria del aire
dentro del salón. En cada punto de las paredes del salón terminan muchos
recorridos rectilíneos, cada uno llevando sonido a ese punto; el sonido entonces
se refleja en muchos otros recorridos, cada uno originado en ese punto, y
dirigiéndose eventualmente a algún otro punto en una pared.

Aunque la pared (y el aire por el que se pasa para llegar a la pared) absorbe
algo del sonido, alguna porción de la potencia incidente es reflejada y lo hace
hacia otra pared. Si la mayoría de la energía recircula, el salón reverbera por
un tiempo largo. Si en alguna frecuencia la pared refleja más energía en general
que la que recibe, el sonido se retroalimentará inestablemente; esto nunca
sucede en salones reales (la conservación de la energía previene esto), pero
puede suceder en un reverberador artificial si no está diseñado de manera
correcta.

Para fabricar un reverberador artificial utilizando una red de retrasos, debemos


llenar dos requisitos que compiten simultáneamente. Primero, las líneas de
retrasos deben ser suficientemente largas para prevenir la coloración en la
salida como un resultado del filtro peine. (Incluso si nos movemos más allá del
filtro peine simple de la sección 7.4, la respuesta a la frecuencia tenderá a
tener picos y valles cuyo espacio varía inversamente con el tiempo de retraso
total.) De otro lado, no deberíamos escuchar ecos individuales; la densidad del
eco debería ser idealmente de hasta mil por segundo.

Con estos objetivos en mente, ensamblamos algún número de líneas de retrasos y


conectamos sus salidas a sus entradas. El camino de la retroalimentación -la
conexión desde la salida hacia la entrada de los retrasos- debe tener una
ganancia agregada que varía poco a poco como una función de la frecuencia, y
nunca excede a uno para cualquier frecuencia. Un buen punto de partida es dar al
camino de retroalimentación una respuesta a la frecuencia plana y una ganancia
ligeramente menor que uno; esto se hace utilizando matrices de rotación.

Idealmente esto es todo lo que necesitaríamos hacer, pero en la realidad no


siempre queremos utilizar miles de líneas de retrasos que serían el modelo para
los trayectos entre todos los posibles pares de puntos en las paredes. En la
práctica usamos entre cuatro y dieciséis líneas de retrasos para hacer el modelo
del salón. Esta simplificación a veces reduce la densidad del eco por debajo de
lo que podríamos desear, de tal manera que deberíamos utilizar más líneas de
retrasos a la entrada de la red con recirculación para incrementar la densidad.

La figura 7.15 muestra el diseño de un reverberador simple que utiliza este


principio. El sonido que entra, que se muestra como dos señales separadas en
este ejemplo, es primero engrosado retrasando progresivamente una de las dos
señales y luego entremezclándolas usando una matriz de rotación. En cada etapa
el número de ecos de la señal original es doblado; típicamente deberíamos usar
entre 6 y 8 etapas para hacer entre 64 y 256 ecos, todo con un retraso total de
entre 30 y 80 milisegundos. La figura muestra tres de estas etapas.

A continuación viene la parte de recirculación del reverberador. Luego del


engrosamiento inicial, la señal de entrada es llevada a un banco de líneas de
retrasos paralelas, y sus salidas son mezcladas de nuevo utilizando una matriz
de rotación. Las salidas mezcladas son atenuadas por una ganancia g ≤ 1, y
regresadas de vuelta a las líneas de retrasos para hacer una red con
recirculación.

El valor g controla el tiempo de reverberación. Si la longitud promedio de las


líneas de retraso con recirculación es d, entonces cualquier sonido entrante es
atenuado por un factor de g después de un tiempo de retraso de d. Después de un
tiempo t la señal ha recirculado t/d veces, perdiendo 20log10(g) decibeles en
cada ronda, de tal manera que la ganancia total, en decibeles, es:

20(t/d)log10(g)

La medida usual de tiempo de reverberación (RT) es el tiempo en el cual la


ganancia cae en seis decibeles:

20(RT/d)log10(g) = -60

RT = -3d/(log10(g))

Si g es uno, esta fórmula da ∞, ya que el logaritmo de uno es cero.


El esquema mostrado arriba es la base para muchos diseños de reverberadores
modernos. Se han propuesto muchas extensiones de este diseño fundamental. El
paso más importante a continuación sería introducir filtros en el camino de la
recirculación de tal manera que las frecuencias altas puedan hacerse decaer más
rápidamente que las graves; esto se logra fácilmente con un filtro pasa-bajos
muy sencillo, pero no trabajaremos esto aquí, sin haber desarrollado aún la
teoría de filtros requerida.

En general, usar este esquema para diseñar un reverberador requiere elaborar


muchas opciones complicadas de tiempos de retraso, ganancias y coeficientes de
filtros. Montañas de literatura han sido publicadas sobre este tópico; Barry
Blesser ha publicado un buen resumen [Ble01]. Se sabe que hay mucho más acerca
del diseño y la puesta a punto del reverberador que no ha sido publicado; los
diseños concretos se mantienen en secreto por razones comerciales. En general,
los procesos de diseño implican una puesta a punto esmerada y lenta, por ensayo,
error y escucha crítica.

7.6.1 El control de reverberadores


La reverberación artificial es utilizada casi universalmente en grabación o
reforzamiento sonoro para endulzar el sonido en general. Sin embargo, y de
manera más interesante, la reverberación puede utilizarse como una fuente sonido
propiamente dicha. El caso especial de la reverberación infinita es útil para
coger sonidos en vivo y extenderlos en el tiempo.

Para hacer este trabajo en la práctica es necesario abrir la entrada del


reverberador únicamente por un período corto de tiempo, durante el cual el
sonido que entra no varía con demasiada rapidez. Si una de las entradas del
reverberador infinito se deja abierta por demasiado tiempo, el sonido se junta y
rápidamente se vuelve una masa indescifrable. Para “reverberar infinitamente”
una nota de un instrumento en vivo, es mejor esperar hasta después de la porción
del ataque de la nota y luego permitir que 1/2 segundo de la nota estable entre
al reverberador. Es posible construir acordes con un instrumento monofónico
abriendo repetidamente la entrada en diferentes momentos de la nota estable.

La figura 7.16 muestra cómo puede hacerse esto en la práctica. Los dos controles
más importantes son la entrada del reverberador y la ganancia de la
retroalimentación. Para capturar un sonido ajustamos la ganancia de la
retroalimentación a uno (tiempo de reverberación infinito) y abrimos
momentáneamente la entrada en el tiempo t1. Para adicionar un sonido a otro que
ya se tiene, simplemente reabrimos la ganancia de entrada en el momento
apropiado (en el tiempo t2 de la figura, por ejemplo). Finalmente podemos borrar
el sonido que recircula, y de esta manera ambos sonidos se atenuan a la salida y
se limpia el reverberador, ajustando la ganancia de retroalimentación a valores
de menos de uno (como en el tiempo t3). Mientras más reduzcamos la ganancia de
retroalimentación, más rápidamente decaerá la salida.

7.7 Cambios variables y fraccionales

Al igual que con cualquier técnica de síntesis o procesamiento de audio, las


redes de retrasos se vuelven mucho más poderosas e interesantes si sus
características pueden hacerse cambiar en el tiempo. Los parámetros de ganancia
(tales como g en el filtro peine con recirculación) pueden ser controlados por
generadores de envolvente, variándolos para evitar clicks y otros artefactos.
Los tiempos de retraso (tales como d anteriormente) no son fáciles de variar
con suavidad por dos razones.

La primera, es que tenemos definidos cambios de tiempo únicamente para valores


enteros de d, ya que para valores fraccionales de d una expresión tal como x[n
- d] no está determinada si x[n] está definida sólo para valores enteros de n.
Para hacer retrasos fraccionales debemos introducir algún esquema de
interpolación apropiado. Y si queremos variar d con suavidad en el tiempo, no
nos dará buenos resultados simplemente el brincar de un entero al siguiente.

La segunda es que incluso una vez hemos alcanzado suavizar perfectamente los
cambios de los tiempos de retraso, los artefactos causados por la variación en
los tiempos de retraso se vuelven más notorios aún con muy pequeñas velocidades
relativas de cambio; mientras en la mayoría de los casos usted puede hacer rampa
con cualquier control de amplitud entre cualesquiera dos valores en 30
milisegundos sin problemas, cambiar un retraso en sólo una muestra de cada cien
produce un cambio muy notable en la altura del sonido -de hecho, uno variará con
frecuencia un retraso deliberadamente con el fin de escuchar los artefactos,
únicamente pasando incidentalmente de un valor específico de tiempo de retraso a
otro.

El primer asunto (los retrasos fraccionales) puede ser tratado usando un esquema
de interpolación, exactamente en la misma forma que para la lectura de tablas
(sección 2.5). Por ejemplo, suponga que queremos un retraso de 1.5 muestras. Por
cada n debemos estimar un valor para x[n – 1.5]. Podríamos hacer esto
utilizando la interpolación normalizada de cuatro puntos, poniendo un polinomio
cúbico a través de los cuatro puntos “conocidos” (0,x[n]), (1,x[n-1]), (2,x[n-
2]), (3,x[n-3]), y luego evaluar el polinomio en el punto 1.5. Hacer esto
repetidamente para cada valor de n nos da la señal retrasada.

Este esquema de interpolación de cuatro puntos puede ser utilizado para


cualquier retraso de hasta una muestra. Los retrasos de menos de una muestra no
puden ser calculados de esta manera debido a que necesitamos dos puntos de
entrada por lo menos tan recientes como el retraso deseado. Ellos estaban
disponibles en el ejemplo anterior, pero para un tiempo de retraso de 0.5
muestras, por ejemplo, necesitaríamos el valor de x[n + 1], el cual está en el
futuro.

La seguridad del estimado podría ser mejorada más adelante usando esquemas de
interpolación de orden más alto. Sin embargo aquí hay un compromiso entre la
calidad y la eficiencia en computación. Es más, si nos movemos a esquemas de
interpolación de grados más altos, el retraso mínimo se incrementará, causando
problemas en algunas situaciones.

El segundo asunto para considerar son los artefactos -sea que los busquemos o
no- que aparecen al cambiar las líneas de retrasos. En general, un cambio
discontinuo en el tiempo de retraso dará lugar a un cambio discontinuo en la
señal de salida, ya que esta se interrumpe en efecto, en un punto, y se hace
saltar a otro. Si la entrada es una sinusoide, el resultado es un cambio
discontinuo en la fase.

Si se desea cambiar la línea de retraso ocasionalmente entre tiempos de retraso


fijos (por ejemplo al comienzo de las notas musicales), entonces podemos
utilizar las técnicas de manejo de discontinuidades esporádicas que se presentó
en la sección 4.3. En efecto estas técnicas trabajarán enmudeciendo la salida de
una u otra manera. De otro lado, si se desea cambiar el tiempo de retraso
continuamente, -mientras estamos escuchando la salida- entonces debemos tener en
cuenta los artefactos que resultan de los cambios.

La figura 7.17 muestra la relación entre los tiempos de entrada y de salida en


una línea de retraso variable. Se asume que la línea de retraso tiene una
longitud máxima fija D. Por cada muestra de la salida (correspondiente a un
punto en el eje horizontal) hay una muestra de la entrada de la línea de
retrasos (posiblemente interpolada). En el eje vertical se ve cuál muestra
(entera o fraccional) utilizar desde la señal de entrada. Siendo n el número de
la muestra a la salida, el eje vertical muestra la cantidad n - d[n], donde
d[n] es el retraso (que varía en el tiempo) dado en número de muestras. Si
denotamos la localización de la muestra de entrada por:

y[n] = n - d[n]

entonces la salida de la línea de retrasos es

z[n] = x[y[n]]

donde la señal x está evaluada en el punto y[n], interpolando apropiadamente en


caso de que y[n] no sea un entero. Esta es exactamente la fórmula para la
lectura de tablas (página “27”). Podemos utilizar todas las propiedades de la
lectura de tablas de sonidos grabados para predecir el comportamiento de líneas
de retraso variables.

Queda una diferencia entre las líneas de retrasos y las tablas de onda: el
material en las líneas de retrasos está cambiando constantemente. No sólo no
podemos leer el futuro, si no que, si la línea de retraso tiene D muestras de
longitud, tampoco podemos leer más de D muestras del pasado:
0 < d[n] < D

o haciendo negativo esto y adicionando n a cada lado:

n > y[n] > n - D

Esta última relación denota la región entre las dos líneas diagonales en la
figura 7.17; la función y[n] debe quedar dentro de esta tira.

Regresando a la sección 2.2 podemos usar las Fórmulas de Transposición


Momentánea para tablas de onda con el fin de calcular la transposición t[n] de
la salida. Esto nos da la Formula de Transposición Momentánea para las líneas de
retrasos:

t[n] = y[n] - y[n - 1] = 1 - (d[n] – d[n - 1])

Si d[n] no cambia con n, el factor de transposición es 1 y el sonido emerge de


la línea de retrasos con la misma velocidad con la que entró. Pero si el tiempo
de retraso se incrementa como una función de n, el sonido resultante es
transpuesto descendentemente, y si d[n] decrece, se transpone ascendentemente.

Esto es llamado el efecto Doppler y ocurre en la Naturaleza también. El aire por


el que viaja el sonido puede a veces ser pensado como una línea de retrasos. Un
cambio en la línea de retrasos corresponde a mover un escucha acercándolo o
alejándolo de una fuente de sonido estacionaria; el efecto Doppler por el cambio
en la longitud de la trayectoria trabaja precisamente de la misma manera en la
línea de retrasos, como si estuviera en el aire físico.

Regresando a la figura 7.17, podemos predecir que no hay aquí cambio al


comienzo, pero cuando la pendiente de la trayectoria decrece la afinación caerá
durante un intervalo de tiempo antes de regresar a la afinación original (cuando
la pendiente regresa a uno). El tiempo de retraso puede ser manipulado para dar
cualquier transposición deseada, pero mientras más grande es la transposición,
menos tiempo es posible mantenerla dentro de la franja, antes de que se salga
por arriba o por abajo de esta región diagonal.

7.8 Fidelidad de la interpolación de las líneas de retrasos

Dado que en efecto hacen lectura de tablas de onda, las líneas de retrasos
variables introducen distorsión en las señales sobre las cuales operan. Aún más,
un sutil problema puede aparecer incluso cuando la línea de retraso no está
cambiando en longitud: la repuesta a la frecuencia, en situaciones reales, nunca
es perfectamente plana en líneas de retrasos cuya longitud no es un entero.

Si el tiempo de retraso está cambiando de muestra a muestra, aplica la


distorsión que resulta de la sección 2.5. Para usarla, suponemos que la entrada
de la línea de retraso puede ser descompuesta en sinusoides y considerar de
manera separada lo que sucede con cada sinusoide individualmente. Podemos
utilizar la tabla 2.1 (página “46”) para predecir el nivel RMS de la distorsión
de los productos combinados para una línea de retraso variable interpolada.

Asumiremos aquí que queremos usar la interpolación de cuatro puntos. Para las
sinusoides con períodos mayores a 32 muestras (esto es, para frecuencias por
debajo de 1/16 de la frecuencia de Nyquist) la distorsión es de 96 decibeles, o
mejor -poco probable de que sea notada. A una velocidad de muestras de 44.1 kHz,
estos períodos deberán corresponder a frecuencias de hasta 1400 Hertz. A
frecuencias más altas la calidad se degrada y por encima de 1/4 de la frecuencia
de Nyquist, los productos de la distorsión, que están únicamente casi a 50 dB,
serán audibles probablemente.

La situación para un sonido complejo depende primariamente de las amplitudes y


de las frecuencias de sus parciales más altos. Suponga, por ejemplo que unos
parciales del sonido por encima de 5000 Hertz son hasta 20 dB más bajos que su
parcial más fuerte y que por encima de 10000 Hertz están 60 dB abajo de éste.
Entonces, como un estimado aproximado, los productos distorsionados del rango
5000 – 10000 estará cada uno limitado a aproximadamente -68 dB y aquellos por
encima de los 1000 estarán limitados en aproximadamente -75 dB (debido a que la
peor situación en la tabla es de aproximadamente -15 dB y debe ser sumada a la
fortaleza del parcial en cuestión.)

Si el contenido de la alta frecuencia de la señal de entrada da productos de


distorsión inaceptable a la salida, es más efectivo en general incrementar la
velocidad de las muestras que el número de puntos de interpolación. Para
períodos mayores a 4 muestras, si se dobla el período (doblando la velocidad de
las muestras, por ejemplo) la distorsión decrece en cerca de 24 dB.

La respuesta a la frecuencia de las líneas de retrasos con interpolación de


cuatro puntos es aproximadamente plana hasta la mitad de la frecuencia de
Nyquist, pero después se zambulle rápidamente. Suponga (para tomar el peor de
los casos) que el retraso se ajusta en la mitad del camino de dos enteros, por
decir 1.5. la interpolación cúbica da:

x[1.5] = (-x[0] + 9x[1] + 9x[2] - x[3])/8

Sea x[n] una sinusoide (real) de una unidad de amplitud con frecuencia angular
!, y cuya fase es cero a 1.5:

x[n] = cos(! • (n – 1.5))

y computamos x[1.5] según la fórmula anterior:

x[1.5] = (9cos(!/2) - 9cos(3!/2))/4

Este es el pico de la sinusoide que viene de regreso de la línea de retrasos, y


dado que la amplitud pico de ida era uno, esto muestra la respuesta a la
frecuencia de la línea de retrasos. Esto se grafica en la figura 7.18. A la
mitad de la frecuencia de Nyquist (! = ¼/2) la ganancia es de cerca de -1 dB lo
cual es una caída en la amplitud apenas perceptible. En la frecuencia de Nyquist
misma, sin embargo, la ganancia es cero.

Al igual que con los resultados para la distorsión, la respuesta a la frecuencia


mejora radicalmente al doblar la velocidad de las muestras. Si hacemos funcionar
nuestro retraso a una velocidad de muestras de 88200 Hertz en lugar de hacerlo a
la normal de 44100, obtendremos únicamente cerca de 1 dB de variación hasta los
20000 Hertz.

7.9 El cambio de afinación

Un uso favorito de las líneas de retrasos es alterar la afinación del sonido que
entra utilizando el efecto Doppler. Se puede querer alterar la afinación
variablemente (aleatoria o periódicamente, por ejemplo), o también mantener un
intervalo de transposición musical dado, durante un tiempo determinado.

Retornando a la figura 7.17, vemos que con una línea de retraso simple y
variable podemos mantener cualquier cambio de afinación por un intervalo de
tiempo limitado pero si queremos mantener una transposición dada, eventualmente
siempre nos caerá por fuera de la franja diagonal de los tiempos de retraso
admisibles. En el escenario más simple, sencillamente variamos la transposición
arriba y abajo, siempre dentro de la franja.

Esto funciona, por ejemplo si queremos aplicar vibrato a un sonido tal como se
muestra en la figura 7.19. Aquí la función de retraso es
d[n] = d0 + acos(!n)

donde d0 es el retraso promedio, a es la amplitud de la variación alrededor del


retraso promedio y ! es la frecuencia angular. La Transposición Momentánea es
(página “200”), aproximadamente

t = 1 + a!cos(!n - ¼/2)

Esta tiene rango entre los valores 1 - a! y 1 + a!.

Suponga, de otro lado, que queremos mantener una transposición constante en un


intervalo de tiempo largo. En este caso no podemos mantener la transposición por
siempre, pero siempre es posible mantenerla en intervalos de tiempo fijos, con
cambios discontinuos, como se muestra en la figura 7.20. El tiempo de retraso es
la salida de una función diente de sierra apropiada y normalizada, y la salida
de la línea de retrasos variable es envuelta como se muestra en la figura para
evitar las discontinuidades.

Esto se logra como se muestra en la figura 7.21. La salida de la diente de


sierra generadora es utilizada de dos maneras. En primer lugar se ajusta para
que haga un recorrido entre las dos fronteras d0 y d0 + s ajustando los
controles de la línea de retrasos en número de muestras. El retraso inicial d0
debe ser por lo menos suficiente para hacer el retraso variable factible, y para
la interpolación de cuatro puntos debe ser de por lo menos una muestra. Valores
más grandes de d0 suman un retraso adicional constante a la salida; estos son
usualmente ofrecidos como un control para el cambio de afinación ya que esta es
escencialmente libre. La cantidad s es llamada a veces tamaño de la ventana.
Corresponde aproximadamente a la longitud de la muestra en un lazo (sección
2.2).

La salida de la diente de sierra también se usa para envolver la salida en


exactamente la misma forma como se envuelve el muestreador de tabla de onda de
la figura 2.7 (página “38”). La envolvente es cero en los puntos donde la diente
de sierra hace la envoltura, y entre éstos, se eleva suavemente hasta un valor
de 1 (para una ganancia unitaria).

Si la frecuencia de la onda diente de sierra es f en ciclos por segundo,


entonces su valor oscila entre 0 y 1 cada R/f muestras (donde R es la velocidad
de las muestras). La diferencia entre los valores sucesivos es así f/R. Si x[n]
denota la salida del oscilador diente de sierra, entonces

x[n + 1] - x[n] = f/R

(excepto en los puntos de envoltura). Si ajustamos el rango de salida del


oscilador de tabla de onda al valor s (tal como está hecho en la figura)
obtenemos una nueva pendiente:

s • x[n + 1] - s • x[n] = sf/R

Adicionar la constante d0 no tiene efecto sobre esta pendiente. La Transposición


Momentánea (página “200”) es entonces:

t = 1 - sf/R

Para completar el diseño del variador de afinación debemos adicionar otra copia
a la mitad de la fase. Esto da como resultado un retraso que lee el patrón
mostrado en la figura 7.22.

El variador de afinación puede transponer hacia arriba (utilizando frecuencias


negativas, como en la figura) o hacia abajo (utilizando la positivas). El cambio
en la afinación es controlado usualmente al cambiar f con s fijo. Para obtener
un intervalo de transposición dado t, hacemos

f = [(t – 1)R]/s

El tamaño de la ventana s debe escogerse suficientemente pequeño, en lo


posible, de tal manera que las dos copias retrasadas (con una distancia de s/2
muestras) no suenen como ecos distintos. Sin embargo, los valores de s muy
pequeños forzarán a f hacia arriba; los valores de f mayores a aproximadamente
5 Hertz darán como resultado una modulación muy audible. Así, si se requieren
transposiciones muy grandes, es posible que se requiera incrementar el valor de
s. Los valores típicos están en los rangos de 30 a 100 milisegundos
(aproximadamente entre R/30 y R/10 muestras).

Aunque la frecuencia podría ser cambiada incluso de manera discontinua, s debe


ser cambiado más cuidadosamente. Una solución posible es enmudecer la salida
mientras se cambia s discontinuamente; alternativamente s puede ser controlado
mediante una rampa de manera continua pero esto ocasiona cambios Doppler
difíciles de controlar.

Una buena opción de envolvente es medio ciclo de una sinusoide. Si asumimos en


promedio que las dos salidas del retraso no están correlacionadas (página “11”),
la potencia de la señal de las dos líneas de retraso, depués de ser envueltas,
se adicionarán en una constante (ya que la suma de los cuadrados de las dos
envolventes es cero).

Existen muchas variantes en este algoritmo de cambio de afinación. Una variante


clásica utiliza una línea de retraso simple, sin ninguna envolvente. En esta
situación es necesario escoger el punto en el cual el tiempo de retraso salta y
el punto al que este salta, de tal manera que la salida permanece continua. Por
ejemplo, uno debería encontrar un punto donde la señal de salida pasa por cero
(un “cruce del cero”) y salta discontinuamente a otro. Usar únicamente una línea
de retraso tiene la ventaja de que la señal de salida suena más “presente”. Una
desventaja es que, debido a que el tiempo de retraso es una función del valor de
la señal de entrada, la salida no es más una función lineal de la entrada, así
las entradas no periódicas pueden dar lugar a artefactos tales como diferencias
en los sonidos.

7.10 Ejemplos

Línea de retraso sin interpolación, fija.

El ejemplo G01.delay.pd (figura 7.23) aplica una línea de retraso simple a una
señal de entrada. Se necesita de dos nuevos objetos:

delwrite~: define y escribe una línea de retraso. La primera creación de


argumento da el nombre de la línea de retraso (y dos líneas de retraso no deben
compartir el mismo nombre). La segunda creación de argumentos es la longitud de
la línea de retrasos en milisegundos. La entrada toma una señal de audio y la
escribe continuamente dentro de la línea de retrasos.

delread~: lee (o “aprovecha”) una línea de retrasos. La primera creación de


argumento da el nombre de la línea de retraso (el cual deberá coincidir con el
nombre del objeto delwrite~ correspondiente; así es como Pd sabe cuál delwrite~
debe asociar con el objeto delread~). La segunda creación de argumentos
(opcional) es el tiempo de retraso en milisegundos. Este no debe ser negativo ni
tampoco debe exceder la longitud de la línea de retraso tal como se especifica
por el objeto delwrite~. Los números (mensajes) de entrada pueden ser utilizados
para cambiar el tiempo de retraso de manera dinámica. Sin embargo esto
ocasionará algunos cambios discontinuos en la salida, los cuales deberán
enmudecerse si el tiempo de retraso cambia.

El ejemplo empareja de manera simple un objeto delwrite~ con otro delread~ para
fabricar un retraso simple, sin interpolación. La señal de entrada es una
grabación en lazo. La señal retrasada y la no retrasada se añaden para hacer un
filtro peine sin recirculación. En tiempos de retraso cercanos a los 10
milisegundos, el efecto del filtro es más pronunciado, y sobre ese tiempo, se
vuelve audible un eco discreto. No hay protección de enmudecimiento en la salida
del retraso, de tal manera que los ruidos son posibles cuando cambia el tiempo
de retraso.

Filtro peine recirculante.

El ejemplo G02.delay.loop.pd (figura 7.24) muestra cómo fabricar una red de


retraso recirculante. EL retraso se logra de nuevo con el par
delwrite~/delread~. La salida del objeto delread~ está multiplicada por una
ganancia de retroalimentación de 0.7 la cual es entregada al objeto delwrite~.
Una entrada (suministrada por el objeto phasor~ y los objetos sociados) se
adiciona a la entrada de delwrite~; esta suma es la salida de la red. Este es el
filtro peine recirculante de la sección 7.4.

La red de los objetos tilde no tiene ciclos, en el sentido de objetos que se


alimentan directa o indirectamente (a través de la conexión con otros objetos).
La retroalimentación en la red ocurre implícitamente entre los objetos delwrite~
y delread~.

Línea de retraso variable.

El ejemplo siguiente, G03.delay.variable.pd (figura 7.25), es otro filtro peine


recirculante, que utiliza en esta ocasión una línea de retraso de longitud
variable. Se introduce un nuevo objeto aquí:

vd~: Lee una línea de retraso, con un tiempo de retraso variable. Al igual que
con el objeto delread~, este lee de una línea de retraso cuyo nombre es
especificado como un argumento de creación. En lugar de utilizar un segundo
argumento y/o mensajes de control para especificar el tiempo de retraso, para el
objeto vd~ el retraso en milisegundos está especificado por una señal de audio
que entra. La línea de retraso se lee utilizando interpolación de cuatro puntos
(cúbica); el mínimo retraso posible es de una muestra.

Aquí los objetos del lado izquierdo, de arriba a abajo hasta el objeto clip~
-0.2 0.2, forman un red de conformación de onda; el índice se ajusta por medio
del control de timbre, y la salida de la conformación de onda varía entre casi
una sinusoide y un sonido brillante, zumbante. La salida se añade al objeto vd~.
La suma se pasa luego por un filtro pasa-altos (el objeto hip~ en la parte
inferior izquierda), se multiplica por una ganancia de retroalimentación, se
recorta, y se escribe en la línea de retraso en la parte inferior derecha. Hay
un control a la derecha para ajusar la ganancia de retroalimentación, aquí, en
contraste con el ejemplo previo, es posible especificar una ganancia mayor que
uno con el fin de obtener una retroalimentación inestable. Por esta razón el
segundo objeto clip~ se inserta dentro del lazo del retraso (justo encima del
objeto delwrite~), de tal manera que la señal no puede exceder a 1 en valor
absoluto.

La longitud del retraso está controlado por la señal de entrada al objeto vd~.
Un oscilador con frecuencia y ganancia variables, en el centro de la figura,
proporciona el tiempo de retraso. El oscilador se adiciona a uno para hacerlo no
negativo antes de multiplicarlo por el control de “cycle depth” <“profundidad
del ciclo”>, el cual ajusta de manera efectiva el rango de los tiempos de
retraso. El tiempo mínimo de retraso posible de 1.46 milisegundos se adiciona de
tal manera que el rango verdadero de los tiempos de retraso está entre el mínimo
y este mismo valor mínimo, más dos veces la “profundidad”. La razón para este
tiempo de retraso mínimo se discute en el ejemplo siguiente.

Los filtros peine con tiempos de retraso variables son a veces llamados
flangers. Cuando el tiempo de retraso cambia, el pico en la respuesta a
frecuencia se mueve arriba y abajo en la frecuencia, de tal manera que el timbre
a la salida cambia de manera característica.

Orden de ejecución y límites inferiores en los tiempos de retraso

Cuando se utilizan retrasos (así como otros objetos tilde que se comparten en
Pd), el orden en el cual se realizan las operaciones de escritura y de lectura
pueden afectar el resultado del cómputo. Aunque los objetos tilde en el parche
pueden tener una tipología complicada para las conexiones de audio, en realidad
Pd las ejecuta todas en orden secuencial, una después de la otra, para computar
cada bloque de audio de salida. Este orden lineal está garantizado para ser
compatible con las interconexiones de audio, en el sentido de que ningún cómputo
de un objeto tilde es realizado hasta que toda su entrada, para ese mismo
bloque, ha sido computada.

La figura 7.26 muestra dos ejemplos de topologías de objetos tilde y su


traducción a una secuencia de cómputos. En la parte (a) hay cuatro objetos
tilde, y según ls conexiones, el objeto a~ debe producir su salida antes de que
b~ ó c~ puedan correr; estos dos últimos son usados en cambio en el cómputo de
d~. Así los posibles ordenamientos de estos cuatro objetos son “a-b-c-d” o “a-c-
b-d”. Estos dos ordenamientos tendrán exactamente el mismo resultado a no ser
que el cómputo de b~ y c~ afecte de alguna manera la salida del otro (lo que
podría ocurrir en operaciones de retrasos, por ejemplo).

La parte (b) de la figura muestra un ciclo de objetos tilde. Esta red no puede
ser organizada dentro de un orden secuencial compatible, ya que tanto a~ como b~
requiere la salida del otro para ser computado en primer lugar. En general un
ordenamiento secuencial de los objetos tilde es posible si y sólo si no hay
ciclos en ninguna parte de la red de los objetos tilde y en sus interconexiones
de señal de audio. Pd reporta un error cuando aparece tal ciclo. (Note que la
situación para interconexiones de control entre objetos es más complicada y
flexible; ver la documentación de Pd para más detalles.)

Para ver el efecto del orden de cómputo en un par delwrite~/delread~, podemos


escribir explícitamente las señales de entrada y de salida en dos órdenes
posibles, con el retraso mínimo posible. Si la operación de escritura va
primero, en un bloque de inicio en la muestra número N, la operación se puede
escribir como:

x[N],...,x[N + B - 1] → delwrite~

donde B es el tamaño del bloque (como en la sección 3.2). Habiendo puesto esas
muestras en particular en la línea de retraso, un delread~ a continuación es
capaz de leer los mismos valores a la salida:

delread~ → x[N],...,x[N + B - 1]

De otro lado, suponga que el objeto delread~ viene antes del delwrite~. Entonces
las muestras x[N],...,x[N + B - 1] aún no han sido almacenadas en la línea de
retraso, de tal manera que las muestras más recientes que pueden leídas
pertenecen al bloque previo:

delread~ → x[N - B],...,x[N - 1]


x[N],...,x[N + B - 1] → delwrite~

Aquí el retraso mínimo que posiblemente obtengamos es el tamaño del bloque B.


Así el retraso mínimo es 0 ó B, dependiendo del orden en el cual los objetos y
delread~ y delwrite~ están organizados en una secuencia de ejecución.

Regresando a los parches de las figuras 7.24 y 7.25, los cuales presentan
retrasos recirculantes, los objetos delread~ o vd~ deben colocarse antes en la
secuencia que el objeto delwrite~. Esto sucede en cualquier diseño en el cual la
salida de un retraso es retroalimentada a su entrada. El retraso mínimo es B
muestras. Para una velocidad de muestras (típica) de 44100 Hertz y tamaño de
bloque de 64 muestras, este viene a ser 1.45 milisegundos. Esto podría no sonar
en principio como una restricción importante. Pero si usted está tratando de
afinar un filtro peine recirculante en un tono específico, el más alto que usted
puede obtener es cercano a sólo 690 Hertz. Para obtener retrasos de
recirculación más cortos usted debe incrementar la velocidad de las muestras o
reducir el tamaño del bloque.

El ejemplo G04.control.blocksize.pd (figura 7.27) muestra cómo el tamaño del


bloque puede ser controlado en Pd utilizando un nuevo objeto:

block~, switch~: Ajusta el tamaño del bloque local de la ventana del parche en
la cual está ubicado el objeto. Los tamaños de los bloques están normlmente en
potencias de dos. El objeto switch~, adicionalmente, puede ser utilizado para
encender y apagar el cómputo de audio en la ventana, utilizando mensajes de
control. La creación de argumentos adicionales puede ajustar la velocidad de las
muestras y especificar las operaciones de traslape (demostradas en el capítulo
9).

En la parte (a) de la figura (el parche principal), un pulso rectangular es


enviado al sub-parche pd delay-writer, cuya salida retorna luego al parche
principal. La parte (b) muestra el contenido del subparche, el cual envía los
pulsos a un retraso recirculante. El objeto block~ especifica que, en este sub-
parche, la señal de cómputo utiliza un tamaño de bloque (B) de sólo uno. Así el
retraso mínimo que se puede obtener es de una muestra, en vez de 64.

El poner un pulso (u otra señal de excitación) en un filtro peine con


recirculación es a veces llamado síntesis de Karplus-Strong, habiendo sido
descrita por ellos en un ensayo [KS83], aunque la idea parece ser anterior. Esta
se muestra por ejemplo en la pieza de Paul Lansky de 1979, Seis Fantasías sobre
un Poema de Thomas Campion.

Orden de ejecución en las líneas de retrasos sin recirculación

En las redes de retraso sin recirculación, es posible ubicar la operación de


escritura dentro de la línea de retraso, anterior en la secuencia a la de
lectura. No debería haber así límite inferior a lo largo de la línea de retraso
(a excepción de lo que se imponga por el esquema de interpolación; ver sección
7.7). En lenguages tales como Csound, la secuencia de los cómputos de la unidad
de generación es (casi siempre) explícita, así que es fácil especificarla. En
ambientes de parches gráficos, sin embargo, el orden es implícito y se debe
tomar otra aproximación para asegurar que, por ejemplo, un objeto delwrite~ sea
computado antes que el obejeto delread~ correspondiente. Una manera de lograr
esto se muestra en el ejemplo G05.execution.order.pd (figura 7.28).

En la parte (a) de la figura, las conexiones en el parche no determian cuál es


el orden en el que aparecen las dos operaciones de retraso, en la secuencia de
cómputo clasificada de los objetos tilde; el objeto delwrite~ puede computarse
antes o después del objeto vd~. Si deseamos asegurar que la operación de
escritura suceda antes de la operación de lectura, podemos proceder como en la
parte (b) de la figura y poner las dos operaciones en subparches, conectando los
dos vía señales de audio de tal forma que el primer subparche deba ser computado
antes que el segundo. (El cómputo de audio en los subparches es realizado
automáticamente, en el sentido de que los contenidos del subparche entero son
considerados como el cómputo de audio para el subparche como un todo. Así todo
en el primer subparche sucede antes que cualquier cosa suceda en el segundo
subparche.)

En este ejemplo, la forma “correcta”·y la forma “incorrecta” para hacer un


filtro peine tienen resultados audibles diferentes. Para retrasos de menos de 64
muestras, el lado derecho del parche (el que utiliza los subparches) da el
resultado correcto, pero el parche del lado izquierdo no puede producir retrasos
en tamaños de bloques por debajo de 64 muestras.

Filtro peine sin recirculación como duplicador de octava

En el ejemplo G06.octave.doubler.pd (figura 7.29) retomamos la idea de un


modificador de octava basado en el tono, que introdujimos antes en
E03.octave.divider.pd. Allí, conocer la periodicidad de un sonido a la entrada
nos permitió afinar un modulador de anillo para introducir subarmónicos. Aquí
realizamos el duplicador de octava descrito en la sección 7.3. Utilizando un
filtro peine sin recirculación, variable, tomamos los armónicos impares, dejando
únicamente los pares, dará como resultado un sonido una octava más alta. Como
antes, la envolvente espectral del sonido es preservada con aproximación por la
operación, de tal manera que podemos evitar el efecto “chipmunk” que podríamos
haber tenido utilizando el cambio de velocidad para hacer la transposición.

El filtrado peine se hace combinando dos copias retrasadas de la señal de


entrada (del subparche pd looper en la parte superior). La copia fija (delread~)
es ajustada al tamaño de la ventana a la altura que sigue al algoritmo. Toda vez
que en el ejemplo anterior esta estaba escondida en otro subparche, podemos
mostrarla ahora de manera explícita. El retraso en milisegundos es estimado como
igual a la ventana de las 2048 muestras utilizada por el objeto fiddle~; en
milisegundos esto viene a ser 1000•2048/R donde R es la velocidad de las
muestras.

El retraso variable es el mismo, más 1/2 del período medido del sonido entrante,
o 1000/(2f) milisegundos, donde f es la frecuencia en ciclos por segundo. La
suma de este y el tiempo de retraso fijo es luego suavizado utilizando un objeto
line~ para hacer la señal de entrada por la línea de retraso variable.

Dado que la diferencia entre los dos retrasos es de 1/(2f), las frecuencias
resonantes del filtrado peine resultante son 2f, 4f, 6f...; la respuesta a la
frecuencia (sección 7.3) es cero en las frecuencias f, 3f,..., de tal manera
que el sonido resultante contiene sólo parciales en los múltiplos de 2f -una
octava por encima de la original. Visto de otra manera, el sonido entrante es la
salida duplicada, con medio ciclo de diferencia; los armónicos impares son de
este modo desplazados 180 grados (¼ radianes) y cancelados; los armónicos pares
están en fase con sus copias retrasadas y permanecen en la suma.

Tanto este como el divisor de octava puede alterarse haciendo cambios de 3 o 4 a


uno en la frecuencia, y también pueden combinarse para hacer cambios compuestos
tales como el de una quinta musical (razón de 3:2) descendiendo una octava y
luego ascendiendo, multiplicando por un factor de tres. (Debe hacer el descenso
de octava antes del cambio ascendente para mejores resultados.)

Filtros peine complejos variantes en el tiempo: agitadores

El ejemplo G07.shaker.pd (figura 7.30) muestra una manera diferente de extender


la idea de un filtro peine. Aquí combinamos la señal de entrada en cuatro
cambios de tiempo diferentes (en lugar de dos, como en filtro peine sin
recirculación original), cada uno a una ganancia diferente positiva o negativa.
Para hacer esto, insertamos la señal de entrada en una línea de retraso y la
insertamos en tres puntos diferentes; el cuarto “inserto” es la señal original,
sin retraso.

Una manera de pensar la respuesta a la frecuencia de un filtro peine de cuatro


insertos, es considerar primero lo que sucede cuando dos de las cuatro ganancias
son cercanas a cero. Terminamos con un filtro peine sin recirculación, simple,
con la ligera complicación que las ganancias de las dos copias retrasadas pueden
ser diferentes. Si son del mismo signo, obtenemos los mismos picos y valles que
se predicen en la sección 7.3, sólo que con los valles entre los picos
posiblemente menos profundos. Si son de signos opuestos, los valles se vuelven
picos y los picos se vuelven valles.

Dependiendo de cuáles de los dos insertos supongamos diferente de cero, los


espacios entre los picos y los valles son de diferente magnitud; los tiempos de
retraso se escogen de tal manera que 6 diferentes tiempos de retraso pueden
aparecer de esta manera, con rangos entre los 6 y los 30 milisegundos. En el
caso general en cual todas las ganancias son diferentes de cero, podemos
imaginar la función de respuesta a la frecuencia variando continuamente entre
estos extremos, dando una sucesión de patrones complejos. Esto tiene el efecto
de elevar y disminuir las amplitudes de los parciales de la señal de entrada,
todos independientemente de los otros, en un patrón complicado, para dar un
timbre continuamente variable en el tiempo.

El lado derecho del parche se encarga de la ganancia de la señal de entrada y de


las de sus tres copias cambiantes en el tiempo. Cada vez que el objeto metro
dispara, un contador se incrementa (los objetos f, + 1, mod 4). Este controla
cuáles de las amplitudes serán cambiadas. La amplitud misma se computa
fabricando un número aleatorio y normalizándolo para que su valor caiga entre
-0.7 y 1.3. El valor aleatorio y el índice se empacan (junto con un tercer
valor, un intervalo de tiempo) y esta tripleta va al objeto route. El primer
elemento de la tripleta (el contador) selecciona a qué salida enviar los otros
dos valores; como resultado, a uno de los cuatro posibles objetos line~ le llega
un mensaje para ir en rampa a un nuevo valor.

Si la variación de tiempo se realiza con la rapidez suficiente, hay también un


efecto de modulación sobre la señal original; en esta situación los segmentos de
línea recta utilizados en este ejemplo deben ser reemplazados por señales de
modulación con un contenido de frecuencia más controlable, por ejemplo,
utilizando filtros (materia del capítulo 8).

Reverberador

El ejemplo G08.reverb.pd (figura 7.31) muestra un reverberador artificial


simple, en escencia una realización del diseño mostrado en la figura 7.15.
Cuatro líneas de retraso se alimentan con la entrada y con su propia salida
recirculada. Las salidas retrasadas son entremezcladas utilizando matrices de
rotación, construidas de rotaciones elementales de ¼/4 como en la figura 7.13
(parte a).

La multiplicación de normalización (por √1/2 en cada estadio) es absorbida por


la ganancia de retroalimentación, la cual de esta manera no puede exceder 1/2.
Con una ganancia de retroalimentación de exactamente 1/2, toda la energía de
salida de las líneas de retraso es reinsertada a estas, de tal manera que la
reverberación es perpetua.

La figura 7.32 muestra el interior de la abstracción reverb-echo utlizada en el


reverberador. Las dos entradas se mezclan (utilizando la misma matriz de
rotación y dejando de nuevo la renormalización para después). Luego un canal se
retrasa. Los tiempos de retraso se seleccionan para crecer de manera
aproximadamente exponencial; esto asegura un patrón de ecos suaves y esparcidos.

Son posibles muchas extensiones de esta idea de las cuales nombraremos una
cuantas. Es natural, en primer lugar, poner filtros pasa-bajos al final de las
líneas de retraso, para imitar el decaimiento típicamente más rápido de las
frecuencias altas con respecto a las frecuencias bajas. Es común utilizar más de
cuatro retrasos recirculantes; un reverberador en la distribución Pd usa
dieciséis. Finalmente es común permitir el control separado de las amplitudes de
los ecos tempranos (escuchados directamente) con respecto al de la señal
recirculante; parámetros como estos son tomados para controlar cualidades
sónicas tales como “presencia”, “calidez”, “claridad”, etc.

Modificador de altura

El ejemplo G09.pitchshifter.pd (figura 7.33) muestra la realización del


modificador de altura descrito en la sección 7.9. Una línea de retraso (definida
y escrita en cualquier sitio en el parche) es leída utilizando dos objetos vd~.
Los tiempos de retraso varían entre un retraso mínimo (provisto como el control
“delay”) y ese mínimo más un tamaño de ventana (el control “window”).

El cambio de altura deseado, en semitonos (h) es convertido primero en un


factor de transposición

t = 2h/12 = elog(2)/12.h ≈ e0.05776h

(llamado “speed change” en el parche). El cómputo etiquetado “tap head rotation


speed” <”velocidad de rotación de la cabeza de inserción”> es el mismo de la
fórmula para f dada en la página 206. Aquí el intervalo positivo (siete
semitonos) hace que se eleve a un factor de transposición mayor que uno, y de
esta manera a un valor negativo para f.

Una vez se calcula f, la producción de las dos señales de fase diente de sierra
y las envolventes correspondientes, son un paralelo exacto del lazo de muestras
traslapado (ejemplo B10.sampler.overlap.pd, página 54). El retraso mínimo se
adiciona a cada una de las dos señales dientes de sierra para hacer entradas de
retraso para los objetos vd~, cuyas salidas son multiplicadas por las
envolventes correspondientes y sumadas.

Ejercicios

1. Un número complejo tiene magnitud 1 y argumento ¼/4. Cuáles son sus partes
real e imaginaria?

2. Un número complejo tiene magnitud uno y parte real 1/2. Cuál es su parte
imaginaria? (Hay dos posibles valores.)

3. Qué tiempo de retraso debería darle a un filtro peine para que su primer pico
de respuesta a la frecuencia esté a 440 Hertz? Si la velocidad de las muestras
es de 44100, qué frecuencia deberá corresponder al retraso entero más cercano?

4. Suponga que hizo una variación en un filtro peine sin recirculación de tal
manera que la señal retrasada es sustraída de la original, en lugar de
adicionarla. Cuál debería ser la nueva respuesta a la frecuencia?

5. Si usted quiere hacer un vibrato de 6 Hertz con una línea de retraso variando
sinusoidalmente, y si quiere que la frecuencia del vibrato cambie en un 5%, qué
tan grande podría necesitar que fuera la variación del retraso? Cómo debería
cambiar esto si la misma profundidad de vibrato se quisiera a 12 Hertz?

6. Una sinusoide compleja X[n] tiene frecuencia de 11025 Hertz, amplitud 50 y


fase inicial de 135 grados. Otra, Y[n] tiene la misma frecuencia pero amplitud
20 y fase inicial 45 grados. Cuál es la amplitud y la fase inicial de la suma de
X y Y?
7. Cuáles son la frecuencia, la fase inicial y la amplitud de la señal obtenida
cuando X[n] (arriba) es retrasada 4 muestras?

8. Muestre que la respuesta a la frecuencia de un filtro peine con


recirculación, con un retraso d y una ganancia de retroalimentación g, como
función de la frecuencia angular !, es igual a
Capítulo 8

Filtros

En el capítulo previo vimos que una red de retrasos puede tener una respuesta a
la frecuencia no uniforme -una ganancia que varía en función de la frecuencia.
Las redes de retraso también cambian típicamente la fase de las señales de
entrada de manera variable, dependiendo de la frecuencia. Cuando los tiempos de
retraso utilizados son muy cortos, las propiedades más importantes de una red de
retrasos vienen a ser su respuesta a la frecuencia y a la fase. Una red de
retrasos que está diseñada específicamente para su respuesta a la frecuencia o a
la fase es llamada un filtro.

En diagramas de bloques, los filtros se muestran como en la figura 8.1 (parte


a). La curva que se ve dentro del bloque da una representación cualitativa de la
respuesta a la frecuencia del filtro. La respuesta a la frecuencia puede variar
con el tiempo, y dependiendo del diseño del filtro, uno o más controles (o
entradas de audio adicionales) podrían utilizarse para cambiarla.

Suponga, siguiendo el procedimiento de la sección 7.3, que ponemos una sinusoide


de una unidad de amplitud, de valor complejo con frecuencia angular ! dentro
del filtro. Esperamos obtener una sinusoide de la misma frecuencia y alguna
amplitud que depende de !. Esto nos da una función H(!) de valor complejo,
llamada función de transferencia del filtro.

La respuesta a la frecuencia es la ganancia como una función de la frecuencia


!. Esta es igual a la magnitud de la función de transferencia. Una respuesta a
la frecuencia de un filtro se acostumbra graficar como en la figura 8.1 (parte
b). Una sinusoide entrante de amplitud unitaria de frecuencia ! sale del filtro
con magnitud |H(!)|.

A veces es útil conocer la respuesta a la fase de un filtro, igual a /(H(!)).


Para una frecuencia fija ! la fase de salida del filtro será /(H(!)) radianes
por delante de su fase de entrada.

El diseño y la utilización de los filtros es una materia completa, debido a que


el amplio rango de los usos de un filtro podría sugerir una variedad amplia de
procesos para sus diseños. En algunas aplicaciones un filtro debe seguir
exactamente una respuesta a la frecuencia prescrita, en otros es importante
minimizar el tiempo de cómputo, en otros la respuesta a la fase es importante, y
en otros aún, el filtro debe comportarse bien cuando sus parámetros cambian
rápidamente con el tiempo.

8.1 Taxonomía de los filtros

A lo largo de la historia de la música electrónica la tecnología para la


construcción de filtros ha cambiado continuamente, pero cierto tipo de filtros
reaparecen con frecuencia. En esta sección daremos alguna nomenclatura que
describe filtros de varios tipos genéricos y recurrentes. Luego desarrollaremos
algunas estrategias para fabricar filtros con características deseadas y
finalmente discutiremos algunas aplicaciones comunes de los filtros en la música
electrónica.

8.1.1 Filtros pasa-bajos y pasa-altos

El propósito más frecuente para el uso de un filtro es extraer la porción de las


frecuencias bajas o de las frecuencias altas de una señal de audio, atenuando el
resto. Esto se logra utilizando un filtro pasa-bajos o pasa-altos.

Idealmente un filtro pasa-bajos o pasa-altos debe tener una respuesta a la


frecuencia de uno para una frecuencia de corte específica hacia arriba (o hacia
abajo) y de cero si se pasa de allí; pero tales filtros no pueden realizarse en
la práctica. En lugar de esto tratamos de encontrar aproximaciones viables para
esta respuesta ideal. Ponemos en esto la mayor parte del esfuerzo de diseño y de
tiempo de cómputo, para acercarnos a esto lo mejor posible.

La figura 8.2 muestra la respuesta a la frecuencia de un filtro pasa-bajos. La


frecuencia está dividida en tres bandas, etiquetadas en el eje horizontal. La
banda de paso es la región (banda de frecuencia) en la cual filtro debe pasar su
entrada a su salida con ganancia unitaria. Para un filtro pasa-bajos (como el
que se muestra), la banda de paso va desde una frecuencia de cero hasta un
cierto límite de frecuencia hacia arriba. Para un filtro pasa-altos la banda de
paso debe aparecer en el lado de la derecha de la gráfica y extenderse desde el
límite de frecuencia hasta la más alta frecuencia posible. Cualquier banda de
paso de un filtro real será únicamente aproximadamente plana; la desviación de
la planitud es llamada rizo, y usualmente se especifica dando la razón entre la
ganancia más alta y la más baja en la banda de paso, expresada en decibeles. El
filtro pasa-bajos o pasa-altos ideal debe tener un rizo de 0 dB.

La banda de parada de un filtro pasa-bajos o pasa-altos es la banda de


frecuencia sobre la cual el filtro intenta no transmitir su entrada. La
atenuación de la banda de parada es la diferencia, en decibeles, entre la
ganancia más baja en la banda de paso y la ganancia más alta en la banda de
parada. Idealmente esta debería ser infinita, y entre más alta, mejor.

Finalmente un filtro realizable, cuya respuesta a la frecuencia es siempre una


función continua de la frecuencia, debe tener una banda de frecuencia sobre la
cual la ganancia cae desde la ganancia de la banda de paso hasta la ganancia de
la banda de parada; esta es llamada banda de transición. Mientras más delgada se
hace esta banda, se acerca más al filtro ideal.

8.1.2 Filtros pasa-banda y de banda de parada

Un filtro pasa-banda admite frecuencias dentro de una banda dada, rechazando


frecuencias por debajo y por encima de esta. La figura 8.3 muestra la respuesta
a la frecuencia de un filtro pasa-banda, indicando sus parámetros claves. Un
filtro de banda de parada hace lo contrario, rechazando las frecuencias dentro
de la banda y dejando pasar las frecuencias por fuera de ésta.

En la práctica, un idioma más simple es utilizado con frecuencia para describir


los filtros pasa-banda, como se muestra en la figura 8.4. Aquí hay únicamente
dos parámetros: un centro de frecuencia y un ancho de banda. Se considera que la
banda de paso es la región donde el filtro tiene hasta la mitad de la ganancia
pico de potencia (es decir, la ganancia está a 3 decibeles de su máximo). El
ancho de banda es el ancho, medido en unidades de frecuencia, de la banda de
paso. El centro de frecuencia es el punto de la máxima ganancia, el cual es
aproximadamente el punto medio de la banda de paso.

8.1.3 Filtros de ecualización

En algunas aplicaciones, tales como la ecualización, el objetivo no es el paso


de señales con ciertas frecuencias, deteniendo otras al mismo tiempo, si no
realizar ajustes controlables, acentuando o atenuando una señal, sobre un rango
de frecuencia, por una ganancia deseada. Dos tipos de filtros son útiles para
esto. Primero, un filtro de realce <shelving> (figura 8.5) es utilizado para
acentuar o reducir selectivamente ya sea lo más grave o lo más agudo del rango
de frecuencia. Por debajo de un cruce de frecuencia seleccionada, el filtro
tiende a una ganancia de frecuencias graves, y por encima de ésta, tiende a una
ganancia de las altas. La frecuencia de cruce, la ganancia de las frecuencias
bajas y la ganancia de las frecuencias altas puede ser ajustada de manera
independiente.
El segundo, un filtro de pico (figura 8.6), es capaz de acentuar o atenuar
señales dentro de un rango de frecuencias. La frecuencia central y el ancho de
banda (los cuales controlan de manera conjunta el rango de frecuencias
afectado), y las ganancias dentro de la banda y por fuera de la banda, son
ajustadas por separado.

Los ecualizadores paramétricos usualmente emplean dos filtros de realce (uno


para ajustar los bajos y otro para los agudos) y dos o tres filtros de pico para
ajustar las bandas entre aquéllos.

8.2 Filtros elementales

Vimos en el capítulo 7 cómo predecir la respuesta a la frecuencia y a la fase de


las redes de retrasos. El arte del diseño de filtros está en encontrar una red
de retraso cuya función de transferencia (la que controla la respuesta a la
frecuencia y a la fase) tiene una forma deseada. Desarrollaremos una
aproximación para la construcción de tales redes de retraso con los dos tipos de
filtros peine desarrollados en el capítulo 7: con recirculación y sin
recirculación. Aquí estaremos interesados en el caso especial en cual el retraso
es de sólo una muestra de longitud. En esta situación, las respuestas a la
frecuencia mostradas en las figuras 7.6 y 7.10 ya no parecerán peines; el
segundo pico desaparece del todo para la velocidad de muestras 2¼ radianes,
cuando d = 1. Ya que únicamente las frecuencias entre 0 y la frecuencia de
Nyquist (¼ radianes) son audibles, en efecto hay un solo pico cuando d = 1.

En los filtros peine mostrados en el capítulo 7, los picos están situados en DC


(frecuencia cero), pero usualmente queremos ubicarlos en otras frecuencias
diferentes de cero. Esto se hace utilizando redes de retraso -filtros peine- con
ganancias de valor complejo.

8.2.1 Filtro elemental sin recirculación

Los filtros peine sin recirculación pueden ser generalizados dando lugar al
diseño mostrado en la figura 8.7. Este es el filtro elemental sin recirculación,
de la primera forma. Su único parámetro de valor complejo Q controla la
ganancia compleja de la señal retrasada sustraída de la señal original.

Para encontrar su respuesta a la frecuencia, como en el capítulo 7 alimentamos


la red de retraso con una sinusoide compleja 1, Z, Z2, ... con frecuencia ! =
arg(Z). La n-ésima muestra de la entrada es Zn y la salida de esta es

(1 - QZ-1)Zn

de tal manera que la función de transferencia es

H(Z) = 1 - QZ-1

Esto puede analizarse gráficamante como se muestra en la figura 8.8. Los números
reales r y ® son la magnitud y el argumento del número complejo Q:

Q = r • (cos(®) + isen(®))

La ganancia del filtro es la distancia desde el punto Q al punto Z en el plano


complejo. Analíticamente podemos ver esto porque

|1 - QZ-1| = |Z||1 - QZ-1| = |Q - Z|

Gráficamente, el número QZ-1 es precisamente el número Q rotado hacia atrás (en


el sentido de las agujas del reloj) por la frecuencia angular ! de la sinusoide
de entrada. El valor |1 - QZ-1| es la distancia desde QZ-1 a 1 en el plano
complejo, la cual es igual a la distancia de Q a Z.
Ya que la frecuencia de entrada va y viene de 0 a 2¼, el punto Z viaja en el
sentido contrario a las manecillas de reloj alrededor del círculo unitario. En
el punto donde ! = ®, la distancia es como mínimo, igual a 1 - r. El máximo
ocurre cuando Z está en el punto opuesto del círculo. La figura 8.9 muestra la
función de transferencia para tres valores diferentes de r = |Q|.

8.2.2 Filtro sin recirculación, segunda forma

Algunas veces necesitaremos una variante del filtro anterior, como se ve en la


figura 8.10, llamado el filtro sin recirculación segunda forma. En lugar de
multiplicar el retraso de salida por Q, multiplicamos la señal directa por su
complejo conjugado Q. Si

A = a + bi = r • (cos(®) + isen(®))

es un número complejo, su complejo conjugado está definido como:

A = a - bi = r • (cos(®) - isen(®))

Gráficamente este refleja puntos del plano complejo arriba y abajo alrededor del
eje real. La función de transferencia del nuevo filtro es

H(Z) = Q - Z-1

Esto da lugar a la misma respuesta a la frecuencia de antes ya que

|Q - Z-1| = |Q - Z-1 | = |Q - Z|

Aquí utilizamos el hecho de que Z = Z-1 para cualquier número complejo unitario
Z, tal como puede ser verificado al escribir ZZ ya sea en la forma rectangular
o en la forma polar.

Aunque las dos formas del filtro elemental sin recirculación tienen la misma
respuesta a la frecuencia, sus respuestas a la fase son diferentes; esto
ocasionalmente nos hará preferir la segunda forma.

8.2.3 Filtro elemental con recirculación

El filtro elemental con recirculación es el filtro peine con recirculación de la


figura 7.7 con una ganancia de retroalimentación compleja P, como se muestra en
la figura 8.11 (parte a). Con el mismo análisis de antes, alimentamos esta red
con una sinusoide cuya n-ésima muestra Zn da una salida de:

Zn/(1 - PZ-1)

de tal manera que la función de transferencia es

H(Z) = 1/(1 - PZ-1)

El filtro con recirculación es estable cuando |P| < 1; si por el contrario, |P|
> 1, la salida crece exponencialmente cada que la muestra retrasada recircula.

La función de transferencia es de esta manera precisamente la inversa de la del


filtro sin recirculación (primera forma). Al poner los dos en serie con P = Q,
la salida teóricamente iguala la entrada. (Este análisis sólo cumple para
entradas sinusoidales; que se cumple también para otras señales, puede ser
verificado trabajando la respuesta al impulso combinada de la red).

8.2.4 Filtros compuestos


Podemos utilizar los filtros con recirculación y sin recirculación desarrollados
aquí para crear un filtro compuesto poniendo varios de los filtros elementales
en serie. Si los parámetros de los no recirculantes (del primer tipo) son
Q1,...Qj y los de los recirculantes son P1,...Pk, entonces, al ponerlos a todos
en serie, en cualquier orden, nos dará la función de transferencia:

H(Z) = [(1 - Q1Z-1)...(1 – QjZ-1)]/[(1 – P1Z-1)...(1 - PkZ-1)]

La respuesta a la frecuencia del filtro compuesto resultante es el producto de


las respuestas de sus elementales. (Uno podría combinar también filtros
elementales sumando sus salidas o haciendo redes de ellos más complicadas; pero
para la mayoría de los propósitos la configuración en serie es con la que se
trabaja más fácilmente.)

8.2.5 Salidas reales de filtros complejos

En la mayoría de las aplicaciones, comenzamos con una señal de valor real para
filtrar y requerimos una salida de valor real, pero en general un filtro
compuesto con una función de transferencia como la anterior nos dará una salida
de valor complejo. Sin embargo podemos construir filtros con coeficientes no
reales los cuales no obstante dan salidas con valores reales, de tal manera que
el análisis que hacemos utilizando números complejos puede ser utilizado para
predecir, explicar y controlar señales de salida de valor real. Hacemos esto
emparejando cada filtro elemental (con coeficiente P o Q) con otro que tenga
como su coeficiente el complejo conjugado P o Q.

Por ejemplo, al poner dos filtros sin recirculación, con coeficientes Q y Q en


serie, nos queda una función de transferencia igual a:

H(Z) = (1 – QZ-1) • (1 – QZ-1)

la cual tiene la propiedad de que:

H(Z) = H(Z)

Ahora si ponemos una sinusoide de valor real:

Xn = 2re(AZn) = AZn + AZn

obtenemos:

A • H(Z) • Zn + A • H(Z) • Zn

la cual, por inspección, es otra sinusoide. Aquí estamos utilizando dos


propiedades de los complejos conjugados. La primera, que se puede sumarlos y
multiplicarlos a voluntad:

A + B = A + B

AB = A • B

y segundo que cualquier suma con su complejo conjugado es real y es precisamente


dos veces su parte real:

A + A = 2re(A)

Este resultado para dos filtros conjugados se extiende para cualquier filtro
compuesto; en general, siempre obtenemos una salida con valor real de una
entrada con valor real si disponemos para que cada coeficiente Qi y Pi en el
filtro compuesto sea de valor real o aparezca emparejado con su complejo
conjugado.

8.2.6 Dos filtros con recirculación por el precio de uno

Cuando emparejamos filtros con recirculación elementales, es posible evitar el


cómputo de cada par, siempre y cuando la entrada sea de valor real (y por lo
tanto la salida también.) Suponiendo que la entrada es una sinusoide real de la
forma:

AZn + AZ-n

y aplicamos un solo filtro son recirculación con coeficiente P. Siendo a[n] la


parte real de la salida, tenemos:

a[n] = re[AZn/(1 - PZ-1) + AZ-n/(1 - PZ)]

= re[AZn/(1 - PZ-1) + AZn/(1 – PZ-1)]

= re[(AZn)(2 – 2re(P)Z-1)/((1 - PZ-1)(1 – PZ-1))]

= re[[(AZn)(1 – re(P)Z-1)/((1 - PZ-1)(1 – PZ-1)) + [(AZ-n)(1 – re(P)Z-1)/


((1 - PZ-1)(1 – PZ-1))]]

(En el segundo paso usamos el hecho de que usted puede conjugar parte o el total
de una expresión, sin cambiar el resultado, si usted de todas maneras, sólo va a
tomar la parte real. En el cuarto paso se hizo lo mismo, pero en sentido
inverso.) Comparando la entrada con la salida, vemos que el efecto de pasar una
señal real a través de un filtro complejo de un polo y luego tomar su parte
real, es equivalente a pasar la señal a través de un filtro con un cero, dos
polos, con función de transferencia igual a:

Hre(Z) = (1 – re(P)Z-1)/((1 - PZ-1)(1 – PZ-1))

Unos cálculos similares muestran que tomar la parte imaginaria (considerada como
una señal real) es equivalente a filtrar la entrada con la función de
transferencia:

Him(Z) = (im(P)Z-1)/((1 - PZ-1)(1 – PZ-1))

Así, al tomar la parte real o imaginaria de un filtro de un polo, a la salida


obtenemos dos filtros con dos polos conjugados. Las dos partes pueden ser
combinadas para sintetizar filtros con otros posibles numeradores; en otras
palabras, con un filtro con recirculación complejo podemos sintetizar un filtro
que actúe sobre las señales reales con dos polos (complejos conjugados) y un
cero (real).

Esta técnica, conocida como fracciones parciales, puede ser repetida por
cualquier número de etapas en serie, siempre y cuando computemos la combinación
apropiada de las partes real e imaginaria a la salida de cada etapa para formar
la entrada (real) de la siguiente etapa. No parecen existir atajos similares
para los filtros sin recirculación; para ellos es necesario computar cada
miembro de cada par complejo conjugado explícitamente.

8.3 Diseño de filtros

La respuesta a la frecuencia de una serie de filtros elementales con


recirculación y sin recirculación puede estimarse gráficamante dibujando todos
los coeficientes Q1,...Qj y P1,...Pk en el plano complejo y razonando como en la
figura 8.8. La respuesta a la frecuencia general es el producto de todas las
distancias desde el punto Z a cada uno de los Qi, dividida por el producto de
las distancias a cada uno de los Pi.
Uno habitualmente marca cada uno de los Qi con una “o” (y lo llama un “cero”) y
cada uno de los Pi con una “x” (un “polo”); sus nombres son prestados del campo
del análisis complejo. Un gráfico mostrando los polos y los ceros asociados con
un filtro es llamado con poca imaginación, gráfico polo-cero.

Cuando Z está cercano a cero la respuesta a la frecuencia tiende a sumergirse,


y cuando está cerca a un polo, tiende a elevarse. El efecto de un polo o de un
cero es más pronunciado, y también más localizado, si está cerca al círculo
unitario en el cual está constreñido Z. Los polos deben quedar dentro del
círculo unitario para ser un filtro estable. Los ceros pueden quedar sobre o por
fuera de este, pero cualquier cero Q por fuera del círculo unitario puede ser
reemplazado por uno dentro de el, en el punto 1/Q, para dar un múltiple
constante de la misma respuesta a la frecuencia. Excepto en casos especiales
mantendremos los ceros dentro del círculo al igual que los polos.

En el resto de esta sección mostraremos cómo construir algunos de los tipos de


filtros más ampliamente utilizados en la música electrónica. La teoría del
diseño del filtro digital es vasta, y aquí únicamente daremos una introducción.
Un tratamiento más profundo está disponible en línea por Julius Smith en
ccrma.stanford.edu. Ver también [Ste96] para una introducción al diseño de
filtros desde el punto de vista más general del procesamiento de señal digital.

8.3.1 Filtro pasa-bajos de un polo

El filtro pasa-bajos de un polo posee un solo polo localizado en un número real


positivo p, como se ilustra en la figura 8.12. Este es sólo un filtro peine con
recirculación con retraso de longitud d = 1, y se aplica el análisis de la
sección 7.7. La ganancia máxima ocurre a la frecuencia cero, correspondiendo al
punto en el círculo más cercano al punto p. La ganancia aquí es 1/(1 – p).
Asumiendo que p es cercano a uno, si nos movemos una distancia de 1 – p
unidades hacia arriba o hacia abajo del eje real (horizontal), la distancia se
incrementa por un factor de aproximadamente √2, y de esta manera esperamos que
el punto de mitad de potencia ocurre en una frecuencia angular de
aproximadamente 1 – p.

Este cálculo es usualmente hecho a la inversa: si queremos que el punto de mitad


de la potencia quede a una frecuencia angular !, hacemos p = 1 - !. Esta
aproximación sólo trabaja bien si el valor ! está bien por debajo de ¼/2, como
es usual en la práctica. Es costumbre normalizar el filtro pasa-bajos de un
polo, multiplicándolo por el factor constante 1 – p para dar una ganancia de 1
a la frecuencia cero; las frecuencias que no son cero tendrán entonces una
ganancia menor que uno.

La respuesta a la frecuencia es graficada en la figura 8.12 (parte b). Las


frecuencias audibles únicamente alcanzan la mitad de la gráfica; el lado derecho
de la curva de respuesta a la frecuencia queda toda por encima de la frecuencia
de Nyquist ¼.

El filtro pasa-bajos de un polo se utiliza con frecuencia para buscar las


tendencias en señales ruidosas. Por ejemplo, si se utiliza un controlador físico
y sólo interesan los cambios en el orden de 1/10 de segundo, se pueden suavizar
los valores con un filtro pasa-bajos cuyo punto de mitad de potencia es de 20 o
30 ciclos por segundo.

8.3.2 Filtro pasa-altos de un polo y un cero

A veces una señal de audio lleva una constante desviada que no se desea, o en
otras palabras, un componente de frecuencia cero. Por ejemplo, el espectro de
onda de la sección 5.3 casi siempre contiene un componente constante. Este es
inaudible, pero, debido a que especifica la potencia eléctrica que es enviada a
sus parlantes, su presencia reduce el nivel de volumen que usted puede alcanzar
sin distorsión. Otro nombre para un componente de señal constante es “DC”, que
significa “corriente directa”.

Una forma fácil y práctica para remover el componente de frecuencia cero de una
señal de audio es utilizar un filtro pasa-bajos de un polo para extraerlo, y
luego sustraer el resultado de la señal. La función de transferencia resultante
es uno menos la función de transferencia del filtro pasa-bajos:

H(Z) = 1 – (1 - p)/(1 – pZ-1) = p (1 - Z-1)/(1 – pZ-1)

El factor de 1 - p en el numerador de la función de transferencia del filtro


pasa-bajos es el factor de normalización requerido para que la ganancia sea uno
en la frecuencia cero.

Examinando el lado derecho de la ecuación (comparándolo con la fórmula general


para los filros compuestos), vemos que todavía hay un polo en el número real p,
y hay ahora también un cero en el punto 1. El gráfico del polo cero se muestra
en la figura 8.13 (parte a), y la respuesta a la frecuencia en la parte (b). (A
partir de ahora graficaremos únicamente respuestas hasta la frecuencia de
Nyquist ¼; en el ejemplo previo graficamos todo hasta la velocidad de las
muestras 2¼.)

8.3.3 Filtros de realce <”shelving”>

Generalizando el filtro anterior de un polo y un cero, suponga que ubicamos el


cero en un punto q, un número menor que uno pero cercano a este. El polo, en el
punto p, está situado de manera similar, y podría ser mayor que o menor que q,
es decir, a la derecha o a la izquierda respectivamente, pero con ambos, p y q
dentro del círculo unitario. Esta situación se diagrama en la figura 8.14.

En los puntos del círculo que están lejos de p y q los efectos del polo y del
cero son casi inversos (las distancias hasta ellos son casi iguales), de tal
manera que el filtro pasa aquellas frecuencias casi sin alteraciones. En las
vecindades de p y q, del otro lado, el filtro tendrá una ganancia mayor o menor
que uno dependiendo de cuál de los dos p o q está más cercano al círculo. Esta
configuración actúa de esta manera como un filtro realce de baja frecuencia.
(para fabricar un filtro realce de alta frecuencia hacemos lo mismo, sólo que
ubicamos p y q cercanos a -1 en lugar de 1.)

Para encontrar los parámetros de un filtro de realce dada una transición de


frecuencia ! (en unidades angulares) y ganancia de baja frecuencia g, escogemos
primero una distancia promedio d, como se ilustra en la figura, desde el polo y
el cero hacia el borde del círculo. Para valores pequeños de d, la región de
influencia es cerca de d radianes, así que simplemente hacemos d = ! para
obtener la transición de frecuencia deseada.

Ponemos luego el polo en p = 1 - d/√g y el cero en q = 1 - d/√g. La ganancia en


la frecuencia cero es entonces

(1 – q)/(1 – p) = g

tal como se quería. Por ejemplo, en la figura, d es 0.25 radianes y g es 2.

8.3.4 Filtro pasa-banda

Comenzando con los tres tipos de filtros mostrados arriba, todos con polos y
ceros de valor real, los transformamos ahora para operar en bandas localizadas
por fuera del eje real. Los filtros pasa-bajos, pasa-altos y de realce se
convertirán en filtros pasa-banda, banda de parada y de pico. Desarrollemos
primero el filtro pasa-banda. Suponga que queremos un centro de frecuencia a !
radianes y un ancho de banda de ¯, aproximadamente a p = 1 - ¯. Rote ahora este
valor en ! radianes en el plano complejo, es decir, multiplique por el número
complejo cos! + isen!. El nuevo polo queda en

P1 = (1 - ¯)(cos! + isen!)

Para tener una salida de valor real, esta debe estar emparejada con otro polo:

P2 = P1 = (1 - ¯)(cos! - isen!)

El gráfico polo-cero resultante se muestra en la figura 8.15.

El pico está aproximadamente (no exactamente) en el centro de frecuencia deseado


!, y la respuesta a la frecuencia cae en 3 decibeles aproximadamente ¯ radianes
por encima y por debajo de este. Usualmente se quiere normalizar el filtro para
tener una ganancia pico cercana a la unidad; esto se hace multiplicando la
entrada o la salida por el producto de las distancias de los dos polos al pico
en el círculo, o (muy aproximadamente):

¯*(¯ + 2!)

Para alguna aplicaciones es deseable adicionar un cero en los puntos 1 y -1, de


tal manera que la ganancia cae a cero en las frecuencias angulares 0 y ¼.

8.3.5 Filtro pico y banda de parada

De la misma manera un filtro pico se obtiene de un filtro de realce rotando el


polo y el cero, y proveyendo un polo y un cero conjugados, como se muestra en la
figura 8.16. Si el centro de frecuencia deseado es ! y los radios del polo y
del cero son p y q, entonces ubicamos el polo y el cero de arriba en

P1 = p • (cos! + isen!)

Q1 = q • (cos! + isen!)

Como un caso especial, colocar el cero sobre el círculo unitario da un filtro de


banda de parada; en este caso la ganancia en el centro de frecuencia es cero.
Este es análogo al filtro pasa-altos de un polo y un cero visto anteriormente.

8.3.6 Filtros Butterworth

Un filtro con un polo real y un cero real puede ser configurado como un filtro
de realce, como un filtro pasa-altos (poniendo el cero en el punto 1) o como un
filtro pasa-bajos (poniendo el cero a -1). La respuesta a la frecuencia de estos
filtros es muy contundente; en otras palabras, las regiones de transición son
amplias. Con frecuencia es deseable un filtro más nítido, sea de realce, pasa-
altos o bajos, cuyas dos bandas sean más planas y separadas por una región de
transición más estrecha. Un procedimiento prestado del mundo de los filtros
análogos transforma filtros de un polo y un cero a sus correspondientes filtros
Butterworth, los cuales poseen regiones de transición más estrechas. Este
procedimiento se describe clara y elegantemente en [Ste96]. La derivación
utiliza más conocimientos matemáticos que los que hemos desarrollado aquí, y
simplemente presentaremos el resultado, sin derivarlo.

Para hacer un filtro Butterworth pasa-altos, pasa-bajos o filtro de realce,


suponga que tanto el polo como el cero están dados por la expresión

(1 – r2)/(1 + r2)

donde r es un parámetro con rango de 1 a ∞. Si r = 0 este es el punto 1, y si


r = ∞ es -1.

Entonces, por razones que quedarán en el misterio, reemplazaremos el punto (ya


sea polo o cero) por n puntos dados por:

[(1 – r2) – (2rsen(®))i]/[1 + r2 + 2rsen(®)]

donde el rango de ® está sobre los valores:

(¼/2)(1/n – 1), (¼/2)(3/n – 1),...,(¼/2)((2n – 1)/n - 1)

En otras palabras, ® queda en n ángulos igualmente espaciados entre -¼/2 y ¼/2.


Los puntos están organizados en el plano complejo como se muestra en la figura
8.17. Ellos están sobre un círculo que cruza el punto de valor real original,
que corta a su vez el círculo unitario en ángulos rectos.

Un buen estimado para la frecuencia de corte o de transición definida por estas


colecciones circulares de polos o ceros es sencillamente el punto donde el
círculo intersecta al círculo unitario, correspondiendo a ® = ¼/2. Esto da el
punto

[(1 – r2) – 2ri]/(1 + r2)

el cual, luego de algo de álgebra, da una frecuencia angular igual a

¯ = 2arctan(r)

La figura 8.18 (parte a) muestra un diagrama de polo cero y respuesta a la


frecuencia para un filtro pasa-bajos Butterworth con tres polos y tres ceros. La
parte (b) muestra la respuesta a la frecuencia del filtro pasa-bajos y de los
otros tres filtros que se obtiene al escoger diferentes valores de ¯ (y por lo
tanto de r) para los ceros, mientras deja los polos estacionarios. Mientras los
ceros progresan de ¯ = ¼ a ¯ = 0, el filtro, que comienza como un filtro pasa-
bajos, se convierte en un filtro de realce y luego en uno pasa-altos.

8.3.7 Estirando el círculo unitario con funciones racionales

En la sección 8.3.4 vimos una forma simple de convertir un filtro pasa-bajos en


uno pasa-banda. Es tentador aplicar el mismo método para convertir nuestro
filtro pasa-bajos Butterworth en un filtro pasa-banda de alta calidad; pero si
queremos preservar la alta calidad del filtro Butterworth debemos ser más
cuidadosos que antes en el diseño de la transformación utilizada. En esta
sección prepararemos la manera de fabricar el filtro Butterworth pasa-banda
usando un tipo de transformaciones racionales del plano complejo, las cuales
preservan el círculo unitario.

Esta discusión es adaptada de [PB87], págs.201-206 (estoy agradecido con Julius


Smith por este punto). Aquí la transformación es llevada en el tiempo continuo,
pero hemos adaptado el método para operar en el tiempo discreto, con el fin de
hacer una discusión auto-contenida.

La idea es comenzar con cualquier filtro con una función de transferencia como
se vio anteriormente:

H(Z) = [(1 - Q1Z-1)...(1 – QjZ-1)]/[(1 – P1Z-1)...(1 - PkZ-1)]

cuya respuesta a la frecuencia (la ganancia a la frecuencia !) está dada por:

|H(cos(!) + isen(!))|

Suponga ahora que podemos encontrar una función racional, R(Z), que distorsiona
el círculo unitario de una manera deseable. Que R sea una función racional
significa que puede escribirse como el cociente de dos polinomios (por ejemplo
la función H es una función racional). Que R envíe puntos sobre el círculo
unitario a otros puntos sobre el mismo círculo unitario es precisamente la
condición de que |R(Z)| = 1 siempre que Z = 1. Puede comprobarse fácilmente que
cualquier función de la forma

R(Z) = U • (AnZn + An-1Zn-1 + ... + A0)/(A0Zn + A1Zn-1 + … + An)

(donde |U| = 1) tiene esta propiedad. El mismo razonamiento de la sección 8.2.2


confirma que |R(Z)| = 1 siempre que Z = 1.

Una vez tenemos una función racional apropiada R, podemos simplemente componer
esta con la función de transferencia original H para fabricar una nueva función
racional,

J(Z) = H(R(Z))

La ganancia del nuevo filtro J en la frecuencia ! es entonces igual a la de H a


una diferencia de frecuencia Á, escogida de tal manera que:

cos(Á) + isen(Á) = R(cos(!) + isen(!))

La función R mueve puntos alrededor del círculo unitario; J en cualquier punto


es igual a H sobre el punto R que lo mueve.

Por ejemplo, suponga que comenzamos con un filtro pasa-bajos de un cero y un


polo:

H(Z) = (1 + Z-1)/(1 - gZ-1)

y aplicamos la función

R(Z) = -Z2 = -(1 • Z2 + 0 • Z + 0)/(0 • Z2 + 0 • Z + 1)

Geométricamente esta opción de R estira el círculo unitario uniformemente a dos


veces su circunferencia y lo envuelve completamente dos veces. Los puntos 1 y -1
son enviados ambos al punto -1, y los puntos i y -i son enviados al punto 1. La
función de transferencia resultante es

J(Z) = (1 + Z-2)/(1 – gZ-2)

= [(1 – Z-1)(1 + Z-1)]/[(1 – i√gZ1)(1 + i√gZ1)]

Las gráficas del polo cero de H y J se muestran en la figura 8.19. Partiendo de


un filtro pasa-bajos terminamos con un filtro pasa-banda. Los puntos i y -i a
los cuales R envía a 1 (donde la ganancia del filtro original es la más alta)
se convierten en los puntos de más alta ganancia para el nuevo filtro.

8.3.8 Filtro Butterworth pasa-banda

Podemos aplicar la transformación R(Z) = -Z2 para convertir el filtro


Butterworth en un filtro pasa-banda de alta calidad con centro de frecuencia
¼/2. Una transformación adicional puede aplicarse después para cambiar el centro
de frecuencia a cualquier valor ! deseado entre 0 y ¼. La transformación será
de la forma,

S(Z) = (aZ + b)/(bZ + a)

donde a y b son números reales y ninguno es cero. Este es un caso particular de


la forma general dada anteriormente para las funciones racionales que preservan
el círculo unitario. Tenemos S(1) = 1 y S(-1) = -1, y las mitades superior e
inferior del círculo unitario son transformadas simétricamente (si Z va a W
entonces Z va a W). El efecto cualitativo de la transformación S es aplastar
los puntos del círculo unitario hacia 1 o -1.

En particular, dado un centro de frecuencia ! deseado, queremos escoger S de


tal manera que:

S(cos(!) + isen(!)) = i

Si hacemos R = -Z2 como antes, y dejamos que H sea la función de transferencia


para un filtro pasa-bajos Butterworth, entonces el filtro combinado con la
función de transferencia H(R(S(Z))) será un filtro pasa-banda con centro de
frecuencia !. Al resolver para a y b da:

a = cos(¼/4 - !/2), b = sen(¼/4 - !/2)

La nueva función de transferencia, H(R(S(Z))), tendrá 2n polos y 2n ceros


(siendo n el grado del filtro Butterworth H).

Conocer la función de transferencia es bueno, pero es mucho mejor conocer la


localización de todos los polos y ceros del nuevo filtro, los cuales requerimos
poder computar usando filtros elementales. Si Z es un polo de la función de
transferencia J(Z) = H(R(S(Z))), esto es, si J(Z) = ∞, entonces R(S(Z)) debe
ser un polo de H. Lo mismo para los ceros. Para encontrar un polo o cero, sea
R(S(Z)) = W , donde W es un polo o un cero de H, y resuelve para Z. Esto da:

-[(aZ + b)/(bZ + a)]2 = W

(aZ + b)/(bZ + a) = ±√-W

Z = (±a√-W – b)/(∓b√-W + a)

(Aquí a y b están tal cual se dieron antes y utilizamos el hecho de que a2 + b2


= 1). Un ejemplo de un gráfico de polo-cero y de respuesta a la frecuencia de J
se muestra en la figura 8.20.

8.3.9 Coeficientes que varían con el tiempo

En algunos diseños de filtro recursivos, cambiar los coeficientes del filtro


puede inyectar energía al sistema. Una analogía física es la de un niño en su
columpio. El niño oscila hacia atrás y hacia adelante con la frecuencia de
resonancia del sistema, y empujar o halar del niño inyecta o extrae energía del
sistema suavemente. Sin embargo, si usted decide acortar la cadena o mover el
columpio usted mismo, puede inyectar una cantidad impredecible de energía al
sistema. Lo mismo sucede cuando usted cambia los coeficientes en un filtro
resonante con recirculación.

Los filtros simples de un polo y un cero utilizados aquí no tienen esta


dificultad; si la ganancia de retroalimentación o de ante-alimentación es
cambiada suavemente (en el sentido de una envolvente de amplitud) la salida se
comportará también de manera suave. Pero una sutileza aparece al tratar de
normalizar la salida de un filtro recursivo, cuando la ganancia de
retroalimentación es cercana a uno. Por ejemplo, suponga que tenemos un filtro
pasa-bajos de un polo con ganancia 0.99 (para una frecuencia de corte de 0.01
radianes, o 70 Hertz a la velocidad de muestras que es usual). Para normalizarlo
para una unidad de ganancia en DC, multiplicamos por 0.01. Suponga que ahora
queremos el doble de la frecuencia de corte cambiando la ganancia ligeramente a
0.98. Esto está bien, excepto que el factor de normalización súbitamente se
dobla. Si multiplicamos la salida del filtro por el factor de normalización, la
salida súbitamente, pero sólo por un momento, saltará a un factor de dos.

El truco es normalizar a la entrada del filtro, no a la salida. La figura 8.21


(parte a) muestra un filtro con recirculación complejo, con ganancia de
retroalimentación P, normalizado a la entrada por 1 - |P|, de tal forma que el
pico de ganancia es uno. La parte (b) muestra la manera incorrecta de hacerlo,
multiplicando a la salida.

Las cosas se vuelven más complicadas cuando varios filtros elementales con
recirculación se ponen en serie, ya que el factor de normalización correcto
está, en general, en función de todos los coeficientes. Una aproximación posible
es que cuando se vaya a cambiar rápidamente algún filtro, normalizar cada
entrada por separado, y multiplicar luego la salida, finalmente, por la
corrección que se necesite posteriormente.

8.3.10 Respuesta al impulso de los filtros con recirculación

En la sección 7.4 analizamos la respuesta al impulso de un filtro peine con


recirculación, del cual el filtro pasa-bajos de un polo es un caso especial. La
figura 8.22 muestra el resultado para dos filtros pasa-bajos y un filtro
resonante complejo de un polo. Todos son filtros elementales con recirculación
como los introducidos en la sección 8.2.3. Cada uno está normalizado para tener
una unidad de ganancia como máximo.

En el caso de un filtro pasa-bajos, la respuesta al impulso se alarga (y


desciende) cuando el polo se acerca más a uno. Suponga que el polo está en un
punto 1 – 1/n (de tal forma que la frecuencia de corte es 1/n radianes). El
factor de normalización es también 1/n. Después de n puntos, la salida
disminuye por un factor de

(1 – 1/n)n ≈ 1/e

donde e es la constante de Euler, aproximadamente 2.718. Se puede decir que el


filtro tiene un ajuste de tiempo de n muestras. En la figura n = 5 para la
parte (a) y n = 10 para la parte (b). En general, el ajuste del tiempo (en
muestras) es aproximadamente uno sobre la frecuencia de corte (en unidades
angulares).

La situación se vuelve más interesante cuando miramos un filtro resonante de un


polo, esto es, uno cuyo polo está sobre el eje real. En la parte (c) de la
figura, el polo P tiene un valor absoluto de 0.9 (como en la parte b), pero su
argumento se ajusta a 2¼/10 radianes. Obtenemos el mismo ajuste de tiempo de la
parte (b), pero la salida timbra a la frecuencia de resonancia (y de esta manera
a un periodo de 10 muestras en este ejemplo).

Una pregunta natural es cuántos períodos de timbrado obtenemos antes de que el


filtro decaiga a una fuerza de 1/e? Si el polo de un filtro resonante tiene una
magnitud de 1 – 1/n como se muestra arriba, vimos en la sección 8.2.3 que el
ancho de banda (llamado b) es aproximadamente 1 – 1/n, y vemos aquí que el
ajuste de tiempo es aproximadamente n. La frecuencia de resonancia (llamada !)
es el argumento del polo, y el período en muestras del timbrado es 2¼/!. El
número de períodos que hacen el ajuste de tiempo es, de esta manera:

n/(2¼/!) = (1/2¼)(!/b) = q/2¼

donde q es la calidad del filtro, definida como el centro de frecuencia


dividida por el ancho de banda. Los filtros resonantes están usualmente
especificados en términos del centro de frecuencia y de “q”, en lugar del ancho
de banda.
8.3.11 Filtros pasa-todo

A veces un filtro se aplica para obtener un cambio de fase deseado, en lugar de


alterar las amplitudes de los componentes de la frecuencia de un sonido. Para
hacer esto podríamos necesitar una manera de diseñar filtros con una respuesta a
la frecuencia constante unitaria, pero que cambie la fase de una sinusoide de
entrada de una manera que dependa de su frecuencia. Ya vimos en el capítulo 7
que un retraso de longitud d introduce un cambio de fase de -d!, a una
frecuencia angular !. Otro tipo de filtros llamados filtros pasa-todo, puede
hacer cambios de fase, las cuales pueden ser las funciones más interesantes de
!.

Para diseñar un filtro pasa-todo, comenzamos con dos hechos: primero un filtro
elemental con recirculación y uno elemental sin recirculación se cancelan entre
sí si tienen el mismo coeficiente de ganancia. En otras palabras, si una señal
pasa a través de un filtro de un cero, ya sea real o compleja, el efecto puede
revertirse al aplicarse secuencialmente un filtro de un polo, y viceversa.

El segundo hecho es que un filtro elemental sin recirculación, de la segunda


forma tiene la misma respuesta a la frecuencia que el de la primera forma; ellos
sólo difieren en la respuesta a la fase. Así si combinamos un filtro elemental
con recirculación con otro elemental sin recirculación de la segunda forma, las
respuestas a la frecuencia se cancelan (para una ganancia plana independiente de
la frecuencia) pero la respuesta a la fase no es constante.

Para encontrar la función de transferencia, escogemos el mismo número complejo


P < 1 como coeficiente para ambos filtros elementales y multiplicamos sus
funciones de transferencia:

H(Z) = (P – Z-1)/(1 - PZ-1)

El coeficiente P controla tanto la ubicación de un polo (en P mismo) y la del


cero (en 1/P). la figura 8.23 muestra la respuesta a la fase del filtro pasa-
todo para cuatro opciones de valor real del coeficiente p. En las frecuencias
0, ¼ y 2¼ la respuesta a la fase es precisamente la de un retraso de una
muestra; pero para las frecuencias en el medio, la respuesta a la fase es
curvada hacia arriba o hacia abajo dependiendo del coeficiente.

Los coeficientes complejos dan curvas de respuesta a la fase similares, pero las
frecuencias a las cuales ellos cruzan la línea diagonal en la figura es cambiada
según el argumento del coeficiente P.

8.4 Aplicaciones

Los filtros son utilizados en un amplio rango de aplicaciones tanto en la


ingeniería del audio como en la música electrónica. La primera incluye, por
ejemplo, ecualizadores, divisores de frecuencia de parlantes, convertidores de
velocidades de muestras, y supresores de componentes DC (que ya utilizamos en
los primeros capítulos). Aquí sin embargo, nos ocuparemos de las aplicaciones
específicamente musicales.

8.4.1 Síntesis sustractiva

La síntesis sustractiva es una técnica que utiliza filtros para dar forma a la
envolvente espectral de un sonido, formando otro sonido, usualmente preservando
las cualidades del sonido original tales como su afinación, su dureza, lo
ruidoso, o lo granuloso de este. La envolvente espectral del sonido resultante
es el producto de la envolvente del sonido original con la respuesta a la
frecuencia del filtro. La figura 8.24 muestra una configuración posible de la
fuente, el filtro, y el resultado.
El filtro puede ser constante o variante en el tiempo. Siendo ya ampliamente
utilizada a mediados de la década de 1950, la síntesis sustractiva tuvo su auge
con la introducción del filtro controlado por voltaje (VCF), el cual estuvo
ampliamente disponible en a mediados de la década de 1960 con la aparición de la
síntesis modular. Un VCF típico tiene dos entradas: una para el sonido que se va
a filtrar y otra para variar la frecuencia central o de corte.

Un uso popular de un VCF es controlar el centro de frecuencia de un filtro


resonante del mismo generador ADSR que controla la amplitud; un posible diagrama
de bloques se muestra en la figura 8.25. En esta configuración, la porción con
mayor volumen de una nota (el volumen controlado de manera aproximada por el
multiplicador de la parte inferior) puede también hacerse sonar más brillante,
utilizando el filtro, que las partes más silenciosas; esto puede simular la
evolución espectral de las cuerdas o de los instrumentos de viento metal durante
la vida de una nota.

8.4.2 Seguidor de envolvente

Es con frecuencia deseable utilizar la potencia variable en el tiempo de una


señal de entrada para disparar o controlar un proceso musical. Para hacer esto
necesitaremos un proceso para medir la potencia de una señal de audio. Ya que la
mayoría de las señales de audio pasan por el cero muchas veces por segundo, no
será suficiente tomar valores instantáneos de la señal para medir su potencia;
en lugar de eso, debemos calcular la potencia promedio en un intervalo de tiempo
lo suficientemente largo para que sus variaciones no vayan a mostrar incremento
en la potencia estimada, pero lo suficientemente corto como para que los cambios
en la señal sean reportados rápidamente. Un proceso de cómputo que provea un
estimado de la variación de la potencia en el tiempo de una señal es llamado un
seguidor de envolvente.

La salida de un filtro pasa-bajos puede ser vista como un movimiento promedio de


su entrada. Por ejemplo, suponga que aplicamos un filtro pasa-bajos de un polo
normalizado con coeficiente p, como en la figura 8.21, a una señal de entrada
x[n]. La salida (llamada y[n]) es la suma de la salida retrasada p veces, con
la entrada 1 - p veces:

y[n] = p • y[n – 1] + (1 - p) • x[n]

de tal manera que cada entrada está promediada, con peso 1 - p, en la salida
previa para producir una nueva salida. De tal manera que usted puede hacer un
movimiento promedio del cuadrado de una señal de audio utilizando el diagrama de
la figura 8.26. La salida es un promedio que varía en el tiempo, de la potencia
instantánea x[n]2, y el diseño del filtro pasa-bajos controla, entre otras
cosas, el ajuste del tiempo del movimiento promedio.

Para adentrarnos más en el diseño de un filtro pasa-bajos apropiado para un


seguidor de envolvente, lo analizamos desde el punto de vista del espectro de la
señal. Si, por ejemplo, ponemos una sinusoide de valor real:

x[n] = a • cos(®n)

el resultado de su cuadrado es:

x[n]2 = (a2/2)(cos(2®n) + 1)

y así, si el filtro pasa-bajos detiene efectivamente el componente de frecuencia


2® obtendremos aproximadamente la constante a2/2 la cual es en realidad la
potencia promedio.

La situación para señales con varios componentes es similar. Suponga que la


señal de entrada es ahora,

x[n] = a • cos(®n) + b • cos(¯n)

cuyo espectro es graficado en la figura 8.27 (parte a). (Hemos omitido los dos
términos de las fases, pero no tendrán efecto en el resultado.) Al elevar al
cuadrado la señal, se produce el espectro mostrado en la parte (b) (ver sección
5.2).) Podemos obtener el valor fijo deseado de (a2 + b2)/2 simplemente
filtrando todos los demás componentes; idealmente el resultado será una señal
constante DC. En tanto filtremos todos los parciales, además de las diferencias
de afinación, lograremos una salida estable que estima correctamente la potencia
promedio.

Los seguidores de envolventes pueden ser utiliados también en señales ruidosas,


las cuales pueden pensarse como señales con espectros densos. En esta situación
habrá diferencias de frecuencias arbitrariamente cercanas a cero, y filtrarlas
por completo será imposible; siempre tendremos fluctuaciones a la salida, pero
ellas decrecerán proporcionalmente en tanto la banda de paso se estrecha.

8.4.3 Modulación simple de banda lateral

Tal como lo vimos en el capítulo 5, al multiplicar dos sinusoides reales tenemos


como resultado una señal con dos componentes nuevos que son la suma y la
diferencia de las frecuencias originales. Si llevamos a cabo la misma operación
con sinusoides complejas, obtenemos únicamente una nueva frecuencia resultante;
este es un resultado de la mayor simplicidad matemática de las sinusoides
complejas comparadas con las reales. Si multiplicamos una sinusoide compleja 1,
Z, Z2,... con otra 1, W, W2,... el resultado es 1, ZW, (ZW)2,... la cual es otra
sinusoide compleja cuya frecuencia, /(ZW), es la suma de las dos frecuencias
originales.

En general, ya que las sinusoides complejas tienen propiedades más simples que
las reales, es con frecuencia útil hacer la conversión de una sinusoide real a
una compleja. En otras palabras, de la sinusoide real:

x[n] = a • cos(®n)

(con un pico espectral de amplitud a/2 y frecuencia !) quisiéramos una manera


de computar la sinusoide compleja:

X[n] = a(cos(!n) + isen(!n))

de tal manera que

x[n] = re(X[n])

Quisiéramos un proceso lineal para hacer esto, de tal manera que la


superposición de las sinusoides sea lleve a cabo como si estuvieran separadas.

Por supuesto hubiéramos podido escoger las sinusoides complejas igualmente con
frecuencia -!:

X'[n] = a(cos(!n) - isen(!n))

y en efecto x[n] es precisamente la mitad de la suma de las dos. En escencia


necesitamos un filtro que pase a través de las frecuencias positivas (en
realidad las frecuencias entre 0 y ¼, corresponden a los valores de Z en la
mitad superior del círculo unitario complejo)

Uno puede diseñar un filtro así diseñando un filtro pasa-bajos con frecuencia de
corte ¼/2, y luego ejecutar una rotación por ¼/2 radianes utilizando la técnica
de la sección 8.3.4. Sin embargo puede hacerse más fácilmente usando dos redes
de filtros pasa-bajos especialmente diseñada, con coeficientes reales.

Llamando la función de transferencia de los dos filtros H1 y H2 diseñamos los


filtros de tal manera que

¼/2 0 < /(Z) < ¼


/(H1(Z)) - /(H2(Z)) ≈
-¼/2 -¼ < /(Z) < 0

o en otras palabras

H1(Z) ≈ iH2(Z), 0 < /(Z) < ¼

H2(Z) ≈ -iH2(Z), -¼ < /(Z) < 0

Luego, para cualquier señal de entrada de valor real x[n] simplemente formamos
un número complejo a[n] + ib[n] donde a[n] es la salida del primer filtro y
b[n] es la salida del segundo. Cualquier componente sinusoidal complejo de x[n]
(llamado Zn) será transformado a:

2H1(Z) 0 < /(Z) < ¼


H1(Z) + iH2(Z) ≈
0 para los demás valores

Habiendo comenzado con una señal de valor real, cuya energía es dividida por
igual en frecuencias positivas y negativas, terminamos con una de valor real con
sólo frecuencias positivas.

8.5 Ejemplos

En esta sección introducimos primero algunos filtros prefabricados fáciles de


usar disponibles en Pd para desarrollar ejemplos que muestren aplicaciones de la
sección previa. Luego mostraremos algunas aplicaciones más sofisticadas que
requieren de filtros especialmente diseñados.

Filtros pasa-altos, pasa-bajos y pasa-banda prefabricados

Los parches H01.low-pass.pd, H02.high-pass.pd y H03.band-pass.pd (fgura 8.28)


muestran filtros de Pd, que implementan diseños de filtros descritos en las
secciones 8.3.1, 8.3.2 y 8.3.4. Dos de los parches usan también un generador de
ruido que no hemos introducido anteriormente. Necesitaremos de cuatro nuevos
objetos Pd:

lop~: filtro pasa-bajos de un polo. La entrada izquierda toma una señal que se
va a filtrar, y la entrada derecha toma los mensajes de control para ajustar la
frecuencia de corte del filtro. El filtro está normalizado de tal manera que la
ganancia es uno cuando la frecuencia es 0.

hip~: filtro pasa-altos de un polo y un cero, con las mismas entradas y salidas
de lop~, normalizado para tener ganancia uno a la frecuencia de Nyquist.

bp~: filtro resonante. La entrada de la mitad toma mensajes de control para


ajustar el centro de frecuencia, y la entrada de la derecha para ajustar “q”.

noise: generador de ruido blanco. Cada muestra es un número seudo-aleatorio,


distribuidos uniformemente de -1 a 1.

Los primeros tres parches de los ejemplos muestran estos tres filtros (ver la
figura 8.28). los objetos lop~ y bp~ se demuesran con ruido en su entrada; hip~
se muestra removiendo el componente DC (frecuencia cero) de una señal.

Filtro pasa-banda variante en el tiempo, prefabricado

El filtrado pasa-banda variante en el tiempo, tal como se utiliza con frecuencia


en la síntesis sustractiva clásica (sección 8.4.1), puede hacerse utilizando el
objeto vcf~, introducido aquí:

vcf~: un filtro pasa-banda “controlado por voltaje”, similar a bp~, pero con una
señal de entrada para controlar el centro de frecuencia. Tanto bp~ como vcf~ son
filtros resonantes de un polo como los desarrollados en la sección 8.3.4; bp~
tiene como salida la parte real de la señal resultante, mientras que vcf~ tiene
a la salida las partes real e imaginaria por separado.

El ejemplo H04.filter.sweep.pd (figura 8.29) demuestra el uso del objeto vcf~


para una tarea simple y característica de síntesis sustractiva. Un objeto
phasor~ (en la parte superior) crea una onda diente de sierra para filtrar.
(Esta no es en especial una buena práctica ya que no estamos controlando la
posibilidad del sobre-doblado; un mejor generador de onda diente de sierra para
este propósito será desarrollado en el capítulo 10.) El segundo objeto phasor~
(etiquetado “LFO for sweep”) controla el centro de frecuencia variable en el
tiempo. Después de hacer los ajustes para la profundidad y un centro de
frecuencia base (dado en unidades MIDI), el resultado se convierte Hertz (usando
el objeto tabread4~ <en el parche no está la tabla “mtof” y por eso no funciona;
en el parche siguiente, H05.filter.floyd.pd se encuentra el subparche pd
conversion-tables que contiene la tabla; copiar y pegar...>) y es pasado a vcf~
para ajustar su centro de frecuencia. Otro ejemplo del uso del objeto vcf~ para
la síntesis sustractiva se demuestra en el ejemplo H05.filter.floyd.pd.

Seguidores de envolvente

El ejemplo H06.envelope.follower.pd muestra una simple y didáctica realización


del seguidor de envolvente descrita en la sección 8.4.2. Una aplicación
interesante del seguidor de envolvente se muestra en el ejemplo
H07.measure.spectrum.pd (figura 8.30, parte a). Una muestra famosa de una
campana es ejecutada en lazo como sonido de chequeo. En lugar de obtener la
media cuadrática general de la potencia, nos gustaría estimar la potencia y la
frecuencia de cada uno de sus parciales. Para hacer esto movemos un filtro pasa-
bajos arriba y abajo en la frecuencia, escuchando el resultado y/o mirando la
potencia de salida del filtro utilizando un seguidor de envolvente. (Utilizamos
dos filtros pasa-banda en serie para un mejor aislamiento de los parciales; este
no es un diseño especialmente bueno de filtro, pero trabajará en este contexto.)
Cuando el filtro es afinado en un parcial, el seguidor de envolvente reporta su
fortaleza.

El ejemplo H08.heterodyning.pd (parte (b) de la figura) muestra una manera


alternativa para mostrar los parciales de una señal de entrada; tiene la ventaja
de reportar la fase así como la fortaleza. Primero modulamos el parcial deseado
a cero frecuencia. Utilizamos una sinuside de valor complejo como un modulador,
de tal manera que obtenemos sólo una banda lateral por cada componente de la
entrada. La frecuencia de chequeo es la única frecuencia que se modula a DC; las
demás van a otras partes. Luego hacemos pasa-bajos de la señal compleja
resultante. (Podemos utilizar un filtro pasa-bajos de valor real por separado
para las partes real e imaginaria.) Este remueve escencialmente todos los
parciales exceptuando el DC, el cual luego recolectamos. Esta técnica es la base
del análisis de Fourier, materia del capítulo 9.

Modulación de banda lateral simple

Como se describió en la sección 8.4.3, un par de filtros pasa-todo pueden ser


construidos para dar aproximadamente ¼/2 de fase de diferencia para frecuencias
positivas y -¼/2 para las negativas. El diseño de estos pares está más allá del
objetivo de esta discusión (ver por ejemplo, [Reg93]) pero Pd provee una
abstracción, hilbert~, para hacer esto. El ejemplo H09.ssb.modulation.pd,
mostrado en la figura 8.31, demuestra cómo utilizar la abstracción hilbert~ para
hacer la modulación de banda lateral de una señal. La transformación Hilbert
data de la era análoga [Str95, págs.129-132].

Las dos salidas de hilbert~, consideradas como las partes real e imaginaria de
una señal de valor complejo, son multiplicadas por una sinusoide (a la derecha
en la figura), y la parte real es la salida. Los componentes de la señal
resultante son aquellos de la entrada cambiados por una frecuencia (positiva o
negativa) que se especifica en la caja de números.

Utilizando filtros elementales: de realce y de pico

No hay un conjunto finito de filtros que pudiera llenar todas las necesidades
posibles, y por eso Pd provee los filtros elementales de las secciones 8.2.1-
8.2.3 en forma no elaborada, de tal manera que el usuario pueda suministrar los
coeficientes del filtro explícitamente. En esta seccion describiremos parches
que realizan los filtros de realce y de pico de las secciones 8.3.3 y 8.3.5
directamente desde los filtros elementales. Primero introducimos los seis
objetos Pd que realizan los filtros elementales:

rzero~, rzero_rev~, rpole~: filtros elementales con coeficientes de valor real


operando en señales de valor real. Los tres implementan filtros sin
recirculación del primer y segundo tipo, y el filtro con recirculación. Todos
ellos tienen una entrada, a la derecha, para suministrar el coeficiente que
ajusta la localización del cero o del polo. La entrada para el coeficiente (así
como la entrada izquierda de la señal a filtrar) toma señales de audio. No se
ejecuta examen de estabilidad.

czero~, czero_rev~, cpole~: filtros elementales con coeficientes de valor


complejo, operando sobre señales de valor complejo, correspondientes a los
anteriores de valor real. En lugar de dos entradas y de una salida, cada uno de
estos filtros tiene cuatro entradas (partes real e imaginaria de la señal a
filtrar, y partes real e imaginaria del coeficiente) y dos salidas para la señal
compleja de salida.

Los parches de los ejemplos utilizan un par de abstracciones para graficar la


respuesta a la frecuencia y a la fase de los filtros según se explicó en el
ejemplo H10.measurement.pd. El ejemplo H11.shelving.pd (figura 8.32, parte a)
muestra cómo fabricar un filtro shelving. Un filtro elemental sin recirculación
(rzero~) y uno elemental con recirculación (rpole~) se ponen en serie. Como
podría sugerir el análisis de la sección 8.3.9, el objeto rzero~ es colocado de
primero.

El ejemplo H12.peaking.pd (parte (b) de la figura) implementa un filtro pico.


Aquí el polo y el cero son rotados por un ángulo ! para controlar el centro de
frecuencia del filtro. La ganancia del ancho de banda y del centro de frecuencia
son iguales a la ganancia de la frecuencia de realce y del DC del filtro de
realce correspondiente.

El ejemplo H13.butterworth.pd demuestra un filtro Butterworth de realce, de tres


polos y tres ceros. El filtro mismo es una abstracción, butterworth3~, para
reutilizar con facilidad.

Haciendo y utilizando filtros pasa-todo.

El ejemplo H14.all.pass.pd (la figura 8.33, parte a) muestra cómo fabricar un


filtro pasa-todo, partiendo de un filtro sin recirculación de la segunda forma
(rzero_rev~) y un filtro con recirculación (rpole~). El coeficiente, que va de
-1 a 1, está controlado en centésimos.
El ejemplo H15.phaser.pd (parte b de la figura) muestra cómo utilizar cuatro
filtros pasa-todo para hacer un fasor clásico. El fasor trabaja sumando la señal
de entrada con una versión de fase alterada de este, haciendo efectos de
interferencia. La cantidad de cambio de la fase es variada en el tiempo al
variar el coeficiente (compartido) de los filtros pasa-todo. El efecto general
es algo similar a un flanger (filtro peine variable en el tiempo) pero el fasor
no impone una afinación como lo hace el filtro peine.

Ejercicios

1. Un filtro elemental con recirculación tiene un polo en i/2. A qué frecuencia


angular está su mayor ganancia, y cuál es su valor? A qué frecuencia es su
ganancia más baja y cuál es su valor?

2. Un filtro de realce tiene un polo en 0.9 y un cero en 0.8. Cuáles son: la


ganancia DC; la ganancia en la frecuencia de Nyquist; la frecuencia de
transición aproximada?

3. Suponga que un filtro con recirculación complejo tiene un polo en P. Suponga


además que usted quiere combinar su salida real e imaginaria para fabricar una
señal única, de valor real equivalente a la de un filtro con dos polos en P y
en P. Cómo debería usted ponderar las dos salidas?

4. Suponga que desea diseñar un filtro pico con ganancia 2 a 1000 Hertz y ancho
de banda de 200 Hertz (a una velocidad de muestras de 44100 Hertz). Dónde,
aproximadamente debería poner el polo y el cero superiores?

5. En la misma situación, dónde debería poner el polo y el cero (superiores)


para remover una sinusoide a 1000 Hertz por completo, mientras atenúa sólo 3
decibeles en los 1001 Hertz?

6. Un filtro complejo de un polo es excitado por un impulso para fabricar un


sonido a 1000 Hertz, el cual decae 10 decibeles en un segundo (a una velocidad
de muestras de 44100 Hertz). Dónde debería ubicar el polo? Cuál es el valor de
“q”?
Capítulo 9

Análisis y resíntesis de Fourier

Entre las aplicaciones de los filtros discutidos en el capítulo 8, vimos cómo


utilizar el heterodino, combinado con un filtro pasa-bajo, para encontrar la
amplitud y la fase de un componente sinusoidal de una señal (pág.”257”). En este
capítulo refinaremos esta técnica dentro de lo que se ha llamado el análisis de
Fourier. En su forma más simple el análisis de Fourier, toma camo su entrada
cualquier señal periódica (de período N) y sus salidas son amplitudes de valor
complejo de sus N posibles componentes sinusoidales. Estas N amplitudes
complejas pueden ser utilizadas, en teoría, para reconstruír exactamente la
señal original. Esta reconstrucción es llamada resíntesis de Fourier.

En este capítulo comenzaremos por desarrollar la teoría del análisis y la


resíntesis de Fourier de señales periódicas en muestras. Luego mostraremos cómo
aplicar la misma técnica para señales arbitrarias, periódicas o no. Fnalmente
desarrollaremos algunas aplicaciones comunes tales como el vocoder de fase.

9.1 Análisis de Fourier para señales periódicas

Suponga que X[n] es una señal de valor complejo que se repite cada N muestras.
(Continuamos con el uso de las señales de valor complejo en lugar de valor real
para para simplificar las matemáticas.) Debido a su período N, los valores de
X[n] para n = 0,...,N - 1 determinan a X[n] para todos los valores enteros de
n.

Suponga, además, que X[n] puede escribirse como una suma de sinusoides
complejas de frecuencia 0, 2¼/N, 4¼/N,...,2(N -1)¼/N. Estos son los parciales,
comenzando con el cero, para una señal de período N. Nos detenemos en el
término N-ésimo debido a que el siguiente deberá tener frecuencia 2¼,
equivalente a la frecuencia 0, que ya está en el listado.

Dados los valores de X, deseamos encontrar las amplitudes complejas de los


parciales. Suponga que queremos el k-ésimo parcial, donde 0 ≤ k < N. La
frecuencia de este parcial es 2¼k/N. Podemos encontrar su amplitud compleja
modulando hacia abajo 2¼k/N radianes de frecuencia por muestra, de tal manera
que el k-ésimo parcial esté modulado a la frecuencia cero. Pasamos luego la
señal por un filtro pasa-bajos con una frecuencia de corte tal que nada, excepto
el parcial de frecuencia cero, permanezca. Podemos hacer esto en efecto
promediando sobre todas las muestras; pero debido a que la señal se repite cada
N muestras, este promedio complejo, es el mismo que el promedio de las primeras
N muestras. En resumen, para medir un componente sinusoidal de una señal
periódica, modúlela a DC y promedie luego sobre un período.

Sea ! = 2¼/N la frecuencia fundamental para el período N y sea U el número


complejo de magnitud unitaria con argumento !:

U = cos(!) + isen(!)

El k-ésimo parcial de la señal X[n] es de la forma:

Pk[n] = Ak[Uk]n

donde Ak es la amplitud compleja del parcial, y la frecuencia del parcial es:

/(Uk) = k/(U) = k!
Asumimos por el momento que la señal X[n] puede ser escrita como la suma de n
parciales, o en otras palabras:

X[n] = A0[U0] + A1[U1] + ... + AN-1[UN-1]n

Por el argumento del filtrado heterodino anterior, esperamos ser capaces de


medir cada Ak multiplicando por la sinusoide de frecuencia -k! y promediando
sobre la mitad de un período:

Ak = ([U-k]0X[0] + [U-k]1X[1] + ... + [U-k]N-1X[N -1])/N

Es esta una fórmula tan útil que tiene su propia notación. La transformada de
Fourier de una señal X[n], sobre N muestras está definida como:

FT{X[n]}(k) = V0X[0] + V1X[1] + ... + VN-1X[N -1]

donde V = U-k. La transformada de Fourier es una función de la variable k, que


es igual a N veces la amplitud de la entrada del k-ésimo parcial. Hasta aquí
hemos tomado a k como un enetero pero la fórmula tiene sentido para cualquier
valor de k si definimos V más generalmente como:

V = cos(-k!) + isen(-k!)

donde como antes, ! = 2¼/N es la frecuencia fundamental (angular) asociada con


el período N.

9.1.1 Periodicidad de la transformada de Fourier

Si X[n] es, como se dijo, una señal que se repite cada N muestras, la
transformada de Fourier de X[n] también se repite cada N unidadaes de
frecuencia, esto es,

FT{X[n]}(k + N) = FT{X[n]}(k)

para todos los valores reales de k. Esto se sigue inmediatamente de la


definición de la transformada de Fourier, ya que el factor

V = cos(-k!) + isen(-k!)

no cambia cuando añadimos N (o múltiplos de N) a k.

9.1.2 Transformada de Fourier como síntesis aditiva

Consideremos ahora una señal arbitraria X[n] que se repite cada N muestras.
(Previamente asumimos que X[n] se puede obtener como una suma de sinusoides y
aún no hemos encontrado las X[n] periódicas que pueden ser obtenidas de esa
manera). Sea Y[k] la transformada de Fourier de X para k = 0,..., N – 1:

Y[k] = FT{X[n]}(k)

= [U-k]0X[0] + [U-k]1X[1] + ... + [U-k]N-1X[N -1]

= [U0]-kX[0] + [U1]-kX[1] + ... + [U-(N-1)]kX[N -1]

En la segunda versión reacomodamos los exponentes para mostrar que Y[k] es una
suma de sinusoides complejas, con amplitudes complejas X[m] y frecuencias -m!
para m = 0,..., N – 1. En otras palabras, Y[k] puede ser considerada como una
serie de Fourier por derecho propio, cuyos m-ésimos componentes tienen
fortaleza X[-m]. (La expresión X[m] tiene sentido ya que X es una señal
periódica. También podemos exprear la amplitud de los parciales de Y[k] en
términos de su transformada de Fourier. Igualando ambas obtenemos:

(1/N)FT{Y[k]}(m) = X[-m]

Esto significa, en cambio, que X[-m] se puede obtener por la suma de sinusoides
con amplitudes Y[k]/N. Haciendo n = -m tenemos:

X[n] = (1/N)FT{Y[k]}(-n)

= [U0]nX[0] + [U1]nX[1] + ... + [UN-1]nX[N -1]

Esto indica que cualquier X[n] periódica puede ser obtenida de esta manera como
una suma de sinusoides. Es más, la fórmula muestra explícitamente cómo
reconstruir X[n] de su transformada de Fourier Y[k], si conocemos su valor para
los enteros k = 0,..., N – 1.

9.2 Propiedades de las transformadas de Fourier

En esta sección investigaremos qué sucede cuando tomamos la transformada de


Fourier de una sinusoide (compleja). La más simple de éstas es “DC”, la
sinusoide especial de frecuencia cero. Luego de que derivemos la transformada de
Fourier de esta, desarrollaremos algunas propiedades de las transformadas de
Fourier que nos permitirán aplicar el resultado para cualquier otra sinusoide.

9.2.1 La transformada de Fourier de DC

Sea X[n] = 1 para todo n (que se repite para cualquier período entero que
queramos N > 1). De la discusión precedente esperamos encontrar que

N k = 0
FT{X[n]}(k) =
0 k = 0,..., N – 1

Sin embargo, usualmente necesitaremos conocer la respuesta para los valores no


enteros de k, y para esto no se puede hace nada mejor que calcular el valor
directamente:

FT{X[n]}(k) = V0X[0] + V1X[1] + ... + VN-1X[N -1]

donde V es, como antes, un número complejo de magnitud unitario con argumento
-k!. Esto es una serie geométrica; siempre que V ≠ 1, tenemos:

FT{X[n]}(k) = (VN - 1)/(V - 1)

Simetrizamos ahora la parate superior y la parte inferior de la misma manera que


lo hicimos antes en la sección 7.3. Para esto, hacemos:

» = cos(¼k/N) - isen(¼k/N)

de tal manera que »2 = V. Luego factorizando las potencias de » apropiadas del


numerador y el denominador, tenemos:

FT{X[n]}(k) = (»N-1)[(»N - »-N)/(» - »-1)]


Es fácil simplificar ahora el numerador:

»N - »-N = (cos(¼k) – isen(¼k)) - (cos(¼k) + isen(¼k)) = -2isen(¼k)

y de manera similar para el denominador, tenemos:

FT{X[n]}(k) = (cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N))(sen(¼k)/(sen(¼k/N)

Sea que V = 1 o no, tenemos

FT{X[n]}(k) = (cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N))DN(k)

donde DN(k), conocido como el núcleo de Dirichlet, está definido como

N k = 0
DN(k) =
(sen(¼k)/(sen(¼k/N) k ≠ 0, -N < k < N

La figura 9.1 muestra la transformada de Fourier de X[n], con N = 100. La


transformada se repita cada 100 muestras, con un pico a k = 0, otro a k = 100,
y así sucesivamente. La figura se esfuerza en mostrar el comportamiento tanto de
la fase como de la magnitud utilizando una gráfica tridimensional proyectada
sobre el papel. El término de la fase

cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N)

tiene la función de hacer dar vueltas a los valores de FT{X[n]}(k) alrededor

del eje k con un período de aproximadamente dos. El núcleo Dirichlet DN(k),


mostrado en la figura 9.2, controla la magnitud de FT{X[n]}(k). Tiene un pico

de dos unidades de amplitud, alrededor de k = 0. Este está rodeado de lóbulos


laterales de una unidad de ancho, alternando en signos y decreciendo
gradualmente en magnitud mientras k se incrementa o disminuye partiendo del
cero. El término de la fase rota casi ¼ radianes cada vez que el núcleo de
Dirichlet cambia de signo, de tal manera que el producto de los dos permanece
aproximadamente en la misma mitad del plano complejo para k > 1 (y en la mitad
opuesta para k < -1). La fase rota por casi 2¼ radianes sobre el pico desde k =
-1 a k = 1.

9.2.2 Movimientos y cambios de fase

La sección 7.2 mostró cómo los cambios de tiempo de una señal cambia las fases
de sus componentes sinusoidales, y la sección 8.4.3 mostró cómo al multiplicar
una señal por una sinusoide compleja se cambian las frecuencias que la componen.
Estos dos efectos tienen identidades correspondientes dentro de la transformada
de Fourier.

Consideremos primero un cambio de tiempo. Si X[n], como es usual, es una señal


de valor complejo que se repite cada N muestras, hagamos que Y[n] sea X[n]
retrasada d muestras:

Y[n] = X[n - d]

que se repite también cada N muestras según lo hace X. Podemos rducir la


transformada de Fourier de Y[n] de esta manera:
FT{Y[n]}(k) = V0Y[0] + V1Y[1] + ... + VN-1Y[N -1]

= V0X[-d] + V1X[-d + 1] + ... + VN-1X[-d + N -1]

= VdX[-d] + Vd+1 X[1] + ... + Vd+N-1X[N -1]

= Vd(V0X[0] + V1X[1] + ... + VN-1X[N -1])

= VdFT{X[n]}(k)

(La tercera línea es sólo la segunda con los términos sumados en un orden
diferente). De esta manera obtenemos la Fórmula del Cambio de Tiempo para las
Transformadas de Fourier:

FT{X[n - d]}(k) = (cos(-dk!) + isen(-dk!))FT{X[n]}(k)

La transformada de Fourier de X[n - d] es un término de fases que multiplica la


transformada de Fourier de X[n]. La fase se cambió por -dk!, una función lineal
de la frecuencia k. Suponga ahora que cambiamos nuestra señal inicial X[n]
multiplicándola por una exponencial compleja Zn con frecuencia angular ®:

Y[n] = ZnX[n]

Z = cos(®) + isen(®)

La transformada de Fourier es:

FT{Y[n]}(k) = V0Y[0] + V1Y[1] + ... + VN-1Y[N -1]

= V0X[0] + V1ZX[1] + ... + VN-1ZN-1X[N -1]

= (VZ)0X[0] + (VZ)1X[1] + ... + (VZ)N-1X[N -1]

= FT{X[n]}(k - ®/!)

Obtenemos así la Fórmula del Cambio de Fase para las Transformadas de Fourier:

FT{(cos(®) + isen(®))X[n]}(k) = FT{X[n]}(k - ®N/2¼)

9.2.3 Transformada de Fourier de una sinusoide

Podemos usar la fórmula del cambio de fase anterior para encontrar la


transformada de Fourier de cualquier sinusoide compleja Zn con frecuencia ®,
haciendo simplemente X[n] = 1 en la fórmula y utilizando la transformada de
Fourier para DC:

FT{Zn}(k) = FT{1}(k - ®/!)

= [cos(©(k)) + isen(©(k))]DN(k - ®/!)

donde DN es el núcleo de Dirichlet y © es un término de fase feo:

©(k) = -¼•(k - ®/!)•(N – 1)/N

Si la frecuencia de la sinusoide ® es un entero múltiplo de la frecuencia


fundamental !, el núcleo de Dirichlet es cambiado a la izaquierda o a la
derecha por un entero. En este caso los ceros del núcleo de Dirichlet están
alineados con valores enteros de k, de tal manera que únicamente un parcial no
es cero. Esto se ilustra en la figura 9.3 (parte a).

La parte b muestra el resultado cuando la frecuencia ® cae en el medio de los


dos enteros. Los parciales tienen amplitudes que caen aproximadamente en 1/k en
ambas direcciones, medidas desde la frecuencia actual ®. Que la energía se deba
esparcir entre muchos parciales cuando después de todo iniciamos con una sola
sinusoide, podría parecer sorprendente al principio. Sin embargo, como se
muestra en la figura 9.4, la señal se repite en el período N que no concuerda
con la frecuencia de la sinusoide. Como resultado, hay aquí una discontinuidad
al comienzo de cada período y la energía se arroja sobre un rango amplio de
frecuencias.

9.3 El análisis de Fourier de señales no periódicas

La mayoría de las señales no son periódicas, e incluso una periódica podría


tener un período desconocido. De esta manera debería estar preparado para hacer
el análisis de Fourier en señales sin hacer la confortable suposición de que la
señal a analizar se repita a un período fijo N. Por supuesto podemos
simplemente tomar N muestras de la señal y hacerla periódica; esto es
escencialmente lo que hicimos en la sección previa, en la cual una sinusoide
pura nos dio la complicada transformada de Fourier de la figura 9.3 (parte b).

Sin embargo, debería ser mejor para tener un resultado en el cual la respuesta a
una sinusoide pura estuviera mejor localizada alrededor del valor
correspondiente de k. Podemos lograr esto usando la técnica de envolvente que
introdujimos en la figura 2.7 (página “38”). Aplicando esta técnica para el
análisis de Fourier no solamente mejorará nuestro análisis, si no que también
arroja nueva luz en el muestreador de lazo con envolvente del capítulo 2.

Dada una señal X[n], periódica o no, definida en los puntos 0 a N – 1, la


técnica es envolver la señal antes del análisis de Fourier. La forma de la
envolvente es conocida como la función ventana. Dada una función ventana ![n],
la transformada de Fourier de ventana es:

FT{![n]X[n]}(k)

Mucha tinta se ha derramado acerca de las funciones de ventana apropiadas para


situaciones particulares, pero consideraremos aquí la más sencilla, llamada la
función ventana de Hann (el nombre a veces se corrompe a “Hanning” en los
círculos del DSP). La ventana de Hann es:

![n] = 1/2 – (1/2)cos(2¼n/N)

Es fácil analizar el efecto de multiplicar una señal por la ventana de Hann


antes de tomar la transformada de Fourier, debido a que la ventana de Hann puede
escribirse como la suma de tres exponenciales complejas:

![n] = 1/2 – (1/4)Un - (1/4)U-n

donde como antes, U es el número complejo de magnitud unitaria con argumento


2¼/N. Podemos ahora calcular la transformada de Fourier de ventana de una
sinusoide Zn con frecuencia angular ® como antes. Las fases viene confusas y las
reemplazaremos con aproximaciones simplificadas:

FT{![n]Zn}(k)
= FT{(1/2)Zn – (1/4)(UZ)n - (1/4)(U-1Z)n}(k)

≈ [cos(©(k)) + isen(©(k))]M(k - ®/!)

donde el término fase es (aproximadamente):

©(k) = -¼•(k - ®/!)

y la magnitud de la función es:

M(k) = [(1/2)DN(k) + (1/4)DN(k + 1) + (1/4)DN(k - 1)]

La magnitud de la función M(k) es graficada en la figura 9.5. Los tres


componentes del núcleo de Dirichlet se muestran también separadamente.

El lóbulo principal de M(k) es de cuatro armónicos de ancho, dos veces el ancho


del lóbulo principal del núcleo de Dirichlet. Los lóbulos laterales, de otro
lado, tienen una magnitud mucho más pequeña. Cada lóbulo lateral de M(k) es una
suma de tres lóbulos laterales de DN(k), uno atenuado por 1/2 y los otros de
signo opuesto, atenuados por 1/4. No se cancelan perfectamente, pero lo hacen
aproximadamente bien.

Los lóbulos laterales alcanzan su amplitud máxima carca a sus puntos medios, y
podemos estimar sus amplitudes allí, usando la aproximación:

DN(k) = [Nsen(¼k)]/(¼k)

Haciendo k = 3/2,5/2,... se obtienen las amplitudes de los lóbulos laterales,


relativos a la altura de pico N de:

2/(3¼) ≈ -13dB, 2/(5¼) ≈ -18dB, 2/(7¼) ≈ -21dB, 2/(9¼) ≈ -23dB,...

Los lóbulos laterales caen progresivamente más lento de tal manera que el décimo
es atenuado únicamente en cerca de 30 dB y el 32o en cerca de -40 dB. De otro
lado los lóbulos laterales de la ventana de Hann son atenuados en:

2/(5¼) – (1/2)[2/(3¼) + 2/(7¼)] ≈ -32.30dB

y -42, -49, -54 y -59 dB para los siguientes cuatro lóbulos laterales.

Esto muestra que aplicar la ventana de Hann antes de tomar la transformada e


Fourier nos permitirá aislar mejor los componentes sinusoidales. Si una señal
tiene muchos componentes sinusoidales, los lóbulos laterales engendrados por
cada uno, interferirán con el lóbulo principal de los demás. Reducir la amplitud
de los lóbulos laterales reducirá esta interferencia.

La figura 9.6 muestra un análisis de Fourier en ventana de Hann de una señal con
componentes sinusoidales. Ambos están separados por cerca de 5 veces la
frecuencia fundamental !, y para cada uno vemos claramente la forma de la
transformada de Fourier de venana de Hann. Cuatro puntos del análisis de Fourier
caen dentro del lóbulo principal M(k) correspondientes a cada sinusoide. La
amplitud y la fase de cada sinusoide individual están reflejadas en las de los
picos (de cuatro puntos de ancho). Los cuatro puntos dentro de un pico los
cuales caen en valores enteros de k están sucesivamente fuera de fase en casi
medio ciclo.

Para resolver por completo los parciales de una señal, debemos escoger el tamaño
N del análisis suficientemente grande de tal manera que ! = 2¼/N no sea mayor
que un cuarto de la frecuencia de separación que hay entre los parciales
vecinos. Para una señal periódica por ejemplo los parciales están separados por
la frecuencia fundamental. En el análisis para resolver totalmente los
parciales, el período de análisis N debe ser por lo menos cuatro períodos de la
señal.

En alguna aplicaciones esto funciona de tal forma que permite el traslape de los
picos en tanto el centro de frecuencia de cada pico es aislado de todos los
demás picos; en este caso la regla de los cuatro períodos puede relajarse a tres
o incluso un poco menos.

9.4 Análisis de Fourier y reconstrucción de señales de audo

El análisis de Fourier puede utilizarse a veces para resolver los componentes


sinusoidales de una señal de audio. Incluso cuando este no puede ir así de
lelos, se puede separar una señal de audo en dos regiones de frecuencias, en el
sentido de que para cada k el k-ésimo punto de la transformada de Fourier
deberá estar afectado por únicamente por los componentes cercanos a la
frecuencia nominal k!. Esto sugiere muchas operaciones interesantes que podemos
ejecutar sobre una señal tomando su transformada de Fourier, transformando el
resultado y reconstruyendo luego una señal nueva, transformada, partiendo de la
transformación modificada.

La figura 9.7 muestra cómo llevar a cabo un análisis de Fourier, la moficación y


la reconstrucción de una señal de audio. El primer paso es dividir la señal en
ventanas, las cuales son segmentos de la señal, de N muestras cada una,
usualmente con algún traslape. Cada ventana es luego conformada multiplicándola
por una función ventana (Hann, por ejemplo). Luego la transformada de Fourier es
calculada para los N puntos k = 0,1,..., N -1. (A veces es deseable calcular la
transformada de Fourier para más puntos que estos, pero estos N puntos serán
suficientes aquí.)

Los análisis de Fourier nos dan un arreglo bi-dimensional de número complejos.


Sea H el tamaño del salto, el número de muestras que avanza cada ventana pasada
la ventana previa. Luego para cada m = ...,0,1,.. la m-ésima ventana consiste
de N puntos iniciando en el punto mH. El n-ésimo punto de la m-ésima ventana es
mH + n. La transformada de Fourier de ventana es así igual a:

S[m, k] = FT{![n]X[n - mH]}(k)

Esta es una función del tiempo (m en unidades de H muestras) y de la frecuencia


(k, como un múltiplo de la frecuencia fundamental !. Fijando el número marco
m y buscando la transformada de Fourier de ventana como una función de k:

S[k] = S[m, k]

Nos da una medida del espectro momentáneo de la señal X[n]. De otro lado,
fijarndo un frecuencia k podemos buscar esta como el k-ésimo canal de una señal
de N canales:

C[m] = S[m, k]

Desde este punto de vista la transformada de Fourier de ventana separa la señal


original X[n] en N regiones de frecuencia estrechas, llamadas bandas.

Habiendo computado la transformada de Fourier de ventana, aplicamos a


continuación la modificación que queramos. En la figura la modificación es
simplemente reemplazar la mitad superior del espectro por cero, el cual nos da
una filtro pasa-bajos altamente selectivo. (Otras dos posibles modificaciones
son la compansión de banda estrecha y el vocoder, que son descritas en las
secciones siguientes.)
Finalmente reconstruimos la señal de salida. Para hacer esto aplicamos la
inversa de la transformada de Fourier (etiquetada “iFT” en la figura). Como se
mostró en la sección 9.1.2 esto puede ser hecho tomando otra transformada de
Fourier, normalizando y moviendo de un tirón el resultado hacia atrás. En el
caso de que la ventana reconstruida no vaya a cero suavemente en sus dos
extremos, aplicamos la función ventana de Hannpor segunda vez. Al hacer esto a
cada ventana sucesiva de la entrada, adicionamos entonces las salidas, usando el
mismo traslape del análisis.

Si usamos la ventana de Hann y un traslape de cuatro (esto es, escoger N como


un múltiplo de cuatro y cada espacio de ventana H = N/4 pasado el previo),
podemos reconstruír la señal original fielmente omitiendo el paso de la
“modificación”. Esto debido a que iFT deshace el trabajo de FT , y de esta
manera estamos multiplicando cada ventana por la función de Hann al cuadrado. La
salida es así la entrada, multiplicada por la ventana de Hann elevada al
cuadrado, y traslape adicionado por cuatro. Un examen fácil muestra que este se
convierte en la constante 3/2, de tal manera que la salida es igual a la entrada
multiplicada por un factor constante.

La habilidad para reconstruir la señal de entrada exactamente es útil porque


algunos tipos de modificaciones pueden ser hechas por grados, y así la salida se
puede hacer variar suavemente entre la entrada y alguna modificación de esta.

9.4.1 Compansión de banda estrecha

Un compansor es una herramienta que amplifica una señal con una ganancia
variable, dependiendo de la medida de amplitud de la señal. El término es una
contracción de “compresor” y “expansor”. La ganancia de un compresor decrece
mientras el nivel de entrada se incrementa, de tal manera que el rango dinámico,
esto es, la variación general del nivel de la señal, se reduce. Un expansor hace
lo inverso, incrementando el rango dinámico. Frecuentemente la ganancia depende
no sólo del nivel de señal inmediato, si no de su historia; por ejemplo, la
velocidad de cambio podría estar limitada o debería ser un retraso de tiempo.

Utilizando el análisis de Fourier y la resíntesis, podemos hacer compansión


individualmente en canales de banda estrecha. Si C[m] es tal banda, le
aplicamos una ganancia g[m], para tener g[m]C[m]. Aunque C[m] es un número
complejo, la ganancia es número real no negativo. En general la ganancia debería
ser una función no solamente de C[m] si no también de cualquiera o de todos las
muestras previas en el canal: C[m – 1], C[m – 2], y así sucesivamente.
Consideraremos aquí la situación más sencilla donde la ganancia es simplemente
una función de la magnitud de la muestra corriente |C[m – 1]|.

El parche diagramado en la figura 9.8 muestra una aplicación muy útil de la


compansión, llamada compuerta de ruido. Aquí la ganancia g[m] depende de la
amplitud del canal C[m] y del ruido de fondo que es una función f del número de
canal k. Para claridad aplicaremos la frecuencia k suscrita a la ganancia,
escrita ahora como g[m, k], y para la transformada de Fourier de ventana S[m,
k] = C[m]. la ganancia está dada por:

1 – f[k]/|S[m, k]| |S[m, k]| > f[k]


g[m, k] =
0 en otros casos

Siempre que la magnitud S[m, k] sea menor que el umbral f[k] la ganancia es
cero y así la amplitud S[m, k] se reemplaza por cero. De otra manera,
multiplicar la amplitud por g[m, k] reduce la magnitud hacia abajo para |S[m,
k]| - f[k]. Ya que la ganancia es un número real no negativo, la fase se
preserva.
En la figura la ganancia se computa como una función de umbral de la razón x =
f[k]/|S[m, k]| de la magnitud de la señal para el ruido de fondo; el umbral es
g(x) = 1 1/x cuando x < 1 y cero en los demás casos, aunque otras funciones de
umbral pueden ser sustituidas fácilmente.

Esta técnica es útil para remover el ruido de un sonido grabado. Medimos o


suponemos valores del ruido de fondo f[k]. Debido al diseño de la función de
ganancia g[m, k], solamente las amplitudes que están por encima del ruido de
fondo alcanzan la salida. Ya que esto es hecho sobre bandas de frecuencias
estrechas, a veces es posible eliminar la mayor parte del ruido incluso mientras
la señal misma, en los rangos de frecuencia donde es más fuerte que el ruido de
fondo, es preservada en su mayor parte.

La técnica también es útil como preparación para aplicar una operación no


lineal, tal como la distorsión, a un sonido. Es usualmente mejor distorsionar
sólo las frecuencias más sobresalientes del sonido. Al sustraer el sonido que se
ha extraído por la compuerta de ruido, del original, se obtiene una señal
residual que puede pasar sin distorsión.

9.4.2 Estampado de timbre (vocoder clásico)

Una segunda aplicación del análisis de Fourier y la resíntesis es un filtro


variable en el tiempo capaza de hacer que un sonido evolucione espectralmente
sobre la envolvente de otro. Esto es ampliamente conocido en los círculos de la
música electrónica como un vocoder, llamado así, no con mucha exactitud, después
del dispositivo de análisis/síntesis vocal original de los Laboratorios Bell. La
técnica descrita aquí es llamada más acertadamente estampado de timbre. Se
utilizan dos señales de entrada, una para ser filtrada, y la otra para controlar
el filtro vía su envolvente espectral variante en el tiempo. La transformada de
Fourier de ventana es utilizada tanto en la entrada de la señal de control para
estimar su envolvente espectral, como sobre la entrada del filtro, para
aplicarlo.

Un diagrama de bloque para el estampado de timbre es mostrado en la figura 9.9.


Como en el ejemplo previo, el estampado del timbre actúa multiplicando la
transformada de Fourier de ventana de valor complejo del filtro de entrada, por
números reales no negativos, cambiando por lo tanto sus magnitudes pero dejando
sus fases intactas. El giro aquí es que simplemente reemplazamos las magnitudes
del |S[m, k]| original, con las magnitudes otenidas de la entrada de control
(llamémosla |T[m, k]|). La ganancia necesaria deberá ser,

g[m, k]| = |T[m, k]|/|S[m, k]|

En la práctica es mejor limitar la ganancia a algún valor máximo (que podría


depender de la frecuencia) ya que de otra manera los canales no contienen más
que ruido, lóbulos laterales, o incluso el error de truncado podría volverse
audible. De tal amnera que una función de límite apropiada se aplica a la
ganancia antes de utilizarla.

9.5 Fase

Hasta aquí hemos operado las señales alterando las magnitudes de sus
transformadas de Fourier de ventana, pero dejando las fases intactas. Las
magnitudes codifican la envolvente espectral del sonido. Las fases de otro lado,
codifican frecuencia y tiempo, en el sentido de que el cambio de fase desde una
ventana a otra diferente se acumula, en el tiempo, de acuerdo a la frecuencia.
Para hacer una transformación que permita el control independiente sobre la
frecuencia y el tiempo, se requiere analizar y reconstrír la fase.

En los ejemplos de análisis/síntesis de la sección previa, la fase de la salida


es copiada directamente de la fase de la entrada. Esto es apropiado cuando la
señal de salida se corresponde con la señal de entrada. A veces se requieren
modificaciones del tiempo, por ejemplo para hacer estiramiento o contracción dl
tiempo. Alternativamente, la fase de la salida podría depender de más de una
entrada, por ejemplo para modificar un sonido y obtener otro.

La figra 9.10 muestra cómo la fase de la transformada de Fourier cambia de


ventana a ventana, dando una sinusoide compleja como entrada. La frecuencia de
la sinusoide es ® = 3!, de tal amnera que el pico en la transformada de Fourier
está a k = 3. Si la fase inicial es Á, entonces las fases vecinas se pueden
llenar así:

/S[0,2] = Á + ¼ /S[0,3] = Á /S[0,4] = Á + ¼


/S[1,2] = Á + H® + ¼ /S[1,3] = Á + H® /S[1,4] = Á + H® + ¼
/S[2,2] = Á + 2H® + ¼ /S[2,3] = Á + 2H® /S[2,4] = Á + 2H® + ¼

Esto da una forma excelente de estimar la frecuencia ®: seleccionar cualquier


canal cuya amplitud esté dominada por la sinusoide y sustraiga dos fases
sucesivas para obtener H®:

H® = /S[1,3] - /S[0,3]

® = (/S[1,3] - /S[0,3] + 2p¼)/H

donde p es un entero. Hay H posibles frecuencias, espaciadas por 2¼/H. Si


estamos utilizando un traslape de 4, esto es H = N/4, las frecuencias están
espaciadas por 8¼/N = 4!. Felizmente, este es el ancho del lóbulo principal
para la ventana de Hann, de tal manera que no hay más que un valor posible de ®
que pueda explicar cualquier diferencia de fase medida dentro del lóbulo
principal, de un pico. El valor correcto de p para escoger es aquel que da la
frecuencia más cercana a la frecuencia nominal del canal, k!.

Cuando computamos fases para sintetizar una señal nueva o modificada, queremos
mantener las relaciones de fase apropiadas entre las sucesivas ventanas de
resíntesis y también, simultáneamente, entre los canales adyacentes. Sin embargo
estos dos conjuntos de relaciones no son siempe compatibles. Haremos de nuestra
primera obligación honrar las relaciones entre las ventanas sucesivas de
resíntesis, y nos ocuparemos de las relaciones de fase entre los canales,
después.

Suponga que queremos construir el m-ésimo espectro S[m, k] para resíntesis


(habiendo ya construido el previo, m – 1). SUponga que queremos que la las
relaciones de fase entre las ventanas m – 1 y m sean aquellas de la señal x[n],
pero que las fases de la ventana m – 1 podrían haber venido de algún otro sitio
y no podemos asumir que estén alineadas como lo queremos.

Para encontrar qué tanto difiere la fase de cada canal, del canal previo,
realizamos dos análisis de la señal x[n], separadas por el mismo salto de
tamaño H que estamos utilizando para la resíntesis:

T[k] = FT(W[n]X[n])(k)

T'[k] = FT(W[n]X[n + H])(k)

La figura 9.11 muestra el proceso de acumulación de fase, en el cual cada fase a


la salida depende de la fase de salida previa, y de la diferencia de la fase
para dos análisis de ventana a la entrada. La figura 9.12 ilustra la relación de
fase en el plano complejo. La fase de la nueva salida S[m, k] debe ser la de la
previa, más la diferencia entre las fases de los dos análisis:

/S[m, k] = /S[m - 1, k] + (/T'[k] - /T[k])

= /(S[m - 1, k]T'[k]/T[k])

Aquí utilizamos el hecho de que al multiplicar o dividir dos números complejos


obtenemos la suma o diferencia de sus argumentos.

Si la magnitud deseada es un número real a, debemos ajustar entonces S[m, k]


para:

S[m, k] = a • |S[m - 1, k]T'[k]/T[k]|-1 • S[m - 1, k]T'[k]/T[k]

Las magnitudes del segundo y del tercer término se cancelan, y así la magnitud
de S[m, k] se reduce a a; el primero de los dos términos son números reales de
tal manera que su argumento está controlado por el último término.

Si queremos finalizar con la magnitud del espectro T de la misma manera,


podemos hacer a =|T'[k]| y simplificar:

S[m, k] = |S[m - 1, k]/T[k]|-1 • S[m - 1, k]T'[k]/T[k]

9.5.1 Relaciones de fase entre los canales

En el esquema anterior, la fase de cada S[m, k] depende únicamente del valor


previo del mismo canal. Las relaciones de fase entre los canales vecinos son
dejadas al azar. Estas a veces trabajan bien, pero a veces la incoherencia de
los canales vecinos da lugar a un efecto de chorus no buscado. Podríamos querer
idealmente que S[m, k] y S[m, k + 1] tuvieran la misma relación de fase que hay
entre T'[k] y T[k].

Estas 2N ecuaciones para N fases en general no tendrá solución, pero podemos


alterar la ecuación anterior de S[m, k] de tal manera que siempre que ocurra
una solución en el sobre-apretado sistema de ecuaciones, el algoritmo de
reconstrucción se aloje en la solución. Este enfoque es llamado aseguramiento
de fase [Puc95b], y tiene la virtud de la simplicidad, aunque están disponibles
técnicas más sofisticadas [DL97].

La relación de fase de salida deseada, en el cuadro m -1, es:

/T[k + 1] - /T[k] = /S[m - 1, k + 1] - /S[m - 1, k]

o re-ordenando:

/{S[m - 1, k + 1]/T[k + 1]} = /{S[m - 1, k]/T[k]}

En otras palabras, la fase del cociente S/T no debería depender de k. Con esto
en mente podemos re-escribir la fórmula de recursión para S[m, k]:

S[m, k] = |R[k]|-1 • R'[k]T'[k]

con

R[k] = (T[k] • S[m - 1, k])/|S[m - 1, k]|

y según la ecuación previa, los R[k] deberán estar todos en fase. El truco es
ahora reemplazar R[k] para cada k con la suma de tres vecinos. El cómputo es
entonces:
S[m, k] = |R'[k]|-1 • R'[k]T'[k]

con

R'[k] = R[k + 1] + R[k] + R[k - 1]

Si los canales están ya en la relación de fase correcta, esto no tiene efecto


(la fase resultante será la misma que si se utilizara únicamente R[k].) Pero en
general, la suma compartirá dos términos en común con su vecino en k + 1:

R'[k + 1] = R[k + 2] + R[k + 1] + R[k]

de tal manera que R' tenderá a apuntar más en la misma dirección que R.
Aplicando esto iterativamente, eventualmente todo se alineará R' a la misma
fase, en tanto las relaciones de fase entre los espectros medidos de T y T' lo
permitan.

9.6 Bashing de fase

En la sección 2.3 en el muestreo con envolvente vimos cómo fabricar una onda
periódica desde un sonido grabado, y así prestar el timbre del sonido original
pero ejecutandolo a una altura específica. Si a la ventana del sonido grabado se
le aplica precesión en el tiempo, el timbre resultante varía en la imitación del
sonido grabado.

Aparece un problema importante, y es que si tomamos formas de onda de diferentes


ventanas de una muestra ( ode diferentes muestras), no hay garantía de que las
dos fases coincidan. Si no lo hacen el resultado es puede ser feo, ya que los
cambios aleatorios de fase son escuchados como fluctuaciones de la frecuencia.
Esto puede ser corregido utilizando análisis de Fourier y resíntesis [Puc05].

La figura 9.13 muestra una manera sencilla de utilizar el análisis de Fourier


para alinear las fases en una serie de ventanas de una grabación. Simplemente
tomamos el FFT de la ventana y luego ajustamos cada fase a cero para valores
pares de k y a ¼ cuando son impares. La fase en el centro de la ventana es, de
esta manera, cero, tanto para los valores pares como para los valores impares de
k. Para ajustar las fases (los argumentos de las amplitudes complejas del
espectro) en la forma deseada, primero encontramos la magnitud, la cual puede
ser considerada un número complejo con argumento cero. Luego, al multiplicar por
(-1)k se ajusta la amplitud de tal forma que esta es positiva y negativa de
manera alternada. A continuación tomamos la transformada inversa de Fourier sin
siquiera molestarse en tomar la ventana de nuevo en el camino de regreso;
probablemente querremos aplicar una envolvente de ventana más tarde, de todas
maneras, tal como se mostró en la figura 2.7. Los resultados pueden combinarse
con las técnicas de modulación del capítulo 6 produciendo herramientas poderosas
para voces y otras síntesis imitativas.

9.7 Ejemplos

Análisis de Fourier y resíntesis en Pd

El ejemplo I01.Fourier.analysis.pd (figura 9.14, parte a) demuestra el cómputo


de la transformada de Fourier de una señal de audio utilizando el objeto fft~:

fft~: Transformada de Fourier Rápida. Las dos entradas toman señales de audio
que representan la parte real y la parte imaginaria de una señal de valor
complejo. El tamaño N de ventana está dado por el tamaño de bloque de Pd. Una
transformada de Fourier está hecha para cada bloque.

La transformada de Fourier Rápida [SI03] reduce el costo computacional del


análisis de Fourier en Pd a sólo de 5 a 15 objetos osc~ en configuraciones
típicas. El algoritmo en su forma más simple toma N como una potencia de dos,
lo cual es también (normalmente) una restricción en el tamaño de los bloques en
Pd.

El ejemplo I02.Hann.window.pd (figura 9.14, partes b y c) muestra cómo controlar


el tamaño del bloque utilizando un obejeto block~, cómo aplicar una ventana de
Hann, y una versión diferente de la transformada de Fourier. La parte (b)
muestra la invocación de una sub-ventana la cual se muestra, a su vez, en la
parte (c). Los nuevos objetos son:

rfft~: transformada de Fourier Rápida real. Se asume que la parte imaginaria de


la entrada es cero. Ünicamente los dos primeros N/2 + 1 canales de salida se
llenan (los otros son determinados por simetría). Este toma la mitad del tiempo
de cómputo del objeto fft~, más general.

tabreceive~: da salidas repetidas del contenido de la tabla de ondas. Cada


bloque de cómputo da a la salida las mismas primeras N muestras de la tabla.

En este ejemplo, la tabla “$0-hann” contiene una función ventana de Hann de


longitud 512, de acuerdo con el tamaño especificado para los bloques. La señal
que va a ser analizada aparece (desde el parche padre) vía el objeto inlet~. Las
amplitudes de los canales (la salida del objeto rfft~) son reducidas a
magnitudes de valor real: las partes real e imaginaria son elevadas al cuadrado
y sumadas, y el resultado se hace pasar por el objeto sqrt~. Finalmente la
magnitud es escrita (controlada por una conexión que no se muestra en la figura)
vía tabwrite~ a otra tabla, “$0-magnitude”, para graficar.

El ejemplo I03.resynthesis.pd (figura 9.15) muestra cómo analizar y resintetizar


una señal de audio siguiendo la estrategia de la figura 9.7. Como antes, hay una
sub-ventana para realizar el trabajo con un tamaño de bloque apropiado para la
tarea; la figura muesra únicamente la sub-ventana. Necesitamos un objeto nuevo
para la transformada inversa de Fourier:

rifft~: transformada inversa de Fourier Rápida, real. Utilizando N/2 + 1 puntos


de su entrada (tomados como un par real/imaginario), y asumiendo los valores
apropiados para los otros canales por simetría, se reconstrye una salida de
valor real. No se ha hecho ninguna normalización, de tal manera que un par
rfft~/rifft~ junto, resulta con una ganancia de N. El objeto ifft~ está
disponible igualmente, y computa un inverso no normalizado para el objeto fft~,
reconstruyendo una salida de valor complejo.

El objeto block~, en la sub-ventana, es invocado con un segundo argumento que


especifica un traslape de 4. Esto hará que la sub-ventana corra cuatro veces
cada N = 512 muestras, en intervalos regulares de 128 muestras. El objeto
inlet~ realiza el búfer necesario y la reorganización de las muestras de tal
manera que su salida siempre da las últimas 512 muestras de la entrada, en
orden. En la otra dirección, el objeto outlet~ adiciona segmentos de sus cuatro
entradas previas para llevarlas al esquema de traslape sumado en la figura 9.7.

Los bloques de 512 muestras están multiplicados por la ventana de Hann tanto en
la entrada como en la salida. Si los objetos rfft~ y rifft~ fueron conectados
entre ellos sin ninguna modificación, la salida deberá reconstruír la entrada
fielmente.

Sin embargo, una modificación es aplicada: cada canal está multiplicado por una
ganacia (positiva y de valor real). La amplitud de valor complejo para cada
canal es escalada separadamente, multiplicando las partes real e imaginaria por
la ganancia. La ganancia (que depende del canal) viene de otra tabla, llamada
“$0-gain”. El resultado es un filtro de ecualización gráfica; aplicando el ratón
en la ventana gráfica de esta tabla, puede diseñar curvas de ganancia de
frecuencia.

Hay un retraso inherente introducido al utilizar block~ para incrementar el


tamaño del bloque (pero no lo hay si es utilizado, como se muestra en el
capítulo 7, para reducir el tamaño del bloque relativo a la ventana padre.) El
retraso puede medirse desde la entrada hasta la salida del sub-parche, y es
igual a la diferencia de los dos tamaños de los bloques. En este ejemplo el
retraso del búfer es de 512-64=448 muestras. El retraso del bloque no depende
del traslape, sólo de los tamaños del bloque.

Compansión de banda estrecha: reducción de ruido

El ejemplo I04.noisegate.pd (figura 9.16) muestra un ejemplo de compansión de


banda estrechautilizando análisis/resíntesis de Fourier. (Esta es una
realización del diagrama de bloques de la figura 9.8.) La parte (a) de la figura
muestra una configuración de filtro similar al del ejemplo previo, excepto que
la ganancia para cada canal es ahora una función de la magnitud del canal.

Para cada k, si s[k] denota la potencia en el canal k y m[k] es el nivel de


máscara (un nivel presumiblemente algo mayor que la potencia del ruido para el
canal k), entonces la ganancia en el canal k está dada por

√(s[k]-m[k])/s[k] s[k] > m[k]


0 para los demás valores

La potencia en el k-ésimo canal es reducida de esta manera por m[k] si es


posible, y de otra manera, es reemplazada por cero.

La máscara misma es el producto del promedio de ruido medido en cada canal, el


cual está contenido en la tabla “$0-mask”, multiplicado por un valor llamado
“mask-level”. El ruido promedio es medido en un sub-parche (pd calculate-mask),
cuyos contenidos se muestran en la parte (b) de la figura. Para computar la
máscara estamos utilizando dos objetos nuevos:

bang~: envía un disparo con anticipación a cada bloque de cómputo. El disparo


aparece en el tiempo lógico de la primera muestra en cada bloque (el primer
tiempo lógico cuyo cómputo de control afecta a ese bloque y no al previo),
siguiendo el esquema mostrado en la figura 3.2.

tabsend~: el objeto complementario de tabreceive~, copia repetidamente su


entrada a los contenidos de una tabla, afectando las primeras N muestras de la
tabla.

El proceso de promediar la potencia es iniciado al enviar un tiempo de duración


en milisegundos para “hacer la máscara”. El parche computa el número equivalente
de bloques b y genera una secuencia de pesos: 1, 1/2, 1/3,..., 1/b por los
cuales cada una de las potencias de los bloques que siguen a continuación es
promediada en lo que contenga la tabla de la máscara en el bloque previo. Al
final de los b bloques la tabla contiene los promedios de igual peso de todas
las medidas de la potencia b. Después de eso, el peso del promedio de las
nuevas medidas de potencias es cero, de tal manera que el promedio medido
detiene su evolución.

El uso de este parche para la supresión clásica de ruido requiere por lo menos
unos pocos segundos de ruido grabado sin que “la señal” esté presente. Esta es
reproducida en el parche, y su duración es enviada a “make-mask”, de tal manera
que la tabla “$0-mask” contiene el promedio de la potencia medida del ruido para
cada canal. Luego, asumiendo que la parte ruidosa de la señal raramente excede
10 veces su potencia promedio (por ejemplo), “mask-level” es enviada a 10, y la
señal a la que se le suprimirá el ruido es enviada a través de la parte (a) del
parche. El ruido se habrá ido en su mayor parte, pero aquellos canales en los
cuales la señal excede 20 veces la potencia del ruido serán atenuados únicamente
en 3 dB, y los canales con mayor potencia serán atenuados progresivamente menos.
(Por supuesto, la supresión actual del ruido podría no ser la aplicación más
interesante del parche, uno podría tratar de enmascarar una señal cualquiera, de
otra.)

Estampado de timbre (“vocoder”)

El ejemplo I05.compressor.pd (figura 9.17) es otro compansor de canal presentado


como preparación para el ejemplo I06.timbre.stamp.pd, que examinaremos a
continuación. Este es una realización del estampado de timbre de la figura 9.9,
ligeramente modificado.

Hay dos entradas, una a la izquierda, para ser filtrada (y cuya transformada de
Fourier es utilizada para resíntesis después de modificar las magnitudes), y
otra a la derecha que actúa como una fuente de control. En términos generales,
si las dos magnitudes son f[k] para la entrada de filtro y c[k] para la fuente
de control, sólo “blanquearemos” la entrada de filtro, multiplicándola por
1/f[k], y luego estampamos las magnitudes de control sobre el resultado, al
multiplicarlas por c[k]. En la práctica, debemos limitar la ganancia a un valor
máximo razonable. En el parche esto se hace limitando el factor de
blanqueamiento 1/f[k] a un valor máximo especificado utilizando el objeto
clip~. El límite está controlado por el parámetro “squelch”, que es elevado al
cuadrado y dividido por 100 para mapear los valores de 0 a 100 a un rango útil.

Otro esquema posible es limitar la ganancia después de la formación del cociente


c[k]/f[k]. La limitación de la ganancia puede ser en cualquier caso dependiente
de la frecuencia. A veces es conveniente elevar la ganancia a una potencia p
entre 0 y 1; si es 1 se trata de un estampado de timbre y si es 0, pasa la
entrada del timbre sin cambios; los valores intermedios dan una suave
interpolación entre ambos.

Ondulación de tiempo de vocoder de fase

El vocoder de fase usualmente se refiere a la técnica general de pasar de un


canal de amplitudes (complejas) a pares consistentes en magnitudes (reales) y
velocidades de precesión de fase (“frecuencias”), y al contrario, como se
describió en la figura 9.11 (sección 9.5). En el ejemplo I07.phase.vocoder.pd
(figura 9.18) utilizamos esta técnica con el ánimo específico de aplicar
estiramiento o contracción del tiempo de un sonido grabado, con control de
tiempo real. Es decir, controlamos en cualquier momento en el tiempo real, la
localización del sonido grabado que estamos escuchando. Son utilizados dos
nuevos objetos:

lrshift~: cambia un bloque de izquierdo o derecho (según el argumento de


creación). Si el argumento es positivo, cada bloque de la salida es la entrada
cambiada en ese número de espacios a la derecha, llenando con ceros, según se
requiera, a la izquierda. Un argumento negativo cambia a la izquierda, llenando
con ceros a la derecha.

q8_rsqrt~: raíz cuadrada rápida y aproximadamente recíproca. La salida del


recíproco de la raíz cuadrada es su entrada, bien para una aproximación de una
parte en 256, utilizando mucho menos cómputo que la de una raíz cuadrada de
total precisión y recíproca.

El proceso comienza con un sub-parche, pd read-windows, que tiene como salida


dos bloques de ventana de Hann de un sonido grabado, uno “atrás” y el otro
“adelante”, con 1/4 de ventana adelantada en la grabación. La ventana mostrada
utiliza las dos salidas del sub-parche para guiar el cambio de amplitud y fase
de cada canal en su propia salida.
Los dos objetos tabreceive~ de la parte superior llaman al bloque previo de
amplitudes complejas enviado al objeto rifft~ de la parte inferior,
correspondiente al S[m – 1, k] de la discusión de la sección 9.5. El parche
como un todo computa S[m, k] y luego hace TF inversa de ventana de Hann, para
la salida.

Después de normalizar S[m – 1, k], su complejo conjugado (el inverso


normalizado) es multiplicado por la transformada de Fourier de la ventana de
“atrás” T[k], dando el producto R[k] de la página “283”. A continuación,
dependiendo del valor del parámetro “lock”, el valor computado de R[k] es
reemplazado condicionalmente con la versión de aseguramiento de fase R'[k].
Esto se hace utilizando los objetos lrshift~, cuyas salidas se adicionan a
R[k], si “lock” es ajustado a uno, o de la otra manera, si es cero. El
resultado es luego normalizado y multiplicado por la transformada de Fourier de
ventana de Hann de la ventana “delantera” (T'[k]), para dar S[m, k].

Otras tres aplicaciones de síntesis/resíntesis de Fourie, que no se ilustran


aquí, están provistas en los ejemplos de Pd. La primera, el ejemplo
I08.pvoc.reverb.pd muestra cómo fabricar un vocoder de fase cuya salida
recircula como en un reverberador, excepto que los canales individuales se han
reemplazado por la entrada cuando esta es más poderosa de lo que es cuando ya
está recirculando. El resultado es un efecto de revereración de sonido más
coherente, que el que se logra con la forma clásica utilizando líneas de
retrasos.

El ejemplo I09.sheep.from.goats.pd demuestra la técnica (imperfecta) para


separar señales afinadas de las señales ruidosas, canal por canal, basado en la
coherencia de fase que deberíamos esperar de una sinusoide en ventana de Hann.
Si los tres canales adyacentes están desfasados aproximadamente en ¼ radianes
uno del otro, son juzgados para belong un pico sinusoidal. Los canales belonging
los picos sinusoidales son reemplazados con ceros para extraer la porción
ruidosa de la señal, o todos los demás son reemplazados por cero para obtener la
porción sinusoidal.

El ejemplo I10.phase.bash.pd nos regresa al muestreador de lazo de tabla de


ondas de la figura 2.7, y muestra cómo alinear las fases de la muestra de tal
amnera que todos los componentes de la señal tengan fase cero en los puntos 0,
N, 2N, y sucesivamente. De esta manera dos copias de un muestreador de lazo
ubicadas N muestras aparte pueden hacer cruzamiento atenuado coherentemente. Se
puede fabricar una versión sintética, afinada del archivo de sonido original,
utilizando cruzamiento atenuado en cadena daisy.

Ejercicios

1. Una señal x[n] es 1 para n = 0 y cero para cualquier otro valor (un
impulso). Cuál es su transformada de Fourier (N puntos) como una función de k?

2. Asumiendo además que N es un número par, cómo es la transformada de Fourier


si x[n] es 1 en n = N/2 en lugar de serlo en n = 0?

3. Para qué valores enteros de k = 0 es no cero la transformada de Fourier de N


puntos de ventana de Hann?

4. Con el fin de realizar el análisis de Fourier de un sonido periódico de 100


Hertz (a una velocidad de muestras de 44100 Hertz) utilizando una ventana de
Hann, qué valor de N se necesitará para resolver completamente los parciales
del sonido (en el sentido de tener picos que no se traslapen en el espectro)?

5. Suponga que una transformada de Fourier de N puntos está hecha sobre una
sinusoide compleja de frecuencia de 2.5! donde ! = 2¼/N es la frecuencia
fundamental. Qué porcentaje de la energía de la señal cae sobre el lóbulo
principal, en los canales k = 2 y k = 3? Si a la señal se le aplica ventana de
Hann, qué porcentaje de la energía está en el lóbulo principal (el cual está
entonces en los canales 1 a 4)?

Potrebbero piacerti anche