Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Capítulo 1
Sinusoides, amplitud y frecuencia
x[n] = acos(!n + Á)
f = (!R)/(2¼)
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.
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:
ARMS{x[n]} = √P{x[n]}
(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.
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.
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
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].
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 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
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.
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.
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.
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],
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.
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.
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.
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].
Introducción rápida a Pd
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 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.
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.
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.
1.9 Ejemplos
Escalado de amplitud constante
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”).
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.
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.
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~.
Triada mayor
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.
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.
send, s: El objeto send, que puede ser abreviado “s”, envía mensajes a los
objetos receive.
Ejercicios
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]]
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 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.
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.
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.
(1 - x[n])y[n] + x[n]z[n]
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.)
t = N/M = Nf/R
h = 12log2(N/M) = 12log2(Nf/R)
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.
(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
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.
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.
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.
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:
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:
<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:
y sustituimos las series de Fourier para todos los tres términos de arriba,
tenemos:
y así
de tal manera que, si las amplitudes de las series de Fourier de x200 se denotan
como c0, c1, ..., obtenemos:
de tal manera que los parciales de x200 son aquellos de x100 comprimidos a la
mitad, y hacia la izquierda.
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>.
2.5 Interpolación
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.
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.)
a0 = y[x0]
a1 = y[x0 + 1] – y[x0]
2.6 Ejemplos
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.
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.
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”.
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:
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.
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.
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.
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:
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).
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~).
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.
t = p + cf
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?
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?
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
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.
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:
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.
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%.
...,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:
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:
donde los t[n] son los puntos en el tiempo y los x[n] son los valores de la
señal en esos 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.
(2,1),(4.75,0),(7.5,1),(10.25,0),(13,1),...
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,
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.
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.
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.
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”).
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.
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).
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”.
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.
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.
3.10 Ejemplos
Muestreo y sobre-doblado
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.
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.
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.
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.
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.
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.
Señales a control
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).
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.
Ejercicios
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?
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?
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.
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.
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.
y[n] = (n/N)4
f1(x) = x (lineal)
f3(x) = x4 (cuártica)
y[n] = f(n/N)
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.
4.3.1 Muteo
4.3.2 Interruptor-y-rampa
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
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.
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?
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:
1 3 60 ...
2 8 62 ...
4 6 64 ...
5 8 65 ...
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.
4.7 Encapsulado Pd
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.
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.
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).
4.8 Ejemplos
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 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.
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:
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:
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.
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
<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>
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.
Ejercicios
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?
Modulación
a0 = a0cos(0 • !n),
cuya frecuencia es cero.)
acos(!n + Á)
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.
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.
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
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.)
[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.
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
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.
®1 + ¯, ®1- ¯, ..., ®k + ¯, ®k - ¯k
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
x(n) = acos(!n + Á)
tenemos que
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
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]
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>
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:
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.
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
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) = f(x)
f(-x) = -f(x)
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.
Los dos espectros armónicos a la salida del proceso de conformación de onda son
cos(acos(!mn))
sen(acos(!mn))
0, 2!m, 4!m,...
!c + m!m
donde
m = ...-2,-1,0,1,2,...
5.5 Ejemplos
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.
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.
cos(5!n)
x[n] = cos(!n)
Este procedimiento nos permite aislar cualquier armónico deseado; las funciones
resultantes f son conocidas como polinomios Chebichev.
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.
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.
fk = 1/(1*2*3*...*k)
f(x) = ex
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:
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.
Modulación de fase y FM
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) + ...
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).
Esto mismo es precisamente otro espectro FM, con sus propias bandas laterales de
frecuencias
Ejercicios
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:
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.
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.
x[n] = cos(!cn)f(acos(!mn))
x(Á) = T(cÁ)*W(aÁ),
x[n] = c(!n)ma(!n)
ma(n) = f(acos(!mn))
ma(n) = ea(cos(!n) - 1)
ma(n) = g[bsen(!n/2)]
con
2
g(x) = e-x
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.
En la formulación de tabla de ondas, un tren de pulsos puede ser hecho por una
tabla de onda estirada:
Ma(Á) = W(aÁ),
W(Á) = (cos(Á) + 1)
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>.
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)
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.
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.
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.
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.
(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.
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.
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,
|sen(!/2)|
6.5 Ejemplos
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>.
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
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.
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.
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.
Ejercicios
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.
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)
/(Z) = arctan(b/a)
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(µ)]
Z1 = r1 • [cos(µ1) + isen(µ1)]
Z2 = r2 • [cos(µ2) + isen(µ2)]
dando:
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.
x[n] = acos(!n + Á)
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!)
..., 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,...
re(AZn) = a • cos(n! + Á)
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:
donde A y B contienen las fases y las amplitudes de las dos señales. La suma es
entonces igual a:
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]
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.
X[n] = AZn
entonces
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.
X[n] = Zn
Zn + Z-dZn = (1 + Z-d)Zn
H = (1 + Z-d)
H = Z-d/2(Zd/2 + Z-d/2)
Zd/2 + Z-d/2
= (cos(!d/2) + isen(!d/2)) + (cos(!d/2) – isen(!d/2))
= 2cos(!d/2)
|H| = 2|cos(!d/2)|
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).
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.
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.
X[n] = Zn
Aquí los términos en la suma vienen de la serie de ecos discretos. Se sigue que
la amplitud de la salida es:
H - gZ-dH = 1
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
H = 1 + HgZ-d
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:
Z-d = 1
|H| = 1/(1 - g)
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.
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.
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:
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.
c = cos(µ)
s = sen(µ)
y así las dos señales a la salida tienen la misma potencia de las dos señales a
la entrada.
Y = XZ
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.
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.
20(t/d)log10(g)
20(RT/d)log10(g) = -60
RT = -3d/(log10(g))
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.
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.
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.
y[n] = n - d[n]
z[n] = x[y[n]]
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
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.
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.
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.
Sea x[n] una sinusoide (real) de una unidad de amplitud con frecuencia angular
!, y cuya fase es cero a 1.5:
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)
t = 1 + a!cos(!n - ¼/2)
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.
f = [(t – 1)R]/s
7.10 Ejemplos
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:
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.
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.
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 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.)
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:
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.
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).
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.
Reverberador
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
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?
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.
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.
(1 - QZ-1)Zn
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(®))
A = a + bi = r • (cos(®) + isen(®))
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
|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.
Zn/(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.
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.
H(Z) = H(Z)
obtenemos:
A • H(Z) • Zn + A • H(Z) • Zn
A + B = A + B
AB = A • B
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.
AZn + AZ-n
(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:
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:
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.
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:
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.)
(1 – q)/(1 – p) = g
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!)
¯*(¯ + 2!)
P1 = p • (cos! + isen!)
Q1 = q • (cos! + isen!)
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.
(1 – r2)/(1 + r2)
¯ = 2arctan(r)
La idea es comenzar con cualquier filtro con una función de transferencia como
se vio anteriormente:
|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
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))
y aplicamos la función
S(cos(!) + isen(!)) = i
Z = (±a√-W – b)/(∓b√-W + a)
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.
(1 – 1/n)n ≈ 1/e
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.
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
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.
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.
x[n] = a • cos(®n)
x[n]2 = (a2/2)(cos(2®n) + 1)
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.
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)
x[n] = re(X[n])
Por supuesto hubiéramos podido escoger las sinusoides complejas igualmente con
frecuencia -!:
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.
o en otras palabras
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:
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
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.
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.
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.
Seguidores de envolvente
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.
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:
Ejercicios
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?
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.
U = cos(!) + isen(!)
Pk[n] = Ak[Uk]n
/(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:
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:
V = cos(-k!) + isen(-k!)
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)
V = cos(-k!) + isen(-k!)
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)
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)
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.
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
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:
» = cos(¼k/N) - isen(¼k/N)
N k = 0
DN(k) =
(sen(¼k)/(sen(¼k/N) k ≠ 0, -N < k < N
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.
Y[n] = X[n - d]
= 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:
Y[n] = ZnX[n]
Z = cos(®) + isen(®)
= FT{X[n]}(k - ®/!)
Obtenemos así la Fórmula del Cambio de Fase para las Transformadas de Fourier:
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.
FT{![n]X[n]}(k)
FT{![n]Zn}(k)
= FT{(1/2)Zn – (1/4)(UZ)n - (1/4)(U-1Z)n}(k)
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)
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:
y -42, -49, -54 y -59 dB para los siguientes cuatro lóbulos laterales.
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.
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]
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.
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.
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.
H® = /S[1,3] - /S[0,3]
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.
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)
= /(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.
o re-ordenando:
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]:
con
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
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.
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.
9.7 Ejemplos
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.
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.
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.)
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.
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?
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)?