teoria musica electronica

Guía para la “Teoría y la Técnica de la Música Electrónica” Basada en el borrador de Miller Puckette escrito en diciembr

Views 164 Downloads 5 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Guía para la “Teoría y la Técnica de la Música Electrónica” Basada en el borrador de Miller Puckette escrito en diciembre de 2006

Capítulo 1

Sinusoides, amplitud y frecuencia La música electrónica se hace casi siempre a través de un computador sintetizando o procesando señales de audio digital. Estas son secuencias de números: ..., x[n-1], x[n], x[n+1], ... donde el índice n es llamado el número de la muestra, cuyo rango puede estar entre algunos o todos los números enteros. Un solo número de la secuencia es denominado muestra. Un ejemplo de una señal de audio digital es la Sinusoide:

x[n] = acos(!n + Á) donde a es la amplitud, ! es la frecuencia angular y Á es la fase inicial. La fase es función del número de muestra n, igual a (!n + Á). La fase inicial es la fase en la muestra cero (n = 0). Las sinusoides juegan un papel clave en el procesamiento de audio, pues si se cambia una de ellas a la izquierda o a la derecha por cualquier número de muestras, se consigue otra sinusoide. Esto hace fácil calcular el efecto de todo tipo de operaciones con sinusoides. Nuestros oídos utilizan esta misma propiedad especial para ayudarnos a analizar los sonidos que escuchamos, lo cual explica porqué la sinusoides, y la combinación de sinusoides pueden ser utilizadas para alcanzar muchos efectos musicales. Las señales de audio digital no tienen ninguna relación intrínseca con el tiempo, pero para escucharlas debemos escoger una velocidad de muestras, la cual se designa usualmente con la variable R, designando el número de muestras que hay en un segundo. El tiempo t está relacionado con la muestra n por Rt = n, o t = n/R. Una señal sinusoidal con frecuencia angular ! tiene una frecuencia en el tiempo real dada por

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

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

x[M],x[M + 1],....,x[M + N - 1] Las dos medidas de amplitud utilizadas con más frecuencia son la amplitud pico, la cual es simplemente la muestra más grande (en valor absoluto) en la ventana:

Apico{x[n]} = |x[n]|,

n = M,...,M + N - 1

y la amplitud media cuadrática (RMS).

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

P{x[n]} = (|x[M]|2 + ... + |x[M + N - 1]|2) (En esta última fórmula los signos de valor absoluto no son necesario por el momento pues estamos trabajando con señales de valor real, pero más tarde serán importantes cuando consideremos las señales de valor comlejo). Ni la amplitud pico ni la amplitud RMS pueden ser cero, y cualquiera de las dos pueden ser cero si la señal misma es cero para cualquier valor de n de la ventana. La amplitud RMS puede ser igual a la amplitud pico, pero nunca podrá excederla; así mismo, la amplitud RMS puede ser tan pequeña como 1/√N veces la amplitud pico, pero nunca menor que este valor. Bajo condiciones razonables -si la ventana contiene por lo menos algunos periodos y si la frecuencia angular está bien por debajo de un radián por muestra - la amplitud pico de la sinusoide de la página “1” es aproximadamente a y su amplitud RMS es cercana a a/√2. La figura 1.2 muestra las amplitudes pico y RMS de dos señales de audio digital. 1.2. Unidades de amplitud Dos amplitudes usualmente se comparan mejor utilizando la razón entre ellas que utilizando su diferencia. Decir que la amplitud de una señal es mayor que otra por un factor de dos podría ser mejor información que decir que es mayor por 30 milivoltios. Esto es válido para cualquier tipo de amplitud (la amplitud pico y la amplitud RMS). Para facilitar la comparación, usualmente expresamos las amplitudes en unidades logarítmicas llamadas decibeles. Si a es la amplitud de una señal (pico o RMS), entonces podemos definir el nivel d en decibeles (dB) como:

d = 20*log10(a/a0)

donde a0 es la amplitud de referencia. Esta definición está ajustada de tal manera que, si incrementamos la potencia de la señal por un factor de diez (y así la amplitud se incrementa por un factor de √10), el logaritmo se incrementará en 1/2, y el valor en decibeles irá hacia arriba (aditivamente) en 10. Un incremento en la amplitud por un factor de dos corresponde a un incremento de 6.02 decibeles aproximadamente; doblar la potencia corresponde a un incremento de 3.01 dB. La relación entre la amplitud lineal y la amplitud en decibeles está graficada en la figura 1.3. Utilizando a0 para denotar la amplitud de referencia, una señal con amplitud lineal más pequeña que a0 tendrá una amplitud negativa en decibeles: a0/10 da -20 dB, a0/100 da -40, etc. Una amplitud lineal de cero es más pequeña que cualquier valor en dB, así que da un nivel en dB de -∞. En audio digital una opción conveniente para tomar como referencia, asumiendo que el equipo tenga una amplitud máxima de uno, es:

a0 = 10-5 = 0.00001 con lo que la amplitud máxima son 100 dB, y 0 dB es el silencio a un nivel de audición razonable. De manera conveniente, el rango dinámico de audición humana -la razón entre un volumen dañino y un silencio inaudible- es de 100 dB aproximadamente. La amplitud está relacionada de una manera inexacta con la intensidad de un sonido. En general dos señales con la misma amplitud pico o RMS, no necesariamente las escucharemos con igual intensidad. Al amplificar una señal en 3 dB, por ejemplo, apenas sí se podría decir que el sonido se siente un poco más intenso. Se ha estudiado mucho la supuesta naturaleza logarítmica del oído humano (y de los otros sentidos), lo cual explica parcialmente porqué los decibeles son tan útiles en la escala de amplitud [RMW02, pág.99]. La amplitud también está relacionada de una manera inexacta con las dinámicas musicales. La dinámica es mejor pensarla como una medida del esfuerzo que como intensidad o potencia. Su rango está sobre nueve valores: silencio, ppp, pp, p, mp, mf, f, ff, fff. Estos están correlacionados de una manera más lejana con la amplitud de una señal que con su intensidad [RMW02, págs.110-111]. 1.3. Controlando la amplitud Sin embargo la operación más frecuente en los sonidos electrónicos es cambiar sus amplitudes. Por ejemplo, una estrategia simple para la síntesis de sonidos es combinando sinusoides, lo cual puede ser generado evaluando la fórmula del primer capítulo

x[n] = acos(!n + Á) muestra por muestra. Pero la sinusoide tiene una amplitud nominal constante a, y nos gustaría ser capaces de variarla en el tiempo. En general, al multiplicar la amplitud de una señal x[n] por un factor y ≥ 0, usted puede simplemente multiplicar cada muestra por y, dando como resultado una nueva señal y*x[n]. Cualquier medida de amplitud pico o RMS de x[n] será mayor o menor según el factor y. De una manera más general, usted puede cambiar la amplitud en una cantidad y[n] que varíe muestra por muestra. Si y[n] no es negativa y si varía con cierta lentitud, la amplitud del producto y[n]*x[n] (en una ventana fija desde M hasta M + N - 1) será el valor de x[n], multiplicado

por el valor de y[n] en la ventana (el cual asumimos no cambia mucho en las N muestras de la ventana). En el caso más general donde tanto x[n] como y[n] tienen valores negativos y positivos y/o cambian rápidamente, el efecto de su multiplicación no puede ser descrito como el simple cambio de amplitud de uno de ellos; esta situación es considerada posteriormente, en el capítulo 5. 1.4 Frecuencia Las frecuencias, al igual que las amplitudes, son usualmente medidas sobre la escala logarítmica, con el fin de enfatizar las proporciones entre ellas, lo que usualmente provee una mejor descripción de la relación entre las frecuencias, que la que hace la diferencia entre ellas. La razón entre las frecuencias de dos notas musicales determina el intervalo musical entre ellas. La escala musical occidental divide la octava (el intervalo musical asociado con una relación de 2:1) en doce sub-intervalos iguales, cada uno de los cuales de esta manera corresponde a una razón de 21/12. Por razones históricas este intervalo es denominado un semitono. Una escala logarítmica conveniente para las notas musicales es simplemente contar el número de semitonos desde una nota de referencia -permitiendo fracciones que posibilitan especificar notas que no corresponden con las notas musicales de la escala occidental. La escala de notas logarítmica más utilizada es la de “notas MIDI”, en la cual la nota 69 está asignada a una frecuencia de 440 ciclos por segundo -el A sobre el C medio. Para hacer la conversión entre una nota MIDI m y una frecuencia en ciclos por segundo f, se aplican las fórmulas de conversión Nota/Frecuencia:

m = 69 + 12*log2(f/440) f = 440*2(m-69)/12 El C medio, correspondiente a la nota MIDI m = 60, sería f = 261,626 ciclos por segundo. El MIDI en sí es un viejo protocolo de equipos de cómputo el cual desafortunadamente ha insinuado un gran convenio de diseño de programas de computación. En los equipos de cómputo, el MIDI permite únicamente notas enteras entre 0 y 127. Sin embargo, la escala en general está bien definida para cualquier número “MIDI”, incluso los números negativos; por ejemplo una “nota MIDI” de -4 es una cantidad de vibración presentable. La escala de notas no puede, sin embargo, describir frecuencias iguales o menores que cero ciclos por segundo. (Para una descripción clara del MIDI, sus posibilidades y limitaciones, vea [Bal03, cap.6-8]). Un semitono conforma una razón de aproximadamente 1,059 a 1, un seis por ciento aproximadamente de incremento en la frecuencia. Los semitonos están además divididos en cents, siendo cada cent un centésimo de un semitono. En la práctica, se considera que con tres cents se hace una diferencia perceptible mínima en el cambio de afinación de una nota musical. En el C medio esto viene a equivaler a 1/2 ciclo por segundo aproximadamente. 1.5. Sintetizando una sinusoide En la mayoría de los paquetes programación de síntesis audio más ampliamente usados (Csound, Max/MSP, y Pd, por ejemplo), las operaciones de audio están especificadas como redes de unidades generadoras [Mat69], las cuales pasan señales de audio entre ellas mismas. El usuario del paquete de programas especifica la red, a veces llamada un parche, la cual esencialmente corresponde al algoritmo de síntesis que se utilizará, y entonces su preocupación se enfoca en cómo controlar las diferentes unidades generadoras en el tiempo. En esta

sección utilizaremos diagramas de bloque abstractos para describir los parches, pero en la sección de “ejemplos” (página “17”), escogeremos un ambiente de implementación específico y mostraremos algunos detalles que dependen del programa de cómputo. Para mostrar cómo producir una sinusoide con amplitud variable en el tiempo, necesitaremos introducir dos unidades generadoras. Primero, necesitamos una sinusoide pura la cual está hecha con un oscilador. La figura 1.5 (parte a) muestra una representación pictórica de un oscilador sinusoidal como un ícono. La entrada es una frecuencia (en ciclos por segundo), y la salida es una sinusoide cuya amplitud pico es uno. La figura 1.5 (parte b) muestra cómo multiplicar la salida de un oscilador sinusoidal por un factor de escala apropiado y[n] para controlar su amplitud. Ya que la amplitud pico del oscilador es 1, la amplitud pico del producto es y[n], asumiendo que y[n] cambia con suficiente lentitud y no tiene valores negativos. La figura 1.6 muestra cómo la sinusoide de la Figura 1.1 es afectada por el cambio de amplitud de dos controladores de señal diferentes y[n]. El control de la señal en la parte (a) tiene una discontinuidad y de esa manera da como resultado la sinusoide de amplitud controlada mostrada en (b). Las partes (c) y (d) muestran una posibilidad de variación menos brusca para y[n] y su resultado. La intuición sugiere que el resultado mostrado en (b) no sonará como una sinusoide que varía en su amplitud, si no como una sinusoide interrumpida por un “pop” audible luego del cual continúa con menos intensidad. En general, por razones que no pueden ser explicadas en este capítulo las señales y[n] que controlan la amplitud en forma de rampa suave entre un valor y otro son menos propensas a dar resultados parásitos (tales como el “pop”), que las que cambian abruptamente. Por el momento podemos dar dos reglas generales sin justificarlas. La primera, que las sinusoides puras son las señales más sensibles a los efectos parásitos de los cambios rápidos de amplitud. Así que cuando usted quiera examinar una transición de amplitud, si esta trabaja para las sinusoides probablemente trabajará para otras señales igual de bien. Segundo, que dependiendo de la señal cuya amplitud usted esté cambiando, el control de amplitud requerirá entre de 0 a 30 milisegundos de tiempo “rampa” -cero para las señales más clementes (tales como el ruido blanco), y 30 para las menos (como una sinusoide). Todo esto depende también en una forma complicada, de los niveles de escucha y del contexto acústico. Funciones apropiadas de control y[n] pueden ser hechas utilizando un generador de envolvente. La figura 1.7 muestra una red en la cual un generador de envolvente se utiliza para controlar la amplitud de un oscilador. Los generadores de envolvente varían ampliamente en su diseño, pero nos enfocaremos en su tipo más simple, el cual genera segmentos de línea como se muestra en la figura 1.6 (parte c). Si un segmento de línea está específicamente diseñado para hacer de rampa entre dos valores de salida a y b sobre N número de muestras comenzando en la muestra M, la salida es:

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

M ≤ n ≤ M + N - 1

La salida puede tener cualquier número de segmentos tales como este conectados en los extremos sobre el rango completo del número de muestras n; los segmentos planos, horizontales, pueden hacerse dejando que a = b. Adicional al cambio de las amplitudes de los sonidos, el control de amplitud es usual, especialmente en las aplicaciones en tiempo real, simplemente para encender sonidos y para enmudecerlos: se enmudecen haciendo que la rampa de amplitud vaya suavemente a cero. La mayoría de los paquetes de programas de

cómputo para síntesis también proveen fórmulas para detener por completo los módulos desde los cómputos de las muestras, pero aquí utilizaremos control de amplitud en su lugar. El generador de envolvente existe desde la era análoga [Str95, pág.64] [Cha80, pág.90], al igual que el resto de componentes de la figura 1.7; los osciladores de frecuencia controlable fueron denominados osciladores controlados por voltaje o VCO's, y el paso de multiplicación se hizo utilizando un amplificador controlado por voltaje o VCA [Str95, págs.34-35] [Cha80, pág.84-89]. Los generadores de envolvente se describen con mayor detalle en la sección 4.1. 1.6. Superponiendo señales Si una señal x[n] tiene una amplitud pico o RMS A (en alguna ventana fija), entonces la señal escalada k*x[n] (donde k ≥ 0) tiene una amplitud kA. La potencia media de la señal escalada cambia por un factor de k2. La situación se vuelve más complicada cuando dos señales diferentes se añaden simultáneamente; conocer las amplitudes de las dos no es suficiente para conocer la amplitud de la suma. Las dos medidas de amplitud deben por lo menos obedecer el triángulo de las desigualdades; para cualquiera de dos señales x[n] y y[n],

Apico{x[n]} + Apico{y[n]} ≥ Apico{x[n] + y[n]} ARMS{x[n]} + ARMS{y[n]} ≥ ARMS{x[n] + y[n]} Si fijamos una ventana desde M hasta M + N – 1 como es usual, podemos escribir la salida de la potencia media de la suma de las dos señales:

P{x[n] + y[n]} = P{x[n]} + P{y[n]} + 2*COV{x[n],y[n]} donde hemos introducido la covariancia de dos señales: COV{x[n],y[n]} = (x[M]y[M] + … + x[M + N – 1]y[M + N – 1])/N La covariancia puede ser positiva, cero o negativa. Sobre una ventana suficientemente grande, la covariancia de dos sinusoides con frecuencias diferentes es insignificante comparada con la potencia media. Dos señales que no tengan covariancia se les llama no correlacionadas (la correlación es la covariancia normalizada que se encuentra entre -1 y 1). En general, para dos señales no correlacionadas, la potencia de la suma es igual a la suma de las potencias:

P{x[n] + y[n]} = P{x[n]} + P{y[n]}, siempre que COV{x[n],y[n]} = 0 Al ponerlo en términos de amplitudes, se tiene: (ARMS{x[n] + y[n]})2 = (ARMS{x[n]})2 + (ARMS{y[n]})2 Esta es la ya conocida relación pitagórica. De esta manera las señales no correlacionadas pueden ser tomadas como vectores que conforman un ángulo recto; las señales correlacionadas positivamente forman un ángulo agudo entre ellas y las correlacionadas negativamente forman un ángulo obtuso. Por ejemplo, si dos señales no correlacionadas tienen ambas una amplitud RMS de valor a, su suma tendrá una amplitud √2a. De otro lado, si las dos señales son iguales, -la mayor correlación posible- la suma tendrá una amplitud 2a, el cual es el valor máximo permitido, según el triángulo de las desigualdades. 1.7 Señales periódicas Se dice que una señal x[n] se repite en un período

¿

si

x[n +

¿]= x[n]

para todo n. Tal señal deberá repetirse en períodos de 2¿ y así sucesivamente; el ¿ más pequeño en el cual se repite la señal se denomina período de la señal. En la discusión de los períodos de las señales de audio digital, rápidamente llegamos a la dificutad de describir señales cuyo “período” no es un entero, de tal manera que la ecuación anterior queda sin sentido. Por el momento ignoraremos efectivamente esta dificultad suponiendo que la señal puede ser interpolada de alguna manera entre las muestras de tal manera que esté bien definida ya sea n un entero o no. Una sinusoide tiene un período (en muestras) de 2¼/! donde ! es la frecuencia angular. De una manera más general, cualquier suma de sinusoides con frecuencias 2¼k/! para enteros de k, se repetirá después de 2¼/! número de muestras. Tal suma es llamada Serie de Fourier:

x[n] = a0 + a1cos(ωn + ϕ1) + a2cos(2ωn + ϕ2) + … + apcos(pωn + ϕp) Más aún, si asumimos ciertas condiciones técnicas (en efecto que la señal únicamente contiene frecuencias hasta una frontera finita), podemos representar cualquier señal peródica con dicha suma. Esta es la variante discreta en el tiempo del análisis de Fourier, que reaparecerá en el capítulo 9. Las frecuencias angulares de las sinusoides anteriores son todas múltiplos enteros de ω. Estas son llamadas los armónicos de ω, el cual es llamado a su vez la fundamental. En términos de su afinación, los armónicos ω, 2ω,... son intervalos de 0, 1200, 1902, 2400, 2786, 3102, 3369, 3600, ..., cents sobre la fundamental; esta secuencia de tonos es a veces llamada serie armónica. Las primeras seis notas de la serie son muy aproximadamente múltiplos de 100; en otras palabras, los primeros seis armónicos de una nota en la escala occidental caen muy cercanos a otras notas (pero no siempre de manera exacta) de la misma escala; la tercera y la sexta se desvían únicamente en 2 cents y la quinta se desvía por 14 cents. Puesto de otra manera, la razón de frecuencias 3:2 (una quinta justa en la terminología occidental) equivale casi exactamente a siete semitonos, 4:3 (una cuarta justa) está muy cercano a cinco semitonos, y las razones 5:4 y 6:5 (tercera mayor y menor) están muy cercanas a de los cuatro y los tres semitonos, respectivamente. Se muestra una serie de Fourier (con sólo tres términos) en la figura 1.8. las primeras tres gráficas son de sinusoides, cuyas frecuencias están en razones 1:2:3. El período común está marcado sobre los ejes horizontales. Cada sinusoide tiene una amplitud y una fase inicial diferentes. La suma de las tres en la parte inferior no es una sinusoide, pero sigue manteniendo la periodicidad compartida por las tres sinusoides componentes. Dejando la cuestión de la fase a un lado, podemos utilizar un banco de osciladores sinusoidales para sintetizar sonidos periódicos o incluso cambiar su forma suavemente a través de una sucesión de sonidos periódicos, especificando la frecuencia fundamental y las (posiblemente variantes en el tiempo) amplitudes de los parciales. La figura 1.9 muestra un diagrama de bloques para hacer esto. Este es un ejemplo de síntesis aditiva; y de manera más general el término puede ser aplicado a redes en las cuales la frecuencia de los osciladores son controlables de manera independiente. Los primeros días de la música por computador sonaron con la síntesis aditiva. 1.8 Acerca de los ejemplos con programas de cómputo

Los ejemplos de este libro utilizan Pure Data (Pd), y para entenderlos usted debe aprender lo mínimo de Pd mismo. Pd es un ambiente para realizar rápidamente aplicaciones musicales en el computador, con el fin principal de las ejecuciones de música en vivo. Pd puede ser utilizado para otros medios, pero no iremos a eso aquí. Existen algunos otros ambientes de audio DSP por parches junto con Pd. El más ampliamente utilizado es ciertamente Csound de Barry Vercoe [Bou00], el cual difiere de Pd en que está basado en el texto (no basado en GUI). Esto es ventajoso en algunos aspectos y desventajoso en otros. Csound está mejor adaptado que Pd para procesos de vaciado y maneja la polifonía mucho mejor que como lo hace Pd. De otro lado, Pd tiene una estructura de control de tiempo real más desarrollada que Csound. Genealógicamente, Csound proviene de los llamados lenguajes Music N [Mat69, págs.115-172]. Otra alternativa de código abierto de amplio uso es el McCartney, el cual está también más orientado al texto Pd, está explícitamente diseñado para el uso en tiempo construcciones lingüísticas poderosas que lo hacen una que Csound para tareas como la escritura de lazos o el estructuras de datos complejas.

SuperCollider de James que Pd, pero al igual que real. SuperCollider tiene herramienta más adecuada mantenimiento de

Finalmente, Pd tiene un hermano utilizado ampliamente, el programa comercial de Cycling74 Max/MSP (los demás mencionados aquí son todos de código abierto). Tanto principiantes como gerentes de sistemas a cargo de laboratorios de cómputo mutiusuarios y multipropósito encontrarán Max/MSP mejor soportado y documentado que Pd. Es posible aprender en Pd y aplicar lo aprendido en Max/MSP y viceversa, e incluso es posible conectar parches de uno a otro, pero los dos no son verdaderamente compatibles. Introducción rápida a Pd Los documentos de Pd son llamados parches. Ellos corresponden muy aproximadamente a las cajas de los diagramas de bloques abstractos mostrados anteriormente en este capítulo, pero en el detalle son diferentes, debido a que Pd es un ambiente de implementación, no un lenguaje de especificación. Un parche Pd, tal como los mostrados en la figura 1.10, consiste en un conjunto de cajas conectadas en red. El borde de las cajas le dice cómo interpretar su texto y cómo funcionan. En la parte (a) de la figura vemos tres tipos de cajas. De arriba a abajo son: •

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



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



una caja de número. Las cajas de número son un tipo particular de caja GUI. Otros tipos incluyen botones para oprimir e interruptores de palanca;

estos vendrán más adelante en los ejemplos. La caja de número tiene un borde con forma de tarjeta perforada, con una muesca en su esquina superior derecha. Mientras que la apariencia de un objeto o caja de mensaje queda fija cuando el parche está corriendo, el contenido (texto) de la caja de número cambia para reflejar el valor actual de la caja. Usted puede utilizar también una caja de números como control haciendo click y arratrando arriba y abajo, o escribiendo valores en ella. En la figura 1.10 (parte a) al hacer click en la caja de mensaje, esta envía el mensaje “21” a una caja de objeto que le suma 13. las líneas que conectan las cajas llevan datos de una caja a la siguiente; las salidas de las cajas están en la parte inferior y las entradas en la parte superior. La figura 1.10 (parte b) muestra un parche Pd que fabrica una sinusoide con frecuencia y amplitud controlables. Las líneas de conexión del parche son de dos tipos aquí; las delgadas se usan para llevar mensajes esporádicos, y las gruesas (que están conectando el oscilador, el multiplicador y el objeto de salida dac~) llevan señales de audio digital. Ya que Pd es un programa de tiempo real, las señales de audio fluyen continuamente. De otro lado, los mensajes esporádicos aparecen en específicos pero probablemente impredecibles instantes del tiempo. Que una conexión lleve mensajes o señales depende de la conexión de la caja de la cual proviene; así, por ejemplo, el objeto + da como salidas, mensajes, pero el objeto *~ da como salida una señal. Las entradas de un objeto dado pueden aceptar o no señales (pero siempre aceptan mensajes, incluso si es para solamente convertirlos en señales). Como convención, las cajas de objetos con entradas o salidas de señal son nombradas todas con una tilde al final (“~”) como en “*~” y “osc~”. Cómo encontrar y hacer funcionar los ejemplos Para hacer funcionar los parches, primero debe descargar, instalar y hacer funcionar Pd. Las instrucciones para hacer esto aparecen en la documntación HTML de Pd en línea, que puede encontrar en http://crca.ucsd.edu/~msp/software.htm. Este libro debe aparecer en http://crca.ucsd.edu/~msp/techniques.htm, posiblemente con alguna revisiones. Escoja la revisión que corresponde al texto que está leyendo (o tal vez sólo la última) y descargue el archivo que contiene la revisión asociada de los ejemplos (puede descargar también un archivo de la versión HTML de este libro para un acceso más fácil en su máquina). Los ejemplos deberán quedar todos en un directorio aparte, ya que algunos de ellos dependen de otros archivos en ese directorio y podrían no cargarse correctamente si ha movido algunas cosas. Si quiere copiar uno de los ejemplos a otro directorio para construir en el (para lo cual es bienvenido), deberá incluir también el directorio de ejemplos en la ruta de búsqueda de Pd (vea la documentación de Pd) o mirar qué otros n archivos necesita y copiarlos también. Una buena manera de saber cuáles son es poner a funcionar Pd desde el archivo reubicado y ver si Pd se queja de algo que no puede encontrar. Deben aparecer docenas de archivos en las carpetas de los “ejemplos”, incluyendo los ejemplos mismos y los archivos de soporte. Los nombres de los archivos de los ejemplos comienzan todos con una letra (A para el capítulo 1, B para el 2, etc) y un número como en “A01.sinewave.pd”. Los parches de ejemplo también se distribuyen con Pd pero tenga precaución porque puede encontrar una versión diferente de los ejemplos que no corresponda con el texto que está leyendo. 1.9 Ejemplos

Escalado de amplitud constante El ejemplo A01.sinewave.pd, que se muestra en la figura 1.11, contiene esencialmente el parche más simple posible para hacer un sonido, con sólo tres cajas de objetos (también hay comentarios, y dos cajas de mensajes para encender y apagar el procesador de audio “DSP” de Pd). Las tres cajas de objetos son: osc~: oscilador sinusoidal. La entrada de la izquierda y la salida son señales de audio digital. La entrada toma la frecuencia (que se puede variar en el tiempo) en Hertz. La salida es una sinusoide en una frecuencia específica. Si no hay nada conectado a la entrada de la frecuencia, el argumento de creación (440 en este ejemplo) se utiliza como la frecuencia. La salida tiene su pico de amplitud uno. Usted puede ajustar una fase inicial enviando mensajes (no señales de audio) a la entrada derecha. La entrada izquierda (la frecuencia) también puede ajustarse para enviar mensajes y ajustar la frecuencia, ya que a cualquier entrada que tome una señal de audio, también pueden enviársele mensajes que son convertidos automáticamente en la señal de audio digital deseada. *~: multiplicador. Existe de dos formas. Si se especifica una creación de argumento (como en este ejemplo, que es 0,05), esta caja multiplica una señal de audio digital (en la entrada izquierda) por el número; los mensajes en la entrada derecha pueden también actualizar ese número. Si no se da ningún argumento, esta caja multiplica las dos señales entrantes de audio digital. dac~: dispositivo de salida de audio. Dependiendo de su equipo de cómputo, este podría no actuar como un Convertidor Análogo/Digital tal y como su nombre lo sugiere; pero en general, le permite enviar cualquier señal de audio digital a la(s) salida(s) de audio de su computador. Si no hay creación de argumentos, el comportamiento por defecto es entregar salida a los canales uno y dos de la tarjeta de sonido; usted puede especificar números de canales alternativos (uno o muchos) utilizando argumentos para su creación. Pd mismo puede configurarse para utilizar dos o más canales de salida, o podría no tener el dispositivo de audio abierto; consulte la documentación de Pd para estos detalles. Las dos cajas de mensajes muestran una particularidad en la manera en que los mensajes son analizados en las cajas de mensajes. Al principio en la figura 1.10 (parte a), el mensaje consistía únicamente del número 21. Cuando se hace click en él, esa caja envía el mensaje “21” a su salida y por lo tanto, a cualquier objeto conectado a ésta. En este ejemplo en particular, el texto de la caja de mensaje comienza con un punto y coma. Este es un cierre entre mensajes (así, el primer mensaje está vacío), después del cual la siguiente palabra se toma como el nombre del receptor del siguiente mensaje. De esta manera el mensaje aquí es “dsp 1” (o “dsp 0”) y el mensaje que se va a enviar, no para ninguno de los objetos conectados -no hay ninguno, de todas maneras- si no para el objeto llamado “pd”. Este objeto en particular se provee de manera invisible por el programa Pd y usted puede enviar varios mensajes para controlar el estado global de Pd, en este caso encendiendo el procesamiento de audio (“1”) y apagándolo (“0”). Control de amplitud en decibeles El ejemplo A02.amplitude.pd muestra cómo hacer un control de amplitud crudo; los elementos activos se muestran en la figura 1.12 (parte a). Hay una clase de objeto nueva: dbtorms: conversión de decibeles a amplitud lineal. “RMS” es un término errado; debería llamarse “dbtoamp”, ya que este objeto realmente convierte decibeles a cualquier unidad de amplitud lineal, sea esta RMS, pico u otra. Una entrada de 100 dB es normalizada a una salida de 1. Los valores más grandes que 100 están bien (120 nos dará 10), pero valores menores o iguales a cero darán salida cero (una entrada de cero, de otro lado, podría tener como salida un pequeño valor

positivo). Este es un objeto de control, pues los números que entran y salen son mensajes, no señales (Un objeto correspondiente, dbtorms~, es el correlativo de señal. Sin embargo, como objeto de señal este es costoso en tiempo de CPU y la mayoría de las veces encontraremos una u otra manera de evitar su utilización.) Las dos cajas de números están conectadas a la entrada y a la salida del objeto dbtorms. La función de entrada es como un control; trabaje con el ratón en esta (click y arrastre arriba y abajo) para cambiar la amplitud. Esta ha sido ajustada para que quede en el rango de 0 a 80, con el fin de proteger sus parlantes y sus oídos, y es prudente construir tales guardas en sus propios parches. La otra caja de números muestra la salida del objeto dbtorms. Es inútil trabajar esta caja con el mouse ya que su salida no está conectada a ningún lado; aquí sólo se muestra su entrada. Las cajas de números pueden ser útiles como control, indicador o ambos, aunque si las está utilizando para ambas cosas, puede haber un trabajo extra por hacer. Control de amplitud suavizado con un generador de envolvente Según se muestra en la figura 1.6 una de las maneras de suavizar los cambios de amplitud en una señal, sin clicks, es multiplicarla por la salida de un generador de envolvente tal como se muestra en el diagrama de bloques de la figura 1.7. Esto se puede implementar en Pd utilizando el objeto line~: line~: generador de envolvente. La salida es una señal que ejecuta una pendiente lineal desde un valor a otro, en el tiempo, según lo determinen los mensajes recibidos. La entrada toma mensajes que especifican los valores finales (entrada izquierda) y los tiempos que se demora (entrada derecha). Debido a una regla general para los mensajes de Pd, un par de números enviados a la entrada izquierda son suficientes para para especificar de manera conjunta un valor final y un espacio de tiempo. El tiempo se mide en milisegundos (tomando en cuenta la velocidad de las muestras), y el valor final no tiene unidades, o sea que su rango de salida podría ser según la entrada a la que estuviese conectado. El ejemplo A03.line.pd demuestra la utilización de un objeto line~ para controlar la amplitud de una sinusoide. La parte activa se muestra en la figura 1.12 (parte b). Las seis cajas de mensajes están todas conectadas al objeto line~, y son activadas al hacer click en ellas; la primera caja de la parte superior, por ejemplo, especifica que la rampa de line~ (comenzando donde fuere que estuviera su valor de salida antes de recibir el mensaje) al valor 0,1 en un lapso de dos segundos. Luego de que transcurren estos dos segundos, a no ser de que otro mensaje haya llegado mientras tanto, la salida permanecerá en 0,1. Los mensajes pueden llegar antes de que culmine el tiempo de los dos segundos, en cuyo caso el objeto line~ abandona su vieja trayectoria y toma la nueva. Dos mensajes pueden llegar a line~ al mismo tiempo o con tan poco espacio de tiempo entre ellos que no se efectúe el cómputo DSP; en este caso, el primer mensaje no tiene efecto, debido a que line~ no habrá cambiado su salida aún para seguir ese primer mensaje, y su salida corriente, sin cambio, se utiliza entonces como punto de partida para el segundo segmento. Una excepción a esta regla es que si line~ llega a un valor cero, el valor de la salida es ajustado inmediatamente al nuevo valor y los segmentos subsiguientes comenzarán desde ese nuevo valor; así, al enviar dos pares, el primero con un valor de tiempo cero y el segundo par con un valor de tiempo diferente de cero, uno puede especificar independientemente los valores iniciales y finales de un segmento en la salida de line~. El tratamiento de la entrada derecha de line~ es inusual para los objetos Pd pues olvida los valores viejos; un mensaje con un solo número tal como “0.1” es siempre equivalente al par “0.1 0”. Casi cualquier otro objeto retendrá el valor previo por la entrada derecha, en lugar de reajustarlo a cero.

El ejemplo A04.line2.pd muestra la salida del objeto line~ gráficamente. Utilizando los mensajes de las diversas cajas, usted puede recrear los efectos mostrados en la figura 1.6. Triada mayor El ejemplo A05.output.subpatch.pd, cuyos ingredientes activos se muestran en la figura 1.12 (parte c), presenta tres sinusoides con frecuencias en razones 4:5:6, de tal forma que las dos más bajas están separadas por una tercera mayor, las dos superiores por una tercera menor y la superior y la inferior por una quinta. La frecuencia más baja es 440, igual al A sobre el C medio, o MIDI 69. Las demás están cuatro y siete semitonos más altas, respectivamente. Las tres tienen amplitudes iguales. El control de amplitud en este ejemplo está manejado por un nuevo objeto llamado output~. Este no es un objeto de Pd, si no que es un parche Pd alojado en un archivo, “output.pd”. (Puede ver lo que hay en output~ abriendo el menú de propiedades de la caja y seleccionando “open”.) Usted tiene dos controles, uno para la amplitud en dB (100 significa “ganancia unitaria”), y un botón “mute”. El proceso de audio de Pd es encendido automáticamente cuando ajusta el nivel de entrada -este podría no ser el mejor comportamiento en general, pero es apropiado para estos parches de ejemplo . El mecanismo para incluir un parche Pd dentro de otro como una caja de objetos se discute en la sección 4.7. Conversión entre frecuencia y nota El ejemplo A06.frequency.pd (figura 1.13) muestra el objeto Pd que convierte notas a frecuencia (mtof que significa “MIDI a frecuencia”) y su inverso ftom, Introducimos también dos clases de objetos, send y receive. mtof, ftom: convierten notas MIDI a unidades de frecuencia de acuerdo con las Fórmulas de Conversión Nota/Frecuencia. Las entradas y salidas son mensajes (los objetos “tilde” equivalentes existen, sin embargo, al igual que dbtorms~ son costosos en tiempo de CPU). La salida del objeto ftom es 1500 si la entrada es cero o negativa; y de otra manera, si usted da un valor de -1500 o menor a mtof su salida es cero. receive, r: los mensajes receive no son locales. El objeto receive, el cual puede abreviarse “r”, espera mensajes externos enviados por un objeto send o por una caja de mensajes que utilice redireccionamiento (el “;” discutido antes en el ejemplo A01.sinewave.pd). El argumento (tal como “frecuency” y “pitch” en este ejemplo) es el nombre al cual se enviarán los mensajes. Objetos receive múltiples pueden compartir el mismo nombre, en cuyo caso cualquier mensaje enviado con ese nombre llegará a todos éstos. send, s: El objeto send, que puede ser abreviado “s”, envía mensajes a los objetos receive. Dos nuevas propiedades de cajas de números se utilizan aquí. Anteriormente las hemos utilizado como cajas de control y de indicación; aquí las dos cajas de números hacen ambas funciones. Si una caja de números tiene un valor numérico en su entrada, esta no sólo muestra el número si no que también repite el número en su salida. Sin embargo a una caja de número también puede ser enviado un mensaje de “ajuste”, tal como se hace con “set 55” en el ejemplo. Este deberá ajustar el valor de la caja de número a 55 (y mostrarlo) pero no hará que sea 55 el valor numérico de la salida. En este caso los números que llegan desde dos objetos receive están formateados (utilizando cajas de mensaje) para leer “set 55” en lugar de “55” u otro número de la misma manera. (La palabra especial “$1” se reemplaza por el número de entrada.) Esto se hace debido a que de otra manera obtendríamos un lazo infinito: la frecuencia cambiará la nota y esta cambiará la

frecuencia y así por siempre o hasta que algo se dañe. Más síntesis aditiva La triada mayor (ejemplo A06.frequency.pd) muestra una manera de combinar sinusoides, sumándolas. Hay muchas otras maneras de organizar conjuntos de sinusoides, de las cuales veremos dos. El ejemplo A07.fusion.pd (figura 1.14) muestra cuatro osciladores, cuyas frecuencias están en razones 1:2:3:4, con amplitudes relativas 1, 0,1, 0,2 y 0,5. las amplitudes están ajustadas multiplicando las salidas de los osciladores (el objeto *~ debajo de los osciladores). Los osciladores segundo, tercero y cuarto se encienden y apagan mediante el interruptor de palanca. Este es un control gráfico, al igual que la caja de número introducida anteriormente. El interruptor de palanca cambia a 1 y a 0 alternativamente cada que se hace click en él con el ratón. Este valor es multiplicado efectivamente por la suma del segundo, tercer y cuarto oscilador, hacéndolos que se enciendan y se apaguen. Incluso cuando todos los osciladores están combinados (con el interruptor de palanca en la posición “1”), el resultado se fusiona en un solo tono, escuchándose la nota dada por el primer oscilador de la izquierda. En efecto, este parche suma una serie de Fourier de cuatro términos que generan una onda periódica compleja. El ejemplo A08.beating.pd (figura 1.15) muestra otra posibilidad, en la cual seis osciladores están afinados en tres pares de fercuencias vecinas, por ejemplo 330 y 330,2 Hertz. Estos pares entran y salen de fase uno con otro, de tal manera que la amplitud de su suma cambia en el tiempo. Con el nombre de beating este fenómeno es utilizado con fercuencia para efectos musicales. Los osciladores se pueden combinar de otras maneras similares simplemente sumando sus salidas, y se puede obtener un amplio rango de sonidos diferentes. El ejemplo A09.frequency.mod.pd (que no se muestra aquí) muestra la síntesis por modulación de la frecuencia, en la cual un oscilador controla la frecuencia de otro oscilador. Esto se describirá de manera más completa en el capítulo 5. Ejercicios 1. Una sinusoide x[n] = acos(!n + Á) tiene una fase inicial Á = 0 y una frecuencia angular ! = π/10. Cuál es su periodo en muestras? Cuál es la fase en la muestra n = 10? 2. Dos sinusoides tienen periodos de 20 y 30 muestras, respectivamente. Cuál es el periodo de la suma de los dos? 3. Si 0 dB corresponden a una amplitud de 1, cuántos dB corresponden a amplitudes de 1,5, 2, 3 y 5? 4. Dos señales no correlacionadas de amplitud RMS 3 y 4 se suman; cuál es la amplitud RMS de la suma? 5. Cuántas señales no correlacionadas, todas con amplitud igual, debería usted adicionar para lograr una señal 9 dB más grande en amplitud? 6. Cuál es la frecuencia del C medio a 44.100 muestras por segundo? 7. Dos sinusoides suenan un C medio (MIDI 60) y un C sostenido medio (MIDI 61). Cuál es la diferencia, en Hertz, entre sus frecuencias?

8. Cuántos cent hay en el intervalo entre el séptimo y el octavo armónico de una señal periódica? 9. Si una señal de audio x[n], n = 0,...,N - 1 tiene una amplitud pico de 1, cuál es la amplitud RMS mínima posible? Cuál es la máxima posible?

Capítulo 2

Tabla de ondas y muestreadores En el capítulo 1 tratamos a las señales de audio como si fluyeran de manera continua con una velocidad de muestreo. La velocidad de las muestras no es realmente una cualidad de la señal de audio, si no que especifica qué tan rápido fluyen las muestras al interior del computador. Pero las señales de audio, en el fondo, no son si no secuencias de números y en la práctica aquí no es un requerimiento que tengan que ser “tocadas” secuencialmente. Otro punto de vista complementario es que ellas pueden ser almacenadas en la memoria y, más tarde, pueden ser leídas en cualquier orden -hacia adelante, hacia atrás, atrás y adelante o demanera totalmente aleatoria. Un rango inexhaustivo de nuevas posibilidades se abre. Por muchos años (aproximadamente entre 1950 y 1990), la cinta magnética sirvió como el principal medio para almacenar sonidos. Las cintas pasaban hacia atrás y hacia adelante a través de captadores magnéticos para reproducir las señales en tiempo real. Más o menos desde 1995, la forma predominante para almacenar sonidos ha sido guardarlos como señales de audio digital, que pueden ser reproducidas con mayor libertad y facilidad que las cintas magnetofónicas. Muchas formas de utilización que datan de la era de la cinta magnética todavía son de uso corriente, incluyendo el corte, la duplicación, el cambio de velocidad y el reversar en el tiempo. Otras técnicas tales como la conformación de ondas han tenido su propio desarrollo en la era digital. Suponga que tenemos almacenadas señales de audio digital, las cuales son sólo una secuencia de muestras (por ejemplo, números) x[n] para n = 0,...,N – 1, donde N es la longitud de la secuencia. Entonces, si tenemos una señal de entrada y[n] (la cual podemos imaginar fluyendo en el tiempo real), podemos utilizar sus valores como índices para leer los valores de la señal almacenada x[n]. Esta operación, llamada lectura de tabla de onda nos da una nueva señal z[n], que se calcula como:

z[n] = x[y[n]] Representamos esquemáticamente esta operación como se muestra en la figura 2.1. Viene dos complicaciones. La primera que los valores de entrada y[n], podrían quedar por fuera del rango 0,...,N – 1, en cuyo caso la tabla de onda x[n] no tiene valores y la expresión para la salida z[n] queda indefinida. En esta situación podemos escoger recortar la entrada, es decir, sustituir por 0 cualquier valor negativo y por N – 1 cualquier valor N o mayor que este. Alternativamente, podemos preferir envolver completamente la entrada de extremo a extremo. Adoptaremos aquí la convención de que las muestras por fuera del rango están siempre recortadas. Cuando necesitemos envolver completamente, introduciremos otra operación de procesamiento de señal que lo hará por nosotros. La segunda complicación es que los valores de entrada no necesariamente son enteros; en otras palabras, ellos podrían caer entre los puntos de la tabla de onda. Por el momento, sin embargo, sólo redondearemos hacia el valor entero inferior más cercano del valor de la entrada. A esto lo llamamos lectura de tabla de onda sin interpolación, y su definición completa es:

z[n] =

x[by[n]c]

si 0 ≤ y[n] < N – 1

x[0] x[N – 1]

si y[n] < 0 si y[n] ≥ N – 1

(donde by[n]c significa “el entero más grande que no excede el valor de y[n]”). Pictóricamente, utilizamos y[0] (un número) como un sitio sobre el eje horizontal de la tabla de onda que se muestra en la figura 2.1, y la salida z[0] el valor que obtengamos en el eje vertical; igual para y[1] y z[1] y así sucesivamente. El rango “natural” para la entrada y[n] es 0 ≤ y[n] < N. Este rango es diferente del usual de una señal de audio en la salida del computador, la cual va de -1 a 1 en nuestras unidades. Veremos más adelante que el rango de valores de entrada utilizable desde 0 hasta N para la lectura sin interpolación, se estrecha ligeramente si se utiliza la búsqueda con interpolación. La figura 2.2 (parte a) muestra una tabla de onda y el resultado de utilizar dos diferentes señales de entrada como índices de búsqueda dentro de esta. La tabla de onda contiene 40 puntos, los cuales se numeran de 0 a 39. En la parte (b), una onda diente de sierra se utiliza como señal de entrada y[n]. Una onda diente de sierra no es nada más que una función de rampa que se repite de extremo a extremo. En este ejemplo el rango de la diente de sierra es de 0 a 40 (lo cual se muestra en el eje vertical). La onda diente de sierra de esta manera lee la tabla de onda de izquierda a derecha -comenzando en el punto 0 hasta el punto final 39- haciéndolo nuevamente cada vez que se repite. En los cincuenta punto que se muestran en la figura 2.2 (parte b) la onda diente de sierra hace dos ciclos y medio. Su período es de veinte muestras, o en otras palabras, la frecuencia (en ciclos por segundo) es R/20. La parte (c) de la figura 2.2 muestra el resultado de aplicar la lectura de tabla de onda utilizando la tabla x[n], para la señal y[n]. Ya que la entrada de la diente de sierra simplemente lee el contenido de la tabla de onda de izquierda a derecha, repetidamnte a una velocidad constante de precesión, el resultado será una nueva señal periódica cuya forma de onda (su forma) es derivada de x[n] y cuya frecuencia está determinada por la onda diente de sierra y[n]. Las partes (d) y (e) muestran un ejemplo donde la tabla de onda es leída de manera no uniforme; debido a que la señal de entrada va incrementalmente de 0 a N y luego se a regresa a 0, vemos que la tabla de onda aparece primero hacia adelante, conserva su valor en su punto final y luego va hacia atrás. La tabla es leída de izquierda a derecha y luego, más rápidamente, es leída de derecha a izquierda. Al igual que en el ejemplo previo, la señal de entrada controla la velocidad de precesión mientras las amplitudes de salida son las mismas de la tabla de onda. 2.1 El oscilador tabla de onda La figura 2.2 sugiere una manera fácil para sintetizar cualquier forma de onda fija deseada a la frecuencia que queramos, utilizando el diagrama de bloque que se muestra en la figura 2.3. El bloque superior es un oscilador -no el oscilador sinusoidal que vimos anteriormente, si no uno que produce ondas diente de sierra en lugar de aquél. Sus valores de salida, tal como se indica a la izquierda del bloque, deben ir desde 0 hasta el tamaño de la tabla de onda N. Este se utiliza como índice dentro del bloque de lectura de la tabla de onda (que se introdujo en la figura 2.1), resultando una forma de onda periódica. La figura 2.3 (parte b) adiciona un generador de envolvente y un multiplicador para controlar la amplitud de la salida de la misma manera a como lo hace para el oscilador sinusoidal mostrado en la figura 1.7. Usualmente se utiliza una tabla de onda con amplitud 1 (pico o RMS), de tal manera que la amplitud de la salida es precisamente de la misma magnitud que la salida del generador de envolvente. Los osciladores tabla de onda son utilizados con frecuencia para sintetizar sonidos con espectro estático, específico. Para hacer esto usted puede precalcular N muestras de cualquier tipo de onda de período N (frecuencia angular

(2¼/N) adicionándole los elementos de la serie de Fourier. El cálculo para el ajuste de la tabla de onda al principio podría ser significante, pero este puede realizarse de manera anticipada al proceso de síntesis, el cual a su vez podría tener lugar en tiempo real. Mientras la síntesis aditiva directa de ondas complejas, como se mostró en el capítulo 1, es en principio infinitamente flexible como una técnica para producir tímbricas que varían en el tiempo, la síntesis de tabla de onda es mucho menos costosa en términos de computación, pero requiere el cambio de tablas de onda para variar el timbre. Una técnica intermedia, más flexible y costosa que la simple síntesis de tabla de onda pero menos flexible y menos costosa que la síntesis aditiva, es crear mezclas que varíen con el tiempo entre un pequeño número de tablas de onda. Si el número de tablas de onda es de dos únicamente, se trata en efecto de un cruzamiento atenuado entre las dos tablas de onda, tal como se diagrama en la figura 2.4. Suponga que deseamos usar alguna señal 0 ≤ x[n] ≤ 1 para controlar las fuerzas relativas entre los dos tipos de onda, de tal manera que si x[n] = 0 obtenemos la primera y si x[n] = 1 obtenemos la segunda. Denotando las dos señales para el cruzamiento atenuado como y[n] y z[n], calculamos la señal (1 - x[n])y[n] + x[n]z[n] o de manera equivalente y usualmente más eficiente para calcular,

y[n] + x[n](z[n] - y[n]) Este cómputo se diagrama en la figura 2.4. Cuando se utiliza esta técnica para el cruzamiento atenuado entre osciladores de tabla de onda, es deseable mantener las fases de los parciales correspondientes iguales a través de las tablas de onda, de tal manera que sus amplitudes se combinen aditivamente cuando se estén mezclando. De otro lado, si se están utilizando tablas de onda arbitrarias (extraídas, por ejemplo, de un sonido grabado) habrá un efecto de fase cuando las diferentes formas de onda se mezclen. Este esquema puede extenderse en cadena sucesiva para poder moverse a lo largo de un camino continuo entre una sucesión de timbres. Alternativamente, o en combinación con una cadena extensa, el cruzamiento atenuado puede utilizarse para interpolar entre dos timbres diferentes, por ejemplo como una función de la dinámica musical. Para hacer esto usted deberá preparar dos o más formas de ondas de una sola voz sintetizada ejecutada con dinámicas diferentes, e interpolar entre ellas de manera sucesiva como una función de la salida dinámica que usted requiera. 2.2 Muestreo El “muestreo” no es más que grabar una señal en vivo dentro de una tabla de onda, y luego ejecutarla de nuevo. (En las muestras comerciales la tabla de onda entera es usualmente denominada “muestra” pero para evitar confusión usaremos la palabra “muestra” para significar un solo número en una señal de audio digital.) En su forma más sencilla, un “muestreador” es simplemente un oscilador de tabla de onda, como se muestra en la figura 2.3, Sin embargo, en una discusión anterior imaginamos al oscilador funcionando a una frecuencia tan alta que la percibimos como una nota, por lo menos desde los 30 Hz aproximadamente. Para el caso del muestreo, la frecuencia es casi siempre menor de 30 Hz y así el período, de por lo menos 1/30 de segundo, es suficientemente largo como para escuchar los ciclos individuales como eventos separados. Regresando a la figura 2.2, suponga que en lugar de una tabla de onda de 40

puntos x[n] es un segundo de grabación con una velocidad de muestras original de 44100, de tal manera que tiene 44100 puntos; y digamos que y[n] en la parte (b) de la figura tiene un período de 22050 muestras. Esto nos lleva a una frecuencia de 2 Hertz. Pero lo que escuchamos no es un sonido o tono musical a 2 ciclos por segundo (es demasiado lento para escucharlo como un tono) si no que estamos escuchando la grabación original x[n] ejecutada de manera repetida al doble de la velocidad. Acabamos de re-inventar el muestreo. En general, si asumimos que la velocidad de las muestras R de la grabación es la misma que la velocidad de las muestras a la salida, que la tabla de ondas tiene N número de muestras e indexamos ésta con una onda diente de sierra cuyo período consta de M número de puntos, la muestra es acelerada o desacelerada por un factor de N/M, igual a Nf/R si f es la frecuencia en Hertz de la diente de sierra . Si denotamos el factor de transposición por t (de tal manera que por ejemplo, t = 3/2 significa una transposición de una quinta perfecta hacia arriba), y si denotamos la transposición en semitonos por h, entonces obtenemos las Fórmulas de Transposición para Tablas de Onda en Lazo

t = N/M = Nf/R h = 12log2(N/M) = 12log2(Nf/R) Con frecuencia se conoce la transposición deseada en semitonos (h) y la fórmula se debe resolver para f o para N:

f = (2h/12R)/N N = (2h/12R)/f Hasta ahora hemos utilizado una diente de sierra como onda de entrada y[t] , pero tal como se sugiere en las partes (d) y (e) de la figura 2.2, podemos utilizar cualquier onda que queramos como señal de entrada. En general, la transposición será dependiente del tiempo y está controlada por la manera en que cambia la señal de entrada. La transposición múltiple t y la transposición en semitonos h están determinadas entonces por las Fórmulas de Transposición Momentáneas para las Tablas de Onda:

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

y[n] - y[n - 1] = 1 De otro lado si y[n] = 2n entonces la tabla de onda se transpone una octava hacia arriba, lo cual es consistente con

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

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

al principio de cada nuevo ciclo. Es bien sabido que al transponer una grabación también se transpone su timbre -este es el efecto “chipmunk”. No solamente cualquier periodicidad (tal como cuando se eleva a un tono) es transpuesta, si no también las frecuencias de los sobretonos. Algunos timbres, notablemente aquellos de sonidos vocales, tienen rangos de frecuencia carcaterísticos en los cuales los sobretonos son más fuertes que los otros más cercanos. Tales rangos de frecuencia también son transpuestos y esto es escuchado como un cambio en el timbre. En un lenguaje que será más preciso en la sección 5.1, decimos que la envolvente espectral es transpuesta junto con el tono o los tonos. Tanto en esta como en la sección precendente, consideramos la ejecución de las tablas de onda de manera periódica. En la sección 2.1 la reproducción es repetida tan velozmente, que se eleva a un “tono”, es decir entre 30 y 4000 veces por segundo, aproximadamente la tesitura de un piano. En esta sección asumiremos una tabla de onda de un segundo de longitud, y en este caso factores de transposición “razonables” (menos de cuatro octavas arriba) podrán elevar a una velocidad de repetición por debajo de 30, usualmente mucho menor y hacia abajo, tan grave como se quiera. El número 30 es significativo por otra razón: es aproximadamente el máximo número de eventos separados que puede discernir el oído en un segundo; por ejemplo, 30 fonemas vocales, o notas melódicas o ataques de un redoblante están cerca de lo que más podemos esperar discernir en un segundo antes de que nuestra habilidad para distinguirlos falle. Existe un continuo entre muestreadores y osciladores de tabla de onda, de tal forma que el parche de la figura 2.3 puede ser tratado como un muestreador (si la frecuencia de repetición es de menos de 20 Hertz aproximadamente) o como un oscilador de tabla de onda (si la frecuencia es de aproximadamente 40 Hertz). Es posible movernos continuamente entre los dos regímenes. Es más, no es necesario ejecutar una tabla de onda completa en un lazo; con un poco más de aritmética podemos escoger subsegmentos de la tabla de onda, y estos pueden cambiar en longitud y localización continuamente cuando se ejecuta la tabla de onda. La práctica de ejecutar muchos pequeños segmentos de una tabla de onda en rápida sucesión es usualmente llamada síntesis granular. La figura 2.5 muestra cómo construír un muy simple muestreador de lazo. En la figura, si la frecuencia es f y el tamaño del segmento en número demuestras es s, el factor de transposición de la salida está dado por t = fs/R, donde R es la velocidad de muestra a la cual fue grabada la tabla de onda (la cual no necesita ser igual a la velocidad de muestras a la cual trabaja el diagrama de bloque.) En la práctica, esta ecuación deberá resolverse o para f o para s para obtener una transposición deseada. En la figura, un oscilador diente de sierra controla la localización de la lectura de la tabla de onda, pero los valores inferiores y superiores de la diente de sierra no están especificados de manera estática tal como lo estaban en la figura 2.3; en lugar de esto, el oscilador de diente de sierra simplemente tiene valores de 0 a 1 y este rango se ajusta para seleccionar un segmento deseado de las muestras en la tabla de onda. Sería bueno especificar la localización del segmento l sea desde su extremo izquierdo (su frontera más baja) o desde el punto medio del segmento; en cualquier caso especificamos la longitud s como un parámetro separado. En el primer caso, comenzamos multiplicando la diente de sierra por s,de tal manera que el rango quede de 0 a s; luego adicionamos l de tal manera que ahora el

rango vaya de l a l + s. Para especificar la localización a partir del punto medio del segmento, primero sustraemos 1/2 de la diente de sierra (así su rango queda de -1/2 a 1/2), y luego, tal como se hizo antes, multiplicamos por s (de tal manera que el rango queda entre -s/2 y s/2) y añadimos l para que el rango quede de l-s/2 a l+s/2. En el muestreador de lazo, debemos mantener la continuidad entre el comienzo y el final de los segmentos de la tabla de onda; nos ocuparemos de esto en la próxima sección. Un detalle adicional es que, si el tamaño del segmento y su localización están cambiando en el tiempo (podrían ser señales de audio digital también, por ejemplo), afectarán el factor de transposición, y la afinación o el timbre de la señal de salida podrían ondular hacia arriba y hacia abajo como consecuencia de esto. La forma más simple para evitar este problema es sincronizar los cambios en los valores de s y l con las discontinuidades regulares de la diente de sierra; ya que la señal salta de manera discontinua, la transposición no está realmente definida aquí de ninguna manera, y, si está haciendo envolvente para esconder la discontinuidad, el efecto de cambio en s y l también queda oculto. 2.3 Muestreadores de envolvente En las secciones previas consideramos la lectura de una tabla de onda ya fuera de manera esporádica o de manera repetida para hacer un muestreador. En la mayoría de las aplicaciones reales debemos trabajar para que las muestras inicien y paren de manera limpia, de tal manera que la señal de salida no salte de manera discontinua al comienzo y al final de las muestras. Esta discontinuidad puede sonar como un “click” o como un “thump” dependiendo de la tabla de onda. La manera más fácil de hacerlo, asumiendo que la tabla de onda se ejecutará desde el principio hasta el fin, es simplemente prepararla con anticipación de tal manera que su amplitud entre gradualmente al inicio y se atenúe de igual manera al final. Esto es posible hacerlo incluso cuando se graban las muestras de la tabla de onda en vivo, multiplicando la señal de entrada por una envolvente segmento de línea, que tenga la misma longitud de la grabación. En muchas situaciones es inconveniente o imposible pre-envolver la tabla de onda -por ejemplo si quisiéramos reproducir sólo una parte de ésta o si quisiéramos cambiar la pendiente de la envolvente dinámicamente. En la sección 1.5 vimos cómo controlar la envolvente de los osciladores sinusoidales utilizando la multiplicación por una función rampa (también conocida como generador de envolvente), y reconstruimos esta noción en los osciladores de tabla de onda de las figuras 2.3 y 2.4. Esto también funciona para iniciar y finalizar las muestras evitando discontinuidades, pero con una gran diferencia: toda vez que en la síntesis de tabla de onda éramos libres de asumir las formas de ondas lineales de extremo a extremo, de tal manera que podíamos escoger cualquier tiempo para esta envolvente, en el caso del muestreo, al utilizar formas de onda no preparadas, estamos obligados a tener valor cero del generador de envolvente al momento de alcanzar el final de la tabla de onda por primera vez. Esta situación se grafica en la figura 2.6. En situaciones donde una tabla de onda arbitraria debe repetirse tantas veces como se requiera, la forma más sencilla de hacer que el lazo trabaje de manera continua es arreglar las cosas para que el cambio de amplitud se sincronice con el lazo, utilizando una tabla de onda aparte (la envolvente). Esto se puede implementar según se muestra en la figura 2.7. Un solo oscilador diente de sierra se utiliza para calcular los índices de lectura de las dos tablas, la que contiene el sonido grabado y la que hace la forma de la envolvente. De lo que más debemos preocuparnos es que las entradas para ambas tablas de onda tengan su propio rango correspondiente.

En muchas situaciones es deseable combinar dos o más copias del muestreador de lazo de la tabla de onda a la misma frecuencia y a una relación de fase específica. Esto puede hacerse de tal manera que cuando una de ellas en particular llegue al final del segmento, otra u otras estén en la mitad de ese segmento, de tal manera que todas en conjunto hacen un sonido continuo. Para lograrlo, requerimos una manera de generar dos o más ondas diente de sierra con la relación de fase deseada para utilizarlas en lugar del oscilador de la parte superior de la figura 2.7. Podemos comenzar con una sola onda diente de sierra y luego producir las otras con una relación de fase fija con la primera. Si queremos una diente de sierra que esté, digamos, a ciclos por delante de la primera, simplemente añadimos el parámetro a y luego tomamos la parte fraccional, que es la nueva diente de sierra que queríamos, tal como se muestra en la figura 2.8. 2.4 Estiramiento del timbre El oscilador tabla de onda de la sección 2.1, que extendimos en la sección 2.2 para encerrar ondas de tablas de onda arbitrarias tales como sonidos grabados, puede adicionalmente extenderse de una manera complementaria, que denominaremos estiramiento del timbre por razones que desarrollaremos en esta sección. Hay muchas otras maneras de extender la síntesis de tablas de onda como por ejemplo la modulación de la frecuencia y la conformación de onda, pero las dejaremos para capítulos posteriores. La idea central del estiramiento del timbre es reconsiderar la idea del oscilador tabla de onda como un mecanismo para ejecutar una tabla de onda (o parte de ésta) almacenada de extremo a extremo. No hay razón para que el final de un ciclo deba coincidir con el comienzo del siguiente. En lugar de esto podríamos buscar la manera de espaciar las copias de la onda insertando silencios alternativamente; o, yendo en la dirección opuesta, las copias de la onda podrían estar tan juntas que se traslapen. El único parámetro disponible en la sección 2.1 -la frecuencia- ha sido utilizado hasta aquí para controlar dos aspectos separados de la salida: el período al cual comenzamos las nuevas copias de la onda, y la longitud de cada copia individual. La idea del estiramiento del timbre es controlar las dos de manera independiente. La figura 2.9 muestra el resultado de ejecutar una tabla de onda de tres maneras diferentes. En cada caso la onda de salida tiene un período de 20; en otras palabras, la frecuencia de salida es R/20, siendo R la velocidad de salida de las muestras En la parte (a) de la figura, cada copia de la onda es ejecutada en 20 muestras, de tal manera que la forma de la onda queda exactamente dentro del ciclo, sin espacios ni traslapes. En la parte (b) aunque el período sigue siendo 20, la onda se comprime en el medio a la mitad del período (10 muestras); o, en otras palabras, el ciclo de trabajo -la cantidad relativa de tiempo en el cual la onda llena el ciclo- es del 50 por ciento. Durante el 50 por ciento restante la salida es cero. En la parte (c) la onda es estirada a 40 muestras, y ya que ésta se repite todavía cada 20 muestras, las ondas se traslapan dos a uno. El ciclo de trabajo es, de esta manera, del 200 por ciento. Suponga ahora que el ciclo de tarea del 100 por ciento de la onda tiene una serie de Fourier (sección 1.7) igual a:

x100[n] = a0 + a1cos(!n + Á1) + a2cos(2!n + Á2) + ... donde ! es la frecuencia angular (igual a ¼/10 en nuestro ejemplo ya que el período es 20 .) Para simplificar este ejemplo no nos

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

x100[2n] = x50[n] + x50[n + ¼/!] donde ! es la frecuencia angular (y así ¼/! es la mitad del período) de ambas señales. De esta manera, si escribimos la serie de Fourier de x50[n] como:

x50[n] = b0 + b1cos(!n + µ1) + b2cos(2!n + µ2) + ... y sustituimos las series de Fourier para todos los tres términos de arriba, tenemos:

a0 + a1cos(2!n + Á1) + a2cos(4!n + Á1) + ... = b0 + b1cos(!n + µ1) + b2cos(2!n + µ2) + ... + b0 + b1cos(!n + ¼ + µ1) + b2cos(2!n + 2¼ + µ2) + ... = 2b0 + 2b2cos(2!n + µ2) + 2b4cos(4!n + µ4) + ... y así

a0 = 2b0, a1 = 2b2, a2 = 2b4 sucesivamente: en cuanto a los parciales pares de x50, se obtienen estirando los de x100 el doble, al alejarse. (No sabemos nada aún de los parciales impares de x50, los cuales podrían estar en línea con los parciales pares o no, dependiendo de factores que no podemos controlar todavía. Basta con decir, por el momento, que si las ondas se conectan suavemente con el eje horizontal en ambos extremos, los parciales impares actuarán globalmente como los pares. Para hacer esto con mayor exactitud necesitaremos análisis de Fourier, el cual es desarrollado en el capítulo 9.) De manera similar, x100 y x200 están relacionadas de la misma manera:

x200[2n] = x100[n] + x100[n + ¼/!] de tal manera que, si las amplitudes de las series de Fourier de x200 se denotan como c0, c1, ..., obtenemos:

c0 = 2a0, c1 = 2a2, c2 = 2a4, ... de tal manera que los parciales de x200 son aquellos de x100 comprimidos a la mitad, y hacia la izquierda. Vemos que comprimir la onda por un factor de 2 tiene el efecto de estirar la serie de Fourier por dos, y de otro lado, estirar la onda por un factor de dos comprime la serie de Fourier por dos. Siguiendo el mismo argumento, en general al estirar la onda por un factor cualquiera posible f comprime los sobretonos, en frecuencia, por el recíproco 1/f -por lo menos aproximadamente, y esta

aproximación es buena si la onda se “comporta bien” en sus extremos. (Como lo veremos más adelante, la onda puede forzarse para comportarse razonablemente bien envolviéndola como se muestra en la figura 2.7.) La figura 2.10 muestra el espectro de las tres ondas -o en otras palabras la onda en sus tres ciclos de trabajo- de la figura 2.9. En la figura se enfatiza la relación entre los tres espectros, trazando curvas a través de cada espectro, las cuales, por inspección, tienden a convertirse en la misma curva, únicamente estiradas de manera diferente; cuando el ciclo de trabajo aumenta, la curva se comprime a la izquierda (todas la frecuencias caen) y se amplifican (se estira hacia arriba). Las curvas continuas tienen una interpretación muy simple. Imagine comprimir la onda en un muy pequeño ciclo de trabajo, por decir del 1 por ciento. El contorno se estirará por un factor de 100. Yendo hacia atrás, esto nos permitiría interpolar entre cada par de puntos consecutivos del 100 por ciento del contorno del ciclo de trabajo (el original) 99 puntos nuevos. Como ya se ve en la figura el ciclo de tarea del 50 por ciento define la curva con el doble de resolución de la curva original. En el límite, si el ciclo de trabajo se hace muy pequeño, el espectro se llena más y más densamente; el límite es el espectro “real” de la onda. Este espectro “real” se escucha únicamente a muy bajos ciclos de trabajo, sin embargo. En el ejemplo del 200 por ciento de ciclo de trabajo desaparece el pico en el espectro ideal (continuo) debido a que el pico cae por debajo del primer armónico. En general los ciclos de trabajo altos son una muestra ideal de la curva a más bajas resoluciones . El estrechamiento del timbre es una técnica extremadamente poderosa para generar sonidos con un espectro variable. En combinación con las posibilidades de mezclar las ondas (sección 2.1) y de poder escoger entre un sin fin de ondas variables de sonidos grabados en muestras (sección 2.2), es posible generar todo tipo de sonidos. Por ejemplo, el diagrama de bloque de la figura 2.7 nos da una manera de grabar y estirar formas de onda de una tabla de onda grabada. Cuando el parámetro “frecuencia” f es suficientemente alto como para escucharse como un tono, el parámetro “tamaño” s puede tomarse para controlar el estiramiento del timbre, vía la fórmula t = fs/R de la sección 2.2 , con lo que ahora reinterpretamos t como el factor por el cual se estira el timbre . 2.5 Interpolación Como se mencionó anteriormente, los esquemas de interpolación son utilizados normalmente para incrementar la exactitud de la lectura de tabla. Haremos aquí un cálculo algo simplificado de los efectos de los tamaños de la tabla de onda y de los esquemas de interpolación en el resultado de la lectura de tabla. Para hablar del error en la lectura de tabla de onda, debemos ver la tabla de onda como una versión en muestras de una función subyacente. Cuando buscamos un valor de esa función subyacente que está entre los puntos de la tabla de onda, el error es la diferencia entre el resultado de la lectura de la tabla de onda y el valor “ideal” de la función en ese punto. Los estudios más relevantes del error en la lectura de tabla de onda asumen que la función subyacente es una sinusoide (ver página 1). Podemos entender entonces lo que sucede con otras

tablas de onda considerándolas como superposiciones (sumas) de sinusoides. La seguridad de la lectura de una tabla de onda conteniendo una sinusoide depende de dos factores: de la calidad del esquema de interpolación, y del período de la sinusoide. En general mientras más largo es el período de la sinusoide, el resultado es más exacto. En el caso de una tabla de onda sintetizada, podemos conocer sus componentes sinusoidales al especificarlos -en cuyo caso basta con escoger un tamaño de tabla de onda apropiado al momento de calcular la tabla de onda, para que se ajuste con el algoritmo de interpolación y encontrar así el nivel deseado de exactitud. En el caso de sonidos grabados, el análisis de exactitud podrían dirigirnos a ajustar la velocidad de las muestras de la grabación, ya sea ajustando la salida o a hacer un nuevo muestreo. El error de interpolación para una tabla de onda sinusoidal puede tener dos componentes: el primero, que la señal continua (el resultado teórico de leer la tabla de onda continuamente en el tiempo, tal como si la velocidad de las muestras fuera infinita) podría no ser una sinusoide pura; y el segundo, que la amplitud podría ser errónea. (Es posible tener errores de fase también, pero únicamente por descuido.) En el desarrollo únicamente consideraremos esquemas de interpolación polinomial tales como el redondeo, la interpolación lineal y la interpolación cúbica. Estos esquemas dan valores al evaluar polinomios (de grado cero, uno y tres respectivamente) en los intersticios entre los puntos de la tabla de onda. La idea es que para cualquier índice x, escojamos un punto de referencia cercano x0, y hagamos que la salida se calcule por algún polinomio:

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

yINT(x) = y[x0] + (y[x0 + 1] – y[x0]).(x – x0) el cual es un polinomio, como en la fórmula previa, con

a0 = y[x0] a1 = y[x0 + 1] – y[x0] En general usted puede ajustar un polinomio de grado n -1 a través de cualquier número de puntos n, en tanto sus valores x sean todos diferentes. La figura 2.11 muestra el efecto de utilizar interpolación lineal (dos puntos) para rellenar una sinusoide de periodo 6. De los tres trazos que se dibujan, desde arriba hacia abajo, aparecen: la sinusoide original, el resultado de la interpolación lineal entre los 6 puntos del período utilizado para representar la sinusoide y, finalmente, otra sinusoide, ligeramente más pequeña en amplitud, la cual es la que mejor coincide con la onda de los seis segmentos. El error introducido al reemplazar la sinusoide original por la versión con interpolación lineal tiene dos componentes: el primero, un cambio en la amplitud (que es poco perceptible) y el segundo, una distorsión en la forma de la onda (la cual es muy perceptible). La gráfica inferior en la figura muestra la diferencia entre la onda interpolada

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

yINT(x) = -f(f – 1)(f – 1)/6.y[x0 - 1] + (f + 1)(f – 1)(f – 2)/2.y[x0] -(f + 1)f(f – 2)/2.y[x0 + 1] + (f + 1)f(f – 1)/6.y[x0 + 2] donde f = x – x0 es la parte fraccional del índice. Para tablas con 4 o más puntos, doblar el número de puntos de la tabla tiende a mejorar el error RMS en 24 dB. La tabla 2.1 muestra el error RMS calculado para sinusoides en varios períodos, para 1, 2 y 4 puntos de interpolación. (Una cantidad ligeramente diferente se mide en [Moo90, pág.164]. Aquí, los errores en amplitud y fase se pueden añadir llegando a resultados ligeramente más pesimistas. Ver también [Har87].) El dominio de entrada disponible para la lectura de la tabla depende del número de puntos de interpolación. En general, cuando usamos k-puntos de interpolación en una tabla con N puntos, el rango está sobre un intervalo de N + 1 – k puntos. Si k = 1 (es decir, sin ningún tipo de interpolación), el dominio es de 0 a N (incluyendo el punto final en 0 pero excluyendo el que queda en N) asumiendo que los valores de entrada están truncados (tal como se hace para leer tabla no interpolada en Pd). El dominio es de -1/2 a N - 1/2 si, en cambio, redondeamos la entrada al entero más cercano en lugar de interpolar. En cualquier caso el dominio se estira sobre una longitud de N puntos. Para la interpolación de dos puntos, la entrada debe quedar entre el primer y el último puntos, esto es, entre 0 y N - 1. De esta manera N puntos son suficientes para definir la función sobre un dominio de longitud N – 1. Para interpolación de cuatro puntos, no podemos tener valores de entrada entre 0 y 1 (no podemos tener los dos puntos requeridos a la izquierda de la entrada) y tampoco podemos tenerlos para el espacio entre los dos últimos puntos (N – 2 y N – 1). Así en este caso el dominio va de 1 a N – 2 y tiene una longitud N – 3. Las ondas periódicas almacenadas en tablas de onda requieren tratamiento especial en los extremos de la tabla. Por ejemplo, suponga que queremos almacenar una sinusoide pura de longitud N. Para leer una tabla sin interpolación, es suficiente ajustar, por ejemplo,

x[n] = cos(2¼n/N), n = 0, ..., N - 1 Para interpolación de dos puntos, necesitamos N + 1 puntos:

x[n] = cos(2¼n/N), n = 0, ..., N En otras palabras debemos repetir el primer punto (n = 0) al final, de tal manera que el último segmento de N - 1 a N alcance a regresar al valor inicial. Para la interpolación de cuatro puntos, el ciclo debe ajustarse para iniciar en el punto n = 1 , ya que no podemos obtener valores de interpolación apropiados para valores de entrada menores que uno. Si, entonces, un ciclo de la tabla de onda se arregla de 1 a N, debemos suplir los puntos extra para 0 (copiado de

N), y también N + 1 y N + 2 copiados de 1 y 2, para hacer una tabla de longitud N + 3. Para la misma sinusoide de arriba, la tabla deberá contener: x[n] = cos(2¼(n - 1)/N), n = 0, ..., N + 2 2.6 Ejemplos Oscilador tabla de onda El ejemplo B01.wavetables.pd, mostrado en la figura 2.12, implementa un oscilador tabla de onda, el cual reproduce desde una tabla de onda denominada “table10”. Dos nuevos objetos Pd se muestran aquí. El primero es la tabla de onda misma, que aparece a la derecha en la figura. Usted puede arrastrar el ratón sobre la tabla de onda para cambiar su forma y escuchar el cambio en el sonido resultante. No se muestra en la figura pero se demuestra en el parche Pd la facilidad para calcular tablas de onda automáticamente con amplitudes específicas de los parciales, lo cual es a veces preferible a dibujar ondas a mano. Usted también puede leer y escribir tablas (texto o sonido) en archivos para intercambiar datos con otros programas. La otra novedad es un objeto de la clase: tabosc4~: un oscilador tabla de onda. El “4” indica que esta clase utiliza interpolación de 4 puntos (cúbica). En el ejemplo, el nombre de la tabla, “table10”, está especificado como un argumento para la creación del objeto tabosc4~. (Usted también puede cambiar dinámicamente de tablas de onda enviando el mensaje apropiado al objeto.) Las tablas de onda utilizadas por tabosc4~ deben tener siempre un período igual a una potencia de dos; pero como se mostró antes, la tabla de onda debe tener tres puntos extras envolviendo los extremos. Las longitudes de tabla disponibles son así de la forma 2m + 3, tales como 131, 259, 515, etc. Los osciladores tabla de onda no están limitados a utilizarse como osciladores de audio. El parche B02.wavetable.FM.pd (que no se muestra aquí) utiliza un par de osciladores de tabla de onda en serie. La salida del primero es utilizado como la entrada del segundo, y de esta manera controla su frecuencia, la cual cambia periódicamente en el tiempo. Lectura de tabla de onda en general El objeto tabosc4~, aunque es práctico y eficiente, es algo especializado y para muchas de las aplicaciones descritas en este capítulo necesitaremos algo más general. El ejemplo B03.tabread4.pd (figura 2.3) demuestra la técnica de estiramiento de timbre discutida en la sección 2.4. Este es un ejemlo simple de una situación donde tabosc4~ no sería suficiente. Hay nuevos objetos aquí: tabread4~: lectura de tabla de onda. Al igual que con tabosc4~ la tabla se lee utilizando interpolación de 4 puntos. Pero aunque tabosc4~ toma una frecuencia como entrada y automáticamente lee la forma de onda en patrón repetido, tabread4~ es más sencillo y espera el índice de lectura de tabla de onda como una entrada. Si se quiere utilizarlo para hacer algo repetitivo, como en este ejemplo, la entrada misma debe ser una onda repetida. Al igual que tabosc4~ (y todos los demás objetos de lectura y escritura de tablas), usted puede enviar mensajes para seleccionar cuál tabla utilizar. tabwrite~: graba una señal de audio en una tabla de onda. En este ejemplo tabwrite~ se utiliza para mostrar la salida (aunque más tarde lo utilizaremos para otro tipo de cosas.) Cada vez que recibe un mensaje “bang” del ícono botón sobre éste, tabwrite~ comienza a escribir muestras sucesivas de su entrada en la tabla nombrada. El ejemplo B03.tabread4.pd muestra cómo combinar un objeto phasor~ y uno

tabread4~ para hacer un oscilador tabla de onda. La salida de phasor~ tiene un rango de valores de 0 a 1. En este caso la tabla de onda de entrada, denominada “waveform12”, es de 131 elementos de logitud. El dominio para el objeto tabread4~ es así de 1 a 129. Para ajustar el rango de phasor~ según esto, lo multiplicamos por la longitud del dominio (128) de tal manera que vaya de 0 a 128, y luego adicione 1, deslizando el intervalo de manera efectiva a la derecha, en un punto. Este reescalado se hace con los objetos *~ y +~ entre phasor~ y tabread4~. Con solamente estas cuatro cajas habríamos reinventado en escencia el objeto tabosc4~. En este ejemplo, sin embargo, la multiplicación no es por una constante 128 si no por una cantidad variable controlada por el parámetro “squeeze”. La función de las cuatro cajas a la derecha del parche es suministrar al objeto *~ los valores para escalar a phasor~. Para esto se hace uso de una nueva clase de objeto: pack: se compone de una lista de dos o más elementos. La creación de los argumentos establece el número de estos, sus tipos (usualmente números) y sus valores iniciales. Las entradas (serán según la cantidad que se especifique en la creación de argumentos) actualizan los valores de los mensajes de los argumentos, y, si se cambia la entrada de la izquierda (o si simplemente se dispara con un mensaje “bang”), el mensaje va a la salida. En este parche los argumentos son inicialmente 0 y 50, pero la caja de número actualizará el valor del primer argumento, de tal manera que, según se muestra, el mensaje más reciente que salió del objeto pack fue “206 50”. El efecto de esto sobre el objeto line~ que está debajo es una pendiente al valor 206 en 50 milisegundas; en general la salida del objeto line~ es una señal de audio que de manera suave sigue los cambios esporádicos en los valores de la caja de número etiquetada “squeeze”. Finalmente 128 es adicionado al valor “squeeze”; si “squeeze” toma valores no negativos (tal como lo fuerza la caja de número en este parche), el multiplicador de ajuste de rango hace que phasor~ se multiplique por 128 o más. Si este valor es mayor que 128 el efecto es que la función “phasor” re-escalada gaste alguna fracción de su ciclo atorada al final de la tabla de onda (lo cual recorta su entrada a 129). El resultado es que la onda es leída sobre alguna fracción del ciclo. Como se muestra, la onda es comprimida a 128/(128+206) de un ciclo, de tal forma que el espectro se estira por un factor de casi 1/2 . Para simplificar, este parche es sutilmente diferente del ejemplo de la sección 2.4 en el que las ondas son comprimidas hacia el comienzo de cada ciclo y no hacia la mitad. Esto tiene el efecto de cambiar ligeramente la fase de varios parciales de la onda cuando se estira y cuando se comprime; si el factor de compresión cambia rápidamente, la deriva correspondiente de la fase sonará como una ligera variación en el tono. Esto se puede evitar utilizando un arreglo ligeramente más complicado: sustraer 1/2 de phasor~, multiplicarlo por 128 o más y luego añadir 65 en lugar de uno. Utilizando una tabla de onda como un muestreador El ejemplo B04.sampler.pd (figura 2.14) muestra cómo utilizar una tabla de onda como un muestreador. En este ejemplo el índice dentro de la muestra (la tabla de onda) es controlado al accionar el ratón sobre la caja de número que se encuentra en la parte superior. Una escala conveniente para la caja de número es

de centésimas de segundo; para convertirlo a muestras (tal como lo requiere la entrada de tabread4~) multiplicamos por 44100 muestras/s por 0.01 s para obtener 441 muestras por unidad, antes de aplicar pack y line~ de la misma manera que lo utilizamos en ejemplo previo. La transposición que usted escucha depende de qué tan rápido mueva el ratón arriba y abajo. Este ejemplo ha introducido un nuevo tipo de objeto: hip~: un filtro simple pasa-altos (corta-graves). El argumento proporciona la frecuencia que se elimina en ciclos por segundo. Utilizamos esto aquí para eliminar la salida constante (frecuencia cero) cuando la entrada se situa en una sola muestra (cada que usted no esté cambiando de manera activa el sitio de lectura con el ratón). Los filtros se discuten en el capítulo 8. Los objetos pack y line~ en este ejemplo no se incluyen únicamente para hacer el sonido más continuo, si no que son esenciales para hacer el sonido entendible. Si el índice de lectura de la tabla de onda cambia simplemente cada que el ratón se mueve un pixel (por decir, veinte a quince veces por segundo) la gran mayoría de las muestras tendrán el mismo índice que la muestra anterior (las otras 44100+ muestras, sin contar aquellas donde el ratón se ha movido). De esta manera la velocidad de precesión será casi siempre cero. En lugar de cambiar las transposiciones, usted escuchará arena de 20 a 50 ciclos por segundo. (Trate de encontrar cómo suena esto!) Muestreadores de lazo En la mayoría de las situaciones, usted querrá una forma más automática para especificar los sitios de lectura de la tabla de onda, que hacerlo con el movimiento del ratón; por ejemplo, usted podría querer ser capaz de ejecutar una muestra en una transposición fija; usted podría tener varias muestras reproduciéndose a la vez (u otras cosas que requieran de atención), o usted podría querer cambiar rápidamente entre muestras o ir a sitios pre-fijados de la tabla de onda. En los pocos ejemplo siguientes desarrollaremos un lector de muestras enlazadas automático, el cual, aun cuando es una de las múltiples posibilidades, es una poderosa y muy utilizada. Los parches B05.sampler.loop.pd y B06.sampler.loop.smooth.pd muestran cómo hacer esto: el primero de la manera más sencilla posible y el segundo (que se muestra en la figura 2.15, parte a) incorporando una segunda onda para envolver el sonido según se describe en la sección 2.3. Un nuevo tipo de objeto se introduce aquí: cos~: calcula el coseno de 2¼ veces la entrada de la señal (de tal manera que de 0 a 1 hace un ciclo completo). A diferencia de la tabla que lee objetos en Pd, cos~ maneja la envolvente de tal manera que no hay limitación de rango en su entrada. En la figura 2.15, (parte a), un objeto phasor~ proporciona los índices de la tabla de onda (a la derecha) y la fase para la función de envolvente de mitad de coseno a la izquierda. Estas dos se multiplican y el producto es filtrado por un filtro pasa-altos, y enviado a la salida de audio. La lectura de la tabla de onda es directa; el fasor es multiplicado por un parámetro “chunk size” , adicionado a 1, y utilizado como un índice para tabread4~. El parámetro tamaño de segmento se multiplica por 441 para convertirlo de centésimos de segundo a muestras. Esto corresponde exactamente al diagrama de bloque que se muestra en la figura 2.5, con una localización de segmento de 1. (la localización del segmento no puede ser 0 debido a que 1 es el índice mínimo para el cual trabaja tabread4~.) El camino de la señal a la izquierda en el ejemplo corresponde a la técnica de lectura de tabla de onda envolvente mostrado enla figura 2.7. Aquí la onda diente de sierra está ajustada al rango (-1/4, 1/4) (al sustraer y multiplicar por 0.5), y luego lo envía a cos~. Este lee la función coseno en el rango (-¼/2,

¼/2), dándole de esta manera la mitad positiva de la onda. La parte (b) de la figura 2.15 introduce un tercer parámetro, el “read point” el cual especifica en qué punto de la muestra debe comenzar el lazo. (En la parte (a) siempre se comenzaba al inicio). El cambio necesario es simple: adicionar el valor de control para el “punto de lectura”, en muestras, para el índice de la tabla de ondas y proceder como antes. Para evitar discontinuidades en el índice suavizamos el valor del punto de lectura utilizando los objetos pack y line~ tal como lo hicimos en el primer ejemplo del muestreador (figura 2.14). Esto pone de relieve un importante aunque sutil asunto. La Fórmula de la Transposición Momentánea (página “33”) predice que mientras el tamaño del segmento y el punto de lectura no estén cambiando en el tiempo, la transposición es la frecuencia por el tamaño del segmento (como siempre, utilizando unidades apropiadas, Hertz y segundos, por ejemplo, de tal manera que el producto es sin dimensiones). Sin embargo, al variar el tamaño del segmento y el punto de lectura en el tiempo se afectará la transposición momentánea, usualmente de maneras muy notables, tal como se puede escuchar en el ejemplo B07.sampler.scratch.pd. El ejemplo B08.sampler.nodoppler.pd (el que se muestra en la figura) muestra una forma posible de controlar este efecto, introduciendo un nuevo tipo de objeto: samphold~: una unidad de muestra y retención. (Esta será familiar para los usuarios de los sintetizadores análogos, pero con un giro digital; para más detalles ver la sección 3.7.) Esta almacena una sola muestra de la entrada de la mano izquierda y la envía a la salida de manera repetida hasta que actue la entrada de la derecha (que es también una señal de audio digital llamada el gatillo) para sobre-escribir la muestra almacenada con una nueva -de nuevo desde la entrada izquierda. La unidad adquiere una nueva muestra siempre y cuando el valor numérico del gatillo caiga desde una muestra a la siguiente. Está diseñada para que funcione bien con los objetos phasor~, para facilitar los disparos en fase con las envolventes. El ejemplo B08.sampler.nodoppler.pd utiliza dos objetos samphold~ para actualizar los valores de tamaño de segmento y de punto de lectura, exactamente cuando el phasor~ realice la envolvente, momento en el cual la envolvente coseno es cero y así el efecto del cambio instantáneo no pueda escucharse. En esta situación podemos utilizar la Fórmula de Transposición para Tablas de Onda en Lazo, que es más sencilla, para relacionar la frecuencia, el tamaño del segmento y la transposición. Esto se demuestra en el ejemplo B09.sampler.transpose.pd (que no se muestra). Muestra enlazada traslapada Tal como se describió en la sección 2.3, a veces es deseable utilizar dos o más muestras enlazadas traslapadas para producir un sonido razonablemente continuo sin tener que envolver de manera muy aguda en los extremos del lazo. Esto es especialmente útil en situaciones donde el segmento que está enlazado es corto, una décima de segundo o menos. El ejemplo B10.sampler.overlap.pd, que se muestra en la figura 2.16 (parte a), realiza dos lazos de muestras con medio ciclo de diferencia de fase entre ellas. Los nuevos tipos de objetos son: loadbang: proporciona una salida con el mensaje “bang” al cargar el parche. Es utilizado en este parche para asegurar que la división de la transposición por el tamaño del segmento tiene un factor de transposición válido en caso de que “tamaño del segmento” se mueva con el ratón en primer lugar. expr: evalúa expresiones matemáticas. Las variables aparecen como $f1, $f2, y así se corresponden con las entradas de los objetos. Las operaciones matemáticas se permiten, con paréntesis para agrupar, y se suministran muchas librerías de funciones tales como la potenciación, la cual se muestra en este ejemplo como

“pow” (función de potenciación). wrap~: envuelve el intervalo de 0 a 1. Así, por ejemplo, 1.2 lo convierte en 0.2; 0.5 queda tal cual; y -0.6 lo convierte en 0.4. send~, s~, receive~, r~: versiones de señal de audio de send y receive. Una señal de audio enviada a un objeto send~ aparece en la salida de cualquiera y de todos los objetos receive~ con el mismo nombre. A diferencia de send y receive, usted no puede tener más de un objeto send~ con el mismo nombre (para ese tipo de conexión ver los objetos throw~ y catch~). En el ejemplo, parte de la maquinaria de lectura de la tabla de onda se duplica, utilizando cálculos idénticos para “chunk-size-samples” (la secuencia de mensajes) y para “read-pt” (una señal de audio suavizada como antes). Sin embargo, el elemento “phase” de la señal de audio, en la otra copia, es reemplazado por “phase2”. La parte superior de la figura muestra el cálculo de las dos fases de la señal: la primera como la salida del objeto phasor~, y la segunda adicionando 0.5 y envolviéndola, adicionándole así 0.5 ciclos (¼ radianes) a la fase. Las dos fases de las señales son utilizadas cada una, con los mismos ajustes de rango según se hicieron, para calcular el índice en la tabla de onda y del objeto cos~, y para controlar también los dos objetos samphold~. Finalmente, los resultados de las dos copias se adicionan para enviarlas a la salida de audio. Precesión automática del punto de lectura El ejemplo B11.sampler.rockafella.pd, que se muestra en la parte (b) de la figura 2.16, adapta las ideas que se mostraron antes para una situación donde el punto de lectura es computado automáticamente. Aquí hacemos la precesión del punto de lectura a través de la muestra en un lazo, permitiéndonos acelerar y desacelerar la reproducción, independientemente de la transposición. Este ejemplo muestra una debilidad del procedimiento, que consiste en que si la velocidad de precesión relativa es cercana a uno (que es el caso de la velocidad normal de escucha de la tabla de onda grabada), y si tampoco hay mucha transposición, es preferible utilizar granos más grandes y frecuencias más bajas de repetición en concordancia (manteniendo el producto constante para alcanzar la transposición deseada.) Sin embargo, si el tamaño del grano queda demasiado grande, ya no es conveniente cuantizar los cambios de control a la fase de la envolvente, pues estos podrían estar demasiado aparte como para permitir un tiempo de respuesta razonable para los cambios de control. En este parche quitamos el objeto samphold~ que había controlado el punto de lectura (pero dejamos el del tamaño de segmento el cual es mucho más difícil de cambiar en medio del lazo). En su lugar utilizamos el porcentaje de precesión (conocido) del punto de lectura para corregir la frecuencia de la diente de sierra, de tal manera que mantenemos la transposición deseada. Esto en cambio hace que cuando el factor de transposición y la precesión están muy cercanos el uno de la otra (haciendo entonces algo muy cercano a un simple cambio de velocidad), la frecuencia caerá a un valor cercano a cero, y así habremos incrementado la naturalidad del resultado al mismo tiempo. En este parche pasamos de manejar puntos de lectura, tamaños de segmento, etc., en número de muestras para utilizar segundos, haciendo la conversión a número de muestras (y cambiando por uno) justo antes del objeto tabread4~. La tabla de onda contiene un sonido de un segundo de duración, y asumiremos que el tamaño nominal del segmento no será mayor que 0.1 segundos, de tal manera que podemos dejar con seguridad que el rango del punto de lectura vaya de 0 a 0.9; el tamaño “real” del segmento variará, y puede llegar a ser bastante largo, debido al movimiento del punto de lectura. El control de la precesión ajusta la frecuencia de un fasor de amplitud 0.9, y

de esta manera frecuencia del frecuencia del al ser iguales “read-pt” como onda.

la precesión debe multiplicarse por 0.9 para ajustar la fasor (así, para obtener una precesión de uno la amplitud y la punto de lectura son ambas 0.9, de tal manera que la pendiente, la amplitud sobre la frecuencia, es uno). La salida es denominada antes, y es utilizada para ambas copias del lector de la tabla de

La precesión p y el tamaño del segmento c se conocen, y si denotamos la frecuencia del fasor de la parte de arriba (la original) por f, el factor de transposición queda dado por:

t = p + cf y resolviendo para f da:

f = (t - p)/c = (2h/12 - p)/c donde h es la transposición deseada en semitonos. Esta es la fórmula utilizada en el objeto expr. Ejercicios 1. Si una tabla de onda con 1000 muestras se reproduce con transposición de una unidad, a una velocidad de lectura de muestras de 44100 Hertz, qué tanto dura el sonido? 2. Una tabla de onda de un segundo de duración es ejecutada en 0.5 segundos. A qué intervalo se transpone el sonido? 3. Asumiendo todavía la tabla de onda de un segundo, si la reproducimos periódicamente (en un lazo), a cuántos Hertz deberíamos hacer el lazo para transponer el sonido original en medio tono? 4. Queremos reproducir una tabla de onda (grabada a R = 44100) en un lazo a 10 veces en cada segundo, de tal manera que el sonido original almacenado en la tabla de onda sea transpuesto una quinta perfecta (ver página “12”). Qué longitud de segmento, en número de muestras debería ser el que se reproduce? 5. Suponga que desea utilizar el estiramiento de onda para una tabla de onda que contiene una onda periódica de período 100. Usted desea escuchar el espectro no transpuesto a un período de 200 muestras. Por qué factor de tarea debería usted comprimir la onda? 6. La primera mitad de una tabla de onda contiene un ciclo de una sinusoide de amplitud pico uno. La segunda mitad contiene ceros. Cuál es la fortaleza del segundo parcial de la tabla de onda. 7. Una sinusoide se almacena en una tabla de onda con período 4 de tal manera que los primeros cuatro elementos son 0, 1, 0, -1, correspondiendo a los índices 0, 1, 2 y 3. Qué valor obtenemos con la entrada 1.5: (a) utilizando interpolación de dos puntos? (b) utilizando interpolación de 4 puntos? (c) cuál es el valor de la sinusoide original aquí?

8. Si todo el contenido de una tabla de onda cae entre los valores -1 y 1, cuál es el rango de salidas posibles de la lectura de tabla de onda utilizando interpolación de 4 puntos?

Capítulo 3

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

f(n) = 1, n = ...,-1,0,1,... Podríamos creer que f(t) = 1 para todos los reales t. Pero sin embargo, f es uno para los enteros y cero para todo lo demás -esa es una función perfectamente buena también, y nada de los valores de la función en los números enteros la distingue de la más simple f(t) = 1. Pero la intuición nos dice que la función constante está en el espíritu de las señales de audio digital, visto que esconde un secreto entre las muestras. Una función que “se deja tomar en muestras” debería ser aquella para la cual podemos utilizar un esquema de interpolación razonable para deducir sus valores en los no-enteros, partiendo de los valores en sus enteros. Se acostumbra en este punto de las discusiones de la música por computador invocar el famoso Teorema de Nyquist. Este dice (de manera resumida) que si una función es una combinación finita o infinita de sinusoides, ninguna de cuyas frecuencias angulares excede ¼, entonces, por lo menos teóricamente, está totalmente determinada por los valores de la función en los enteros. Una forma posible de reconstruir la función podría ser como un límite del mayor y el más alto orden polinomial para la interpolación. La frecuencia angular ¼ llamada la Frecuencia de Nyquist corresponde a R/2 ciclos por segundo si R es la velocidad de las muestras. El período correspondiente es de dos muestras. La frecuencia de Nyquist es lo mejor que podemos hacer en el sentido que cualquier sinusoide real de frecuencia más alta, es igual en los enteros, a aquella cuya frecuencia es menor que la de Nyquist, y es esta la frecuencia más baja que tendremos para la reconstrucción con el proceso de interpolación ideal. Por ejemplo, una sinusoide con frecuencia angular entre ¼ y 2¼, por decir ¼ + !, puede ser escrita como cos((¼ + !)n + Á) = cos((¼ + !)n + Á - 2¼n) = cos((! - ¼)n + Á) = cos((¼ - !)n - Á) para todos los enteros n. (Si n no fuera un entero, el primer paso debería fallar.) Así, una sinusoide con frecuencia entre ¼ y 2¼, es igual, por lo menos en lo que se refiere a los números enteros, a otra con frecuencia entre 0 y ¼; usted simplemente no puede tener las dos aparte. Y ya que cualquier operación de conversión en el equipo de cómputo deberá hacer lo “correcto” y reconstruir la sinusoide de más baja frecuencia, cualquiera que usted trate de sintetizar con frecuencia más alta llegará a sus parlantes con la frecuencia errada -específicamente usted escuchará la frecuencia única entre 0 y ¼ a la que cae la frecuencia en la forma descrita anteriormente. Este fenómeno es llamado foldover , 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 significa la misma cosa. La figura 3.1 muestra que las sinusoides de frecuencias angulares ¼/2 y 3¼/2, no se pueden distinguir una de

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

f(t) = 1/2 – 1/¼(sen(!t) + sen(2!t)/2 + sen(3!t)/3 + ... ) la cual goza arbitrariamente de altas frecuencias; y más aún el parcial cien es únicamente 40 dB más débil que el primero. A cualquier valor muy bajo de !, los parciales por encima de ¼ se escucharán presentes -y, debido al sobre-doblado, se escucharán a las frecuencias incorrectas. (Esto no significa que no se deberían utilizar ondas diente de sierra como generadores de fase -la lectura a pasos de la tabla de onda corrige mágicamente el sobre-doblado de la diente de sierra- pero uno debería pensarlo dos veces antes de utilizar una onda diente de sierra como fuente de sonido digital.) Muchas técnicas de síntesis, incluso si no están estrictamente limitadas en sus bandas, dan parciales que pueden ser apagados más rápidamente que 1/n como en el ejemplo de la diente de sierra, y de esta manera son más apropiadas trabajarlas digitalmente. En cualquier caso, siempre es buena idea mantener en la mente la posibilidad del sobre-doblado, y entrenar sus oídos para reconocerlo. La primera línea de defensa contra el sobre-doblado es simplemente utilizar velocidades altas de muestreo; es una buena práctica utilizar sistemáticamente las velocidades de muestreo más altas que pueda manejar su computador con facilidad. La velocidad práctica más alta variará de acuerdo a si lo que sea que está trabajando en el computador es en tiempo real o no, las limitantes de tiempo y de memoria de la CPU, y/o los dispositivos de entrada y salida, y a veces incluso las limitaciones impuestas por los programas de cómputo. Un tratamiento no muy técnico de la teoría del muestreo se da en [Bal03]. Más detalles se pueden encontrar en [Mat69, págs.1-30]. 3.2 Control Ya hemos discutido acerca de las señales de audio digital, las cuales son sólo secuencias x[n] definidas para enteros n, los cuales corresponden a puntos espaciados regularmente en el tiempo. Este puede ser un esquema para describir las técnicas de síntesis, pero las aplicaciones reales de música electrónica usualmente suponen otros cómputos que deben ser realizados en puntos irregulares en el tiempo. En esta sección desarrollaremos un marco para describir lo que llamaremos cómputos de control. Siempre requeriremos que cualquier cómputo se corresponda con un específico tiempo lógico. El tiempo lógico controla cuál muestra de audio irá en primer lugar a la salida para reflejar el resultado de los cómputos. En un sistema de tiempo no real (tal como Csound en su forma clásica), esto significa que el tiempo lógico procede desde cero hasta la longitud de la salida del archivo de sonido. Cada “tarjeta de puntuación” tiene un tiempo lógico asociado (el tiempo en la puntuación), y actúa una vez el cómputo del audio ha alcanzado ese tiempo. Así los cálculos de audio y de control (la salida de las muestras y el manejo de las tarjetas de notas) se manejan cada uno por turnos, incrementándose con todo el tiempo lógico.

En un sistema de tiempo real, el tiempo lógico, el cual corresponde todavía al tiempo para la salida de la muestra siguiente de audio afectada, está siempre ligeramente adelantado al tiempo real, el cual está medido por la muestra que sale en ese momento del computador. Los cómputos de control y de audio son llevados a cabo de manera alterna, seleccionados por el tiempo lógico. La razón para utilizar el tiempo lógico y no el tiempo real en los cálculos de la música por computador es mantener los cómputos independientes del tiempo de ejecución del computador, el cual puede variar por una cantidad de razones, incluso para dos cálculos aparentemente idénticos. Cuando estamos haciendo el cálculo de un nuevo valor para la señal de audio o procesando alguna entrada de control, el tiempo real puede pasar, pero nosotros requerimos que el tiempo lógico sea el mismo a través del cálculo completo, como si tomara lugar instantáneamente. Como resultado de esto, los cómputos en la música electrónica, si se han hecho de la manera correcta, son determinísticos: dos corridas de los mismos cálculos del mismo audio en tiempo real o no real, teniendo cada una las mismas entradas, deberán tener resultados idénticos. La figura 3.2 (parte a) muestra esquemáticamente cómo están alineados el tiempo lógico y los cómputos de las muestras. Las muestras de audio están calculadas en períodos regulares (marcados por líneas onduladas), pero antes del cálculo de cada muestra hacemos todos los cálculos de control que podrían afectarla (marcados con segmentos de línea rectos). Hacemos primero los cómputos de control asociados con los tiempos lógicos empezando de cero hasta uno, pero sin incluir ese valor; entonces computamos la primera muestra de audio (de índice cero) en el tiempo lógico uno. Hacemos luego todos los cálculos de control hasta el tiempo lógico 2, pero sin incluir ese valor, luego la muestra de índice uno, y así sucesivamente. (Adoptamos aquí ciertas convenciones para el etiquetado que podrían haber sido escogidas de manera diferente. Por ejemplo, no hay razón fundamental para que el control debe ilustrarse entrando “antes” que los cómputos de audio pero es más fácil pensarlo de esa manera.) La parte (b) de la figura muestra la situación cuando queremos computar la salida del audio en bloques de más de una muestra a la vez. Utilizando la variable B para denotar el número de elementos en un bloque (en la figura B = 4), el primer cálculo de audio tendrá com salida las muestras de audio 0,1, ...B – 1 todas a la vez en un bloque computado en el tiempo lógico B. Debemos realizar los cómputos de control relevantes para todos los períodos de tiempo B, con anticipación. Hay un retraso de las muestras B entre el tiempo lógico y la aparición del audio en la salida. La mayor parte de los programas de música calculan el audio por bloques. Esto se hace para incrementar la eficiencia de las operaciones de audio individuales (tal como lo hacen las unidades generadoras de Csound y Max/MSP y los objetos tilde de Pd). La unidad generadora o el objeto tilde incurren en gasto cada vez que se hacen funcionar, igual a aproximadamente veinte veces el costo del cómputo de una muestra en promedio. Si el tamaño del bloque es uno, esto significa un gasto de 2000%; si es sesenta y cuatro (como lo es en Pd por defecto), el gasto es de sólo el 30%. 3.3 Secuencias de control Los cálculos de control pueden provenir de una variedad de fuentes, tanto internas como externas, para el cómputo general. Los ejemplos de los cálculos de control engendrados internamente incluyen secuenciación (cuyos cálculos de control pueden tener lugar en tiempos predeterminados) o la detección de la salida del audio (casos de búsqueda de ceros cruzando en una señal). Los engendrados externamente pueden venir de aparatos tales como controladores MIDI, el ratón y el teclado, paquetes de red y otros. En cualquier caso, los cálculos de control pueden ocurrir a intervalos irregulares, a diferencia de las muestras de audio las cuales corresponden a una marca fija de reloj de muestras.

Necesitaremos una manera para describir cómo fluye la información entre los cómputos de control y de audio, para lo cual nos basaremos en la noción de una secuencia de control. Esta es simplemente un conjunto de números -posiblemente vacía- que aparece como un resultado de los cálculos de control, ya sea regular o irregularmente espaciada en el tiempo lógico. La secuencia de control más simple posible no tiene otra información que una secuencia de tiempo: ...,t[0],t[1],t[2],... Aunque es mejor dar los valores de tiempo en muestras, sus valores no están cuantizados; ellos pueden ser números reales arbitrarios. Requerimos que estén organizados en orden no decreciente: ... ≤ t[0] ≤t [1] ≤ t[2] ≤ ... Cada ítem de la secuencia es llamado un evento. Las secuencias de control se pueden mostrar gráficamente como aparecen en la figura 3.3. Una línea numerada muestra el tiempo y una secuencia de flechas señala los puntos de tiempo asociados con cada evento. La secuencia de control que se muestra no tiene datos (es una secuencia de tiempo). Si queremos mostrar datos en la secuencia de control los escribiremos en la base de cada flecha. Una secuencia de control numérica es la que contiene un número por cada punto en el tiempo, de tal manera que aparece como una secuencia de pares ordenados: ...,(t[0],x[0]), (t[1],x[1]), ... donde los t[n] son los puntos en el tiempo y los x[n] son los valores de la señal en esos tiempos. Una secuencia de control de números es casi análoga a un “controlador MIDI”, cuyos valores cambian irregularmente, por ejemplo cuando un control físico se mueve por parte de un ejecutante. Otras fuentes posibles de secuencias de control pueden tener las velocidades de cambio más altas posibles y/o mayor precisión. De otro lado, una secuencia de tiempo podría ser una secuencia de golpes de pedal, los cuales (no obstante la implementación MIDI) no deberían considerarse conteniendo valores, si no tiempos. Las secuencias de control numéricas son como señales de audio, pues ambas son sólo valores numéricos variando en el tiempo. Pero toda vez que las señales audio van a una velocidad constante (y así los valores de tiempo no requieren estar especificados para cada muestra), las secuencias de control son impredecibles -a veces son parejas, a veces disparejas, a veces no aparecen. Vamos a mostrar lo que sucede cuando tratamos de convertir una secuencia de control numérico en una señal de audio. Como antes, escogeremos un bloque de tamaño B = 4. Consideraremos como una secuencia de control una onda cuadrada de período 5.5: (2,1),(4.75,0),(7.5,1),(10.25,0),(13,1),... y demostramos tres maneras en que podría convertirse en señal de audio. La figura 3.4 (parte a) muestra la conversión más simple y más-rápida-posible. Cada muestra de audio a su salida refleja simplemente el valor más reciente de la señal de control. De esta manera las muestras de 0 a 3 (las cuales son computadas en el tiempo lógico 4 debido al tamaño del bloque) son de valor 1 según el punto (2,1). Las cuatro muestras siguientes también son uno ya que de los dos puntos, (4.75,0) y (7.5,1), el más reciente tiene también el valor 1. La conversión más-rápida-posible es la más apropiada para controlar secuencias

que no cambian con frecuencia, en comparación al tamaño del bloque. Sus principales ventajas son la simplicidad para el cálculo y la respuesta más rápida posible a los cambios. Según se ve en la figura, cuando los cambios de la secuencia de control son muy rápidos (cercanos al orden del tamaño del bloque), la señal de audio pueden no tener mucha semejanza con la esporádica. (Si, como en este caso, la secuencia de control viene en intervalos de tiempo regulares, podemos utilizar el teorema del sampleo para analizar el resultado. Aquí, la frecuencia de Nyquist asociada con la velocidad del bloque R/B es menor que la frecuencia de entrada de la onda cuadrada, y así la salida produce un alias a una nueva frecuencia que es más baja que la frecuencia de Nyquist.) La parte (b) muestra el resultado de la conversión de la muestra-más-cercana. Cada nuevo valor de la secuencia de control en el tiempo t afecta la salida de las muestras comenzando desde el índice btc (el entero más grande que no exceda a t). Este es el equivalente a usar la conversión más-rápida-posible a un tamaño de bloque de 1; en otras palabras, la conversión de la muestra-máscercana esconde el efecto de los tamaños de bloque más grandes. Esta es mejor que la conversión más-rápida-posible en los casos en los que la secuencia de control podría cambar rápidamente.

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

fx + (1 - f)y en otras palabras, a una aproximación ponderada del valor previo y del valor nuevo, cuyos pesos favorecen más al nuevo valor si el tiempo del valor esporádico es anticipado, más cercano a n. En el ejemplo que se muestra, la transición de 0 a 1 en el tiempo 2 da 0 • x + 1 • y = 1, mientras la transición de 1 a 0 en el tiempo 4.75 da: 0.75 • x + 0.25 • y = 0.75 Esta técnica proporciona una representación todavía más cercana de la señal de control (por lo menos la porción que queda por debajo de la frecuencia de Nyquist), a expensas de mayor cómputo y un retraso ligeramente mayor. Las secuencias de control numérico pueden convertirse también a señales de audio utilizando funciones rampa para suavizar las discontinuidades. Se utilizan con frecuencia cuando una de estas secuencias debe controlar una amplitud, como se describió en la sección 1.5. En general hay tres valores para especificar el ajuste de una función rampa en movimiento: el tiempo de inicio y el valor al que se quiere llegar (especificado por la secuencia de control) y el tiempo para llegar al valor, que usualmente se expresa como un retraso después del tiempo de inicio. En tales situaciones es casi siempre suficientemente seguro ajustar los tiempos del comienzo y del final para que coincida con la primera muestra de audio computada en un tiempo lógico posterior, una opción que corresponde al escenario de más-rápida-posible anterior. La figura 3.5 (parte a) muestra el efecto de la rampa desde 0, comenzando en el tiempo 3, a un valor de 1 en el tiempo 9,

comenzando el regreso de inmediato a 0 en el tiempo 15, con un tamaño de bloque B = 4. Los tiempos 3, 9 y 15 están truncados a 0, 8 y 12 respectivamente. En situaciones reales el tamaño del bloque podría ser del orden de un milisegundo, y el ajuste de los puntos finales de las rampas con las fronteras del bloque funciona bien para controlar las amplitudes; alcanzar un objetivo en una fracción de milisegundo antes o después raramente hace audible una diferencia. Sin embargo otros usos de las rampas son más sensibles a la cuantización del tiempo en los extremos. Por ejemplo si queremos hacer algo repetitivo de unos pocos milisegundos, la variación en el segmento hará audible una aperiodicidad. Para situaciones tales como esta, podemos mejorar el algoritmo de generación de la rampa para iniciar y detener en muestras arbitrarias, como se muestra en la figura 3.5 (parte b), por ejemplo. Aquí los extremos de los segmentos de línea coinciden exactamente con las muestras requeridas 3, 9 y 15. Podemos ir incluso más allá y ajustar para muestras fraccionadas, haciendo que los segmentos de línea toquen los valores 0 y 1 en puntos específicos sobre la línea de números. Por ejemplo, suponga que queremos repetir un sonido grabado de una tabla de onda 100 veces por segundo, cada 441 muestras a la velocidad de muestreo usual. Los errores de redondeo debidos a los bloques de 64 muestras podrían desafinar la reproducción en casi un tono completo, e incluso redondear a fronteras de una muestra puede introducir variaciones de cerca del 2%, o tres cents. Esta situación debería llevar a la exactitud de sub-muestras en la conversión esporádica-a-audio. 3.4 Conviertiendo de señales de audio a secuencias de control numérico A veces necesitamos hacer la conversión en otra dirección, de una señal de audio a la señal esporádica. Para ir en esa dirección, de alguna manera proveemos una serie de tiempos lógicos (una secuencia de tiempo), así como una señal de audio. A la salida queremos una secuencia de control que combine con los valores tomados de la señal de audio. Hacemos esto cuando queremos incorporar el valor de la señal como parte de los cómputos de control. Por ejemplo, podríamos estar controlando la amplitud de una señal utilizando el objeto line~ como en el ejemplo A03.line.pd (página “21”). Suponga que queremos apagar el sonido a una velocidad fija, en lugar de hacerlo en un tiempo fijo. De esta manera podríamos querer re-utilizar la red para otro sonido y querer mutearlo tan rápido como fuera posible sin artefactos audibles; podemos probablemente hacerlo en forma de rampa a cero en menos tiempo si la amplitud en ese instante es más baja. Para hacer esto debemos confeccionar un mensaje en el objeto line~ para enviarlo a cero en una cantidad de tiempo que calcularemos con base en el valor de su salida en ese momento. Esto requiere antes que nada, que “sampleemos” la salida del objeto line~ (una señal de audio) a una secuencia de control. El mismo asunto del retraso de tiempo y exactitud aparece también para la conversión de datos esporádicos a audio. De nuevo, habrá un compromiso entre inmediatez y exactitud. Suponga como antes que estamos calculando en bloques de audio de 4 muestras, y suponga que en el tiempo lógico 6 queremos buscar el valor de una señal de audio, y utilizarla para cambiar el valor de otra. Como se muestra en la figura 3.2 (parte b), el valor más recientemente calculado de la señal será para el índice 3, y el primer índice al cual nuestros cálculos pueden afectar la señal es 4. Podemos de esta manera llevar el asunto completo con un retraso de únicamente una muestra. Sin embargo, no podemos escoger exactamente cuál muestra -la actualización sólo puede ocurrir en las fronteras del bloque. Como antes, podemos negociar inmediatez por mayor exactitud en el tiempo. Si

esto sucede exactamente en la muestra en la que llevamos el cómputo audio-acontrol-a-audio, leemos la muestra del índice 2 y la actualizamos en el índice 6. Entonces, si queremos hacer la misma cosa de nuevo en el tiempo lógico 7, leemos desde el índice 3 y actualizamos en el índice 7 y así sucesivamente. En general, si el tamaño del bloque es B, y para cualquier índice n, podemos leer siempre la muestra en el índice n - B y afectarla en el índice n. Existe así un retraso de B muestras en el cómputo audio a control a audio, que es el precio en el que se incurre por ser capaces de nombrar a n exactamente. Si queremos ir más allá, para ser capaces de especificar la fracción de una muestra, entonces (como antes) podemos utilizar interpolación -con un ligero incremento en el retraso. En general, como en el caso de la conversión esporádica-a-audio, en la mayoría de los casos la solución más simple es la mejor, pero ocasionalmente tenemos que hacer trabajo extra. 3.5 Secuencias de control en diagramas de bloque La figura 3.6 muestra cómo las secuencias de control se expresan en diagramas de bloque, utilizando la conversión control-a-señal y señal-a-control como ejemplos. Las secuencias de control están representadas utilizando puntos (opuesto a las señales de audio que aparecen como flechas sólidas). El bloque señal convierte de una secuencia de control numérico a una señal de audio. El tipo exacto de conversión no se especifica a este nivel de detalle; en los ejemplos Pd el tipo de operador de la conversión determinará esto. El bloque instantánea convierte la señal de audio de nuevo a secuencia de control numérico. Adicional a la señal de audio, se requiere una señal de control separada para especificar la secuencia de tiempo a la cual se toman las muestras de la señal audio. 3.6 Detección de evento Además de tomar instantáneas, un segundo modo de pasar información de señal de audio a cómputos de control es la detección de evento. Aquí derivamos la información de tiempo de la señal de audio. Un ejemplo es la detección de umbral, en la cual la entrada es una señal de audio y la salida es una secuencia de tiempo. Consideraremos el ejemplo de detección de umbral con algún detalle aquí. Una razón típica para usar la detección de umbral es encontrar cuándo inicia algún tipo de actividad y cuándo se detiene, tal como un ejecutante tocando un instrumento. Supondremos que ya hemos hecho una medición continua de una actividad en forma de una señal de audio. (Esto puede ser hecho por ejemplo, utilizando un seguidor de envolvente). Lo que queremos es un par de secuencias de tiempo, una que marque el tiempo de inicio de la actividad y otra marcando la parada. La figura 3.7 (parte a) muestra una realización simple de esta idea. Asumimos que la señal de entrada es como se muestra en la gráfica continua. Una línea horizontal marca el valor constante del umbral. La secuencia de tiempo marcada “onset” contiene un evento cada vez que la señal cruza el umbral de abajo hacia arriba; la que está marcada como “turnoff” marca los cruces en la dirección contraria. En muchas ocasiones tendremos encendidos y apagados indeseables causados por pequeños rizos en la señal cercanos al umbral. Esto se evita con deboucing, el cual puede ser hecho por lo menos de dos maneras. En la primera, como se muestra en la parte (b) de la figura, podemos ajustar dos umbrales: uno alto para marcar los encendidos y otro bajo para los apagados. En este esquema la regla es que únicamente reportamos el primer encendido después

de cada apagado y, viceversa, únicamente reportamos un apagado después de cada encendido. Así, la tercera vez que la señal cruza el umbral alto en la figura no reporta encendido, debido a que no se ha apagado desde la vez anterior. (Al iniciar, actuamos como si la salida más reciente hubiera sido de apagado, de tal manera que el primer encendido sí se reporta.) Una segunda aproximación al filtrado de múltiples encendidos y apagados, se muestra en la parte (c) de la figura, es asociar un período muerto a cada encendido. Este es un intervalo de tiempo constante que sucede después de cada encendido reportado, durante el cual rechazamos el reporte de más encendidos y apagados. Luego de que el período finaliza, si la señal ha caído por debajo del umbral en el transcurso de ese tiempo, reportamos de manera tardía un apagado. Los períodos muertos se pueden asociar también con los apagados, y los dos períodos pueden tener valores diferentes. Las dos estrategias de filtrado pueden utilizarse separada o simultáneamente. Es usualmente necesario adaptar los valores de umbral y/o los tiempos muertos manualmente para cada situación específica en la cual se usa el umbral. El umbral a veces se utiliza com el primer paso en el diseño de estrategias de alto nivel para arreglar la respuesta de los computadores a las entradas audibles de ejecutantes musicales. Un ejemplo sencillo podría ser el de detener una secuencia de procesos pre-planificados, cada detención provocada por un encendido de sonido después de un período específico de relativo silencio, tal como lo podríamos ver si un músico ejecutara una secuencia de frases separadas por silencios. Detectores más sofisticados (construidos por lo mejor de la detección de umbral) podrían detectar sonido o silencio continuo en un rango esperado de duraciones, o secuencias rápidas de alternancia entre tocar y no tocar, o períodos de tiempo en los cuales el porcentaje de tiempo de ejecución con respecto al de silencios está por encima o por debajo de un umbral, o muchas otras características. Estas podrían detener reacciones predeterminadas o figurar en una improvisación. 3.7 Señales de audio como control De la tradición de la síntesis análoga viene una elegante y antigua aproximación para los problemas de control, que puede utilizarse como una alternativa para las secuencias de control que hemos estado tratado en este capítulo. En lugar o adicional al uso de las secuencias de control, podemos utilizar las mismas señales de audio para controlar la producción de otras señales de audio. Dos técnicas específicas de la síntesis análoga se prestan bien para este tratamiento: la secuenciación análoga y la muestra-y-retención. El secuenciador análogo [Str95, págs.70-79][Cha80, págs.93,304-308] era utilizado con frecuencia para lograr una secuencia de sonidos repetida regular o semi-regularmente. La secuencia misma típicamente repite una secuencia de voltajes, junto con una señal de disparo la cual es pulsada cada que hay una transición entre los voltajes. Uno utilizaba los voltajes para tonos o para los parámetros tímbricos, y el disparador para controlar uno o más generadores de envolvente. Lograr secuencias enlazadas de valores predeterminados en audio digital es tan simple como el envío de un objeto phasor~ a un lector de tabla no interpolada. Si usted quiere, por decir, cuatro valores en la secuencia, escale el valor de la salida de phasor~ para tomar valores de 0 a 3.999... de tal manera que el primer cuarto de ciclo lea el punto 0 de la tabla y así sucesivamente. Para disparar repetidamente, el primer paso es sintetizar otra diente de sierra que corra en sincronía con la salida de phasor~, pero cuatro veces más rápido. Esto se hace utilizando una variante de la técnica de la figura 2.8, en la cual utilizamos un operador de suma y un operador de envolvente para lograr el cambio de fase deseado. La figura 3.8 muestra el efecto de multiplicar una onda diente

de sierra por un entero, y luego envolverla para conseguir una diente de sierra a un múltiplo de la frecuencia original. A partir de aquí es fácil conseguir una envolvente que se repita con lectura de tabla de onda, por ejemplo (utilizando un lector de tabla de onda esta vez, en lugar de una secuencia de voltajes). Toda la generación de la onda y las técnicas de alteración utilizadas para hacer sonidos a una cierta altura también pueden ser usados en este caso. La otra técnica de control común derivada del control de los sintetizadores análogos es la unidad de muestra-y-retención [Str96, págs.80-83][Cha80, pág.92]. Se coge una señal de entrada, se toman ciertos valores instantáneos de ésta, y se “congelan” estos valores para su salida. Los valores particulares que se toman se seleccionan por una entrada de “disparo” secundaria. En puntos específicos del tiempo determinados por la entrada de disparo, se toma un valor de la entrada principal que es enviado a la salida de manera continua hasta el siguiente punto en el tiempo, cuando es reemplazado por un nuevo valor de la entrada principal. En el audio digital es a veces útil tomar la muestra de un nuevo valor sobre los bordes de caída de la señal de disparo, es decir, cada vez que el valor corriente de la señal de disparo es más pequeño que el valor previo, según se ve en la figura 3.9. Esto es especialmente conveniente útil con un disparador diente de sierra, cuando queremos tomar muestras de señales en sincronía con un proceso conducido por oscilador. El objeto muestra-y-retención de Pd fue presentado previamente en el contexto del muestreo (ejemplo B08.sampler.nodoppler.pd, página “53”). 3.8 Operaciones en secuencias de control Hemos discutido cómo hacer la conversión entre secuencias de control y secuencias de audio. Adicional a esta posibilidad, existen cuatro tipo de operaciones que usted puede ejecutar sobre las secuencias de control para lograr otras secuencias de control. Estas operaciones con las secuencias de control no tienen operacones correspondientes en las señales de audio. Su existencia explica en gran parte porqué es útil introducir una estructura de control completa paralelamente con la de la señal de audio. El primer tipo consiste en las operaciones de retraso, las cuales modifican los valores de tiempo asociados con una secuencia de control. En los sistemas de tiempo real los retrasos no pueden tener valores negativos. Una secuencia de control se puede retrasar en una cantidad constante o, alternativamente, usted pude retrasar cada evento de manera separada por diferentes cantidades. Dos tipos de retraso se utilizan en la práctica: simple y compuesto. Ejemplos de cada uno de estos se muestran en la figura 3.10. Un retraso simple actúa sobre una secuencia de control programando cada evento, tal como viene, para un tiempo en el futuro. Sin embargo, si otro evento llega a la entrada antes de que el primer evento salga, el primer evento es olvidado en favor del segundo. En el retraso compuesto, cada evento a la entrada produce una salida, incluso si otros eventos llegan antes de que aparezca la salida. Una segunda operación en las secuencias de control es la mezcla: toma dos secuencias de control y combina todos los eventos en uno nuevo. La figura 3.11 (parte a) muestra cómo esta y las otras operaciones son presentadas en diagramas de bloques. La parte (b) de la figura muestra el efecto de mezcclar dos secuencias. Las secuencias pueden contener más de un evento a la vez. Si dos secuencias que se van a mezclar contienen eventos simultáneos, la secuencia mezclada los contiene a ambos, en un orden bien definido.

Un tercer tipo de operación sobre las secuencias de control es la selección. Selección en una secuencia de control significa buscar en los datos asociados y permitir pasar únicamente ciertos elementos. La parte (c) muestra un ejemplo en el cual los eventos (los cuales tienen cada uno un número asociado) pasan únicamente si el número es positivo. Finalmente, está el concepto de resincronización de una secuencia de control con otra, como se muestra en la parte (d). Aquí una secuencia de control (la fuente) proporciona valores que son puestos en la secuencia de tiempo de otra secuencia (la sync). El valor dado a la salida es siempre el más reciente viniendo de la secuencia fuente. Note que cualquier evento de la fuente puede aparecer más de una vez (según se sugiere en la figura), o de otro lado, podría no aparecer. De nuevo tenemos que considerar lo que sucede cuando las dos secuencias contienen cada una un evento al mismo tiempo. Debería la secuencia “sync” ser considerada como la que ocurre antes de la fuente (de tal manera que la salida proporciona el valor del evento previo de la fuente), o debería el evento de la fuente ser considerado como el primero de tal manera que su valor vaya a la salida al mismo tiempo? Cómo se podrá solucionar esto es una cuestión de diseño, por lo cual los diversos ambientes de los programas de computación toman diversas posiciones. (En Pd esto es controlado explícitamente por el usuario). 3.9 Operaciones de control en Pd Hemos utilizado Pd principalmente para el procesamiento de señales de audio, aunque ya antes, como en la figura 1.10, hemos tenido que hacer la distinción entre la noción de señales de audio y de secuencias de control en Pd: las conexiones delgadas llevan secuencias de control y las gruesas llevan audio. Las secuencias de control en Pd aparecen como secuencias de mensajes. Los mensajes pueden contener datos (la mayoría usualmente, uno o más números) o no. Una secuencia de control numérico (sección 3.3) aparece como una conexión (delgada) que lleva números como mensajes. Los mensajes sin datos hacen secuencias de tiempo. Así usted puede ver mensajes sin datos, que en Pd llevan el símbolo (arbitrario) de “bang”. Los cuatro tipos de operaciones de control descritos en la sección previa pueden ser expresados en Pd como se muestra en la figura 3.12. Los retrasos se logran utilizando dos objetos de retraso explícito: del, delay: retraso simple. Usted puede especificar el tiempo de retraso con la creación de un argumento o por vía de la entrada derecha. Un “bang” en la entrada izquierda ajusta el retraso, el cual entonces da como salida un “bang” después de un retraso en milisegundos. El retraso es simple en el sentido de que envía un disparo a un retraso que ya ha sido ajustado y lo re-ajusta a un nuevo valor de tiempo, cancelando el que había sido programado con anterioridad. pipe: retraso compuesto. Los mensajes que llegan a la entrada izquierda aparecen en la salida después del retraso especificado, el cual se ajusta por la creación del primer argumento. Si hay más creación de argumentos, ellos especifican una o más entradas para los datos numéricos o simbólicos que contendrán los mensajes. Cualquier número de mensajes puede ser almacenado por pipe de manera simultánea, y los mensajes pueden ser re-organizados para su salida, dependiendo de los tiempos de retraso dados para éstos. La mezcla de secuencias de control en Pd se logra no con objetos explícitos, si no con el mismo mecanismo de conexiones de Pd. Esto se muestra en la parte (b) de la figura con cajas de números como un ejemplo. En general, siempre y cuando se haga más de una conexión para una entrada de control, las secuencias de control se mezclarán. Pd ofece algunos objetos para la selección de secuencias de control, de los

cuales se muestran dos en la parte (c) de la figura: moses: selecciona un rango numérico. Los mensajes numéricos que llegan a la entrada izquierda aparecerán en la salida izquierda si son más pequeños que un valor de umbral (ajustado en la creación de argumentos, o por la entrada de la derecha), y de lo conrario, salen por la entrada derecha. select, sel: selecciona números específicos. Los mensajes numéricos que llegan a la entrada izquierda producen un “bang” en la salida únicamente si coinciden exactamente con un valor de prueba. El valor de prueba es ajustado ya sea por la creación de argumentos o por la entrada derecha. Finalmente Pd se encarga de la resincronización de las secuencias de control implícitamente en sus mecanismos de conexión, según se ilustra en la parte (d) de la figura. La mayoría de los objetos con más de una entrada sincronizan todas las demás entradas partiendo de la entrada del extremo izquierdo. Así, el objeto float mostrado en la figura resincroniza su entrada del lado-derecho (la cual toma números) con la de su lado-izquierdo. Al enviar un “bang” a la entrada izquierda se tiene como salida el número float más reciente que ha sido recibido de antemano. 3.10 Ejemplos Muestreo y sobre-doblado El ejemplo C01.nyquist.pd (figura 3.13, parte a) muestra un oscilador ejecutando una tabla de onda barriendo frecuencias desde 500 hasta 1423. La tabla de onda consiste únicamente del parcial 46, el cual de esta manera varía de 23000 a 65458 Hertz . Con una velocidad de lectura de muestras de 44100 estas dos frecuencias teóricamente suenan a 21100 y 21358 Hertz , pero en el barrido entre una y otra el doblado desciende, pasando por cero y luego asciende. Las otras dos formas de onda están provistas para mostrar los interesantes efectos del batido entre parciales que, aunque “deberían” estar muy apartados, se encuentran vecinos ellos mismos a través del sobre-doblado. Por ejemplo, a 1423 Hertz el segundo armónico es 2846 mientras que el armónico 33 suena a 1423*33-44100 = 2859 Hertz -una fuerte disonancia. Otros ejemplos menos extremos pueden producir sobre-doblado audible en formas menos bruscas. Usualmente sigue siendo desagradable, y vale la pena aprender a escucharlo. El ejemplo C02.sawtooth-foldover.pd (no ilustrado aquí) demuestra esto para una diente de sierra (el objeto phasor~). Para tablas de onda que contienen grabaciones de audio, el error de interpolación puede generar sobredoblado extra. Los efectos de esto pueden variar ampliamente; el sonido a veces se describe como “crujiente” o como “salpicado”, dependiendo de la grabación, la transposición y el algoritmo de interpolación. Convirtiendo controles a señales El ejemplo C03.zipper.noise.pd (figura 3.13, parte b) demuestra el efecto de convertir una secuencia de control actualizada lentamente a una señal de audio. Este ejemplo presenta un nuevo objeto: line: un generador de rampa con control de salida. Al igual que line~, line toma pares de números (objetivo, tiempo) como parejas y ejecuta una rampa en dirección al objetivo, en la cantidad de tiempo dada; sin embargo, a diferencia de line~, la salida es una secuencia de control numérico, apareciendo, por defecto, en intervalos de 20 milisegundos. En el ejemplo usted puede comparar el sonido al elevarse y al caer la amplitud

controlada por la salida de line con la controlada por la señal de audio generada por line~. La salida de line es convertida a una señal de audio en la entrada del objeto *~. La conversión está implicada aquí al conectar una secuencia de control numérico a una entrada de señal. En Pd, las conversiones implícitas desde las secuencias de control numérico a las secuencias de audio están hechas con el modo más-rápida-posible mostrado en la figura 3.4 (parte a). La salida del objeto line se convierte en una señal en escalera con 50 escalones por segundo. El resultado se denomina comúnmente “ruido zipper”. Mientras que las limitaciones del objeto line para generar señales de audio eran claramente audibles incluso sobre períodos de tiempo de 300 milisegundos, la variante de señal del objeto no produce problemas hasta períodos de tiempo que pueden ser mucho más cortos. El ejemplo C04.control.to.signal.pd (figura 3.13, parte c) demuestra el efecto de utilizar line~ para generar una onda triangular de 250 Hertz. Aquí los efectos mostrados en la figura 3.5 vienen al caso. Ya que line~ siempre alinea segmentos de línea con las fronteras de los bloques, la duración exacta de los segmentos de línea varía, y en este ejemplo la variación (del orden de milisegundos) es una fracción significante de su longitud. Un objeto más preciso (y más costoso, en términos del tiempo de computación) se provee para estas situaciones: vline~: generador de segmento de línea exacto. Este tercer miembro de la familia “line” tiene a la salida una señal de audio (parecida a line~), pero alinea los extremos de la señal a los puntos de tiempo requeridos, con la exactitud de una fracción de muestra. (La exactitud está limitada únicamente por el formato numérico del punto flotante utilizado por Pd.) Aún más, muchos segmentos de línea pueden estar especificados dentro de un solo bloque de audio; vline~ puede generar ondas en períodos por debajo de las dos muestras (más allá de lo cual sólo conseguirá sobre-doblado). El objeto vline~ puede también utilizarse para convertir secuencias de control numérico a secuencias de audio en los modos muestra-más-cercana e interpolaciónde-dos-puntos, según se muestra en la figura 3.4 (parte b y c). Para conseguir la conversión muestra-más-cercana, simplemente dele a vline~ un tiempo de rampa de cero. Para interpolación lineal, dele un tiempo de rampa de una muestra (0.0227 milisegundos si la velocidad de las muestras es de 44100 Hertz). Reproductor de tabla de onda sin lazo Un área de aplicación que requiere de cuidadosa atención para el control de señales de frontera de secuencia/audio es la lectura de muestras. Hasta ahora nuestros lectores de muestras se han ceñido al asunto de enlazarse perpetuamente. Esto permite una rica variedad de sonidos a los que se puede acceder haciendo cambios continuos en parámetros tales como tamaño del lazo y forma de la envolvente. Sin embargo muchos usos del muestreo requieren que surjan características internas de la tabla de onda en momentos de tiempo predecibles y que se puedan sincronizar. Por ejemplo, los sonidos de percusión grabada son ejecutados usualmente desde el comienzo en una relación de tiempo determinada con el resto de la música. En esta situación, las secuencias de control están mejor adaptadas que las señales de audio como disparadores. El ejemplo C05.sampler.oneshot.pd (figura 3.14) muestra una forma posible de lograr esto. Los cuatro objetos tilde de la parte inferior izquierda forman la red para el procesamiento de la señal en la reproducción. Un objeto vline~ genera una señal de fase (precisamente un índice de lectura de tabla) para el objeto tabread4~; este reemplaza al phasor~ del ejemplo B03.tabread4.pd (página “49”) y sus derivados. La amplitud de la salida de tabread4~ está controlada por un segundo objeto

vline~ para prevenir discontinuidades en la salida en caso de que un nuevo evento comience mientras el evento previo todavía suena. El objeto “cutoff” de vline~ tiene como salida una rampa a cero (esté sonando o no), de tal manera que, una vez la salida es cero, el índice de la tabla de onda puede ser cambiado de manera discontinua. Para iniciar una “nota” nueva, primero el objeto “cutoff” de vline~ es llevado a cero por una rampa; después, luego de un retraso de 5 milisegundos (al cabo del cual el punto vline~ ha alcanzado el cero) la fase se reajusta. Esto se hace con dos mensajes: primero, la fase se ajusta a 1 (sin valor de tiempo, de tal manera que salta a 1 sin rampa). El valor de “1” especifica el primer punto de lectura de la tabla de onda, ya que estamos utilizando interpolación de 4 puntos. Segundo, en la misma caja de mensajes, la fase va en rampa a 441,000,000 en un período de tiempo de 10,000,000 milisegundos. (En Pd los números muy grandes se muestran usando notación exponencial, estos dos aparecen como 4.41e+08 y 1e+07.) El cociente es 44.1 (en unidades por milisegundos) dando una transposición de uno. El objeto vline~ de la parte superior (que genera la fase) recibe estos mensajes vía el objeto “r phase” que está sobre él. El ejemplo asume que la tabla de onda es llevada a cero suavemente en rampa en el otro extremo, y la porción inferior derecha del parche muestra cómo grabar una tabla de onda así (en este caso de cuatro segundos de duración). Aquí un objeto line~ regular (y computacionalmente más barato) es suficiente. Aunque la tabla de onda debería ser de por lo menos 4 segundos de duración para este trabajo, usted puede grabar tablas de onda más cortas simplemente recortando el objeto line~ antes. La única dificultad es que, si está leyendo y escribiendo simultáneamente de la misma tabla, debería evitar situaciones en las que las operaciones de lectura y escritura ataquen la misma porción de la tabla de onda a la vez. Los objetos vline~ que rodean a tabread fueron escogidos por sobre line~ debido a que los redondeos de este último de los puntos de quiebre de las fronteras del bloque más cercano (típicamente 1.45 milisegundos) pueden hacer audibles las aperiodicidades en el sonido si la tabla de onda es repetida a más de 10 o 20 veces por segundo, y prevendría un hermoso y periódico sonido a altas frecuencias de repetición. Regresaremos a la lectura de muestras basadas en vline~ en el siguiente capítulo para adicionar transposición, envolventes y polifonía. Señales a control El ejemplo C06.signal.to.control.pd (que no se ilustra) demuestra la conversión de las señales de audio a secuencias de control nuevamente, vía un objeto tilde presentado aquí. snapshot~: convierte la señal de audio a mensaje de control. Siempre da la muestra de audio computada más recientemente (con la conversión más-rápidaposible) de tal manera que el tiempo de lectura de muestras varía en hasta un bloque de audio. Es deseable con frecuencia sensar la amplitud de la señal de audio en lugar del pico en una sola muestra; el ejemplo C07.envelope.follower.pd (que tampoco se muestra) presenta otro objeto que hace esto: env~: seguidor de envolvente RMS. A su salida hay mensajes de control que dan la amplitud RMS en tiempos cortos (en decibeles) de la señal de audio que entra. Una creación de argumentos le permite seleccionar el número de muestras utilizadas para el cálculo de RMS; números más pequeños dan una salida más rápida (y posiblemente menos estable). Secuenciador estilo análogo

El ejemplo C08.analog.sequencer.pd (figura 3.15) realiza la secuenciación análoga y la generación de envolvente descrita en la sección 3.7. La tabla “sequence”, con nueve elementos, contiene una secuencia de frecuencias. El objeto phasor~ en la parte superior ejecuta los ciclos a través de la tabla de secuencia a 0.6 Hertz. La lectura de tabla sin interpolación (tabread~ en lugar de tabread4~) se utiliza para leer las frecuencias en pasos discretos. (Tales situaciones, en las que preferimos lectura de tabla sin interpolación son raras.) El objeto wrap~ convierte la diente de sierra de amplitud 9 a una amplitud de una unidad, según se describió antes en la figura 3.8, tras lo cual se usa para obtener una función de envolvente de una segunda tabla de onda. Aquí la tabla de onda consiste en seis períodos de una sinusoide. Los granos se suavizan multiplicando por una función coseno elevada (cos~ y + 1). El ejemplo C09.sample.hold.pd (que no se ilustra aquí) muestra una unidad de muestra-y-retención, otro recurso útil para hacer tareas de control en el dominio de la señal de audio. Sintetizador estilo MIDI El ejemplo C10.monophonic.synth.pd (figura 3.16) también implementa un sintetizador monofónico orientado hacia las notas, pero en este caso orientado también hacia el control MIDI. Aquí las tareas de generación de envolvente y secuencia de notas son manejadas utilizadando secuencias de control en lugar de señales de audio. Objetos de control nuevos se requieren en este ejemplo: notein: entrada de nota MIDI. Tres salidas dan la altura, la velocidad y el canal de entrada MIDI de los eventos nota-encendida y nota-apagada (con los eventos nota-apagada apareciendo como eventos nota-encendida con velocidad cero). Las salidas aparecen en el orden acostumbrado de derecha a izquierda. stripnote: filtra los mensajes nota-apagada. Pasa pares (nota, velocidad) siempre y cuando la velocidad no sea cero, eliminando los otros. A diferencia de notein, stripnote no utiliza entrada o salida de hardware MIDI directamente. trigger, t: copia un mensaje a la salida en el orden de derecha a izquierda, con conversión del tipo de mensaje a la salida. La creación de argumentos (“b” y “f” en este ejemplo) especifica dos salidas, una que proporciona mensajes “bang” y la otra mensajes “float” (es decir, números). Se crea una salida por cada argumento creado. Las salidas aparecen en el orden normal de Pd de derecha a izquierda. Los objetos de control del parche alimentan las frecuencias del objeto phasor~ siempre y cuando se reciba un mensaje MIDI de nota-encendida. El control de la amplitud (vía objetos line~) es más difícil. Cuando un mensaje nota-encendida se recibe, el objeto sel 0 tiene como salida la velocidad a la derecha (debido a que la entrada no coincide con 0), esta se divide por la velocidad máxima MIDI de 127 y se empaca en un mensaje para line~ con un tiempo de 100 ms. Sin embargo, cuando se recibe un mensaje nota-apagada, es apropiado parar el sonido únicamente si la altura de la nota-apagada coincide con la altura que está sonando a través del instrumento. Por ejemplo, suponga que los mensajes recibidos son “60 127”, “72 127”, “60 0” y “72 0”. Cuando la nota-encendida en la altura 72 llega, la altura del sonido debe cambiar a 72 y entonces el mensaje “60 0” se debe ignorar, con la nota sonando hasta el mensaje “72 0”. Para lograr esto, primero almacenamos la velocidad en el objeto float de la parte superior. En segundo lugar, cuando la altura MIDI de la nota llega, se almacena también (el objeto float de la parte inferior) y luego la velocidad se examina de nuevo contra cero (la salida “bang” de t b f vuelve a llamar la velocidad que es enviada a sel 0). Si es cero, el segundo paso es volver a

llamar la altura y examinarla (con el objeto select) contra la altura de la nota-encendida que se recibió más reciente. Únicamente si son iguales (de tal manera que el “bang” aparece en la salida de la izquierda de select) hace que el mensaje “0 1000” vaya al objeto line~. . Ejercicios 1. Cuántos parciales de un sonido La 440 pueden representarse digitalmente a una velocidad de muestras de 44100 Hertz? 2. Qué frecuencia debería escuchar si sintetizó una sinusoide a 88000 Hertz a una velocidad de muestras de 44100? 3. Suponga que está sintetizando un sonido a 44100 Hertz, y está computando bloques de audio de 64 muestras. Un evento de control se programa para que ocurra pasado exactamente un tiempo de un segundo, utilizando el esquema másrápida-posible. En qué número de muestra ocurre el evento? 4. Leyendo a 44100 muestras por segundo, queremos tocar un sonido Do medio repitiendo una onda fija cada N muestras. Qué valor de N deberíamos escoger, y cuántos cents (página “7”) quedaremos por fuera del “verdadero” Do medio? 5. Dos ondas diente de sierra, de una unidad de amplitud, tienen frecuencias de 200 y 300 Hertz respectivamente. Cuál es la periodicidad de la suma de las dos? Cuál es si usted envuelve la suma para obtener un rango de 0 a 1? Al hacer esto hay algún cambio dependiendo de la fase relativa entre ambas? 6. Dos ondas diente de sierra con igual frecuencia y amplitud pero con un desfase de medio ciclo, se suman. Cuál es la forma de la onda y cuál es su amplitud y su frecuencia? 7. Cuál es el nivel relativo, en decibeles, del tercer armónico de una diente de sierra (tres veces la fundamental) comparado con el de la fundamental? 8. Suponga que sintetiza una diente de sierra de 44000 Hertz a una velocidad de muestras de 44100 Hertz. Cuál es la onda resultante? 9. Usando las técnicas de la sección 3.7, dibuje un diagrama de bloques para generar dos sinusoides con fase fija a 500 y 700 Hertz. 10. Dibujar un diagrama de bloques mostrando cómo utilizar el umbral para detectar cuándo una señal de audio excede a otra en un cierto valor. (Podría querer hacer esto para detectar y filtrar la realimentación de los parlantes a los micrófonos.)

Capítulo 4

Automatización y admnistración de las voces A veces queremos controlar los objetos musicales o los eventos como agregados, en lugar de hacerlo individualmente. Los agregados podrían tomar la forma de una serie de eventos espaciados en el tiempo, en los cuales los detalles de los eventos siguen un arco más grande (por ejemplo las notas de una melodía). O los individuales podrían sonar simultáneamente como las voces en un acorde o los parciales en un sonido complejo. A veces algunas o todas las propiedades de los elementos individuales son mejor inferidas de las propiedades que tiene el todo. Una rica colección de herramientas e ideas surgen en el repertorio de la música electrónica para describir comportamientos individuales de los agregados. En este capítulo cubrimos dos clases de tales herramientas: los generadores de envolvente y los bancos de sonidos. Los generadores de envolvente automatizan el comportamiento en el tiempo, y los bancos de voces lo hacen sobre los agregados de procesos simultáneos (tales como los generadores de señal). 4.1 Generadores de envolvente Un generador de envolvente (a veces y con más justicia, llamado un generador de transiente) hace que una señal de audio se eleve suavemente y luego caiga para controlar la fortaleza de una nota musical. Los generadores de envolvente fueron tocados anteriormente en la sección 1.5. El control de la amplitud por multiplicación (figura 1.4) es la forma más directa y ordinaria para utilizarlo, pero hay muchos otros usos posibles. Los generadores de envolvente han tenido muchas formas a lo largo de los años, pero el más simple y perenne favorito es el generador de envolvente ADSR. “ADSR” es un acrónimo de “Attack, Decay, Sustain, Release” , los cuatro segmentos de la salida del generador. El generador ADSR es encendido y apagado por una secuencia de control llamada “disparo”. Al “encender” con el disparador el generador ADSR este ejecuta sus segmentos de ataque, decaimiento y sostenimiento. Al “apagar” con el disparador inicia el segmento de liberación. La figura 4.1 muestra la representación en diagrama de bloques de un generador de envolventes. Hay cinco parámetros controlando el generador ADSR. El primero, un parámetro de nivel ajusta el valor de la salida al final del segmento de ataque (que es normalmente el valor más alto de salida del generador ADSR). El segundo y el tercero son los parámtros de ataque y decaimiento que dan el tiempo de duración de estos segmentos respectivamente. El cuarto es un parámetro de sostenimiento que da el nivel del segmento sostenimiento, como una fracción del parámetro de nivel. Finalmente el parámetro liberación proporciona la duración de dicho segmento. Estos cinco valores, junto con los tiempos de encendido y apagado en el disparo, determinan totalmente la salida del generador ADSR. Por ejemplo la duración de la porción del sostenimiento es igual al tiempo entre los “disparos” de encendido y apagado, menos las duraciones de los segmentos de ataque y decaimiento. La aplicación clásica de una envolvente ADSR es usándola en un teclado o secuenciador musical controlado por voltaje, para hacer notas musicales con un sintetizador. Al oprimir y liberar una tecla (por ejemplo) se deberían generar los disparos de “encendido” y “apagado”. El generador ADSR debería controlar entonces la amplitud de la síntesis de tal manera que las “notas” inicien y terminen con las teclas. Adicional a la amplitud, el generador ADSR puede ser utilizado (y usualmente se hace) para controlar el timbre, lo cual puede hacer evolucionar el timbre de manera natural en el transcurrir de cada nota. 4.2 Formas de amplitud lineales y curvas

Suponga que desea iniciar gradualmente una señal en el transcurso de diez segundos -eso es, usted quiere multiplicarla por una señal de control de amplitud y[n] la cual se eleva de 0 a 1 en valor sobre 10R muestras donde R es la velocidad de las muestras. La opción más obvia podría ser la de una rampa lineal: y[n] = n/(10R). Pero esta no dará como resultado la producción de un incremento suave en la intensidad percibida. En el primer segundo y[n] se eleva de -∞ dB a -20 dB, en los siguientes cuatro a otros 14 dB y en los cinco restantes, únicamente un restante de 6 dB. En la mayor parte del período de diez segundos el incremento en la amplitud será barely no-sé perceptible. Otra posibilidad sería elevar y[n] exponencialmente, de tal manera que se eleve a una velocidad constante en decibeles. Se deberá fijar la amplitud inicial en lo inaudible, por decir 0 dB (si fijamos la unidad a 100 dB). Ahora tenemos el problema opuesto: para los primeros cinco segundos el control de la amplitud se elevará de 0 dB (inaudible) a 50 dB (pianísimo); esta parte del inicio de la nota debería tomarse únicamente el primer segundo aproximadamente. Una progresión más natural debería ser sin embargo considerar el inicio de la nota como una sucesión de dinámicas, 0-ppp-pp-p-mp-mf-f-ff-fff, tomando cada paso aproximadamente un segundo. Una entrada de nota idealmente debería obedecer a una escala entre la logarítmica y la lineal. Una opción algo arbitraria, pero útil en la práctica, es la curva cuártica:

y[n] = (n/N)4 donde N es el número de muestras sobre el cual está la entrada (en el ejemplo anterior este número es 10R). Así en el primer segundo de los diez estaríamos elevándonos a -80 dB, a los cinco segundos a -24, y a los nueve, a casi -4 dB. La figura 4.3 muestra las tres funciones de transferencia de amplitud:

f1(x) = x (lineal) f2(x) = 102(x

-1)

(dB a lineal)

f3(x) = x4 (cuártica) La segunda función hace la conversión de dB a lineal, arreglada de tal manera que el rango de entrada, de 0 a 1, corresponde a 40 dB. (Este rango de entrada de 40 dB corresponde a un rango de dinámica razonable, permitiendo 5 dB por cada 8 pasos en la dinámica.) La curva cuártica imita bien la curva exponencial (dB) para las amplitudes más altas, pero cae más rápidamente en las amplitudes pequeñas, llegando al cero real correctamente (toda vez que la curva exponencial cae únicamente a 1/100). Podemos pensar las tres curvas de las funciones de transferencia que se muestran, desde un control abstracto (con rango de 0 a 1) a una amplitud lineal. Después de escoger una función de transferencia f apropiada, podemos calcular la señal de control correspondiente; si queremos elevarnos sobre una rampa de N muestras desde el silencio hasta la unidad de ganancia, la señal de control deberá ser:

y[n] = f(n/N) Un diagrama de bloques para esto se muestra en la figura 4.4. Introducimos aquí un nuevo tipo de bloque para representar la aplicación de función de transferencia. Por ahora no nos preocuparemos de su implementación; dependiendo de la función deseada, esto debería ser mejor hacerlo aritméticamente o

utilizando la lectura de tablas. 4.3 Cambios de control continuos y discontinuos Los algoritmos de síntesis varían ampliamente en su capacidad para tratar con los cambios de control discontinuos. Hasta ahora en este capítulo hemos asumido que los controles deben cambiar continuamente, y que el generador de envolvente ADSR se convierte en el que idealmente realiza tales controles. Puede incluso suceder que la amplitud máxima de una nota sea menor que el valor corriente de su predecesora (utilizando el mismo generador) y la envolvente ADSR simplemente descenderá la rampa (en lugar de ascender) a un nuevo valor para un ataque. Esto no es necesariamente deseable, siempre y cuando, en situaciones donde un generador de envolvente esté encargado de algunos aspectos del timbre: sin embargo, por ejemplo no queremos que la agudeza de una nota decrezca durante el ataque a una más suave, si no que salte a un valor más bajo de tal forma que siempre pueda elevarse durante el ataque. Esta situación también puede suceder con las envolventes de afinación: se puede querer deslizar la altura de una nota a la siguiente, o se puede querer que la trayectoria de la afinación de cada nota inicie de nuevo en un punto independiente del sonido previo. Dos situaciones se presentan cuando queremos hacer cambios discontinuos a los parámetros de síntesis: podemos hacerlo simplemente sin interrupción (por ejemplo haciendo un cambio discontinuo en la altura); o en cambio, no podemos, como en el caso de un índice de tabla de onda (el cual hace un cambio discontinuo en la salida). Hay incluso parámetros que posiblemente no pueden cambiarse de manera continua; por ejemplo, una selección entre un conjunto de tablas de onda. En general, los cambios discontinuos de la fase en un oscilador o de la amplitud de una señal ocasionará un artefacto audible, pero los incrementos de fase (tales como alturas) pueden ir por saltos sin malos resultados. En los casos en los que un cambio de parámetro no se puede hacer de manera continua por una u otra razón, existen por lo menos dos estrategias para realizar el cambio limpiamente: el muteo y el cambio-y-rampa. 4.3.1 Muteo La técnica del muteo se aplica a una envolvente en una salida de amplitud, la cual es rápidamente llevada en rampa a cero antes de que el parámetro cambie y luego es restaurada más tarde. Puede ser o no el caso de que los cambios discontinuos resultarán en una señal que se eleve lentamente desde cero posteriormente. En la figura 4.5 (parte a), tomamos el ejemplo de una envolvente de amplitud (la salida de la señal de un generador de ADSR), y asumimos que el cambio discontinuo está al iniciar una nueva nota desde la amplitud cero. Para cambiar la salida del generador ADSR de manera dicontinua, lo reajustamos. Esta es una operación diferente del disparo; el resultado es hacer que salte a un nuevo valor, después del cual se puede simplemente dejarlo ahí o redisparar el generador ADSR. Debajo de la salida del generador ADSR vemos el muteo apropiado de la señal, el cual llega en rampa a cero para preparar la discontinuidad. La cantidad de tiempo que dejamos para el muteo debe ser pequeña (de tal manera que interrumpa el sonido previo en tan poco como sea posible) pero no tan pequeña que cause artefactos audibles en la salida. Un ejemplo de trabajo de este tipo de muteo se mostró ya en la página “81”; allí dejamos 5 milisegundos para el descenso de la rampa. La señal del muteo se multiplica por la salida del proceso para eliminar el click.

La figura 4.5 (parte b) muestra la situación en la cual suponemos que el cambio discontinuo está entre dos valores que posiblemente no son cero. Aquí la señal de muteo debe no únicamente bajar la rampa como antes (con anticipación a la discontinuidad) si no que también debe subirla posteriormente. El tiempo de la bajada de la rampa no necesita ser igual al de la subida; estos se pueden escoger, como siempre, escuchando el sonido a la salida. En general, el muteo presenta la dificultad de que usted debe comenzar la operación del muteo con anticipación al cambio de control deseado. En ajustes en tiempo real, esto usualmente requiere que nosotros intencionalmente retrasemos el cambio de control. Esta es otra razón para mantener el tiempo de muteo tan bajo como sea posible. (Es más, es mala idea tratar de minimizar el retraso condicionalmente, omitiendo el período de descenso de la rampa cuando este no se requiere; un retraso constante es mucho mejor que uno que varíe, incluso si este es más pequeño en promedio.) 4.3.2 Interruptor-y-rampa La técnica interruptor-y-rampa también busca remover discontinuidades resultado de los cambios de control discontinuos, pero lo hace de manera diferente: sintetizando una discontinuidad opuesta la cual adicionamos para cancelar la original. La figura 4.6 muestra un ejemplo en el cual un sonido percusivo (una sinusoide envuelta) comienza una nota en la mitad de la nota previa. El ataque del sonido no deriva de la envolvente de amplitud, si no de la fase inicial de la sinusoide, como es usualmente apropiado para sonidos percusivos. La gráfica inferior en la figura muestra una señal de audio compensadora con una discontinuidad opuesta, la cual puede ser sumada a la superior para remover la discontinuidad. Las ventajas de esta técnica sobre el muteo son, primero, que aquí no se requiere de retraso entre la decisión de hacer un ataque y el sonido del ataque; y segundo, que cualquier artefacto que aparezca con esta técnica es más probable que se pueda enmascarar con la aparición de un nuevo sonido. La figura 4.7 muestra cómo la técnica interrupción-y-rampa puede realizarse en un diagrama de bloques. La caja marcada con comillas (“...”) puede contener cualquier algoritmo de síntesis, el cual queremos interrumpir discontinuamente de tal manera que re-inicie de cero (como por ejemplo lo hace en la parte (a) de la figura previa). Al mismo tiempo que disparamos los cambios de control necesarios (ejemplificados por el generador ADSR de la parte superior), también reiniciamos y disparamos otro generador ADSR (en la mitad a la derecha) para cancelar la discontinuidad. La discontinuidad es menos que el último valor de salida de la síntesis, justo antes de reajustarse a cero. Para hacer esto medimos el nivel al que el generador de envolvente ADSR debe saltar. Este es su propio nivel corriente (que no debería ser cero). Los dos son sumados (con el objeto +~ en la parte inferior), y luego se toma una instantánea. La generador de envolvente de cancelación (a la derecha) es reiniciado continuamente a este nuevo valor, y luego disparado para descender la rampa a cero. La salida del objeto +~ (la suma de la salida del sintetizador y de la señal de cancelación de discontinuidad) es la señal de-click-ada. 4.4 Polifonía En la música, el término polifonía es usualmente utilizado para significar “más de una voz separadas cantando o tocando en diferentes tonos una de la otra”. Cuando hablamos de instrumentos musicales electrónicos utilizamos el término para decir “mantener varias copias del mismo proceso en paralelo”. Usualmente llamamos cada copia una “voz” manteniendo la analogía, aun cuando las voces no necesitan ser tocadas de manera separada con sonidos distintos. En este lenguaje, un piano es un instrumento polifónico, con 88 “voces”. Cada voz del piano es capaz normalmente de tocar exactamente una nota. Aquí nunca se pregunta cuál voz usar para tocar una nota en una altura determinada, y tampoco

se pregunta por la ejecución de varias notas simultáneamente en la misma altura. Muchos instrumentos musicales electrónicos polifónicos se aprovechan de manera más flexible del manejo de las voces. La mayoría de los programas de síntesis (como Csound) utilizan un esquema de asignación dinámica de voces, esto es, en efecto, que una nueva voz se crea por cada nota en la partitura. En sistemas tales como Max o Pd, los cuales están orientados para el uso interactivo en tiempo real, un banco de voces es localizado con anticipación, y el trabajo que se debe hacer (tocar notas o lo que sea), se distribuye entre las voces en el banco. Esto se diagrama en la figura 4.8, donde cada una de las voces produce una señal de salida, las cuales se suman todas para producir la salida total de las voces del banco. Frecuentemente las voces individuales requerirán algunas salidas separadas; por ejemplo, ellas podrían tener salidas por varios canales de tal manera de que puedan ser panoramizadas individualmente; o podrían tener envíos de efectos individuales de tal manera que cada una puede tener su propio nivel de envío. 4.5 Asignación de las voces Es frecuentemente deseable automatizar la selección de las voces para asociarlas con tareas individuales (tales como notas para tocar). Por ejemplo, un músico tocando el teclado no puede escoger en la práctica cuál voz suena con cada nota. Para automatizar la selección de las voces necesitamos un algoritmo de asignación de las voces, para usarse como se muestra en la figura 4.9. Armados con un algoritmo apropiado de asignación de las voces, la fuente de control no necesita preocuparse con el detalle de qué voz se ocupa de qué tarea; a los generadores de notas algorítmicos y a los secuenciadores frecuentemente se les confía esto. De otro lado, la escritura musical para ensambles frecuentemente especifica explícitamente cuál instrumento toca qué nota, de tal manera que las notas se conectarán una con la otra de extremo a extremo de la manera que queremos. Un algoritmo sencillo de asignación de voces trabaja como se muestra en la figura 4.10. Aquí suponemos que el banco de voces tiene únicamente dos voces, y tratamos de asignar voces para las tareas a, b, c y d. Las cosas van sin sobresaltos hasta que llega la tarea d, porque entonces vemos que no hay voces libres (están tomadas por b y c). Podríamos ahora elegir realizar o no la tarea d o tomar la voz de la tarea b o c. En la práctica, la mejor opción es tomar una. En este ejemplo en particular, escogimos tomar la voz de la tarea más antigua, b. Si conocemos la longitud de las tareas b y c por fuera de la ejecución de la tarea d, podremos ser capaces de escoger mejor cuál voz tomar. En este ejemplo podría haber sido mejor tomar la de la c, ya que d y b deben sonar juntas en el final y no la d únicamente. En algunas situaciones esta información estará disponible cuando debamos tomar la decisión, y en otras (la entrada de un teclado en vivo, por ejemplo), no. 4.6 Etiquetas de las voces Suponga ahora que estamos utilizando en banco de voces para tocar notas, como en el ejemplo de arriba, pero suponga que las notas a, b, c y d tienen todas la misma altura y aún más, que tienen otros parámeros idénticos. Cómo podemos diseñar una secuencia de control de tal manera que cuando cualquier nota se apague, sepamos cuál fue? Esta cuestión no viene al caso si la fuente de control es un teclado debido a que es imposible tocar más de una nota simultáneamente con una sola tecla. Pero podría fácilmente presentarse algorítmicamente, o simplemente como resultado de la mezcla de dos secuencias de teclados juntas. Aún más, el apagado de las notas es únicamente el ejemplo más simple de un problema más general, el cual es cómo,

una vez terminada una tarea en un banco de voces, podemos recobrarla para la misma voz con el fin de guiar su evolución como una función de las entradas en tiempo real, o de cualquier otro factor que no es posible predecir. Para tratar con situaciones como esta podemos adicionar una o más etiquetas al mensaje de inicio de la nota (o en general, a una tarea). Una etiqueta es cualquier conjunto de datos con el cual podemos identificar más tarde la tarea, los cuales podemos utilizar depués para buscar la voz a la que fue asignada. Tomando de nuevo el ejemplo de la figura 4.10, hay una forma en la que podríamos escribir aquellas cuatro tareas como una secuencia de control: tiempo-de-inicio

tiempo-de-finalización nota

...

1 2 4 5

3 8 6 8

... ... ... ...

60 62 64 65

En esta representación no necesitamos etiquetas debido a que cada mensaje (cada línea de texto) contiene toda la información que requerimos para especificar la tarea completa. (Aquí hemos asumido que las tareas a, ..., d son de hecho notas musicales con alturas 60, 62, 64 y 65.) En efecto, estamos representando cada tarea como un evento singular en una secuencia de control (sección 3.3). De otro lado, si suponemos ahora que no conocemos con anticipación la longitud de cada nota, una mejor representación podría ser esta otra: tiempo

etiqueta

acción

parámetros

1 2 3 4 5 6 7 8

a b a c d c b d

start start end start start end end end

60 ... 62 ...

Aquí cada nota ha sido dividida finalizar. Las letras a, ..., d inicio va con con cuál final ya etiqueta no necesariamente está para tocar cada nota.

64 ... 65 ...

en dos eventos separados para iniciar y para son utilizadas como etiquetas; sabemos cuál que sus etiquetas son las mismas. Note que la del todo relacionada con la voz que se utilizará

El MIDI normalizado no suministra etiquetas; en el uso normal, la altura de una nota sirve también como su etiqueta (de tal manera que las etiquetas están siendo re-utilizadas continuamente.) Si dos notas tienen la misma altura deben ser dirigidas de manera separada (para deslizar sus alturas en direcciones diferentes, por ejemplo) y el canal MIDI debe ser usado como una etiqueta (adicional a la nota). En los programas de computación de música en tiempo real es usualmente necesario pasar alternativamente entre los eventos-por-tarea y el etiquetado anterior, ya que la primera representación está mejor dispuesta para almacenar una edición gráfica, mientras que la segunda está mejor dispuesta para las operaciones en tiempo real. 4.7 Encapsulado Pd Los ejemplos para este capítulo utilizarán el mecanismo de encapsulado Pd el cual permite la construcción de parches que pueden ser reutilizados cualquier

número de veces. Una o más caja de objetos en Pd pueden ser subparches, los cuales son parches separados encapsulados dentro de las cajas. Vienen en dos tipos: subparches encendido-apagado y abstracciones. En cualquier caso el subparche aparece como una caja de objeto en otro parche denominado padre. Si usted escribe “pd” o “pd mi-nombre” dentro de una caja de objeto, este crea un subparche encendido-apagado. Los contenidos de este subparche son salvados como parte del parche padre, en un archivo. Si hace algunas copias de un subparche, puede cambiarlas individualmente. De otro lado puede invocar una abstracción escribiendo dentro de la caja el nombre de un parche Pd salvado como un archivo (sin la extensión “.pd”). En esta situación Pd leerá ese archivo dentro del subparche. De esta manera los cambios en el archivo se propagarán donde quiera que la abstracción se invoque. Un subparche (sea encendido-apagado o abstracción) puede tener diferentes entradas o salidas que aparecen en la caja del parche padre. Esto se especifica utilizando los siguientes objetos: inlet, inlet~: crea entradas para la caja de objeto que contiene al subparche. La versión inlet~ crea una entrada de señal de audio, mientras que inlet crea crea una para secuencias de control. En cualquier caso, lo que sea que llegue a la entrada de la caja en el parche padre, llega al inlet o al inlet~ en el subparche. outlet, outlet~: objetos correspondiente para las salidas de los subparches. Pd provee un mecanismo de paso-de-argumento para que usted pueda parametrizar invocaciones diferentes de una abstracción. Si en una caja de objeto usted escribe “$1”, esto significa “el primer argumento creado en mi caja del parche padre”, de manera similar para “$2” y así sucesivamente. El texto en una caja de objeto se interpreta en el momento en que se crea la caja, a diferencia del texto en una caja de mensaje. En las cajas de mensajes el mismo “$1” significa “el primer argumento del mensaje que acabo de recibir” y es interpretado siempre y cuando llegue un nuevo mensaje. Un ejemplo de una abstracción utilizando entradas, salidas y parametrización, se muestra en la figura 4.11. En la parte (a), un parche invoca el objeto plusminus, y la salida es la suma y la diferencia de 8 y 5. El objeto plusminus no está definido por Pd, pero sí está definido por el parche que reside en el archivo denominado “plusminus.pd”. Este parche se muestra en la parte (b) de la figura. El objeto inlet y los dos objetos outlet corresponden a las entradas y las salidas del objeto plusminus. Los dos argumentos “$1” (para los objetos + y -) son reemplazados por 5 (el argumento creado del objeto plusminus). Hemos visto ya una abstracción en los ejemplos: el objeto output~ introducido en la figura 1.10 (página “16”). En ese ejemplo se ve también que una abstracción puede mostrar controles como parte de su caja en el parche padre; vea la documentación de Pd para una descripción de esta característica. 4.8 Ejemplos Generador de envolvente ADSR El ejemplo D01.envelope.gen.pd (figura 4.12) muestra cómo el objeto line~ puede ser utilizado para generar una envolvente ADSR para controlar un parche de síntesis (en la figura se muestra únicamente la envolvente ADSR). El botón “attack” tiene dos efectos cuando se presiona. El primero (a la izquierda en la figura) es ajustar el objeto line~ con su segmento de ataque, con una meta de 10 (la amplitud pico) sobre 200 milisegundos (el tiempo de ataque). Segundo, el botón de ataque ajusta un objeto delay 200, de tal manera que después de que el

segmento de ataque haya pasado, el segmento de decaimiento pueda iniciar. El segmento de decaimiento cae a 1 (el nivel de sostenimiento) luego de otros 2500 milisegundos (el tiempo de decaimiento). El botón “release” envía el mismo objeto line~ a cero en más de 500 milisegundos (el tiempo de liberación). También, en caso de que el objeto delay 200 esté activo en el momento de que el botón “release” se presiona, un mensaje “stop” es enviado a este. Esto previene al generador ADSR de lanzar su segmento de decaimiento después de lanzar el segmento de liberación. En el ejemplo D02.adsr.pd (figura 4.13) encapsulamos el generador ADSR en una abstracción Pd (denominada adsr) de tal manera que se pueda replicar con facilidad. El diseño de la abstracción adsr hace posible controlar los cinco parámetros ya sea suministrando argumentos creados o conectando secuencias de control en sus entradas. En este ejemplo, los cinco argumentos creados (1, 100, 200, 50 y 300) especifican el nivel pico, el tiempo de ataque, el tiempo de decaimiento, el nivel del sostenimiento (como un porcentaje del nivel pico), y el tiempo de liberación. Hay seis entradas de control: la primera para disparar el generador ADSR, y las otras para actualizar los valores de los cinco parámetros. La salida de la abstracción es una señal de audio. Esta abstracción está realizada como se muestra en la figura 4.14. (Puede abrir este subparche haciendo click en el objeto adsr del parche.) Los únicos objetos de señal son line~ y outlet~. Los tres objetos pack corresponden a los tres objetos de mensaje de la figura 4.12 anterior. De izquierda a derecha, ellos se ocupan de los segmentos de ataque, decaimiento y liberación. El segmento de ataque va a un objetivo especificado como “$1” (el primer argumento creado de la abstracción) en “$2” milisegundos; estos valores se pueden sobreescribir enviando números a las entradas “peak level” y “attack”. El segmento de liberación es similar pero más sencillo, ya que el objetivo es siempre cero. La parte difícil es el segmento de decaimiento, que debe ajustarse después de un retraso igual al tiempo de ataque (el objeto del $2). El nivel de sostenimiento es calculado a partir del nivel pico y del porcentaje de sostenimiento (multiplicando los dos y dividiendo por 100). La entrada del disparador, si envía un número diferente de cero, dispara un arranque (los segmentos de ataque y decaimiento), y si envía cero, dispara el segmento de liberación. Aún más, el generador ADSR puede ser reiniciado en cero enviando un disparo negativo (lo cual genera también un arranque). Funciones de transferencia para control de amplitud La sección 4.2 describió el uso de las envolventes ADSR para controlar la amplitud, para lo cual los segmentos exponencial o de curva cuártica usualmente proporcionan resultados sonoros más naturales que los segmentos lineales. Los parches D03.envelope.dB.pd y D04.envelope.quartic.pd (el último mostrado en la figura 4.15) demuestra el uso de segmentos decibel y cuártico. Adicional a la amplitud, en el ejemplo D04.envelope.quartic.pd la frecuencia del sonido está controlada también, utilizando formas lineales y cuárticas para su comparación. Ya que convertir decibeles a unidades de amplitud lineal es una operación costosa (por lo menos comparada con la de un oscilador o la de un generador de rampa), el ejemplo D03.envelope.dB.pd utiliza lectura de tabla para implementar la función de transferencia necesaria. Esto tiene la ventaja de la eficiencia, pero la desventaja de que debemos decidir el rango de los valores admisibles con anticipación (que son aquí de 0 a 120 dB). Para los segmentos cuárticos como en el ejemplo D04.envelope.quartic.pd no se requiere lectura; simplemente elevamos al cuadrado la señal de salida del objeto

line~, dos veces, sucesivamente. Para compensar la elevación a la cuarta potencia, el valor meta enviado al objeto line~ debe ser la raíz cuarta del valor deseado. Así, los mensajes que hacen la rampa de frecuencia o amplitud son primero desempacados para separar el valor meta del intervalo de tiempo, se toma la raíz cuarta del valor meta (por la vía de la sucesión de dos raíces cudradas), ylos dos se envían luego al objeto line~. Hemos hecho uso aquí de un nuevo objeto Pd: unpack: desempaca una lista de números (y/o símbolos) y los distribuye en salidas separadas. Como es usual las salidas aparecen en orden de derecha a izquierda. El número de las salidas y sus tipos están determinadas por los argumentos creados. (Ver también pack, página “50”). Los dos parches siguientes, D05.envelope.pitch.pd y D06.envelope.portamento.pd, utilizan el primero, un generador de envolvente ADSR para hacer una envolvente de altura y el segundo, un solo objeto line~, también como control de la altura, para hacer portamento. En ambos casos los segmentos exponenciales son deseables, y se calculan utilizando lectura de tabla. Síntesis aditiva: la campana de Risset El mecanismo de abstracción de Pd, que utilizamos antes para hacer un generador de envolvente re-utilizable, es también útil para hacer bancos de voces. Utilizaremos aquí abstracciones para organizar bancos de osciladores para síntesis aditiva. Hay muchas formas posibles de organizar bancos de osciladores, además de las que se muestran aquí. La organización más simple y directa de las sinusoides es formar parciales y adicionarlos a una nota. El resultado es monofónico, en el sentido que el parche ejecutará una sola nota a la vez, la cual, sin embargo consistirá de algunas sinusoides cuyas frecuencias y amplitudes individuales dependen de aquellas cuya nota estamos tocando, y también de su lugar individual en una serie armónica (o inarmónica) de series de sobretonos. El ejemplo D07.aditive.pd (figura 4.16) utiliza un banco de 11 copias de una abstracción denominada partial (figura 4.17) en una imitación de un instrumento campana bien conocido de Jean-Claude Risset. Tal como se describe en [DJ85, pág. 94] el sonido de la campana tiene 11 parciales, cada uno con su propia amplitud, frecuencia y duración relativas. Para cada nota, la abstracción partial computa una envolvente de amplitud simple (cuártica) consistente únicamente de un segmento de ataque y de decaimiento; sin segmento de sostenimiento o de liberación. Esto se multiplica por una sinusoide y el producto se adiciona en un bus de suma. Dos nuevos tipos de objetos son introducidos para implementar el bus de suma: catch~: define y da salida a un bus de suma. El argumento creado (“sum-bus” en el ejemplo) le da al bus de suma un nombre para que el objeto throw~ en la parte inferior se pueda referir a este. Usted puede tener tantos buses de suma como quiera (y por lo tanto objetos catch~) pero deben tener todos nombres diferentes. throw~: adición a un bus de suma. El argumento creado selecciona cuál bus de suma utilizar. La interface de control es cruda: las cajas de números controlan la frecuencia “fundamental” de la campana y su duración. Al enviar un mensaje “bang” al objeto s trigger comienza la nota. (la nota entonces decae sobre el período de tiempo controlado por el parámetro de duración; no hay disparo separado para detener la nota). No hay control de amplitud excepto vía el objeto output~. Los cuatro argumentos para cada invocación de la abstracción partial

especifican: 1. la amplitud. Es la amplitud del parcial en su pico, al final del ataque y al comienzo del decaimiento de la nota. 2. la duración relativa. Esta está multiplicada por la duración general de la nota (controlada en el parche principal) para determinar la duración de la porción de decaimiento de la sinusoide. Los parciales individuales pueden tener así diferentes tiempos de decaimiento de tal forma que algunos parciales mueren más rápido que otros, bajo el control general del parche principal. 3. la frecuencia relativa. Al igual que con la duración relativa, esta controla cada frecuencia de los parciales como un múltiplo de la frecuencia general controlada en el parche principal. 4. la desafinación. Una frecuencia en Hertz que se añade al producto de la frecuencia global y la frecuencia relativa. A interior de la abstracción partial, la amplitud es tomada simplemente de manera directa del argumento “$1” (multiplicando por 0.1 para ajustar las amplitudes individuales altas); la duración es calculada del objeto r duration, multiplicándolo por el argumento “$2”. La frecuencia es computada como fp + d donde f es la frecuencia global (que viene del objeto r frequency), p es la frecuencia relativa del parcial, y d es la frecuencia de desafinación. Síntesis aditiva: control de la envolvente espectral El siguiente parche de ejemplo, D08.table.spectrum.pd (figura 4.18), muestra una aplicación muy diferente de la síntesis aditiva. Aquí las sinusoides son manejadas por la abstracción spectrum-partial mostrada en la figura 4.19. Cada parcial computa su propia amplitud periódicamente (cuando es disparada por el objeto poll-table), utilizando un objeto tabread4. Los contenidos de la tabla (los cuales tienen un rango nominal de 50 dB) son convertidos a unidades lineales y utilizados como un control de amplitud en la forma usual.

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

La técnica de sintetizar a una envolvente espectral específica puede ser generalizada de muchas maneras: la envolvente puede ser hecha para variar en el tiempo ya sea como el resultado de un análisis de una señal en vivo, o por el cálculo de un conjunto de reglas composicionales, o por el cruzamiento atenuado entre un conjunto de envolventes espectrales prediseñadas o por el pandeo-defrecuencias de envolventes, para nombrar algunas pocas posibilidades. Síntesis polifónica: el muestreador Nos movemos ahora a un ejemplo utilizando la asignación dinámica de voces tal como se describió en la sección 4.5. En los ejemplos de la síntesis aditiva mostrados previamente, cada voz es utilizada para un propósito fijo. En el presente ejemplo, asignamos las voces desde un banco según se necesiten para ejecutar las notas en una secuencia de control. El ejemplo D11.sampler.poly.pd (figura 4.20) muestra el sampleador polifónico, que usa la abstracción sampvoice (cuyo interior se muestra en la figura 4.21). Las técnicas para alterar la afinación y otros parámetros en un muestrador de un disparo se ven en el ejemplo D10.sampler.notes.pd (que no se muestra) el cual a su vez deriva del muestrador de un disparo del capítulo previo (C05.sampler.oneshot.pd, mostrado en la figura 3.14.) Los objetos sampvoice están organizados en un tipo diferente de bus de suma al de los anteriores; aquí, cada uno adiciona su propia salida a la señal en su entrada, y pone la suma en su salida. En la parte inferior de los ocho objetos, la salida de esta manera mantiene la suma de todos los ocho objetos. Este tiene la ventaja de ser más explícito que los buses throw~ / catch~, y es preferible cuando el atestamiento visual no es un problema. La tarea principal del parche es, sin embargo, distribuir los mensajes “note” a los objetos sampvoice. Para hacer esto debemos introducir algunos nuevos objetos Pd: mod: Módulo de enteros. Por ejemplo, 17 mod 10 da 7, -2 mod 10 da 8. Existe también un objeto de división de enteros denominado div; dividir 17 por 10 vía div da 1, y -2 por 10 da -1. poly: Asignador de voces polifónico. Los argumentos creados dan el número de voces en el banco y una bandera (1 si la voz que se toma se necesita, 0 si no). Las entradas son una etiqueta numérica a la izquierda y una bandera a la derecha indicando el inicio o la parada de una voz con la etiqueta dada (los números que no son cero significan “start” y cero, “stop”). Las salidas son, a la izquierda, el número de la voz, la etiqueta de nuevo al centro, y la bandera inicio/parada a la derecha. En las aplicaciones MIDI, la etiqueta puede ser la nota y la bandera inicio/parada puede ser la velocidad de la nota. makenote: Suministra mensajes retrasados de nota-apagada para que coincidan con los mensajes nota-encendida. Las entradas son una etiqueta y bandera de inicio/parada (“nota” y “velocidad” cuando se usa MIDI) y la duración deseada en milisegundos. Los pares etiqueta/bandera se repiten para las dos salidas tal como ellas son recibidas; luego, después del retraso, la etiqueta es repetida con la bandera cero para detener la nota después de la duración deseada. Los mensajes “note” contienen campos para nota, amplitud, duración, número de muestra, sitio de inicio en la muestra, tiempo de aparición y tiempo de decaimiento. Por ejemplo, el mensaje

60 90 1000 2 500 10 20 (si es recibido por el objeto r note) significa tocar una nota a la altura 60 (en unidades MIDI), amplitud 90 dB, un segundo de longitud, desde la tabla de onda denominada “sample2”, comenzando en el punto 500 milisegundos en la tabla de onda, con tiempos de aparición y de decaimiento de 10 y 20 milisegundos. Luego de desempacar el mensaje en sus siete componentes, el parche crea una etiqueta para la nota. Para hacer esto, primero el objeto t b f da como salida un disparo después de que el último de los siete parámetros aparece separadamente. La combinación de los objetos +, f, y mod actúa como un contador que se repite después de un millón de veces, escencialmente generando un número único correspondiente a la nota. El paso siguiente es utilizar el objeto poly para determinar cuál voz ejecuta qué nota. El objeto poly espera mensajes separados para iniciar y detener las tareas (es decir, las notas). De esta manera la etiqueta y la duración son alimentados primero al objeto makenote, cuyas salidas incluyen una bandera (“velocidad”) a la derecha y una etiqueta de nuevo a la izquierda. Por cada etiqueta que recibe makenote, se genera la salida de dos pares de números, uno para iniciar la nota, y el otro, después de un retraso igual a la duración de la nota, para detenerla. Habiendo tratado poly de separar esta entrada, ahora tenemos que desnudar los mensajes correspondientes a los finales de las notas, puesto que nosotros realmente necesitamos únicamente mensajes combinados de “nota” con campos de duración. El objeto stripnote hace esta tarea. Finalmente, el número de voz que hemos calculado es antepuesto a los siete parámetros con los que comenzamos (el objeto pack), de tal manera que la salida del objeto pack aparece así: 4 60 90 1000 2 500 10 20 donde “4” es el número de la voz a la salida del objeto poly. El número de la voz es utilizado para enrutar el mensaje hacia la voz deseada utilizando el objeto route. El objeto sampvoice apropiado obtiene entonces la lista original iniciando con “60”.

Dentro del objeto sampvoice (figura 4.21), el mensaje es utilizado para controlar los objetos tabread4~ y rodear los objetos line~ y vline~. El control tiene lugar con un retraso de 5 milisegundos como en el primer ejemplo de muestreador. Aquí, sin embargo debemos almacenar los siete parámetros de la nota (antes aquí no había parámetros). Esto se hace utilizando los seis objetos f, más la entrada derecha del objeto delay de la derecha. Estos valores son usados después del retraso de 5 milisegundos. Esto se hace en tándem con el mecanismo de muteo descrito en la página “95”, utilizando otro objeto vline~. Cuando han pasado los 5 milisegundos, el objeto vline~ a cargo de la generación del índice de la tabla de onda consigue poner sus órdenes en marcha (y simultáneamente, el número de la tabla de onda es ajustado para el objeto tabread4~ y la envolvente de amplitud del generador comienza su ataque.) El índice de la tabla de onda debe ajutarse discontinuamente para iniciar el índice, luego hace la rampa hacia un índice final en un intervalo de tiempo apropiado para obtener la transposición deseada. El índice de inicio en muestras es precisamente 44.1 veces la localización del inicio en milisegundos, más uno, para permitir la tabla de cuatro puntos de interpolación. Este viene a ser el

tercer número en la lista empacada generada por el objeto pack en el centro del parche de voces. Arbitrariamente decidimos que la rampa tendrá diez mil segundos (este es el “1e+07” que aparece en la caja de mensaje enviada al índice de la tabla de onda del generador), esperando que sea esta la mayor duración de cualquier nota que vayamos a tocar. El índice del final es el índice del inicio, más el número de muestras de la rampa. Con un factor de transposición de uno, nos deberemos mover 441,000,000 de muestras durante 10,000,000 de milisegundos, o proporcionalmente más o menos, dependiendo del factor de transposición. El factor de transposición es computado por el objeto mtof, dividido por 261.62 (la frecuencia correspondiente a la nota MIDI 60) de tal manera que una “altura” especificada como 60 resulte en un factor de transposición de uno. Estos y otros parámetros son combinados en un mensaje vía el objeto pack de tal manera que las cajas de mensajes siguientes puedan generar los mensajes de control requeridos. La única novedad es el objeto makefilename, el cual convierte números tales como “2” a símbolos tales como “sample2” de tal manera que el objeto tabread4~ de la tabla de onda se puede ajustar. En la parte inferior del parche de voces veremos cómo un bus de suma se implementa dentro de un subparche; un objeto inlet~ va haciendo la suma de todas las voces precedentes, haciendo que la salida de la voz corriente se adicione en la entrada, y el resultado se envíe a la siguiente voz, vía el objeto outlet~.

Ejercicios 1. Qué entrada para una función de transferencia de cuarta potencia da una salida de -12 dB, si una entrada de 1 da una salida de 0 dB? 2. Un generador de envolvente se eleva desde cero a un valor pico durante su segmento de ataque. Cuántos decibeles menos que el pico tiene la salida alcanzada en la mitad del camino del ataque, asumiendo una salida lineal? Y asumiendo una salida de cuarta potencia? 3. Qué ley exponencial de función de transferencia (es decir, qué opción de n para la función f(x) = xn) debería utilizar si usted desea que el valor en el punto medio sea de -12 dB? 4. Suponga que desea hacer un cruzamiento atenuado de dos señales, es decir, que mientras una señal va entrando, la otra va decayendo. Si tienen igual potencia y

no están correlacionadas un cruzamiento atenuado lineal daría como resultado una caída de 3 decibeles en la mitad del cruzamiento. Qué ley de potencia debería utilizar para mantener la potencia constante a lo largo del cruzamiento? 5. Un acorde de tres notas, que dura 1.5 segundos, suena iniciando una vez cada segundo. Cuántas voces se requieren para sintetizarlo sin que se anule ninguna nota? 6. Suponga que un parche de síntesis da salida entre -1 y 1. Mientras una nota está sonando, una nueva nota ha iniciado utilizando la técnica de toma-de-voz con “descenso-de-rampa”. Cuál es la salida máxima?

Capítulo 5

Modulación Habiendo tomado un recorrido de dos capítulos al interior de los aspectos de control y de la organización en la música electrónica, retornamos a la descripción de la síntesis de audio y las técnicas de procesamiento. Ya hemos visto métodos aditivos y de tabla de ondas. En este capítulo introduciremos tres técnicas de las llamadas “modulación”: modulación de la amplitud, modulación de la frecuencia y conformación de ondas. El término “modulación” se refiere de manera muy general a cualquier técnica que sistemáticamente altere la forma de una onda, curvando su gráfica vertical u horizontalmente. La modulación se utiliza de manera amplia para la construcción de sonidos con varias familias de espectros, para lo cual debemos desarrollar alguna terminología antes de ir a las técnicas. 5.1 Taxonomía de los espectros La figura 5.1 muestra una manera de visualizar el espectro de una señal de audio. El espectro describe, hablando en términos generales, cómo está distribuida en frecuencias la potencia de la señal. (Se pueden dar definiciones más precisas que la que se da aquí, pero requieren de más conocimiento matemático). La parte (a) de la figura muestra el espectro de una señal armónica, la cual es una señal periódica cuya frecuencia fundamental está en el rango de las afinaciones perceptibles, aproximadamente entre 50 y 4000 Hertz. Las series de Fourier (página “12”) dan una descripción de una señal periódica como una suma de sinusoides. Las frecuencias de estas sinusoides están en relación 0 : 1 : 2 ... (El término constante en las series de Fourier puede ser pensado como una sinusoide, a0 = a0cos(0

• !n),

cuya frecuencia es cero.) En una señal armónica la potencia mostrada en el espectro está concentrada en un subconjunto pequeño de ejes de frecuencia (un conjunto discreto consiste de muchos puntos aislados, sólo en cantidad finita, y en un intervalo cualquiera delimitado). Llamamos a esto un espectro discreto. Aún más, las frecuencias donde la potencia de la señal está en razones 0 : 1 : 2... son las que aparecen de una señal periódica. (No es necesario que todos los armónicos de la frecuencia estén presentes; algunos armónicos pueden tener amplitud cero.) Para una señal armónica el gráfico del espectro muestra las amplitudes de los parciales de las señales. Conociendo las amplitudes y las fases de todos los parciales se determina completamente la señal original. La parte (b) de la figura muestra un espectro que también es discreto, de tal manera que la señal puede considerarse de nuevo como una suma de series de parciales. En este caso, sin embargo, no hay frecuencia fundamental, es decir, no hay un submúltiplo común de todos los parciales. Esta es llamada una señal inarmónica. (Los términos armónico e inarmónico pueden utilizarse para describir tanto las señales como su espectro.) Cuando tratamos con el espectro discreto, reportamos la amplitud de un parcial en una forma ligeramente no intuitiva. Cada componente sinusoidal,

acos(!n + Á) cuenta únicamente como si tuviera amplitud a/2 en tanto que la frecuencia

angular ! es no cero. Pero para un componente de frecuencia cero, para el cual ! = Á = 0, la amplitud está dada por a -sin dividirla por 2. (Los componentes con frecuencia cero son llamados usualmente componentes DC; “DC” es históricamente un acrónimo de “direct current” ). Estas convenciones para las amplitudes en los espectros simplificarán más tarde las matemáticas en este capítulo; una razón profunda para estas se dará en el capítulo 7. La parte (c) de la figura muestra una tercera posibilidad: el espectro podría no estar concentrado en un conjunto discreto de frecuencias, si no que podría estar disperso entre todas las frecuencias posibles. Este puede ser llamado un espectro continuo o de ruido. Los espectros no necesariamente caen en categorías continuas o discretas; los sonidos reales, en particular, están usualmente entre ambos. Cada una de las tres partes de la figura muestra una curva continua llamada envolvente espectral. En general los sonidos no tienen una envolvente espectral singular, bien definida; puede haber muchas maneras de dibujar una curva suave a través del espectro. De otro lado, una envolvente espectral puede especificarse intencionalmente; en cuyo caso, usualmente se aclara cómo hacer el espectro conforme a esto. Para un espectro discreto, por ejemplo, podríamos simplemente leer, en la envolvente espectral, la amplitud deseada de cada parcial y hacerlo así sucesivamente. A veces la altura de un sonido puede inferirse de su espectro. Para los espectros discretos, la altura está codificada primariamente en las frecuencias de los parciales. Las señales armónicas tienen una altura determinada por su frecuencia fundamental; para la inarmónicas, la altura puede ser clara, ambigua o estar ausente del todo, según reglas complejas y que aún no se entienden por completo. Un espectro de ruido puede tener también una altura perceptible si la envolvente espectral contiene uno o más picos estrechos. En general la fortaleza de un sonido y su timbre dependen más de su envolvente espectral que de las frecuencias en el espectro, si bien la diferencia entre espectro continuo y discreto puede escucharse también como un timbre distinto. El timbre, así como la afinación, puede evolucionar durante la vida de un sonido. Hemos estado hablando de los espectros como entidades estáticas, sin considerar si cambian o no en el tiempo. Si la altura y el timbre de una señal cambian en el tiempo, podemos pensar en el espectro como la descripción del comportamiento momentáneo de una señal que varía en el tiempo. Esta manera de ver los sonidos está muy simplificada. El comportamiento real de la altura y del timbre tiene muchos aspectos que no se pueden explicar en los términos de este modelo. Por ejemplo, la cualidad tímbrica llamada “lo áspero” es a veces tomada como si reflejara cambios rápidos en la envolvente espectral en el tiempo. La descripción simplificada que se desarrolla aquí es útil no obstante, en las discusiones acerca de cómo construír espectros discretos o continuos para una amplia variedad de propósitos musicales, tal como lo comenzaremos a mostrar en el resto de este capítulo. 5.2 Multiplicando señales de audio Hemos estado añadiendo rutinariamente señales de audio, y multiplicándolas por señales con variaciones lentas (utilizadas, por ejemplo, como envolventes de amplitud) desde el capítulo 1. Para entender completamente el álgebra de las señales de audio, debemos considerar también la situación donde dos señales de audio, ninguna de las cuales puede asumirse que cambia lentamente, son multiplicadas. Es clave comprender lo que sucede en la Fórmula de Producto de Cosenos: cos(a)cos(b) = [cos(a + b) + cos(a - b)]/2

para ver porqué esta fórmula es cierta, podemos usar la fórmula para el coseno de una suma de ángulos: cos(a + b) = cos(a)cos(b) - sen(a)sen(b) para evaluar el lado derecho de la fórmula de producto de cosenos; lo que entonces simplifica el lado izquierdo. Podemos utilizar esta fórmula para ver qué sucede cuando multiplicamos dos sinusoides (página “1”): cos(®n + Á)cos(¯n + ») = [cos((® + ¯)n + (Á +

»)) + cos((® - ¯)n + (Á - »))]/2

En palabras, al multiplicar dos sinusoides se consigue un resultado con dos parciales, uno con la suma de las dos frecuencias originales, y otro con su diferencia. (Si la diferencia ® - ¯ es negativa, simplemente se cambian las dos sinusoides originales y la diferencia queda positiva). Estos dos nuevos componentes se denominan bandas laterales. Esto nos proporciona una técnica para cambiar las frecuencias de un sonido, denominadad modulación de anillo, la cual se muestra en su forma más simple en la figura 5.2. Un oscilador provee una señal portadora, la cual simplemente se multiplica por la entrada. El término “modulación de anillo” es utilizado de manera más general para indicar la multiplicación de dos señales cualquiera, pero aquí sólo la consideraremos utilizando una señal portadora sinusoidal. (La técnica de modulación de anillo data de la era análoga [Str95]; los multiplicadores digitales reemplazan ahora tanto el VCA (sección 1.5) como el modulador de anillo.) La figura 5.3 muestra una variedad de resultados que se pueden obtener multiplicando una sinusoide (modulante) de frecuencia angular ® y amplitud pico 2a por una sinusoide (portadora) de frecuencia angular ¯ y amplitud pico 1: [2acos(®n)]•[cos(¯n)] (Por simplicidad los términos de la fase son omitidos.) Cada parte de la figura muestra la señal de la modulación y el resultado en el mismo espectro. La señal de modulación aparece como una frecuencia singular, ®, a la amplitud a. El producto en general tiene dos componentes de frecuencias, cada una a una amplitud de a/2.

¯n)]/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 cos((® -

¯)n) = cos((¯ - ®)n)

así el componente negativo es exactamente equivalente al de la frecuencia positiva ¯ - ®, a la misma amplitud. En el caso especial donde ® = ¯, la segunda banda lateral (la diferencia) tiene frecuencia cero. En este caso la fase será significante así que reescribimos el producto con fases explícitas, reemplazando ¯ por ®, para obtener:

2acos(®n + Á)cos(¯n + ») = = acos(2®n + (Á + »)) + acos(Á -

»).

El segundo término tiene frecuencia cero; su amplitud depende de la fase relativa de las dos sinusoides y tiene rango de +a a -a ya que la diferencia de fase Á - » varía de 0 a ¼ radianes. Esta situación se muestra en la parte (c) de la figura 5.3. Finalmente, la parte (d) muestra una señal portadora cuya frecuencia es cero. Su valor es la constante a (no 2a; la frecuencia cero es un caso especial). Aquí obtenemos únicamente una banda lateral, de amplitud a/2, la usual. Podemos usar la regla distributiva de la multiplicación para encontrar qué sucede cuando multiplicamos las señales que consisten de más de un parcial cada una. Por ejemplo, en la situación anterior podemos reemplazar la señal de la frecuencia ® con la suma de varias sinusoides, tales como:

a1cos(®1n) + ... + akcos(®kn) Al multiplicar por la señal de la frecuencia frecuencias iguales en:

¯ se obtienen parciales a

®1 + ¯, ®1- ¯, ..., ®k + ¯, ®k - ¯k Como antes, si cualquier frecuencia es negativa tomamos su valor absoluto. La figura 5.4 muestra el resultado de multiplicar una señal periódica compleja (con algunos componentes afinados en razón 0:1:2: ...) por una sinusoide. La envolvente espectral y las frecuencias de los componentes del resultado son cambiadas de acuerdo a reglas relativamente sencillas. El espectro resultante es escencialmente el espectro original combinado con su reflexión con respecto al eje vertical. Este espectro combinado se desplaza luego a la derecha por la frecuencia portadora. Finalmente, si algunos componentes del espectro cambiado están todavía a la izquierda del eje vertical, son reflejados alrededor de este para hacer frecuencias positivas nuevamente. En la parte de (b) de la figura, la frecuencia portadora (la frecuencia de la sinusoide) está por debajo de la frecuencia fundamental de la señal compleja. En este caso, el cambio es por una distancia relativamente pequeña, de tal manera que se vuelve a doblar el espectro en los extremos, y casi se sitúan las dos mitades una sobre la otra. El resultado es una envolvente espectral aproximadamente igual a la original (aunque con la mitad de su altura) y un espectro dos veces más denso. Un caso especial, que no se muestra, es utilizar una frecuencia portadora de la mitad de la fundamental. En este caso, los pares de parciales caerán encima uno del otro, y tendrán razones 1/2 : 3/2 : 5/2: ..., para dar una señal de sólo parciales impares una octava por debajo de la original. Este es un muy simple y efectivo divisor de octava para una señal armónica, asumiendo que usted conoce o puede encontrar su frecuencia fundamental. Si usted quiere parciales pares tanto como los impares (para la señal de octava baja), simplemente mezcle la señal original con la modulada. La parte (c) de la figura muestra el efecto de utilizar una frecuencia modulante mucho más alta que la frecuencia fundamental de la señal compleja. Aquí el efecto del desdoblado es mucho más claramente visible (únicamente un parcial, el de la izquierda, ha de reflejarse para hacer su frecuencia positiva). La

envolvente espectral está ahora ampliamente desplazada de la original; este desplazamiento es usualmente un efecto más fuertemente audible que el de la relocalización de parciales. Como otro caso especial, la frecuencia portadora puede ser un múltiplo de la fundamental de las señales periódicas complejas; entonces los parciales caen sobre los otros parciales de la misma fundamental, y el único efecto es el cambio en la envolvente espectral. 5.3 Conformación de onda Otra forma de modulación de la señal, llamada conformación de onda, es pasarla a través de una función no lineal escogida apropiadamente. Un diagrama de bloque para hacer esto se muestra en la figura 5.5. La función f() (llamada la función de transferencia) distorsiona la onda que entra dándole otra forma. La nueva forma depende de la forma de la onda entrante, de la función de transferencia, y también -de manera crucial- de la amplitud de la señal de entrada. Dado que la amplitud de la onda que entra afecta la forma de la onda que sale (y de hecho el timbre), esta nos da una manera fácil de hacer una familia de timbres que varían continuamente, simplemente variando el nivel de entrada de la transformación. Por esta razón es imprescindible incluir un control de amplitud general como parte de la operación de conformación de onda, tal como se muestra en el diagrama de bloques. La amplitud de la onda de entrada es llamada el índice de conformación de onda. En muchas situaciones, un índice pequeño conduce a una distorsión relativamente pequeña (de tal manera que la salida prácticamente es parecida a la entrada) y los índices más grandes dan un timbre más rico y distorsionado. La figura 5.6 muestra un ejemplo familiar de conformación de onda, en el cual f() da la cantidad para una función de corte. Este ejemplo muestra claramente cómo la amplitud de entrada -el índice- puede afectar la forma de la salida. La función de corte pasa de su entrada a su salida sin cambio, siempre y cuando aquélla esté en el intervalo entre -0.3 y 0.3. Así mientras la entrada no exceda 0.3 en valor absoluto, la salida es igual a la entrada. Pero cuando la entrada se pasa del límite, la salida se mantiene dentro de este; y mientras la amplitud de la entrada sea mayor, el efecto de esta acción de recorte es progresivamente más severo. En la figura, la entrada es una sinusoide que decae. La salida evoluciona desde una onda casi cuadrada al comienzo, hasta una sinusoide pura al final. Este efecto será muy bien conocido por quien haya tocado un instrumento a través de un amplificador con distorsión. Mientras más fuerte es la entrada, más distorsionada es la salida. Por esta razón, el proceso de conformación de onda es a veces llamado distorsión. La figura 5.7 muestra una manera mucho más fácil y sencilla para analizar la situación, en la cual la función de transferencia simplemente eleva al cuadrado la entrada:

f(x) = x2 Para una entrada sinusoidal,

x(n) = acos(!n + Á) tenemos que

f(x[n]) = a2(1 + cos(2!n + 2Á))/2 Si la amplitud a es igual a uno, el resultado es precisamente el resultado de una modulación de anillo de una sinusoide con una sinusoide de la misma frecuencia, descrito en la sección previa: la salida es una sinusoide DC (de

frecuencia cero) más una sinusoide al doble de la frecuencia original. Sin embargo, en este ejemplo de conformación de onda, a diferencia de la modulación de anillo, la amplitud de la salida crece con el cuadrado de la entrada. Manteniendo la misma función de transferencia, consideramos el efecto de enviarle una combinación de dos sinusoides con amplitudes a y b, y frecuencias angulares ® y ¯. Por simplicidad, omitiremos los términos de la fase inicial. Tenemos:

x(n) = acos(®n) + bcos(¯n) y reemplazando esto en f() da

f(x[n]) = a2(1 + cos(2®n))/2 + b2(1 + cos(2¯n))/2 + + ab[cos(® + ¯)n) + cos(® - ¯)n)] Los dos primeros términos son precisamente los que obtendríamos al enviar las dos sinusoides separadamente. El tercer término es dos veces el producto de los dos términos de entrada el cual proviene del término cruzado de la mitad, en la expansión,

f(x + y) = x2 + 2xy + y2 Este efecto, llamado intermodulación, se vuelve más y más dominante mientras el número de términos en la entrada se incrementa; si hay k sinusoides en la entrada, hay únicamente k términos “directos” en el producto, pero hay (k2 – k)/2 términos de intermodulación. En contraste con la modulación de anillo, la cual es una función lineal de su señal de entrada, la conformación de onda es no lineal. Mientras éramos capaces de analizar procesos lineales considerando su acción por separado en todos los componentes de la entrada, en este caso no lineal también debemos considerar las interacciones entre los componentes. Los resultados son muchos más complejos -a veces mucho más ricos sonoramente, pero, de otro lado, mucho más difíciles de entender o predecir. En general, podemos mostrar que una entrada periódica, sin importar lo compleja que sea, se repetirá en el mismo período después del proceso de conformación de onda: si el período es ¿ de tal manera que

x[n + ¿] = x[n] y temporalmente ajustamos el índice a = 1,

f(x[n + ¿]) = f(x[n]) (En algunos casos especiales la salida se puede repetir en un submúltiplo de de tal manera que obtenemos un armónico de la entrada como resultado; esto sucede por ejemplo en la figura 5.4.)

¿,

Las combinaciones de sonidos periódicos en intervalos constantes pueden ocasionar productos distorsionados en los subarmónicos. Por ejemplo, si las dos señales periódicas x y y forman un intervalo de cuarta musical (períodos con la relación 4:3), entonces la suma de los dos se repite a una velocidad más baja por el subarmónico común. En ecuaciones, tendríamos:

x[t + ¿/3] = x[t] y[t + ¿/4] = y[t] lo cual implica

x[t + ¿] + y[t + ¿] = x[t] + y[t]

¿ que se repite cada n veces, por

y así la suma distorsionada f(x + y) se deberá repetir después de un período

¿:

f(x + y)[n + ¿] = f(x + y)[n] Esto ha sido experimentado por todos los guitarristas eléctricos que han ajustado el amplificador a “overdrive” y tocado las cuerdas B y E al aire, juntas: la distorsión produce a veces sonidos en la nota de la cuerda de E grave, dos octavas por debajo de la aguda. Para lograr un análisis algo más explícito del efecto de la conformación de onda en una señal de entrada, a veces es útil escribir la función f como una función finita o infinita de una serie de potencias:

f(x) = f0 + f1x + f2x2 + f3x3 + ... Si la señal de entrada x[n] es una sinusoide de una unidad de amplitud, cos(! n), podemos considerar la acción de los términos de arriba separadamente:

f(a•x[n]) = f0 + af1cos(!n)+ a2f2cos2(!n) + a3f3cos3(!n) + ...

Debido a que los términos de las series son multiplicados sucesivamente por potencias más altas del índice a, un valor más bajo de a enfatizará los primeros términos más pesadamente, y un valor más alto hará énfasis en los últimos. Los términos de los espectros individuales se pueden encontrar aplicando la fórmula del producto coseno repetidamente: 1 = cos(0) x[n] = cos(!n) x2[n] = 1/2 + cos(2!n)/2 x3[n] = cos(-!n)/4 + 2cos(!n)/4 + cos(3!n)/4 x4[n] = cos(-2!n)/8 + 3cos(0)/8 + 3cos(2!n)/8 + cos(4!n)/8 5 x [n] = cos(-3!n)/16 + 4cos(-!n)/16 + 6cos(!n)/16 + 4cos(3!n)/16 + cos(5!n)/16 < por ejemplo, x3[n] = cos(!n)*cos(!n)*cos(!n) = cos(!n)*(1/2 + cos(2!n)/2) = 2cos(!n)/4 + cos(3!n)/4 + cos(-!n)/4> y así sucesivamente. En los numeradores de las fracciones se reconoce el triángulo de Pascal. El Teorema del Límite Central de la probabilidad implica que cada k-ésima fila puede ser aproximada a una curva Gaussiana cuya desviación normal (una medida de su ancho) es proporcional a la raíz cuadrada de k. Los términos con frecuencias negativas (que se muestran separadamente por claridad) se combinan con los positivos; la envolvente espectral se dobla sobre

sí misma de la misma manera que en el ejemplo de la figura 5.4 de la modulación de anillo. Si los coeficientes fk son todos números positivos o cero, así mismo son todas las amplitudes de las sinusoides en la expansión de arriba. En este caso todas las fases quedan coherentes en tanto a varía y así logramos una ampliación del espectro (y posiblemente un incremento drástico de la amplitud) con el incremento de los valores de a. De otro lado, si algunos de los fk son positivos y otros son negativos, las expansiones diferentes se interferirán destructivamente; esto dará una evolución espectral de un sonido más complicado. Note también que las ampliaciones sucesivas contienen únicamente parciales pares o parciales impares. Si la función de transferencia (en forma de series) contiene únicamente potencias pares:

f(x) = f0 + f2x2 + f4x4 + ... entonces el resultado, teniendo únicamente parciales pares, sonará una octava más aguda que la sinusoide de entrada. Si se muestran únicamente los parciales impares en la expansión de f(x), entonces la salida contendrá únicamente parciales impares. Si f no se puede expresar exactamente como una serie de potencias (por ejemplo la función corte de la figura 5.3), sigue siendo cierto que si f es una función par, es decir, si

f(-x) = f(x) usted conseguirá únicamente armónicos pares y si f es una función impar,

f(-x) = -f(x) conseguira armónicos impares. Muchos trucos matemáticos han sido propuestos para utilizar conformación de onda y generar espectros específicos. En cambio de eso, usted puede generar sinusoides puras en cualquier armónico de la fundamental utilizando un polinomio Chebisev como una función de transferencia, y desde ahí, usted puede construír cualquier espectro estático deseado (el ejemplo E05.chebychev.pd demuestra esto.) Generar familias de espectros aplicando la conformación de onda en una sinusoide de amplitud variable puede convertirse en algo complicado, sin embargo algunos casos especiales interesantes han sido encontrados, y de éstos se desarrollan en detalle algunos en el capítulo 6. 5.4 Modulación de frecuencia y de fase Si una sinusoide está produciendo una frecuencia que varía lentamente en el tiempo, la escuchamos como si tuviera variaciones de altura. Pero si la altura cambia tan rápidamente que nuestros oídos no pueden seguir el cambio, -por ejemplo, si el cambio mismo ocurre en o por encima de la frecuencia fundamental de la sinusoide- escuchamos un cambio tímbrico. Los timbres generados de esta manera son ricos y de una amplia variedad. El descubrimiento de John Chowning de esta posibilidad revolucionó el campo de la música por computador. Desarrollamos aquí la modulación de frecuencia, usualmente llamada FM, como un caso especial de conformación de onda; el análisis dado aquí es algo diferente. La técnica FM en su forma más sencilla se muestra en la figura 5.8 (parte a). Una sinusoide de frecuencia modulada es aquella cuya frecuencia varía sinusoidalmente, con alguna frecuencia angular !m alrededor de una frecuencia central !c de tal manera que las frecuencia instantáneas varían entre (1 - r)!c y (1 + r)!c, con los parámetros !m controlando la variación de la frecuencia y r controlando la profundidad de la variación. Los parámetros !c, !m y r son llamados la frecuencia portadora, la frecuencia de modulación y el índice de

modulación respectivamente.

Es costumbre utilizar una formulación más simple, escencialmente equivalente, en la cual la fase de la sinusoide portadora, en lugar de la frecuencia, es modulada sinusoidalmente. (Esto da un resultado equivalente ya que la frecuencia instantánea es la velocidad de cambio de la fase, dado que la velocidad de cambio de una sinusoide es precisamente otra sinusoide.) La formulación de la modulación de fase se muestra en la parte (b) de la figura. Podemos analizar el resultado de la modulación de fase como sigue, asumiendo que el oscilador modulante y la tabla de ondas son ambas sinusoidales, y que las frecuencias portadora y de modulación no están variando en el tiempo. La señal resultante puede escribirse como

x[n] = cos(acos(!mn) + !cn) El parámetro a que toma el lugar del anterior parámetro r, es de esta manera llamado el índice de modulación; también controla la extensión de la variación de la frecuencia relativa a la frecuencia portadora !c. Si a = 0, no hay variación de la frecuencia y la expresión se reduce a la sinusoide portadora, sin modificaciones; en tanto a se incrementa la onda se va haciendo más compleja. Para analizar el espectro resultante podemos re-escribir la señal como,

x[n] = cos(!cn)*cos(acos(!mn)) - sen(!cn)*sen(acos(!mn)) Podemos considerar el resultado como una suma de dos generadores de conformadores de onda, cada uno operando una sinusoide de frecuencia !m y con un índice de conformación de onda a y cada anillo modulado, con una sinusoide de frecuencia !c. La función de conformación de onda f está dada por f[x] = cos[x] para el primer término, y por f[x] = sen[x] para el segundo. Retornando a la figura 5.4 podemos predecir que el espectro lucirá así. Los dos espectros armónicos a la salida del proceso de conformación de onda son cos(acos(!mn)) y sen(acos(!mn)) y tienen respectivamente armónicos afinados a 0, 2!m, 4!m,... y

!m, 3!m, 5!m,... y cada uno está multiplicado por una sinusoide a la frecuencia portadora. Habrá así un espectro centrado a la frecuencia portadora !c con bandas laterales tanto

de múltiplos pares como impares de la frecuencia de modulación !m, aportados respectivamente por los términos seno y coseno de la conformación de onda de arriba. Cuando el índice de modulación a cambia, controla la fortaleza relativa de los diversos parciales. Los parciales mismos están situados en las frecuencias

!c + m!m donde

m = ...-2,-1,0,1,2,... Al igual que con cualquier situación donde dos señales periódicas se multiplican, si hay algún supermúltiplo de los dos períodos, el producto resultante se repetirá al cabo de ese largo período. Así, si los dos períodos son k¿ y m¿, donde k y m son primos relativos, ambos se repiten al cabo de un intervalo de tiempo de km¿. En otras palabras, si los dos tienen frecuencias que son ambas múltiplos de alguna frecuencia común, de tal manera que !m = k! y !c = m!, de nuevo con k y m primos relativos, el resultado se repetirá a una frecuencia del submúltiplo común !. De otro lado, si no se encuentra ningún submúltiplo común !, o si sólo los submúltiplos son más bajos que cualquier altura discernible, entonces el resultado será inarmónico. Mucho más de la FM se puede encontrar en libros de texto [Moo90, p.316] [DJ85, pp.115-139] [Bou00] y literatura investigativa. Algunas de las posibilidades se muestran en los siguientes ejemplos.

5.5 Ejemplos Modulación de anillo y espectros El ejemplo E01.spectrum.pd sirve para presentar una herramienta de medición del espectro que utilizaremos; de aquí saltamos al segundo ejemplo, E02.ring.modulation.pd, el cual muestra el efecto del proceso de modulación de anillo de un espectro armónico (el cual se trabajó teóricamente en la sección 5.2 y se mostró en la figura 5.4). En el ejemplo consideramos una señal cuyos armónicos (del 0 hasta el 5) tienen todos amplitud de una unidad. Los armónicos se pueden encender y apagar separadamente utilizando interruptores de palanca. Cuando todos están encendidos, la envolvente espectral tiene el pico en DC (debido a que la señal constante cuenta el doble en tanto se fortalecen las otras sinusoides), tiene una región plana desde los armónicos 1 hasta 5, y luego desciende a cero. En la porción de la generación de la señal del parche (parte (a) de la figura), sumamos los seis parciales y multiplicamos la suma por el único oscilador portador. (Las seis señales se suman implícitamente conectándolas todas a la misma entrada del objeto *~.) El valor de la fundamental en la parte superior es computado para alinearlo bien con el análisis espectral, cuyos resultados se muestran en la parte (b) de la figura. El análisis espectral (el cual utiliza técnicas que no describiremos hasta el capítulo 9) muestra la localización de las sinusoides (asumiendo un espectro discreto) sobre el eje horizontal y sus magnitudes sobre el eje vertical. Así la presencia de un pico en DC de magnitud uno en el espectro de la señal de entrada predice, en la figura 5.3, que debería haber un pico en el espectro de salida, en la frecuencia portadora, de altura 1/2. De manera similar, las otras dos sinusoides en la señal de entrada, que tienen una altura de 1/2 en el espectro, hacen levantar dos picos cada una, de altura 1/4, en la salida. Una de estas

cuatro ha sido reflejada con respecto al borde izquierdo de la figura (tomando el valor absoluto de su frecuencia negativa). Divisor de octava y sumador de formante Como se sugirió en la sección 5.2, cuando se considera el resultado de modular una señal armónica compleja (es decir, periódica) por una sinusoide, un interesante caso especial es ajustar el oscilador portador a 1/2 de la frecuencia fundamental, lo cual hace caer el sonido resultante una octava con sólo una relativamente pequeña deformación de la envolvente espectral. Otro caso especial es modular con una sinusoide a varias veces la frecuencia fundamental, lo cual en efecto desplaza la envolvente espectral sin cambiar la frecuencia fundamental del resultado. Esto se demuestra en el ejemplo E03.octave.divider.pd (figura 5.10). La señal que procesamos aquí es una grabación de voz hablada. Los subparches pd looper y pd delay esconden detalles. El primero es un muestreador de lazo como el que se presentó en el capítulo 2. El segundo es un retraso de 1024 muestras, que utiliza objetos que serán presentados luego en el capítulo 7. Presentaremos un nuevo tipo de objeto aquí: fiddle~: seguidor de altura. La entrada toma una señal para ser analizada, y mensajes para cambiar sus ajustes. Dependiendo de los argumentos creados fiddle~ puede tener un número variable de salidas ofreciendo información diversa acerca de la señal de entrada. Como se muestra aquí, con solamente un argumento creado para especificar el tamaño de la ventana, la tercera salida intenta reportar la altura de la entrada y la amplitud de esa porción de la entrada que se repite (por lo menos de manera aproximada) en la altura reportada. La salida de éstas es una lista de dos números. La altura, en unidades MIDI, se reporta como cero si no se logra identificar. En este parche la tercera salida es desempacada en su componentes de altura y amplitud, y el componente de altura es filtrado por el objeto moses de tal manera que sólo se utilizan las estimaciones de altura exitosas (las que no son cero). Estas son convertidas a unidades de frecuencia por el objeto mtof. Finalmente las frecuencias estimadas son o reducidas en 1/2 o multiplicadas por 15, dependiendo del multiplicador seleccionado para proveer la modulación de la frecuencia. En el primer caso obtenemos un divisor de octava y en el segundo, armónicos altos adicionales que deforman las vocales. Conformación de onda y sonidos diferenciados El ejemplo E04.difference.tone.pd (figura 5.11) presenta la conformación de onda, demostrando la no linealidad del proceso. Dos sinusoides (de 300 y 225 Hertz, o en una razón de 4 a 3) se suman y luego se recortan, utilizando un nuevo tipo de objeto: clip~: cortador de señal. Cuando la señal está entre los límites especificados por los argumentos del objeto clip~, pasa sin cambio alguno; pero cuando cae por debajo del límite inferior o se eleva por encima del límite superior, es reemplazada por el límite. El efecto de recorte de una señal sinusoidal se mostró gráficamente en la figura 5.6. Mientras la amplitud de la suma de sinusoides sea menos del 50 por ciento, la suma no excede el valor absoluto de uno y el objeto clip~ permite pasar el par de sinusoides sin cambio hacia la salida. Tan pronto la amplitud excede el 50 por ciento, la no linealidad del objeto clip~ da a luz productos distorsionados (a las frecuencias 300m y 225n para los enteros m y n), y al ser múltiplos de 75, es esta frecuencia la fundamental del sonido resultante. Visto de otra manera, el período común más corto de las dos sinusoides es de 1/75 de segundo (lo cual representa cuatro períodos del sonido a 300 Hertz y tres períodos del sonido a 225 Hertz), de tal manera que se repite 75 veces por segundo.

La frecuencia del sonido a 225 Hertz en el parche se puede variar. Si es movida ligeramente por fuera de 225, se producen sonidos de batido. Otros valores encuentran otros subarmónicos comunes que también dan sonidos inarmónicos enriquecidos. Conformación de onda utilizando polinomios Chebichev El ejemplo E05.chebichev.pd (figura 5.12) demuestra cómo puede utilizar conformación de onda para generar armónicos puros. Nos limitaremos a un ejemplo específico en el cual nos gustaría generar el quinto armónico puro, cos(5!n) por conformación de onda de una sinusoide

x[n] = cos(!n) Necesitamos encontrar un función de transferencia apropiada f(x). Primero vamos a la fórmula para la función de conformación de onda f(x) = x5 (página “131”), la cual nos da el primer, tercer y quinto armónico: 16x5 = cos(5!n) + 5cos(3!n) + 10cos(!n) A continuación añadimos un múltiple apropiado de x3 para cancelar el tercer armónico: 16x5 - 20x3 = cos(5!n) - 5cos(!n) y luego por un múltiplo de x para cancelar el primer armónico: 16x5 - 20x3 + 5x = cos(5!n) Así, para nuestra función de conformación de onda escogimos

f(x) = 16x5 - 20x3 + 5x Este procedimiento nos permite aislar cualquier armónico deseado; las funciones resultantes f son conocidas como polinomios Chebichev. Para incorporar esto en un instrumento de conformación de onda, simplemente construimos un parche que trabaje como en la figura 5.5, computando la expresión

x[n] = f(a[n]cos(!n)) donde a[n] es un índice apropiado que puede variar como una función del número de muestra n. Cuando a es de valor uno, aparece el quinto armónico puro. Otros valores de a dan espectros variables los cuales, en general, tienen el primer y tercer armónico, así como también el quinto. Con una apropiada combinación de polinomios de Chebichev podemos solucionar cualquier superposición de componentes a la salida de la onda (de nuevo, mientras el índice de conformación de onda sea uno). Pero la promesa real del proceso de conformación de onda -que simplemente cambiando el índice podemos fabricar espectros que evolucionen en formas interesantes pero controlables- no está dirigida, por lo menos directamente, al procedimiento de Chebichev. Conformación de onda utilizando la función exponencial Regresamos de nuevo a los espectros computados en la página “131”, correspondientes a las funciones de conformación de onda de la forma f(x) = xk.

Notamos con placer que no solamente están todas en fase (de tal manera que pueden superponerse con resultados predecibles) si no también que los espectros se propagan en tanto k se incrementa. También, en series de la forma,

f(x) = f0 + f1x + f2x2 + ..., un índice más alto de modulación prestará un mayor peso relativo a los términos de más alta potencia de la expansión; tal como lo vimos anteriormente, si el índice de modulación es a los diversos términos xk son multiplicados por f0, af1, a2f2 y así sucesivamente. Suponga ahora que queremos organizar los diferentes términos en la expansión de arriba para dominar el resultado de una manera predecible, como una función del índice a. Para escoger el ejemplo más sencillo posible, suponga que queremos que f0 sea el término más grande para 0 < a < 1, luego lo retomamos para el término de crecimiento más rápido af1 con 1 < a < 2, el cual es también retomado por el término a2f2 para 2 < a < 3 y así sucesivamente, de tal manera que cada n-ésimo término se toma sobre el índice n. Para hacer que esto suceda sólo requerimos que

f1 = f0, 2f2 = f1, 3f3 = f2,... y así, escogiendo f0 = 0, obtenemos f1 = 1, f2 = 1/2, f3 = 1/6, y en general,

fk = 1/(1*2*3*...*k) Estos son los coeficientes de la serie de potencias para la función

f(x) = ex donde e = 2.7, la constante de Euler. Antes de conectar ex como una función de transferencia, es inteligente planear cómo tratar con la amplitud de la señal, ya que ex crece rápidamente con el incremento de x. Si le vamos a conectar una sinusoide de amplitud a la salida máxima será ea, pero con la fase cero. Una opción sencilla y natural es simplemente dividir por ea para reducir el pico a uno, dando:

f(acos(!n)) = eacos(!n) / ea = ea(cos(!n)-1) Esto se a = 0.4 de onda energía

realiza en el ejemplo E06.exponential.pd. Los espectros resultantes para y 16 se muestran en la figura 5.13. Mientras el índice de conformación crece, progresivamente se presenta menos energía en la fundamental; la es incrementalmente propagada sobre los parciales.

Conformación de onda sinusoidal: paridad e imparidad Otra interesante clase de función de transferencia de conformación de onda son las sinusoides:

f(x) = cos(x + Á) que incluyen las funciones seno y coseno (las cuales se consiguen haciendo Á = 0 y Á = -¼/2, respectivamente). Estas funciones, siendo la primera par y la otra impar dan como resultado espectros armónicos pares e impares, los cuales se convierten en: cos(acos(!n)) = J0(a)-J2(a)cos(2!n)+2J4(a)cos(4!n)-2J6(a)cos(6!n)±...

sen(acos(!n)) = 2J1(a)cos(2!n)-2J3(a)cos(3!n)+2J5(a)cos(5!n)∓... Las funciones Jk(a) son las funciones de Bessel del primer tipo, utilizadas por los ingenieros para resolver problemas acerca de las vibraciones o de flujo de calor en discos. Para otros valores de Á, podemos expandir la expresión para f:

f(x) = cos(x)cos(Á) - sen(x)sen(Á) de tal manera que el resultado es una mezcla entre armónicos pares e impares, con Á controlando las amplitudes relativas de las dos. Esto se demuestra en parche E07.evenodd.pd, mostrado en la figura 5.14.

Modulación de fase y FM El ejemplo E08.phase.mod.pd de la figura 5.15, muestra cómo utilizar Pd para realizar las verdaderas modulación de frecuencia (parte a) y modulación de fase (parte b). Estas corresponden al diagrama de bloques de la figura 5.8. Para lograr la modulación de la fase, el oscilador portador se divide en sus componentes de lectura de fase y de coseno. La señal es de la forma

x[t] = cos(!cn + acos(!mn)) donde !c es la frecuencia portadora, !m es la frecuencia de modulación, y a es el índice de modulación- todas en unidades angulares. Podemos predecir el espectro expandiendo el coseno externo:

x[t] = cos(!cn)cos(acos(!mn)) - sen(!cn)sen(acos(!mn)) Conectando en la expansión de la página “141” y simplificando productos:

x[t] = J0(a)cos(!cn) + J1(a)cos((!c + !m)n + ¼/2) + J1(a)cos((!c - !m)n + ¼/2) + J2(a)cos((!c + 2!m)n + ¼/2) + J2(a)cos((!c - 2!m)n + ¼/2) + J3(a)cos((!c + 3!m)n + 3¼/2) + J3(a)cos((!c - 3!m)n + 3¼/2) + ... Así los componentes están centrados alrededor de la frecuencia portadora !c con bandas laterales extendiéndose en una u otra dirección, cada una espaciada !m de la siguiente. Las amplitudes son funciones del índice de modulación, y no dependen de las frecuencias. La figura 5.16 muestra algunos espectros de modulación de fase de dos operadores, medidos utilizando el ejemplo E09.FM.spectrum.pd. La modulación de fase puede así ser vista como una forma de conformación de onda modulada, de anillo. De esta manera podemos utilizar las estrategias descritas en la sección 5.2 para generar combinaciones particulares de frecuencias. Por ejemplo, si la frecuencia portadora es la mitad de la frecuencia de modulación, obtiene un sonido con armónicos impares, exactamente como en el ejemplo de la división de octava (figura 5.10). La modulación de la frecuencia no requiere estar restringida a portadoras puramente sinusoidales u osciladores de modulación. Un camino bastante recorrido es aplicar el efecto de modulación de fase sobre el propio espectro de modulación de fase. Hay entonces dos índices de modulación (llamémoslos a y b) y dos frecuencias de modulación (!m y !p) y la onda es:

x[n] = cos(!cn + acos(!mn) + bcos(!pn)) Para analizar el resultado, sólo re-escribimos la serie FM original de arriba, reemplazando todos los !cn por !cn + bcos(!pn). La tercera banda lateral positiva quedará, por ejemplo: J3(a)cos((!c + 3!m)n + 3¼/2 + bcos(!pn)) Esto mismo es precisamente otro espectro FM, con sus propias bandas laterales de frecuencias

!c + 3!m + k!p, k = 0,±1,±2,... con amplitudes J3(a)Jk(b) y fase (3+k)¼/2. El ejemplo E10.complex.FM.pd (que no se muestra aquí) ilustra esto graficando los espectros de un instrumento FM con dos moduladores. Desde los primeros tiempos los investigadores han buscado combinaciones de fases, frecuencias e índices de modulación, para instrumentos simples y compactos de modulación de fase, que manejen imitaciones de sonidos de instrumentos familiares. Esto se convirtió en una gran industria, con la introducción comercial de los sintetizadores FM. Ejercicios 1. Un sonido tiene fundamental de 440. Cómo se le podría aplicar la modulación de anillo para que diera un sonido de 110 Hertz con únicamente parciales impares? Podría luego llenarlo con los pares si quisiera? 2. Una sinusoide con frecuencia 400 y amplitud pico de unidad es elevada al cuadrado. Cuáles son las amplitudes y las frecuencias de los componentes de la nueva señal? 3. Qué frecuencias portadoras y modulantes le debería dar a un instrumento FM de dos operadores para que entregue frecuencias de 618, 1000 y 2618 Hertz? (esta es una característica prominente de Stiria de Chowning.) 4. Dos sinusoides con frecuencia 300 y 400 Hertz y amplitud pico uno (de tal manera que la amplitud RMS ≈ 0.707) se multiplican. Cuál es la amplitud RMS del producto? 5. Suponga que quiso hacer una FM un poco más complicada, modulando el oscilador modulante, de la siguiente manera: 6. A una sinusoide de frecuencia ! se le aplica la modulación de anillo con otra sinusoide de exactamente la misma frecuencia. Qué diferencia de fase hará que el componente DC del resultado desaparezca?

Capítulo 6

Diseño de espectros Tal como se sugirió al comienzo del capítulo previo, una poderosa forma de sintetizar sonidos musicales es especificar –y luego realizar- trayectorias específicas de alturas de sonido (o más específicamente, frecuencias de parciales), a lo largo de las trayectorias de la envolvente espectral [Puc01]. La envolvente espectral es utilizada para determinar la amplitud de los parciales individuales, como una función de sus frecuencias, y se toma para controlar el timbre del sonido (que posiblemente varíe en el tiempo). Un ejemplo simple podría ser imitar una cuerda que se pulsa, construyendo un sonido con parciales armónicamente espaciados, en el cual la envolvente espectral inicie rica pero luega muera exponencialmente con las frecuencias más altas decayendo más rápido que las bajas, de tal manera que el timbre suene melodioso en el tiempo. Los modelos de evolución espectral para varios instrumentos acústicos ya se han propuesto [GM77] [RM69]. Un ejemplo más complicado es la voz hablada o cantada, en la cual las vocales aparecen como envolventes espectrales, los diptongos y las consonantes aparecen como variaciones en el tiempo de las envolventes espectrales, y otras consonantes aparecen como ruido conformado espectralmente. Las envolventes espectrales se pueden obtener del análisis de sonidos grabados (que se desarrolla en el capítulo 9) o de criterios puramente sintéticos. Especificar una envolvente espectral desde el inicio para cada frecuencia posible podría ser tedioso, y en la mayoría de los casos se la podría querer describir en términos de sus característica sobresalientes. La forma más popular de hacer esto es especificar el tamaño y la forma de los picos de la envolvente espectral llamados formantes. La figura 6.1 muestra una envolvente espectral con dos formantes. Aunque las formas de los dos picos en la envolvente espectral son diferentes, estos se pueden describir en términos generales por las coordenadas de cada ápice (que proporcionan el centro de frecuencia y su amplitud), y el ancho de banda de cada formante. Una medida típica del ancho de banda podría ser el ancho del pico a un nivel de 3 decibles por debajo de su cima. Note que si el pico está en (o cerca al) eje f = 0, esperamos que caiga a la izquierda de la misma manera a como lo hace (en realidad) a la derecha. Suponga que queremos generar un sonido armónico con una colección específica de formantes. Independientemente de la frecuencia fundamental que se desee, queremos que el espectro tenga picos con centros de frecuencias, amplitudes y anchos de banda prescritos. Retornando a los espectros de modulación de fase mostrados en la figura 5.16, vemos que, con los índices de modulación más pequeños posibles, el resultado tiene un solo pico espectral bien definido. Podemos imaginar adicionar varios de estos , todos compartiendo una frecuencia fundamental (modulante) pero con frecuencias portadoras afinadas en diferentes armónicos para seleccionar los diversos centros de frecuencia , y con índices de modulación apropiados para dar los anchos de banda deseados. Esto lo exploró Chowning por primera vez, organizando formantes generados por la modulación de fase, para sintetizar voces cantadas. En este capítulo estableceremos un marco general para construir espectros armónicos con los formantes deseados, y con la posibilidad de variarlos en el tiempo. 6.1 El modelo portador/modulador Vimos anteriormente cómo utilizar la modulación de anillo para modificar el espectro de una señal periódica, ubicando picos espectrales en diferentes lugares (ver la figura 5.4 en la página “125”). Para hacer esto debemos generar señales periódicas cuyos espectros tengan su máximo en DC y caigan monolíticamente con el decrecimiento de la frecuencia. Al fabricar una señal con

un formante en la frecuencia cero -sin más formantes que este- podemos utilizar la modulación de anillo para desplazar el formante hacia cualquier armónico que queramos. Utilizando la conformación de ondas para generar el formante inicial, el producto de la modulación de anillo será de la forma

x[n] = cos(!cn)f(acos(!mn)) donde !c (la frecuencia portadora) se ajusta para ser el centro de frecuencia del formante y f(acos(!mn)) es una señal con frecuencia fundamental determinada por !m, que se produce utilizando una función de conformación de onda f y un índice a. Este segundo término es la señal a la cual le queremos dar un formante en DC con un ancho de banda controlable. Un diagrama de bloque para la síntesis de esta señal se muestra en la figura 6.2. Mucho antes, en la sección 2.4 introdujimos la técnica de estiramiento del timbre, como parte de la discusión de la síntesis de tabla de ondas. Esta técnica, que genera timbres variables y complejos, se puede tomar dentro del mismo marco general. La salida para la tabla de onda envuelta para un ciclo es:

x(Á) = T(cÁ)*W(aÁ), donde Á, la fase, satisface -¼ ≤ Á ≤ ¼ . Aquí T es la función almacenada en la tabla de ondas, W es la función de ventana, y c y a son el estiramiento y un índice de modulación para la función de ventana . La figura 6.3 muestra cómo realizar esto en la forma de un diagrama de bloques. Comparando esto con la figura 2.7, vemos que la única nueva característica significante es la adición del índice a. En esta organización, como en la previa, el primer término especifica el emplazamiento de la energía en el espectro -en este caso con el parámetro c estirando el espectro de la tabla de ondas. Este es el papel que llevaba previamente cuando se seleccionó como la frecuencia portadora en la modulación de anillo. Ambas (la conformación de ondas por modulación de anillo y la síntesis de tabla de ondas estirada) pueden ser consideradas casos particulares de la aproximación a un caso más general que computa funciones de la forma,

x[n] = c(!n)ma(!n) donde c es una función periódica que describe la señal portadora y ma es una función de un modulador periódico que depende del índice a. Las funciones de modulación que nos han interesado usualmente tomarán la forma de trenes de pulsos , y el índice a tomará el control del ancho del pulso; valores más altos de a darán pulsos más estrechos . En el caso de la tabla de onda, la función de modulación debe ser cero en los puntos de la fase de la envolvente, para suprimir cualquier discontinuidad en la función portadora cuando la fase hace la envolvente. La señal portadora dará lugar a un único pico espectral (un formante) en el caso de la conformación de onda con modulación de anillo; las tablas de onda pueden tener un espectro más complicado. En la sección siguiente haremos un desarrollo de las dos formas de modulación de la señal presentadas aquí, y en la siguiente, miraremos más de cerca a la señal

portadora. 6.2 Trenes de pulsos Los trenes de pulsos se pueden generar ya sea utilizando la formulación de la conformación de onda o la del estiramiento de tabla de ondas. La formulación de la conformación de onda es más fácil de analizar y controlar, y la consideraremos en primer lugar. 6.2.1 Trenes de pulso vía conformación de onda Cuando utilizamos conformación de onda la configuración del formante está determinada por un término de modulación

ma(n) = f(acos(!mn)) Para valores pequeños del índice a el término de la modulación varía sólo ligeramente con respecto al valor constante f(0), de tal manera que la mayor parte de la energía está concentrada en DC. En tanto a se incrementa la energía se esparce progresivamente hacia los armónicos más elevados de la fundamental !. Dependiendo de la función f, este proceso puede ser llevado a cabo ordenada o desordenadamente. Puede quererse un esparcimiento ordenado al principio y luego no, dependiendo de si nuestro objetivo es un espectro predecible o un amplio rango de espectros (que son de esta manera difíciles de predecir). La función de conformación de onda f(x) = ex, analizada en la página “140”, proporciona resultados que se comportan bien, simples y predecibles. Después de normalizar apropiadamente, obtenemos los espectros mostrados en la figura 5.13. Una ligera re-escritura del modulador de conformación de onda para esta opción de f (y tomando en cuenta la renormalización) da:

ma(n) = ea(cos(!n)

- 1)

2

= e-[bsen(!n/2)] donde b2 = 2a de tal manera que b es proporcional al ancho de banda. Esto puede re-escribirse como

ma(n) = g[bsen(!n/2)] con 2

g(x) = e-x

Excepto por un factor de normalización perdido, esta es una distribución gaussiana, usualmente llamada “curva campana” . Las amplitudes de los armónicos están dadas por las funciones de Bessel tipo “I” . Otra opción es la distribución de Cauchy (también sin normalizar):

h(x) = 1/(1 + x2) la cual hace aparecer un espectro de armónicos cayendo exponencialmente:

h[bsen(!n/2)] = G · (1/2 + Hcos(!n) + H2cos(2!n) + ...) donde G y H son funciones del índice b (fórmulas explícitas se dan en [Puc95a]). Tanto en esta como en la gaussiana del caso anterior, el ancho de banda (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) . 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) es aproximadamente una lectura (hacia adelante o hacia atrás) de la función de transferencia, de tal manera que la onda resultante aparece como pulsos cuyas anchuras decrecen mientras los anchos de banda especificados se incrementan. 6.2.2 Trenes de pulsos vía estiramiento de tabla de ondas En la formulación de tabla de ondas, un tren de pulsos puede ser hecho por una tabla de onda estirada:

Ma(Á) = W(aÁ), donde -¼ ≤ Á ≤ ¼ es la fase, es decir, al valor !n se le aplica una envolvente para quedar entre -¼ y ¼. La función W deberá ser cero en y más allá de los puntos -¼ y ¼, y elevarse a su máximo en 0. Una opción posible para la función W es

W(Á) = (cos(Á) + 1) lo cual se grafica en la parte (a) de la figura 6.4. Esta se conoce como la función de la ventana de Hann; que vendrá de nuevo en el capítulo 9. Al realizar repiticiones de esta como una onda, obtenemos una sucesión de copias de la función W (sampleada apropiadamente), cuyo ciclo de trabajo es 1/a (partes b y c de la figura). Si no desea que las copias se traslapen, el índice a debe ser como mínimo 1. Si usted quiere permitir el traslape, la estrategia más simple es duplicar el diagrama de bloque (figura 6.3), como se describió en la sección 2.4 y se efectuó en la sección 2.6 . 6.2.3 Espectros resultantes Antes de considerar señales más complejas que vayan con las moduladoras tal como lo hemos visto, es instructivo ver qué ondas y espectros nos da la multiplicación por una sinusoide pura. La figura 6.5 muestra el resultado de multiplicar dos trenes de pulsos diferentes por una sinusoide en el sexto parcial: cos(6!n)Ma(!n) donde el índice de modulación a es dos en ambos casos. En la parte (a) Ma es la función de ventana de Hann, estirada; la parte (b) muestra una conformación de onda vía la distribución de Cauchy no normalizada. Se muestra un período de cada onda. En ambas situaciones vemos, en efecto, el sexto armónico (la señal portadora)

envuelto dentro de un paquete de onda centrado en la mitad del ciclo, donde la fase de la sinusoide es cero . Al cambiar la frecuencia de la sinusoide, cambia el centro de frecuencia del formante; al cambiar el ancho del paquete (la parte de la onda durante la cual la sinusoide es fuerte) cambia el ancho de banda. Note que la función de ventana de Hann estirada es cero al comienzo y al final del período, a diferencia del paquete al que se le ha aplicado la conformación de onda. La figura 6.6 muestra cómo la configuración del formante depende del método de producción. La forma de la tabla de onda estirada (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 , se estira y se contrae de manera inversa a como el tren de pulsos es contraído y estirado en el tiempo. El primero y más fuerte de los lóbulos laterales en cualquiera de los lados es de aproximadamente 32 dB más bajo en amplitud que el pico principal. Los demás lóbulos laterales caen más lentamente cuando se expresan en decibeles; las amplitudes decrecen con el cuadrado de la distancia desde el pico central de tal manera que el sexto lóbulo lateral a la derecha, a una distancia tres veces mayor que la del primero desde la frecuencia central, es aproximadamente veinte decibeles más bajo. El efecto de estos lóbulos laterales es usualmente audible como un ligero zumbido en el sonido. Esta configuración del formante puede ser hecha arbitrariamente gorda (es decir con un ancho de banda alto) , pero hay un límite en lo delgada que pueda ser, ya que el ciclo de trabajo de la onda no puede exceder el 100%. En su ciclo de trabajo máximo la fortaleza del formante cae a cero a la distancia de dos armónicos del pico central. Si se requiere un ancho de banda aún más bajo, las ondas se pueden traslapar, tal como se describió en la sección 2.6. Las partes (b) y (c) de la figura muestran los formantes generados utilizando la conformación de onda con modulación de anillo, con funciones gaussianas y de Cauchy. El índice de modulación es dos en ambos casos (el mismo que para la ventana de Hann de la parte a), y el ancho de banda es comparable al del ejemplo de la ventana de Hann. En estos ejemplos no hay lóbulos laterales, y es más, el índice de modulación puede ser llevado a cero, resultando una sinusoide pura; no hay límite inferior en el ancho de banda. De otro lado, debido a que la onda no alcanza el cero al final del ciclo, este tipo de tren de pulso no puede ser utilizado para ser ventana de una tabla de onda arbitraria, tal como lo puede ser el tren de pulsos de Hann. El ejemplo de Cauchy es particularmente útil para el diseño de espectros, ya que la configuración del formante es un triángulo isósceles, cuando se grafica en decibeles. De otro lado, el ejemplo gaussiano reúne más energía hacia el formante, y cae más rápidamente en las colas, de tal manera que tiene un sonido más limpio y ofrece mayor protección contra el sobre-doblado. 6.3 Modulación de anillo móvil Retornamos ahora a la señal portadora, buscando maneras de hacerla más controlable. En particular nos gustaría poder deslizar la energía espectral continuamente arriba y abajo en la frecuencia . Llevar en rampa la frecuencia del oscilador portador no logrará esto, ya que los espectros no serán armónicos excepto cuando la portadora sea un múltiplo entero de la frecuencia fundamental. Con la tabla de ondas estirada podemos lograr esto sencillamente haciendo la lectura de muestras de una sinusoide y transponiéndola a la “altura” deseada. La altura transpuesta no es escuchada como algo periódico ya que la tabla de ondas misma es leída periódicamente a la frecuencia fundamental . En lugar de esto, la sinusoide es transpuesta como una envolvente espectral. La figura 6.7 muestra una señal portadora producida de esta manera, afinada para producir un formante a 1.5 veces la frecuencia fundamental. La señal no tiene discontinuidad en la frecuencia de la fase envolvente, pero tiene una discontinuidad en el traslape , la cual, si no se remueve aplicando una modulación apropiada de la señal, podría llegar a tener componentes muy audibles en frecuencias altas. Utilizando esta idea podemos hacer una descripción completa de cómo utilizar el diagrama de bloque de la figura 6.3 para producir el formante deseado. La tabla a leer en el lado izquierdo podría contener una sinusoide (ubicada simétricamente, de tal manera que la fase es cero en el centro de la tabla de ondas). La tabla de ondas de la derecha deberá contener una ventana de Hann u otra función de ventana apropiada. Siendo la frecuencia fundamental !, la frecuencia central del formante !c, y el ancho de banda !b, obtenemos el parámetro “estiramiento” para el cociente de frecuencia central, definido como !c/!, y el índice de modulación como el cociente ancho de banda, !b/!. La señal de salida es simplemente una muestra de una onda coseno a la frecuencia central deseada, repetida en el período deseado (no relacionados en general) y a la que se aplica una ventana para tomar las discontinuidades en las fronteras del período. Aunque no somos capaces de derivar este resultado todavía (necesitaremos el análisis de Fourier), este se convertirá en que, en el lóbulo principal del formante, las fases son todas cero en el centro de la onda (es decir, los componentes son todos coseno si consideramos que la fase debe ser cero en el centro de la onda). Esto significa que podemos superponer cualquier número de estos formantes para construir un espectro más complejo y las amplitudes de los parciales se combinarán por adición. (Los lóbulos laterales no se comportan así: ellos son de signo opuesto alternativamente y producirán patrones de cancelación; pero usualmente los podemos ignorar como una señal residual, pequeña e incontrolable). Este método nos conduce a una interesante generalización, que es tomar una secuencia de tablas de ondas grabadas, alinear todas las fases de sus componentes con las de los cosenos, y utilizarlas en lugar de la función coseno como señal portadora. La alineación de la fase es necesaria para permitir la atenuación cruzada entre las muestras, de tal manera que la envolvente espectral pueda cambiar con suavidad. Si, por ejemplo usamos retazos de una muestra vocal como entrada, obtenemos un sorpendentemente efectivo vocoder; ver la sección 9.6. Otra técnica para fabricar señales portadoras que se puedan deslizar continuamente arriba y abajo en la frecuencia mientras se mantiene la frecuencia fundamental es simplemente hacer atenuación cruzada entre los armónicos. La señal portadora es entonces:

c(Á) = c(!n) = pcos(k!n) + qcos((k + 1)!n)

donde p + q = 1 y k es un entero, y todos los tres se escogen de tal manera que (k + q)*

! = !c

de tal manera que el centro espectral de masa de los dos cosenos esté ubicado en !c. (Note que hacemos que la adición de las amplitudes de los dos cosenos sea uno, en lugar de ajustar la potencia total a uno; hacemos esto porque el modulador operará coherentemente con la fase sobre ellos.) Para lograr esto ajustamos k y q para que sean parte entera y parte fraccional, respectivamente, del cociente del centro de frecuencia !c/!. La forma más simple de hacer una interfaz de control para esta técnica de síntesis podría ser utilizar rampas para actualizar ! y !c, y luego computar q y k como señales de audio que van en rampa, variando suavemente ! y !c. Extrañamente sin embargo, a pesar del hecho de que k, p y q son funciones discontinuas de !c/!, la portadora c(Á) se convierte para variar continuamente con !c/!, y así si el centro de frecuencia !c va en rampa de valor en valor, el resultado es un cambio continuo en el centro de frecuencia. Sin embargo se requiere más trabajo si se necesitan cambio discontinuos en el centro de frecuencia. No es irracional querer esto pues es análogo a cambiar la frecuencia de un oscilador de manera discontinua. Hay una buena manera de acomodarlo. El truco para actualizar k y q es notar que c(Á) = 1 siempre que Á sea un múltiplo de 2¼, sin importar cuáles valores de k, p y q escojamos, y siempre que p + q = 1. Por lo tanto podemos hacer cambios discontinuos en k, p y q una vez por período (cuando la fase es un múltiplo de 2¼) sin hacer discontinuidades en la señal portadora. En el caso específico de FM, si queremos podemos ir atrás y modificar la formulación original a:

pcos(n!2t + rcos(!1t)) + qcos((n + 1)!2t + rcos(!1t)) Esto nos permite adicionar glisandos (los cuales son escuchados como diptongos) a la técnica original de la síntesis vocal basada en la modulación de fase, de Chowning. 6.4 Generador de formantes alineados en fase (PAF) Combinando las dos señales portadoras de dos cosenos con el generador de pulsos por conformación de onda, resulta un generador de formantes alineados en fase, usualmente llamado por su acrónimo PAF. (El PAF es tema de una patente de 1994 perteneciente al IRCAM.) La fórmula combinada es,

x[n] = g(asen(!n/2))[pcos(k!n) + qcos((k + 1)!n)]

Aquí la función g puede ser la función de conformación de onda gaussiana o de Cauchy, ! es la frecuencia fundamental, a es el índice de modulación que controla el ancho de banda y k, p y q controlan la frecuencia central del formante. La figura 6.8 muestra el PAF como un diagrama de bloques, separado en una sección de generador de fase, una sección portadora y una sección moduladora. La sección de la generación de fase da a la salida una señal diente de sierra en la frecuencia fundamental. El modulador fue hecho por conformación de onda normal

con una ligera modificación. La fórmula para las señales del modulador tienen una entrada sinusoidal a la mitad de la frecuencia fundamental, es decir sen(!/2), y esto normalmente nos hace utilizar una diente de sierra a la mitad de la frecuencia fundamental. Sin embargo, debido a que la función de conformación de onda es par, podemos sustituír por el valor absoluto de la sinusoide: |sen(!/2)| la cual se repite a la frecuencia ! (la primera mitad del ciclo es igual a la segunda mitad.) Podemos calcular esto simplemente utilizando una sinusoide de medio ciclo como una función de lectura de una tabla de onda (con la fase de -¼/2 a ¼/2), y esta es la sinusoide rectificada que pasamos a la función de conformación de onda. Aunque la función de la tabla de onda está dibujada en valores positivos y negativos (de -10 a 10), de hecho estamos utilizando únicamente el lado positivo para la lectura, llevando de 0 a b el índice de modulación. Si el índice de modulación excede el rango de la tabla (aquí lo ajustamos para que se detenga en 10 como un ejemplo), la lectura de la tabla será recortada. La tabla debe extenderse suficientemente lejos hacia la cola de la función de conformación de onda, de tal manera que el efecto del recorte resulte inaudible. La señal portadora es una suma ponderada de dos cosenos, cuyas frecuencias se incrementan multiplicándolas (por k y k + 1 respectivamente) y aplicándoles envolventes. De esta manera todas las fases de la lectura están controladas por el mismo oscilador diente de sierra. Las cantidades k, q y el índice de tabla de en la figura 6.9. Estas son funciones de la frecuencia central del formante y del ancho originales del algoritmo. La cantidad p que precisamente 1 – q.

onda b se calculan como se muestra frecuencia fundamental dada, de la de banda, que son parámetros no se muestra en la figura es

Tal como se describió en la sección previa, las cantidades k, p y q deberán cambiar únicamente en los puntos de envoltura de la fase, es decir en períodos de 2¼/!. Ya que el cálculo de k, etc depende del valor del parámetro !, se sigue que ! mismo deberá ser actualizado cuando la fase sea un múltiplo de 2¼; de otra manera, un cambio en ! podría enviar el centro de frecuencia (k + q)/! a un valor incorrecto por una fracción (muy notable) del período. En efecto, todos los cálculos del parámetro deberán ser sincronizados a la fase del oscilador original. Tener un control de la fase del oscilador que actualice su propia frecuencia es un ejemplo de retroalimentación, que significa en general el uso de la salida de un proceso como una de sus entradas. Cuando procesamos señales de audio digital a una velocidad fija de lectura de muestras (tal y como lo estamos haciendo), nunca es posible tener la salida actual del proceso como una entrada, debido a que el tiempo que podríamos necesitar aún no lo hemos calculado. Lo mejor que podemos esperar es utilizar la muestra previa de la salida -en efecto, adicionando una muestra de retraso. En ambientes de bloques (tales como Max, Pd y Csound) la situación se vuelve más complicada, pero dejaremos la discusión para el capítulo siguiente (y simplemente deseo esquivar el problema en los ejemplos y al final de este capítulo). La amplitud del pico central en el espectro del generador PAF es aproximadamente 1/(1 + b); en otras palabras, cercana a la unidad cuando b es menor que uno, y cayendo de manera inversa con valores más grandes de b. Para los valores de b aproximándose a diez por debajo, la fortaleza de la señal puede no variar mucho, ya que la introducción de otros parciales, incluso a amplitudes más bajas, desajusta el decrecimiento de la amplitud del parcial central. Sin embargo, si

se utiliza PAF para generar formantes con amplitudes pico específicas, la salida deberá multiplicarse por 1 + b (o incluso, si es necesario, por una aproximación del factor de corrección, cuyo valor exacto depende de la función de conformación de onda). Esta corrección de amplitud debe aplicarse en rampa y no por muestra-y-sostenimiento. Debido a que la expansión de la señal de conformación de onda (moduladora) consiste de todos los términos coseno (es decir, debido a que todos tienen fase inicial cero), como lo son los dos componentes de la portadora, se sigue de la fórmula del producto de cosenos que los componentes del resultado son todos coseno también. Esto significa que cualquier número de generadores PAF, si están fabricados para compartir el mismo oscilador de generador de fase, estarán todos en fase y al combinarlos el resultado será la suma de los espectros individuales. De esta manera podemos hacer versiones de formantes múltiples como se muestra en la figura 6.10. La figura 6.12 muestra una salida posible de un par de formantes generados de esta manera; el primer formante está centrado en la mitad de los parciales 3 y 4, y el segundo en parcial 12, con amplitud y ancho de banda menores. Se utilizó la función de conformación de onda de Cauchy, la cual produce espectros traslapados linealmente (visto en dB). Los dos se superponen aditivamente, de tal manera que la envolvente espectral es una curva suave entre un formante y el otro. El formante más bajo también adiciona su propia reflexión alrededor del eje vertical, de tal manera que aparece ligeramente curvado delante de allí. El generador PAF puede alterarse si se desea fabricar espectros inarmónicos deslizando los parciales adelante y atrás en su frecuencia. Para hacer esto, adicionamos un segundo oscilador para la fase de los dos cosenos de la portadora, pero no para la fase de la porción moduladora del diagrama, ni para controlar la fase de las unidades de muestra-y-sostenimiento. En cambio, la estrategia de muestra-y-sostenimiento para suavizar la actualización de los parámetros funciona todavía; y aún más, los generadores PAF comparten la misma porción de generación de fase con lo que seguirán en fase uno con otro. La técnica de superposición de espectros no trabaja de manera predecible para la modulación de fase como sí lo hace el generador PAF; la salida de los parciales de la modulación de fase tiene relaciones de fase complicadas y parecen difíciles de combinar de manera coherente. En general la modulación de fase dará patrones más complicados de evolución espectral, toda vez que el PAF es más fácil de predecir y convertir en efectos específicos deseados. 6.5 Ejemplos Tren de pulsos de tabla de ondas El ejemplo F01.pulse.pd (figura 6.13) genera un tren de pulsos de altura variable, utilizando la lectura de una tabla de onda estirada. La figura 6.14 muestra dos productos intermedios del parche y su salida. El parche lleva a cabo la labor de la manera más simple posible, ubicando el pulso en el ángulo (fase) ¼ en lugar de 0; en los ejemplos posteriores esto se solucionará adicionando 0.5 a la fase y aplicando una envolvente. La fase inicial se ajusta para que vaya de -0.5 a 0.5 y se escala luego por un multiplicador que es uno como mínimo, dando como resultado la señal de la figura 6.14 (parte a); esta corresponde a la salida del objeto *~, el quinto de abajo hacia arriba en el parche. La gráfica en la parte (b) muestra el resultado de recortar la onda diente de sierra al intervalo -0.5 y 0.5, usando el objeto clip~ . Si el multiplicador que escala es el mínimo (uno) , 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 . Generador de formantes sencillo Los siguientes tres ejemplos demuestran el sonido de un pulso con anchura variable, grafican su espectro, y hacen el contraste con el generador de pulsos por conformación de onda. Saltando al ejemplo F05.ring.modulation.pd (figura 6.15), mostramos la manera más simple de combinar el generador de pulsos con un oscilador de modulación de anillo para fabricar un formante. El tren de pulsos de los ejemplo previos está contenido en el subparche pd pulse-train. Este se multiplica por un oscilador cuya frecuencia está controlada como un múltiplo de la frecuencia fundamental. Si el múltiplo es un entero, se obtiene un sonido armónico. No se ha intentado controlar las fases relativas de los componentes del tren de pulsos ni de las sinusoides portadoras. El ejemplo siguiente, F06.packets.pd (figura 6.16), muestra cómo combinar el tren de pulsos de la tabla de onda estirada con una muestra de sinusoide para realizar formantes móviles, como se describió en la sección 6.3. El generador de pulsos está como antes, pero ahora la señal portadora es una sinusoide quebrada. Dado que su fase es la fase fundamental multiplicada por el cociente del centro de frecuencia, el incremento de la fase muestra por muestra es el mismo que para la sinusoide de la frecuencia central. Sin embargo cuando se aplica una envolvente a la fase, la fase de la portadora salta a un sitio diferente en el ciclo, tal como se ilustró en la figura 6.7. Aunque el cociente del ancho de banda !b/! debe ser por lo menos uno, el cociente del centro de frecuencia !c/! puede llegar hasta cero si se desea . Señal portadora de dos cosenos El ejemplo F08.two.cosines.pd (figura 6.17) muestra cómo fabricar una señal portadora que realice un cruzamiento atenuado entre armónicos para hacer centro de frecuencias continuamente variables. El cociente del centro de frecuencia aparece como la salida de un objeto line~. Esta es separada en dos partes fraccionales (utilizando el objeto wrap~) y su parte entera (al sustraer la parte fraccional de la original). Estas están etiquetadas como q y k de acuerdo con el tratamiento de la sección 6.3. La fase -una onda diente de sierra a la frecuencia fundamental- es multiplicada por k y k + 1 (el último adicionando la diente de sierra original a la primera), y se toman los cosenos de ambos; ellos están de esta manera a k y k + 1 veces la frecuencia fundamental y no tienen discontinuidades en los puntos de la envolvente de fase. Los siguientes pocos objetos en el parche computan la suma ponderada pc1 + qc2, donde c1 y c2 son las dos sinusoides y p = 1 - q , al

evaluar una expresión equivalente, c1 = q(c2 - c1). Esto nos da la frecuencia móvil deseada de la señal portadora. El ejemplo F09.declickit.pd (que no se muestra aquí), muestra cómo adicionando un objeto samphold~ después del objeto line~ controlando la frecuencia central, usted puede evitar discontinuidades en la señal de salida incluso si la frecuencia central deseada cambia discontinuamente. En el ejemplo el cociente de frecuencia central alterna entre 4 y 13.5. Al efectuar la rampa multiplicada por un valor por debajo de casi 20 milisegundos se presentan artefactos audibles cuando se utiliza el objeto line~ solo, el cual desaparece cuando se añade el objeto samphold~. (Una desventaja de hacer muestra-y-sostenimiento para el cociente de la frecuencia, es que para frecuencias fundamentales muy bajas, los cambios pueden escucharse como pasos discretos. Así en situaciones donde la frecuencia fundamental es baja y la frecuencia central no necesita cambiarse muy rápidamente, puede ser mejor omitir el paso de muestra-y-sostenimiento.) Los siguientes dos ejemplos demuestran el uso de los osciladores portadores con cruzamiento atenuado como parte de la técnica clásica de modulación de fase de dos operadores. El mismo oscilador de modulación se suma de manera separada a las fases de los dos cosenos. Los espectros resultantes pueden ser hechos para viajar arriba y abajo en frecuencia, pero debido a las complicadas relaciones de fase entre los picos vecinos en el espectro de modulación de fase, sin importar cómo alinee los dos espectros, usted nunca puede evitar cancelaciones de fase cuando se traslapan. El generador PAF El ejemplo F12.paf.pd (figura 6.18) es una realización del generador PAF, descrito en la sección 6.4. El control de la entrada especifica la frecuencia fundamental, la frecuencia central, y el ancho de banda, todo en “unidades” MIDI . Los primeros pasos tomados en la realización son dividir la frecuencia central por la fundamental (para obtener el cociente de la frecuencia central) y el ancho de banda por la fundamental para obtener el índice de modulación para el mecanismo de conformación de onda. Al cociente de la frecuencia central se le aplica muestra-y-sostenimiento de tal manera que esta se actualiza únicamente en períodos de la fundamental. El oscilador uno (el objeto phasor~) corre a la frecuencia fundamental. Este es utilizado para controlar el objeto samphold~ que sincroniza las actualizaciones con el cociente del centro de frecuencia (etiquetado “C.F. relative to fundamental” en la figura), y para computar fases para los dos objetos cos~ que operan como se mostró antes en la figura 6.17. La porción de conformación de onda del parche utiliza una sinusoide de medio período como una función de lectura (para compensar el doblaje de frecuencia debido a la simetría de la función de lectura). Para obtener medio ciclo de la función seno, multiplicamos la fase por 0.5 y sustraemos 0.25, de tal manera que el ajuste de la fase corre de -0.25 a 0.25, una vez cada período. Esto lee la mitad positiva del ciclo definido por el objeto cos~. La amplitud de la mitad de la sinusoide se ajusta luego por un índice de modulación (el cual es precisamente el cociente del ancho de banda !b/!). La tabla (“bell-curve”) contiene una curva gaussiana no normalizada, en muestras, desde -4 a 4 sobre 200 puntos (25 puntos por unidad), de tal manera que el centro de la tabla, en el punto 100, corresponde al pico central de la curva campana. Por fuera del intervalo -4 a 4 los valores de la curva gaussiana son prácticamente nulos. La figura 6.19 muestra cómo se prepara la tabla de ondas gaussiana. Se requirió de un nuevo objeto de control:

until~: Cuando la entrada izquierda, “start”, se dispara, da como salida disparos secuenciales (sin que ningún tiempo transcurra entre ellos) iterativamente, hasta que la entrada derecha, “stop”, sea disparada. El mensaje “bang” de parada se debe originar de alguna manera desde la salida de los objetos until; de otra manera la salida enviará mensajes por siempre, congelando cualquier otro objeto que pudiera romper el lazo. Tal como se utilizó aquí, un lazo conducido por un objeto until cuenta de 0 a 199, incluído. El lazo de conteo se mantiene por los objetos “f” y “+ 1”, cada uno de los cuales alimenta al otro. Pero debido a que la salida del objeto “+ 1” va a la entrada derecha de “f”, su resultado (una unidad más grande) únicamente surgirá del “f” la siguiente vez que sea disparado por “until”. De esta manera, cada disparo desde “until” incrementa el valor en uno. Es importante el orden con el cual inicia el lazo: el objeto “t b b” de la parte superior (iniciales de “trigger bang bang”) deben enviar primero un cero a “f”, con el fin de darle inicio, y luego se ajusta el objeto until enviando disparos, incrementando el valor, hasta detenerse. Para detenerlo cuando el valor alcance 199, un objeto select examina el valor, y cuando ve que coincide, dispara la entrada “stop” del objeto until. Entre tanto, por cada número de 0 a 199 que sale del objeto “f” creamos mensajes de pares ordenados para el objeto “tabwrite”. Primero, a la derecha, va el índice mismo, de 0 a 199. Luego, para la entrada izquierda, el primer objeto expr ajusta el índice para que vaya de -4 a 4 (iba previamente de 0 a 199) y el segundo evalúa la función gaussiana. En este parche no tenemos totalmente solucionado el punto de actualizar el cociente del centro de frecuencia en los tiempos apropiados. Siempre que la frecuencia portadora sea cambiada en el paso muestra-y-sostenimiento se retrasa apropiadamente la actualización del cociente. Pero si, en lugar de la suma, la fundamental misma cambia abruptamente entonces, por una fracción de un período, la frecuencia del objeto phasor~ y el cociente quedan por fuera de sincronía. Pd no permite que la salida de samphold~ se conecte a la entrada de phasor~ nuevamente sin la inclusión de un retraso explícito (ver el capítulo siguiente) y no hay una manera sencilla de modificar el parche para resolver este problema. Asumiendo que de alguna manera hicimos que la entrada del objeto phasor~ quedara en sincronía con sus propios puntos de aplicación de envolvente, deberíamos hacer entonces lo mismo con el cociente ancho-de-banda/fundamental en el lado derecho del parche. En el escenario corriente, sin embargo, no hay problema en actualizar ese valor continuamente. Una solución práctica para este problema de actualización podría ser simplemente re-escribir el parche entero en C como un elemento Pd; esto también significa la utilización de mucho menos tiempo de CPU que el del parche mostrado, y es una solución más práctica en general -siempre y cuando no quiera experimentar embelleciendo o haciendo otros cambios en el algoritmo. Tales embellecimientos podrían incluír: adicionar un cambio inarmónico arriba y abajo en los parciales; permitiendo cambiar entre las actualizaciones suaves y de muestra-ysostenimiento de la frecuencia central; adicionar controles de ganancia separados para parciales pares e impares introduciendo gravilla por la modulación irregular de la fase; permitiendo mezclas de dos o más funciones de conformación de onda; o fabricar ataques marcados alineando la fase del oscilador con los tiempos de un generador de envolvente de amplitud. Un detalle final acerca de la amplitud está al orden: debido a que la amplitud de los parciales más fuertes decrece aproximadamente como 1/(1 + b), donde b es el índice de modulación, es a veces (pero no siempre) deseable corregir la amplitud de la salida multiplicándola por 1 + b. Esto es únicamente una opción si b se actualiza de manera suave (como en este ejemplo), pero no cuando se hace con muestra-y-sostenimiento. Una situación en la cual esto es apropiado es

en la simulacion de cuerdas pulsadas (al ajustar el centro de frecuencia a la fundamental, comenzando con índice de modulación alto y haciéndolo caer exponencialmente); debería ser apropiado escuchar la fundamental cayendo, no elevándose en su amplitud, cuando la cuerda decae. Tablas de onda estiradas En lugar de utilizar conformación de onda, la síntesis de formantes también es posible utilizando el estiramiento de tabla de ondas, como se demuestra en el ejemplo F14.wave.packet.pd (que no se muestra aquí). La técnica es escencialmente la del ejemplo B10.sampler.overlap.pd (que se describió en la sección 2.6), con un lector de coseno en lugar de la tabla de onda más general, pero con la adición de un control para ajustar el ciclo de tarea de las envolventes de amplitud. Las unidades están ajustadas para ser compatibles con las del ejemplo previo. Ejercicios 1. Un tren de pulsos consiste en ventanas de Hann (cosenos elevados), de extremo a extremo, sin ningún espacio entre ellas. Cuál es el espectro resultante? 2. Para sintetizar un formante con centro de frecuencia de 2000 Hertz y fundamental de 300 Hertz, qué valores deberían tomar k y q (según la terminología de la figura 6.8)? 3. Cómo podría modificar el diagrama de bloques de la figura 6.8 para producir únicamente armónicos impares?

Capítulo 7

Variaciones en el tiempo y retrasos A las 5 de alguna tarde, ponga su grabación favorita de Ramones en la pista 5. El sábado siguiente ejecute la misma grabación a las 5:00:01, un segundo más tarde en el día. Las dos ejecuciones sonarán idealmente lo mismo. Cambiar todo un segundo (o, si usted prefiere, algunos días y un segundo) no tiene efecto físico en el sonido. Pero suponga ahora que usted ejecuta la grabación a las 5:00 y a las 5:00:01 del mismo día (en dos sistemas de reproducción diferentes, ya que la música dura más de un segundo). Ahora el sonido es muy diferente. La diferencia, cualquiera que sea, claramente no reside en ninguno de los dos sonidos individuales, si no en la interferencia entre ambos. Esta interferencia puede percibirse por lo menos de cuatro maneras diferentes: Cánon: Combina dos copias de una señal con una diferencia de tiempo suficiente para que la señal cambie apreciablemente, podríamos escuchar las dos como secuencias de sonidos separados, comparando efectivamente la señal actual con su previa. Si la señal es una melodía, la variación en el tiempo podría ser comparable con la duración de una o más notas. Eco: Cuando la variación en el tiempo está entre 30 milisegundos y un segundo aproximadamente, la segunda copia de la señal puede sonar como un eco de la primera. Un eco puede reducir la inteligibilidad de la señal (especialmente si es voz hablada), pero usualmente no combiará la “forma” general de las melodías o frases. Filtro: Cuando la variación en el tiempo está por debajo de los 30 milisegundos aproximadamente, las copias están demasiado cercanas unas de otras en el tiempo para ser percibidas separadamente, y el efecto dominante es que algunas frecuencias se destacan y otras son suprimidas. Esto cambia la envolvente espectral del sonido. Alteración de la calidad del salón: Si la segunda copia es ejecutada con menos volumen que la primera, y especialmente si añadimos más copias retrasadas con amplitudes reducidas, el resultado puede ser la imitación de los ecos que aparecen en un salón o en otro espacio acústico. El sonido de un arreglo dado de copias retrasadas de una señal puede combinar dos o más de estos efectos. Matemáticamente, el efecto de una variación del tiempo en una señal puede describirse como un cambio de fase de cada una de las componentes sinusoidales de la señal. El cambio de fase de cada componente es diferente dependiendo de su frecuencia (así como de la extensión de la variación en el tiempo). En el resto de este capítulo usualmente consideraremos superposiciones de sinusoides en diferentes fases . Hasta aquí hemos descrito sinusoides reales en nuestros análisis, pero en este y en los posteriores capítulos las fórmulas serán más complicadas y necesitaremos herramientas matemáticas más complejas para manejarlas. En la sección preliminar de este capítulo desarrollaremos los conocimientos requeridos. 7.1 Números complejos Los números complejos se escriben como:

Z = a + bi donde a y b son números reales e

i = √-1. (En este libro usaremos las letras

mayúsculas tales como Z para denotar los números complejos. Los números reales aparecen en letras romanas o griegas en minúscula, excepto para fronteras de enteros, usualmente escritas como M o N.) Debido a que los números tienen dos componentes, usamos el plano cartesiano (en lugar de una línea de números) para graficarlos, como se muestra en la figura 7.1. Las cantidades a y b son denominadas parte real y parte imaginaria de Z, y se escriben:

a = re(Z) b = im(Z) Si Z es un número complejo, su magnitud (o valor absoluto), escrito como |Z|, es precisamente la distancia en el plano desde el origen al punto (a,b): |Z| = √(a2 + b2) y su argumento, escrito /(Z), es el ángulo del eje positivo a al punto (a,b): /(Z) = arctan(b/a) Si conocemos la magnitud y el argumento de un número complejo (los llamaremos r y µ) podemos reconstruir las partes real e imaginaria:

a = rcos(µ) b = rsen(µ) Un número complejo puede ser estar escrito en términos de sus partes real e imaginaria a y b, como Z = a + bi, o alternativamente en la forma polar, en términos de r y µ:

Z = r • [cos(µ) + isen(µ)] Las formulaciones rectangular y polar son intercambiables; las ecuaciones arriba muestran cómo computar a y b partiendo de r y µ y viceversa. La razón principal para utilizar números complejos en la música electrónica es debido a que ellos mágicamente automatizan los cálculos trigonométricos. Frecuentemente debemos sumar ángulos para hablar de los cambios de fase de una señal según el progreso del tiempo (o según varía en el tiempo, como en este capítulo). Así, si usted multiplica dos números complejos, el argumento del producto es la suma de los argumentos de los dos factores. Para ver cómo sucede esto, multiplicaremos dos números Z1 y Z2 escritos en la forma polar:

Z1 = r1 • [cos(µ1) + isen(µ1)] Z2 = r2 • [cos(µ2) + isen(µ2)] dando:

Z1Z2 = r1r2 • [cos(µ1)cos(µ2) – sen(µ1)sen(µ2) + cos(µ1)sen(µ2))]

i(sen(µ1)cos(µ2) +

El signo menos delante del término sen(µ1)sen(µ2) viene de multiplicar i por sí mismo, lo cual nos da -1. Podemos reconocer la fórmula de la suma de senos y cosenos y simplificar:

Z1Z2

= r1r2 • [cos(µ1 +

µ2) + isen(µ1 + µ2)]

Por inspección se sigue que el producto Z1Z2 tiene como magnitud r1r2 y como argumento µ1 + µ2.

Podemos utilizar esta propiedad de los números complejos para adicionar y sustraer ángulos (multiplicando y dividiendo los números complejos con los argumentos apropiados) y tomar luego el seno y el coseno del resultado para extraer las partes real e imaginaria. 7.2 Sinusoides complejas Volviendo a la fórmula de la sinusoide (real) de la página “1”:

x[n] = acos(!n + Á) Esta es una secuencia de cosenos de ángulos (llamados fases) que se incrementa aritméticamente con la muestra número n. Todos los cosenos se ajustan al factor a. Podemos re-escribir esto como la parte real de una secuencia de números complejos mucho más fácil y sencilla de manipular, utilizando las propiedades de sus argumentos y magnitudes. Suponga que el número complejo Z tiene magnitud uno y argumento manera que puede escribirse como:

!, de tal

Z = cos(!) + isen(!) Entonces para cualquier entero n, el número Zn debe tener magnitud uno también (según la multiplicación de las magnitudes) y argumento n! (por la adición de los argumentos). Así,

Zn = cos(n!) + isen(n!) Esto también es cierto para valores negativos de n, por ejemplo, 1/Z = Z-1 = cos(!) -

isen(!)

La figura 7.2 muestra gráficamente cómo las potencias de Z quedan envueltas en un círculo unitario, que es el conjunto de todos los números complejos de magnitud uno. Ellos forman una secuencia geométrica: ..., Z0,Z1,Z2,... y tomando la parte real de cada término obtenemos una sinusoide real con fase inicial cero y amplitud uno: ...,cos(0),cos(!),cos(2!),... Aún más, suponga que multiplicamos los elementos de la secuencia por alguna constante (compleja) A con magnitud a y argumento Á. Esto daría ...,A,AZ,AZ2,... Las magnitudes son todas a y el argumento del enésimo término es manera que la secuencia es igual a:

!n + Á, de tal

AZn = a • [cos(n! + Á) + isen(n! + Á)] y la parte real es precisamente la sinusoide real: re(AZn) = a • cos(n! +

Á)

El número complejo A contiene la amplitud real a y la fase inicial Á; el número complejo Z de magnitud uno controla la frecuencia que es precisamente su argumento !.

La figura 7.2 también muestra la secuencia A, AZ, AZ2,...; en efecto esta es la misma secuencia, 1, Z1, Z2,..., pero amplificada y rotada de acuerdo con la amplitud y la fase inicial. En una sinusoide compleja de esta forma A es llamada la amplitud compleja. Utilizar los números complejos para representar las amplitudes y las fases de las sinusoides puede clarificar manipulaciones que de otro modo parecerían sin motivo. Por ejemplo, suponga que queremos conocer la amplitud y la fase de la suma de dos sinusoides con la misma frecuencia. En el lenguaje de este capítulo, escribimos las sinusoides como:

X[n] = AZn, Y[n] = BZn donde A y B contienen las fases y las amplitudes de las dos señales. La suma es entonces igual a:

X[n] + Y[n] = (A + B)Zn que es una sinusoide cuya amplitud es igual a |A + B| y cuya fase es igual a / (A + B). Esto es claramente una manera mucho más fácil de manipular amplitudes y fases que utilizando las propiedades de los senos y los cosenos. Eventualmente, por supuesto, tomaremos la parte real de los resultados; lo que se puede dejar usualmente para el final de lo que sea que estemos haciendo. 7.2 Variaciones en el tiempo y cambios de fase Comenzando con cualquier señal X[n] (real o compleja), podemos fabricar otras señales variando el tiempo de la señal X por un entero (positivo o negativo) d:

Y[n] = X[n - d] de tal manera que la sucesivamente. Si el X. Si d es negativo, sonido grabado, pero

muestra d-ésima de Y es la muestra 0 de X y así entero d es positivo, entonces Y es una copia retrasada de entonces Y anticipa X; lo que puede realizarse para un no se puede practicar en operaciones en tiempo real.

La variación del tiempo es una operación lineal (considerada como una función de la señal de entrada X); si usted varía el tiempo por una suma X1 + X2 obtiene el mismo resultado que si variara el tiempo de manera separada y lo adicionara posteriormente. La variación del tiempo tiene además otra propiedad, si se varía el tiempo de una sinusoide de frecuencia !, el resultado es otra sinusoide de la misma frecuencia; la variación del tiempo nunca introduce frecuencias que no estuvieran presentes en la señal de entrada antes de ser variada. Esta propiedad, llamada invariancia del tiempo, hace fácil el análisis del efecto de los cambios de las variaciones de tiempo -y las combinaciones lineales de estaconsiderando de manera separada lo que hacen las operaciones en las sinsoides individuales. Aún más, el efecto de una variación en el tiempo en una sinusoide es simple: sólo cambia la fase. Si utilizamos una sinusoide compleja, el efecto sigue siendo simple. Si por ejemplo

X[n] = AZn entonces

Y[n] = X[n - d] = AZ(n-d) = Z-dAZn = Z-dX[n]

así la variación en el tiempo de una sinusoide compleja en d muestras es lo mismo que escalarla por Z-d -es precisamente un cambio de amplitud por un número complejo en particular). Ya que |Z| = 1 para una sinusoide, el cambio en la amplitud no cambia la magnitud de la sinusoide, únicamente su fase. El cambio de fase es igual a -d!, donde ! = /(Z) es la frecuencia angular de la sinusoide. Esto es exactamente lo que deberíamos esperar ya que la sinusoide avanza ! radianes por muestra y está desplazada (es decir, retrasada) en d muestras. 7.3 Redes de retrasos Si consideramos que nuestras muestras de audio digital corresponden a sucesivos momentos en el tiempo, entonces variar el tiempo de la señal en d muestras corresponde a un retraso de d/R unidades de tiempo, donde R es la velocidad de las muestras. La figura 7.3 muestra un ejemplo de una red de retrasos lineal: un ensamble de unidades de retraso, posiblemente con operaciones de escalado de amplitud, combinada con el uso de la adición y la sustracción. La salida es una función lineal de la entrada, en el sentido de que adicionar a la entrada es lo mismo que procesar cada una separadamente y sumar los resultados. Es más, las redes de retrasos lineales no crean nuevas frecuencias que no estuvieran presentes en la entrada, en tanto la red permanece invariante en el tiempo, de tal manera que las ganancias y los tiempos de retraso no cambian con el tiempo. En general hay dos maneras de pensar las redes de retrasos. Podemos pensar en el dominio del tiempo, en el cual dibujamos ondas como función del tiempo (o del índice n), y consideramos los retrasos como cambios en el tiempo. Alternativamente podemos pensar en el dominio de la frecuencia, en el cual dosificamos la entrada con una sinusoide compleja (de tal manera que su salida será una sinusoide de la misma frecuencia) y reportamos el cambio de amplitud o de fase forjado por la red, como una función de la frecuencia. Miraremos ahora la red de retrasos de la figura 7.3 en cada una de las dos maneras. La figura 7.4 muestra el comportamiento de la red en el dominio del tiempo. Inventamos algún tipo de función de examen apropiada como entrada (es un pulso rectangular de 8 muestras de ancho en este ejemplo) y graficamos la entrada y la salida como funciones de la muestra n. Esta red de retrasos en particular adiciona a la entrada una copia retrasada de esta misma. Una función de examen utilizada con frecuencia es un impulso, que es un pulso de sólo una muestra. La utilidad de esto es que, si conocemos la salida de la red para un impulso, podemos encontrar la salida para cualquier otra señal de audio digital -puesto que cualquier señal x[n] es una suma de impulsos, uno de altura x[0], el siguiente una muestra después con altura x[1], y así sucesivamente. Luego, cuando las redes se vuelvan más complicadas, nos moveremos utilizando impulsos como señales de entrada para mostrar su comportamiento en el dominio del tiempo. De otro lado, podemos analizar la misma red en el dominio de la frecuencia considerando una señal de examen (de valor complejo),

X[n] = Zn donde Z tiene una unidad de magnitud y argumento !. Ya sabemos que la salida es otra sinusoide compleja con la misma frecuencia, esto es,

HZN

para algún número complejo H (el cual queremos encontrar). De esta manera escribimos la salida directamente como la suma de la entrada y de su copia retrasada:

Zn + Z-dZn = (1 + Z-d)Zn y encontramos por inspección que:

H = (1 + Z-d) Podemos entender el comportamiento en el dominio de la frecuencia de esta red de retrasos estudiando cómo el número complejo H varía como una función de la frecuencia angular !. Estamos especialmente interesados en su argumento y magnitud -los cuales nos dan la fase relativa y la amplitud de la sinusoide que viene saliendo. Trabajaremos este ejemplo en detalle para mostrar cómo la aritmética de los números complejos puede predecir lo que sucede cuando las sinusoides se combinan aditivamente. La figura 7.5 muestra el resultado, en el plano complejo, cuando las cantidades 1 y Z-d se combinan aditivamente. Para adicionar los números complejos sumamos sus partes real e imaginaria separadamente. Así, el número complejo 1 (parte real 1, parte imaginaria 0) se adiciona de manera coordinada al número complejo Z-d (parte real cos(-d!), parte imaginaria sen(-d!)). Esto se muestra gráficamente haciendo un paralelogramo, con esquinas en el origen y en los dos puntos que van a ser sumados, y cuya cuarta esquina es la suma H. Como se muestra en la figura, el resultado puede ser entendido al hacer simetría alrededor del eje real: en lugar de 1 y Z-d, es más fácil sumar las cantidades Zd/2 y Z-d/2 debido a que son simétricas con respecto al eje real (horizontal). (Estrictamente hablando, no tenemos definidas apropiadamente las cantidades Zd/2 y Z-d/2, estamos utilizando esas expresiones para denotar números complejos unitarios cuyos argumentos son los de Zd y Z-d, de tal manera que al elevarlos al cuadrado nos da Zd y Z-d.) Re-escribimos la ganancia como:

H = Z-d/2(Zd/2 + Z-d/2) El primer término es un cambio de fase de -d!/2. El segundo término se entiende mejor en la forma rectangular:

Zd/2 + Z-d/2 = (cos(!d/2) + isen(!d/2)) + (cos(!d/2) – isen(!d/2)) = 2cos(!d/2) Esta cantidad real puede ser positiva o negativa; su valor absoluto da la magnitud de la salida: |H| = 2|cos(!d/2)| La cantidad |H| es llamada la ganancia de la red de retrasos a la frecuencia angular !, y está graficada en la figura 7.6. La ganancia con respecto a la frecuencia de una red de retrasos (esto es, la ganancia en función de la frecuencia) es llamada la respuesta a la frecuencia de la red. Ya que la red tiene mayores ganancias en unas frecuencias que en otras, puede ser considerada como un filtro que puede ser utilizado para separar ciertos componentes de los demás, en un sonido. Debido a la forma de esta expresión particular de la ganancia como una función de !, este tipo de red de retrasos es llamado filtro peine (sin recirculación). La salida de la red es una suma de dos sinusoides de amplitud igual, y cuyas

fases difieren en !d. La respuesta a la frecuencia que resulta está en acuerdo con el sentido común: si la frecuencia angular ! se ajusta de tal manera que un número entero de períodos se fije en d muestras, es decir, si ! es un múltiplo de 2¼/d, la salida del retraso es exactamente igual a la de la señal original, y de esta manera las dos se combinan para hacer una salida con dos veces la amplitud original. De otro lado, si por ejemplo tomamos ! = ¼/d de tal manera que el retraso es la mitad del período, entonces la salida del retraso está fuera de fase y cancela la entrada de manera exacta. Esta red de retrasos en particular tiene una interesante aplicación: si tenemos una señal de entrada periódica (o casi periódica), cuya frecuencia fundamental es de ! radianes por muestra, podemos ajustar el filtro peine de tal manera que los picos en la ganancia estén alineados con los armónicos pares y los impares caigan donde la ganancia es cero. Para hacer esto escogemos d = ¼/!, es decir, ajustamos el tiempo de retraso a exactamente la mitad del período de la señal de entrada. De esta manera obtenemos una nueva señal cuyos armónicos son 2!, 4!, 6!,..., y de esta manera tiene una nueva frecuencia fundamental que es dos veces la frecuencia original. Excepto por un factor de dos, las amplitudes de los armónicos que quedan siguen todos la envolvente espectral del sonido original. Tenemos ahora una herramienta para elevar a una octava un sonido que entra, sin cambiar la envolvente espectral. Este multiplicador de octava es lo inverso al divisor de octava presentado en el capítulo 5. Los dominios del tiempo y de la frecuencia ofrecen formas complementarias de mirar la misma red de retrasos. Cuando los retrasos en la red son más pequeños que la habilidad de del oído para distinguir eventos en el tiempo -aproximadamente 20 milisegundos- la situación de dominio en el tiempo se vuelve menos relevante para entender la red de retrasos, y nos volcamos principalmente hacia el dominio en la frecuencia. De otro lado, cuando los retrasos son más grandes que aproximadamente 50 milisegundos, los picos y los valles en los dibujos que muestran ganacia vs frecuencia (tales como el de la figura 7.6) se apiñan de manera tan estrecha, que el dominio en la frecuencia se vuelve menos importante. Ambos son sin embargo, válidos en el rango completo de los posibles tiempos de retrasos. 7.4 Redes de retrasos con recirculación A veces es deseable conectar las salidas de uno o más retrasos de una red de nuevo a sus mismas o a otras entradas. En lugar de obtener uno o algunos pocos ecos del sonido original como en el ejemplo anterior, podemos potencialmente obtener un número infinito de ecos, cada uno retroalimentándose dentro de la red para engendrar aún más. El ejemplo más simple de una red con recirculación es el filtro peine con recirculación cuyo diagrama se muestra en la figura 7.7. Al igual que en el anterior, el filtro peine simple, la señal de entrada es enviada a la línea de retraso con una longitud de d muestras. Pero ahora la salida de la línea de retrasos también retroalimenta su entrada; la entrada de los retrasos es la suma de la salida original más la salida retrasada. La salida es multiplicada por un número g antes de regresar a alimentar la entrada. El comportamiento en el dominio del tiempo del filtro peine con recirculación se muestra en la figura 7.8. Aquí consideramos el efecto de enviar un impulso a la red. Obtenemos de nuevo el impulso original, más una serie de ecos, cada uno en turno a d muestras después del previo, y multiplicados cada vez por la ganancia g. En general, una salida de una red de retrasos dado un impulso como su entrada es llamada la respuesta al impulso de la red. Note que hemos escogido una ganancia g que es menor que uno en valor absoluto. Si escogemos una ganancia mayor que uno (o menor que -1), cada eco tendrá una

magnitud mayor que la previa. En lugar de caer exponencialmente como lo hacen en la figura, crecerán exponencialmente. Una red con recirculación cuya salida eventualmente cae a cero luego de que su entrada ha finalizado es llamada estable; una red cuya salida crece sin límites es denominada inestable. Podemos analizar también el filtro peine con recirculación en el dominio de la frecuencia. La situación ahora es más difícil de analizar utilizando sinusides reales, y así tenemos la primera gran recompensa al haber introducido los números complejos, los cuales simplifican mucho el análisis. Si como antes, alimentamos la entrada con la señal,

X[n] = Zn con |Z| = 1, podemos escribir la salida como

Y[n] = (1 + gZ-d + g2Z-2d + ...)X[n] Aquí los términos en la suma vienen de la serie de ecos discretos. Se sigue que la amplitud de la salida es:

H = 1 + gZ-d + (gZ-d)2 +... Esta es una serie geométrica; podemos sumarla utilizando la técnica normalizada. Primero multiplicamos a ambos lados por gZ-d para obtener:

gZ-dH = gZ-d + (gZ-d)2 + (gZ-d)3 + ... y al sustraer la ecuación original da:

H - gZ-dH = 1 Se resuelve entonces para H:

H = 1/(1 - gZ-d) Un método más rápido (pero ligeramente menos intuitivo) para obtener el mismo resultado es examinar la red recirculante misma para obtener una ecuación para H, como sigue. Llamemos una entrada X[n] y la salida Y[n]. La señal que entra a la línea de retraso es Y[n], y al pasar esta a través de la línea de retrasos y multiplicar da

Y[n] • gZ-d Esto, más la entrada es justamente la señal de salida de nuevo, así:

Y[n] = X[n] +

Y[n] • gZ-d

y dividiendo por X[n] y utilizando H = Y[n]/X[n] da:

H = 1 + HgZ-d Esta es equivalente a la anterior ecuación para H. Nos gustaría hacer ahora una gráfica de respuesta a la frecuencia (la ganancia como función de la frecuencia) tal como se hizo para los filtros peine sin recirculación en la figura 7.6. Esto requiere hacer de nuevo un dibujo en el plano complejo. Podríamos estimar la magnitud de H igual a: |H| = 1/|1 - gZ-d|

donde utilizamos la propiedad multiplicativa de las magnitudes para concluír que la magnitud de un recíproco (complejo) es el recíproco de una magnitud (real). La figura 7.9 muestra la situación gráficamente. La ganancia |H| es el recíproco de la longitud del segmento que va del punto 1 al punto gZ-d. La figura 7.10 muestra una gráfica de la respuesta a la frecuencia |H| como una función de la frecuencia angular ! = /(Z). La figura 7.9 se puede usar para analizar cómo debería comportarse cualitativamente la respuesta a la frecuencia |H(!)| como una función de g. La altura y el ancho de banda de los picos dependen ambos de g. El valor máximo que puede tener |H| es cuando

Z-d = 1 Esto ocurre en las frecuencias ! = 0, 2¼/d, 4¼/d,... tal como sucede en el filtro peine anterior. En estas frecuencias la ganancia llega a |H| = 1/(1 - g) El siguiente asunto importante es el ancho de banda de los picos en la respuesta a la frecuencia. Nos gustaría encontrar sinusoides Wn, con frecuencia /(W), que logren un valor de |H| de 3 decibeles aproximadamente por debajo del valor máximo. Para hacer esto, retornamos a la figura 7.9 y tratamos de ubicar W de tal manera que la distancia del punto 1 al punto gW-d sea aproximadamente √2 veces la distancia de 1 a g (ya que √2:1 es una razón de aproximadamente 3 decibeles). Hacemos esto arreglando la parte imaginaria de gW-d de tal manera que sea casi 1 - g o su negativo, haciendo casi un triángulo isósceles rectángulo entre los puntos 1, 1 - g, y gW-d. (Estamos suponiendo que g es casi 2/3, de otra manera esta aproximación no es muy buena). La hipotenusa de un triángulo rectángulo isósceles es siempre √2 veces el lado, y así la ganancia cae por ese factor comparado con su máximo. Ahora otra aproximación: hacemos que la parte imaginaria de gW-d sea aproximadamente el ángulo en radianes cortando desde el eje real: ±(1 - g) ≈ im(gW-d) ≈ /(W-d) Así la región de cada pico que abarca los 3 decibeles desde el valor máximo es aproximadamente (1 - g)/d (en radianes) a cualquiera de los lados del pico. El ancho de banda se estrecha (y los picos del filtro se vuelven más agudos) en tanto g se aproxima a su máximo valor de 1. Al igual que con el filtro peine sin recirculación de la sección 7.3, los dientes del peine están más cercanos para valores más grandes del retraso d. De otro lado un retraso de d = 1 (el más corto posible) da únicamente un diente (a frecuencia cero) por debajo de la frecuencia de Nyquist ¼ (el diente siguiente, a 2¼, corresponde de nuevo a la frecuencia de cero por el sobre-doblado). Así el filtro peine con recirculación y con d = 1 es precisamente un filtro pasabajos. Las redes de retrasos con retrasos de una muestra serán la base para el diseño de muchos otros tipos de filtros digitales en el capítulo 8. 7.5 Conservación de la potencia y redes de retrasos complejas

Las mismas técnicas trabajarán para analizar cualquier red de retrasos, aunque para redes más complicadas es más difícil caracterizar los resultados, o diseñar la red para tener las propiedades específicamente deseadas. Otro punto de vista puede a veces ser útil para esta situación, particularmente cuando se requiere de respuesta a la frecuencia plana, ya sea por sí misma o para asegurar que una red con recirculación compleja permanece estable a ganancias de retroalimentación cercanas a uno. El hecho central que usaremos es que si cualquier red de retrasos, con una o más entradas y salidas, está construída de tal manera que su potencia de salida (promediada en el tiempo) siempre es igual a su potencia de entrada, esa red debe tener una respuesta plana a la frecuencia. Esto es casi una tautología; si usted pone una sinusoide a cualquier frecuencia en una de las entradas, obtendrá sinusoides de la misma frecuencia a la salida, y la suma de la potencia en todas las salidas será igual a la potencia de la entrada, de tal manera que la ganancia, definida apropiadamente, es exactamente uno. Para trabajar con redes de retrasos que conservan la potencia requeriremos una definición explícita de “potencia promedio total”. Si hay únicamente una señal (llamémosla x[n]), la potencia promedio está dada por:

P(x[n]) = [|x[0]|2 + |x[1]|2 +...+ |x[N - 1]|2]/N donde N es un número suficientemente grande como para que las fluctuaciones en la amplitud sean despreciables. Esta situación trabaja bien tanto para señales complejas como para las reales. La potencia promedio total para algunas señales de audio digital es precisamente la suma de las potencias individuales de las señales:

P(x1[n],...,xr[n]) = P(x1[n]) +...+ P(xr[n]) donde r es el número de señales que se combinan. Igualmente un amplio rango de redes de retrasos interesantes tienen la propiedad de que la potencia total de la salida iguala la potencia total de la entrada; son llamadas unitarias. Para comenzar con estas, ponemos cualquier número de retrasos en paralelo, como se muestra en la figura 7.11. Cualquiera que sea la potencia total de las entradas, la potencia total de las salidas ha de ser igual a esta. Una segunda familia de transformaciones con conservación de la potencia está compuesta de rotaciones y reflexiones de las señales x1[n],...,xr[n], considerándolas, en cada punto n fijo del tiempo, como las coordenadas r de un punto en un espacio r-dimensional. La rotación o reflexión deben ser uno, lo que deja el origen (0,...,0) fijo. Para cada número de muestra n, la contribución total a la potencia promedio es proporcional a |x1|2 +...+ |xr|2 Esta es precisamente la distancia pitagórica desde el origen al punto (x1,...,xr). Debido a que las rotaciones y las reflexiones son transformaciones que preservan la distancia, la distancia desde el origen antes de hacer la transformación debe ser igual a esa distancia después de hacerla. Es así como la potencia total de un conjunto de señales debe ser preservada por rotación. La figura 7.12 muestra una matriz de rotación operando en dos señales. En la parte (a) la transformación se muestra de manera explícita. Si las señales de

entrada son x1[n] y x2[n] las salidas son:

y1[n] = cx1[n] - sx2[n] y2[n] = sx1[n] + cx2[n] donde c y s están dados por

c = cos(µ) s = sen(µ) para un ángulo de rotación µ. Considerados como puntos en el plano cartesiano, el punto (y1,y2) es precisamente el punto (x1,x2) rotado en el sentido contrario a las agujas del reloj, en un ángulo µ. Los dos puntos están así a la misma distancia del origen: |y1|2 + |y2|2 = |x1|2 + |x2|2 y así las dos señales a la salida tienen la misma potencia de las dos señales a la entrada. Para una descripción alternativa de la rotación en dos dimensiones, considere los números complejos X = x1 + x2i y Y = y1 + y2i. La transformación anterior permite obtener

Y = XZ donde Z es un número complejo con magnitud uno y argumento se sigue que |X| = |Y|.

µ. Ya que |Z| = 1,

Si ejecutamos una rotación sobre un par de señales y luego invertimos una de ellas (pero no la otra), el resultado es una reflexión. Esta también preserva la potencia total de la señal, ya que podemos invertir cualquiera o el conjunto total de las señales sin cambiar la potencia total. En dos dimensiones, una reflexión aparece como una transformación de la forma

y1[n] = cx1[n] + sx2[n] y2[n] = sx1[n] - cx2[n] Una matriz de rotación útil y especial se obtiene haciendo µ = ¼/4, de tal manera que s = c = √1/2. Esto nos permite simplificar el cómputo como se muestra en la figura 7.13 (parte a) debido a que cada señal necesita únicamente ser multiplicada por la cantidad única s = c. Las rotaciones o reflexiones más complicadas con más de dos señales de entrada pueden fabricarse al repetir la rotación y/o la reflexión de ellas por pares. Por ejemplo, en la figura 7.13 (parte b), cuatro señales están combinadas en pares, en dos etapas sucesivas, de tal manera que al final cada señal de entrada va a alimentar todas las salidas. Podemos hacer lo mismo con ocho señales (usando tres etapas) y así sucesivamente. Es más, si utilizamos el ángulo especial ¼/4, todas las señales de entrada contribuyen de manera pareja en cada una de las salidas. Cualquier combinación de retrasos y matrices de rotación, aplicada en sucesión a un conjunto de señales de audio, resultará en una respuesta a la frecuencia plana, ya que cada operación individual lo hace. Esto ya nos permite generar una infinidad de redes de retrasos, pero a la larga, ninguna de ellas con recirculación. Una tercera operación, mostrada en la figura 7.14, nos permite hacer redes con recirculación que aún gozan de respuestas a la frecuencia planas.

La parte (a) de la figura muestra la organización general. Se asume que la transformación R es cualquier combinación de retrasos y matrices de mezcla que preservan la potencia total. Las señales x1,...,xk entran a la red de retrasos unitaria, y las señales y1,...,yk, emergen. Algunas otras señales w1,...,wj (donde j no es necesariamente igual a k) aparecen a la salida de la transformación R y son regresadas a su entrada. Si R está en efecto preservando la potencia, la potencia total de la entrada (la potencia de las señales x1,...,xk más w1,...,wj deben igualar la potencia de salida (la potencia de las señales y1,...,yk más w1,...,wj), y sustrayendo todas las w de la igualdad encontramos que las potencias totales de salida y entrada son iguales. Si hacemos j = k = 1 de tal manera que hay una sola de cada x, y y w, y siendo la transformación R una rotación en un ángulo µ seguido por un retraso de d muestras a la salida W, el resultado es el bien conocido filtro pasa-todo. Con algunos malabares, y haciendo c = cos(µ), podemos mostrar que es equivalente a la red mostrada en la parte (b) de la figura. Los filtros pasa-todo tienen muchas aplicaciones, algunas de las cuales visitaremos más tarde en este libro. 7.6 Reverberación artificial La reverberación es ampliamente utilizada para mejorar el sonido de las grabaciones, pero tiene un rango amplio de otras aplicaciones musicales [DJ85, págs.289-340]. La reverberación en espacios reales, naturales aparece por un complicado patrón de reflexiones sonoras y los otros objetos que definen el espacio. Es una gran sobresimplificación imitar este proceso utilizando redes de retrasos discretas con recirculación. Sin embargo el modelado de la reverberación utilizando líneas de retrasos con recirculación, puede, con mucho trabajo, lograr buenos resultados. La idea central es idealizar cualquier salón (u otro espacio reverberante) como una colección de líneas de retrasos paralelos que modelan la memoria del aire dentro del salón. En cada punto de las paredes del salón terminan muchos recorridos rectilíneos, cada uno llevando sonido a ese punto; el sonido entonces se refleja en muchos otros recorridos, cada uno originado en ese punto, y dirigiéndose eventualmente a algún otro punto en una pared. Aunque la pared (y el aire por el que se pasa para llegar a la pared) absorbe algo del sonido, alguna porción de la potencia incidente es reflejada y lo hace hacia otra pared. Si la mayoría de la energía recircula, el salón reverbera por un tiempo largo. Si en alguna frecuencia la pared refleja más energía en general que la que recibe, el sonido se retroalimentará inestablemente; esto nunca sucede en salones reales (la conservación de la energía previene esto), pero puede suceder en un reverberador artificial si no está diseñado de manera correcta. Para fabricar un reverberador artificial utilizando una red de retrasos, debemos llenar dos requisitos que compiten simultáneamente. Primero, las líneas de retrasos deben ser suficientemente largas para prevenir la coloración en la salida como un resultado del filtro peine. (Incluso si nos movemos más allá del filtro peine simple de la sección 7.4, la respuesta a la frecuencia tenderá a tener picos y valles cuyo espacio varía inversamente con el tiempo de retraso total.) De otro lado, no deberíamos escuchar ecos individuales; la densidad del eco debería ser idealmente de hasta mil por segundo. Con estos objetivos en mente, ensamblamos algún número de líneas de retrasos y conectamos sus salidas a sus entradas. El camino de la retroalimentación -la conexión desde la salida hacia la entrada de los retrasos- debe tener una ganancia agregada que varía poco a poco como una función de la frecuencia, y nunca excede a uno para cualquier frecuencia. Un buen punto de partida es dar al

camino de retroalimentación una respuesta a la frecuencia plana y una ganancia ligeramente menor que uno; esto se hace utilizando matrices de rotación. Idealmente esto es todo lo que necesitaríamos hacer, pero en la realidad no siempre queremos utilizar miles de líneas de retrasos que serían el modelo para los trayectos entre todos los posibles pares de puntos en las paredes. En la práctica usamos entre cuatro y dieciséis líneas de retrasos para hacer el modelo del salón. Esta simplificación a veces reduce la densidad del eco por debajo de lo que podríamos desear, de tal manera que deberíamos utilizar más líneas de retrasos a la entrada de la red con recirculación para incrementar la densidad. La figura 7.15 muestra el diseño de un reverberador simple que utiliza este principio. El sonido que entra, que se muestra como dos señales separadas en este ejemplo, es primero engrosado retrasando progresivamente una de las dos señales y luego entremezclándolas usando una matriz de rotación. En cada etapa el número de ecos de la señal original es doblado; típicamente deberíamos usar entre 6 y 8 etapas para hacer entre 64 y 256 ecos, todo con un retraso total de entre 30 y 80 milisegundos. La figura muestra tres de estas etapas. A continuación viene la parte de recirculación del reverberador. Luego del engrosamiento inicial, la señal de entrada es llevada a un banco de líneas de retrasos paralelas, y sus salidas son mezcladas de nuevo utilizando una matriz de rotación. Las salidas mezcladas son atenuadas por una ganancia g ≤ 1, y regresadas de vuelta a las líneas de retrasos para hacer una red con recirculación. El valor g controla el tiempo de reverberación. Si la longitud promedio de las líneas de retraso con recirculación es d, entonces cualquier sonido entrante es atenuado por un factor de g después de un tiempo de retraso de d. Después de un tiempo t la señal ha recirculado t/d veces, perdiendo 20log10(g) decibeles en cada ronda, de tal manera que la ganancia total, en decibeles, es: 20(t/d)log10(g) La medida usual de tiempo de reverberación (RT) es el tiempo en el cual la ganancia cae en seis decibeles: 20(RT/d)log10(g) = -60 RT = -3d/(log10(g)) Si g es uno, esta fórmula da

∞, ya que el logaritmo de uno es cero.

El esquema mostrado arriba es la base para muchos diseños de reverberadores modernos. Se han propuesto muchas extensiones de este diseño fundamental. El paso más importante a continuación sería introducir filtros en el camino de la recirculación de tal manera que las frecuencias altas puedan hacerse decaer más rápidamente que las graves; esto se logra fácilmente con un filtro pasa-bajos muy sencillo, pero no trabajaremos esto aquí, sin haber desarrollado aún la teoría de filtros requerida. En general, usar este esquema para diseñar un reverberador requiere elaborar muchas opciones complicadas de tiempos de retraso, ganancias y coeficientes de filtros. Montañas de literatura han sido publicadas sobre este tópico; Barry Blesser ha publicado un buen resumen [Ble01]. Se sabe que hay mucho más acerca del diseño y la puesta a punto del reverberador que no ha sido publicado; los diseños concretos se mantienen en secreto por razones comerciales. En general, los procesos de diseño implican una puesta a punto esmerada y lenta, por ensayo, error y escucha crítica. 7.6.1 El control de reverberadores

La reverberación artificial es utilizada casi universalmente en grabación o reforzamiento sonoro para endulzar el sonido en general. Sin embargo, y de manera más interesante, la reverberación puede utilizarse como una fuente sonido propiamente dicha. El caso especial de la reverberación infinita es útil para coger sonidos en vivo y extenderlos en el tiempo. Para hacer este trabajo en la práctica es necesario abrir la entrada del reverberador únicamente por un período corto de tiempo, durante el cual el sonido que entra no varía con demasiada rapidez. Si una de las entradas del reverberador infinito se deja abierta por demasiado tiempo, el sonido se junta y rápidamente se vuelve una masa indescifrable. Para “reverberar infinitamente” una nota de un instrumento en vivo, es mejor esperar hasta después de la porción del ataque de la nota y luego permitir que 1/2 segundo de la nota estable entre al reverberador. Es posible construir acordes con un instrumento monofónico abriendo repetidamente la entrada en diferentes momentos de la nota estable. La figura 7.16 muestra cómo puede hacerse esto en la práctica. Los dos controles más importantes son la entrada del reverberador y la ganancia de la retroalimentación. Para capturar un sonido ajustamos la ganancia de la retroalimentación a uno (tiempo de reverberación infinito) y abrimos momentáneamente la entrada en el tiempo t1. Para adicionar un sonido a otro que ya se tiene, simplemente reabrimos la ganancia de entrada en el momento apropiado (en el tiempo t2 de la figura, por ejemplo). Finalmente podemos borrar el sonido que recircula, y de esta manera ambos sonidos se atenuan a la salida y se limpia el reverberador, ajustando la ganancia de retroalimentación a valores de menos de uno (como en el tiempo t3). Mientras más reduzcamos la ganancia de retroalimentación, más rápidamente decaerá la salida. 7.7 Cambios variables y fraccionales Al igual que con cualquier técnica de síntesis o procesamiento de audio, las redes de retrasos se vuelven mucho más poderosas e interesantes si sus características pueden hacerse cambiar en el tiempo. Los parámetros de ganancia (tales como g en el filtro peine con recirculación) pueden ser controlados por generadores de envolvente, variándolos para evitar clicks y otros artefactos. Los tiempos de retraso (tales como d anteriormente) no son fáciles de variar con suavidad por dos razones. La primera, es que tenemos definidos cambios de tiempo únicamente para valores enteros de d, ya que para valores fraccionales de d una expresión tal como x[n - d] no está determinada si x[n] está definida sólo para valores enteros de n. Para hacer retrasos fraccionales debemos introducir algún esquema de interpolación apropiado. Y si queremos variar d con suavidad en el tiempo, no nos dará buenos resultados simplemente el brincar de un entero al siguiente. La segunda es que incluso una vez hemos alcanzado suavizar perfectamente los cambios de los tiempos de retraso, los artefactos causados por la variación en los tiempos de retraso se vuelven más notorios aún con muy pequeñas velocidades relativas de cambio; mientras en la mayoría de los casos usted puede hacer rampa con cualquier control de amplitud entre cualesquiera dos valores en 30 milisegundos sin problemas, cambiar un retraso en sólo una muestra de cada cien produce un cambio muy notable en la altura del sonido -de hecho, uno variará con frecuencia un retraso deliberadamente con el fin de escuchar los artefactos, únicamente pasando incidentalmente de un valor específico de tiempo de retraso a otro. El primer asunto (los retrasos fraccionales) puede ser tratado usando un esquema de interpolación, exactamente en la misma forma que para la lectura de tablas (sección 2.5). Por ejemplo, suponga que queremos un retraso de 1.5 muestras. Por cada n debemos estimar un valor para x[n – 1.5]. Podríamos hacer esto

utilizando la interpolación normalizada de cuatro puntos, poniendo un polinomio cúbico a través de los cuatro puntos “conocidos” (0,x[n]), (1,x[n-1]), (2,x[n2]), (3,x[n-3]), y luego evaluar el polinomio en el punto 1.5. Hacer esto repetidamente para cada valor de n nos da la señal retrasada. Este esquema de interpolación de cuatro puntos puede ser utilizado para cualquier retraso de hasta una muestra. Los retrasos de menos de una muestra no puden ser calculados de esta manera debido a que necesitamos dos puntos de entrada por lo menos tan recientes como el retraso deseado. Ellos estaban disponibles en el ejemplo anterior, pero para un tiempo de retraso de 0.5 muestras, por ejemplo, necesitaríamos el valor de x[n + 1], el cual está en el futuro. La seguridad del estimado podría ser mejorada más adelante usando esquemas de interpolación de orden más alto. Sin embargo aquí hay un compromiso entre la calidad y la eficiencia en computación. Es más, si nos movemos a esquemas de interpolación de grados más altos, el retraso mínimo se incrementará, causando problemas en algunas situaciones. El segundo asunto para considerar son los artefactos -sea que los busquemos o no- que aparecen al cambiar las líneas de retrasos. En general, un cambio discontinuo en el tiempo de retraso dará lugar a un cambio discontinuo en la señal de salida, ya que esta se interrumpe en efecto, en un punto, y se hace saltar a otro. Si la entrada es una sinusoide, el resultado es un cambio discontinuo en la fase. Si se desea cambiar la línea de retraso ocasionalmente entre tiempos de retraso fijos (por ejemplo al comienzo de las notas musicales), entonces podemos utilizar las técnicas de manejo de discontinuidades esporádicas que se presentó en la sección 4.3. En efecto estas técnicas trabajarán enmudeciendo la salida de una u otra manera. De otro lado, si se desea cambiar el tiempo de retraso continuamente, -mientras estamos escuchando la salida- entonces debemos tener en cuenta los artefactos que resultan de los cambios. La figura 7.17 muestra la relación entre los tiempos de entrada y de salida en una línea de retraso variable. Se asume que la línea de retraso tiene una longitud máxima fija D. Por cada muestra de la salida (correspondiente a un punto en el eje horizontal) hay una muestra de la entrada de la línea de retrasos (posiblemente interpolada). En el eje vertical se ve cuál muestra (entera o fraccional) utilizar desde la señal de entrada. Siendo n el número de la muestra a la salida, el eje vertical muestra la cantidad n - d[n], donde d[n] es el retraso (que varía en el tiempo) dado en número de muestras. Si denotamos la localización de la muestra de entrada por:

y[n] = n - d[n] entonces la salida de la línea de retrasos es

z[n] = x[y[n]] donde la señal x está evaluada en el punto y[n], interpolando apropiadamente en caso de que y[n] no sea un entero. Esta es exactamente la fórmula para la lectura de tablas (página “27”). Podemos utilizar todas las propiedades de la lectura de tablas de sonidos grabados para predecir el comportamiento de líneas de retraso variables. Queda una diferencia entre las líneas de retrasos y las tablas de onda: el material en las líneas de retrasos está cambiando constantemente. No sólo no podemos leer el futuro, si no que, si la línea de retraso tiene D muestras de longitud, tampoco podemos leer más de D muestras del pasado:

0 < d[n] < D o haciendo negativo esto y adicionando n a cada lado:

n > y[n] > n - D Esta última relación denota la región entre las dos líneas diagonales en la figura 7.17; la función y[n] debe quedar dentro de esta tira. Regresando a la sección 2.2 podemos usar las Fórmulas de Transposición Momentánea para tablas de onda con el fin de calcular la transposición t[n] de la salida. Esto nos da la Formula de Transposición Momentánea para las líneas de retrasos:

t[n] = y[n] - y[n - 1] = 1 - (d[n] – d[n - 1]) Si d[n] no cambia con n, el factor de transposición es 1 y el sonido emerge de la línea de retrasos con la misma velocidad con la que entró. Pero si el tiempo de retraso se incrementa como una función de n, el sonido resultante es transpuesto descendentemente, y si d[n] decrece, se transpone ascendentemente. Esto es llamado el efecto Doppler y ocurre en la Naturaleza también. El aire por el que viaja el sonido puede a veces ser pensado como una línea de retrasos. Un cambio en la línea de retrasos corresponde a mover un escucha acercándolo o alejándolo de una fuente de sonido estacionaria; el efecto Doppler por el cambio en la longitud de la trayectoria trabaja precisamente de la misma manera en la línea de retrasos, como si estuviera en el aire físico. Regresando a la figura 7.17, podemos predecir que no hay aquí cambio al comienzo, pero cuando la pendiente de la trayectoria decrece la afinación caerá durante un intervalo de tiempo antes de regresar a la afinación original (cuando la pendiente regresa a uno). El tiempo de retraso puede ser manipulado para dar cualquier transposición deseada, pero mientras más grande es la transposición, menos tiempo es posible mantenerla dentro de la franja, antes de que se salga por arriba o por abajo de esta región diagonal. 7.8 Fidelidad de la interpolación de las líneas de retrasos Dado que en efecto hacen lectura de tablas de onda, las líneas de retrasos variables introducen distorsión en las señales sobre las cuales operan. Aún más, un sutil problema puede aparecer incluso cuando la línea de retraso no está cambiando en longitud: la repuesta a la frecuencia, en situaciones reales, nunca es perfectamente plana en líneas de retrasos cuya longitud no es un entero. Si el tiempo de retraso está cambiando de muestra a muestra, aplica la distorsión que resulta de la sección 2.5. Para usarla, suponemos que la entrada de la línea de retraso puede ser descompuesta en sinusoides y considerar de manera separada lo que sucede con cada sinusoide individualmente. Podemos utilizar la tabla 2.1 (página “46”) para predecir el nivel RMS de la distorsión de los productos combinados para una línea de retraso variable interpolada. Asumiremos aquí que queremos usar la interpolación de cuatro puntos. Para las sinusoides con períodos mayores a 32 muestras (esto es, para frecuencias por debajo de 1/16 de la frecuencia de Nyquist) la distorsión es de 96 decibeles, o mejor -poco probable de que sea notada. A una velocidad de muestras de 44.1 kHz, estos períodos deberán corresponder a frecuencias de hasta 1400 Hertz. A frecuencias más altas la calidad se degrada y por encima de 1/4 de la frecuencia de Nyquist, los productos de la distorsión, que están únicamente casi a 50 dB, serán audibles probablemente. La situación para un sonido complejo depende primariamente de las amplitudes y

de las frecuencias de sus parciales más altos. Suponga, por ejemplo que unos parciales del sonido por encima de 5000 Hertz son hasta 20 dB más bajos que su parcial más fuerte y que por encima de 10000 Hertz están 60 dB abajo de éste. Entonces, como un estimado aproximado, los productos distorsionados del rango 5000 – 10000 estará cada uno limitado a aproximadamente -68 dB y aquellos por encima de los 1000 estarán limitados en aproximadamente -75 dB (debido a que la peor situación en la tabla es de aproximadamente -15 dB y debe ser sumada a la fortaleza del parcial en cuestión.) Si el contenido de la alta frecuencia de la señal de entrada da productos de distorsión inaceptable a la salida, es más efectivo en general incrementar la velocidad de las muestras que el número de puntos de interpolación. Para períodos mayores a 4 muestras, si se dobla el período (doblando la velocidad de las muestras, por ejemplo) la distorsión decrece en cerca de 24 dB. La respuesta a la frecuencia de las líneas de retrasos con interpolación de cuatro puntos es aproximadamente plana hasta la mitad de la frecuencia de Nyquist, pero después se zambulle rápidamente. Suponga (para tomar el peor de los casos) que el retraso se ajusta en la mitad del camino de dos enteros, por decir 1.5. la interpolación cúbica da:

x[1.5] = (-x[0] + 9x[1] + 9x[2] - x[3])/8 Sea x[n] una sinusoide (real) de una unidad de amplitud con frecuencia angular !, y cuya fase es cero a 1.5:

x[n] = cos(! • (n – 1.5)) y computamos x[1.5] según la fórmula anterior:

x[1.5] = (9cos(!/2) - 9cos(3!/2))/4 Este es el pico de la sinusoide que viene de regreso de la línea de retrasos, y dado que la amplitud pico de ida era uno, esto muestra la respuesta a la frecuencia de la línea de retrasos. Esto se grafica en la figura 7.18. A la mitad de la frecuencia de Nyquist (! = ¼/2) la ganancia es de cerca de -1 dB lo cual es una caída en la amplitud apenas perceptible. En la frecuencia de Nyquist misma, sin embargo, la ganancia es cero. Al igual que con los resultados para la distorsión, la respuesta a la frecuencia mejora radicalmente al doblar la velocidad de las muestras. Si hacemos funcionar nuestro retraso a una velocidad de muestras de 88200 Hertz en lugar de hacerlo a la normal de 44100, obtendremos únicamente cerca de 1 dB de variación hasta los 20000 Hertz. 7.9 El cambio de afinación Un uso favorito de las líneas de retrasos es alterar la afinación del sonido que entra utilizando el efecto Doppler. Se puede querer alterar la afinación variablemente (aleatoria o periódicamente, por ejemplo), o también mantener un intervalo de transposición musical dado, durante un tiempo determinado. Retornando a la figura 7.17, vemos que con una línea de retraso simple y variable podemos mantener cualquier cambio de afinación por un intervalo de tiempo limitado pero si queremos mantener una transposición dada, eventualmente siempre nos caerá por fuera de la franja diagonal de los tiempos de retraso admisibles. En el escenario más simple, sencillamente variamos la transposición arriba y abajo, siempre dentro de la franja. Esto funciona, por ejemplo si queremos aplicar vibrato a un sonido tal como se muestra en la figura 7.19. Aquí la función de retraso es

d[n] = d0 + acos(!n) donde d0 es el retraso promedio, a es la amplitud de la variación alrededor del retraso promedio y ! es la frecuencia angular. La Transposición Momentánea es (página “200”), aproximadamente

t = 1 + a!cos(!n - ¼/2) Esta tiene rango entre los valores 1 - a! y 1 + a!. Suponga, de otro lado, que queremos mantener una transposición constante en un intervalo de tiempo largo. En este caso no podemos mantener la transposición por siempre, pero siempre es posible mantenerla en intervalos de tiempo fijos, con cambios discontinuos, como se muestra en la figura 7.20. El tiempo de retraso es la salida de una función diente de sierra apropiada y normalizada, y la salida de la línea de retrasos variable es envuelta como se muestra en la figura para evitar las discontinuidades. Esto se logra como se muestra en la figura 7.21. La salida de la diente de sierra generadora es utilizada de dos maneras. En primer lugar se ajusta para que haga un recorrido entre las dos fronteras d0 y d0 + s ajustando los controles de la línea de retrasos en número de muestras. El retraso inicial d0 debe ser por lo menos suficiente para hacer el retraso variable factible, y para la interpolación de cuatro puntos debe ser de por lo menos una muestra. Valores más grandes de d0 suman un retraso adicional constante a la salida; estos son usualmente ofrecidos como un control para el cambio de afinación ya que esta es escencialmente libre. La cantidad s es llamada a veces tamaño de la ventana. Corresponde aproximadamente a la longitud de la muestra en un lazo (sección 2.2). La salida de la diente de sierra también se usa para envolver la salida en exactamente la misma forma como se envuelve el muestreador de tabla de onda de la figura 2.7 (página “38”). La envolvente es cero en los puntos donde la diente de sierra hace la envoltura, y entre éstos, se eleva suavemente hasta un valor de 1 (para una ganancia unitaria). Si la frecuencia de la onda diente de sierra es f en ciclos por segundo, entonces su valor oscila entre 0 y 1 cada R/f muestras (donde R es la velocidad de las muestras). La diferencia entre los valores sucesivos es así f/R. Si x[n] denota la salida del oscilador diente de sierra, entonces

x[n + 1] - x[n] = f/R (excepto en los puntos de envoltura). Si ajustamos el rango de salida del oscilador de tabla de onda al valor s (tal como está hecho en la figura) obtenemos una nueva pendiente:

s • x[n + 1] - s • x[n] = sf/R Adicionar la constante d0 no tiene efecto sobre esta pendiente. La Transposición Momentánea (página “200”) es entonces:

t = 1 - sf/R Para completar el diseño del variador de afinación debemos adicionar otra copia a la mitad de la fase. Esto da como resultado un retraso que lee el patrón mostrado en la figura 7.22. El variador de afinación puede transponer hacia arriba (utilizando frecuencias

negativas, como en la figura) o hacia abajo (utilizando la positivas). El cambio en la afinación es controlado usualmente al cambiar f con s fijo. Para obtener un intervalo de transposición dado t, hacemos

f = [(t – 1)R]/s El tamaño de la ventana s debe escogerse suficientemente pequeño, en lo posible, de tal manera que las dos copias retrasadas (con una distancia de s/2 muestras) no suenen como ecos distintos. Sin embargo, los valores de s muy pequeños forzarán a f hacia arriba; los valores de f mayores a aproximadamente 5 Hertz darán como resultado una modulación muy audible. Así, si se requieren transposiciones muy grandes, es posible que se requiera incrementar el valor de s. Los valores típicos están en los rangos de 30 a 100 milisegundos (aproximadamente entre R/30 y R/10 muestras). Aunque la frecuencia podría ser cambiada incluso de manera discontinua, s debe ser cambiado más cuidadosamente. Una solución posible es enmudecer la salida mientras se cambia s discontinuamente; alternativamente s puede ser controlado mediante una rampa de manera continua pero esto ocasiona cambios Doppler difíciles de controlar. Una buena opción de envolvente es medio ciclo de una sinusoide. Si asumimos en promedio que las dos salidas del retraso no están correlacionadas (página “11”), la potencia de la señal de las dos líneas de retraso, depués de ser envueltas, se adicionarán en una constante (ya que la suma de los cuadrados de las dos envolventes es cero). Existen muchas variantes en este algoritmo de cambio de afinación. Una variante clásica utiliza una línea de retraso simple, sin ninguna envolvente. En esta situación es necesario escoger el punto en el cual el tiempo de retraso salta y el punto al que este salta, de tal manera que la salida permanece continua. Por ejemplo, uno debería encontrar un punto donde la señal de salida pasa por cero (un “cruce del cero”) y salta discontinuamente a otro. Usar únicamente una línea de retraso tiene la ventaja de que la señal de salida suena más “presente”. Una desventaja es que, debido a que el tiempo de retraso es una función del valor de la señal de entrada, la salida no es más una función lineal de la entrada, así las entradas no periódicas pueden dar lugar a artefactos tales como diferencias en los sonidos. 7.10 Ejemplos Línea de retraso sin interpolación, fija. El ejemplo G01.delay.pd (figura 7.23) aplica una línea de retraso simple a una señal de entrada. Se necesita de dos nuevos objetos: delwrite~: define y escribe una línea de retraso. La primera creación de argumento da el nombre de la línea de retraso (y dos líneas de retraso no deben compartir el mismo nombre). La segunda creación de argumentos es la longitud de la línea de retrasos en milisegundos. La entrada toma una señal de audio y la escribe continuamente dentro de la línea de retrasos. delread~: lee (o “aprovecha”) una línea de retrasos. La primera creación de argumento da el nombre de la línea de retraso (el cual deberá coincidir con el nombre del objeto delwrite~ correspondiente; así es como Pd sabe cuál delwrite~ debe asociar con el objeto delread~). La segunda creación de argumentos (opcional) es el tiempo de retraso en milisegundos. Este no debe ser negativo ni tampoco debe exceder la longitud de la línea de retraso tal como se especifica por el objeto delwrite~. Los números (mensajes) de entrada pueden ser utilizados para cambiar el tiempo de retraso de manera dinámica. Sin embargo esto ocasionará algunos cambios discontinuos en la salida, los cuales deberán

enmudecerse si el tiempo de retraso cambia. El ejemplo empareja de manera simple un objeto delwrite~ con otro delread~ para fabricar un retraso simple, sin interpolación. La señal de entrada es una grabación en lazo. La señal retrasada y la no retrasada se añaden para hacer un filtro peine sin recirculación. En tiempos de retraso cercanos a los 10 milisegundos, el efecto del filtro es más pronunciado, y sobre ese tiempo, se vuelve audible un eco discreto. No hay protección de enmudecimiento en la salida del retraso, de tal manera que los ruidos son posibles cuando cambia el tiempo de retraso. Filtro peine recirculante. El ejemplo G02.delay.loop.pd (figura 7.24) muestra cómo fabricar una red de retraso recirculante. EL retraso se logra de nuevo con el par delwrite~/delread~. La salida del objeto delread~ está multiplicada por una ganancia de retroalimentación de 0.7 la cual es entregada al objeto delwrite~. Una entrada (suministrada por el objeto phasor~ y los objetos sociados) se adiciona a la entrada de delwrite~; esta suma es la salida de la red. Este es el filtro peine recirculante de la sección 7.4. La red de los objetos tilde no tiene ciclos, en el sentido de objetos que se alimentan directa o indirectamente (a través de la conexión con otros objetos). La retroalimentación en la red ocurre implícitamente entre los objetos delwrite~ y delread~. Línea de retraso variable. El ejemplo siguiente, G03.delay.variable.pd (figura 7.25), es otro filtro peine recirculante, que utiliza en esta ocasión una línea de retraso de longitud variable. Se introduce un nuevo objeto aquí: vd~: Lee una línea de retraso, con un tiempo de retraso variable. Al igual que con el objeto delread~, este lee de una línea de retraso cuyo nombre es especificado como un argumento de creación. En lugar de utilizar un segundo argumento y/o mensajes de control para especificar el tiempo de retraso, para el objeto vd~ el retraso en milisegundos está especificado por una señal de audio que entra. La línea de retraso se lee utilizando interpolación de cuatro puntos (cúbica); el mínimo retraso posible es de una muestra. Aquí los objetos del lado izquierdo, de arriba a abajo hasta el objeto clip~ -0.2 0.2, forman un red de conformación de onda; el índice se ajusta por medio del control de timbre, y la salida de la conformación de onda varía entre casi una sinusoide y un sonido brillante, zumbante. La salida se añade al objeto vd~. La suma se pasa luego por un filtro pasa-altos (el objeto hip~ en la parte inferior izquierda), se multiplica por una ganancia de retroalimentación, se recorta, y se escribe en la línea de retraso en la parte inferior derecha. Hay un control a la derecha para ajusar la ganancia de retroalimentación, aquí, en contraste con el ejemplo previo, es posible especificar una ganancia mayor que uno con el fin de obtener una retroalimentación inestable. Por esta razón el segundo objeto clip~ se inserta dentro del lazo del retraso (justo encima del objeto delwrite~), de tal manera que la señal no puede exceder a 1 en valor absoluto. La longitud del retraso está controlado por la señal de entrada al objeto vd~. Un oscilador con frecuencia y ganancia variables, en el centro de la figura, proporciona el tiempo de retraso. El oscilador se adiciona a uno para hacerlo no negativo antes de multiplicarlo por el control de “cycle depth” , el cual ajusta de manera efectiva el rango de los tiempos de retraso. El tiempo mínimo de retraso posible de 1.46 milisegundos se adiciona de tal manera que el rango verdadero de los tiempos de retraso está entre el mínimo y este mismo valor mínimo, más dos veces la “profundidad”. La razón para este

tiempo de retraso mínimo se discute en el ejemplo siguiente. Los filtros peine con tiempos de retraso variables son a veces llamados flangers. Cuando el tiempo de retraso cambia, el pico en la respuesta a frecuencia se mueve arriba y abajo en la frecuencia, de tal manera que el timbre a la salida cambia de manera característica. Orden de ejecución y límites inferiores en los tiempos de retraso Cuando se utilizan retrasos (así como otros objetos tilde que se comparten en Pd), el orden en el cual se realizan las operaciones de escritura y de lectura pueden afectar el resultado del cómputo. Aunque los objetos tilde en el parche pueden tener una tipología complicada para las conexiones de audio, en realidad Pd las ejecuta todas en orden secuencial, una después de la otra, para computar cada bloque de audio de salida. Este orden lineal está garantizado para ser compatible con las interconexiones de audio, en el sentido de que ningún cómputo de un objeto tilde es realizado hasta que toda su entrada, para ese mismo bloque, ha sido computada. La figura 7.26 muestra dos ejemplos de topologías de objetos tilde y su traducción a una secuencia de cómputos. En la parte (a) hay cuatro objetos tilde, y según ls conexiones, el objeto a~ debe producir su salida antes de que b~ ó c~ puedan correr; estos dos últimos son usados en cambio en el cómputo de d~. Así los posibles ordenamientos de estos cuatro objetos son “a-b-c-d” o “a-cb-d”. Estos dos ordenamientos tendrán exactamente el mismo resultado a no ser que el cómputo de b~ y c~ afecte de alguna manera la salida del otro (lo que podría ocurrir en operaciones de retrasos, por ejemplo). La parte (b) de la figura muestra un ciclo de objetos tilde. Esta red no puede ser organizada dentro de un orden secuencial compatible, ya que tanto a~ como b~ requiere la salida del otro para ser computado en primer lugar. En general un ordenamiento secuencial de los objetos tilde es posible si y sólo si no hay ciclos en ninguna parte de la red de los objetos tilde y en sus interconexiones de señal de audio. Pd reporta un error cuando aparece tal ciclo. (Note que la situación para interconexiones de control entre objetos es más complicada y flexible; ver la documentación de Pd para más detalles.) Para ver el efecto del orden de cómputo en un par delwrite~/delread~, podemos escribir explícitamente las señales de entrada y de salida en dos órdenes posibles, con el retraso mínimo posible. Si la operación de escritura va primero, en un bloque de inicio en la muestra número N, la operación se puede escribir como:

x[N],...,x[N + B - 1] → delwrite~ donde B es el tamaño del bloque (como en la sección 3.2). Habiendo puesto esas muestras en particular en la línea de retraso, un delread~ a continuación es capaz de leer los mismos valores a la salida: delread~ → x[N],...,x[N + B - 1] De otro lado, suponga que el objeto delread~ viene antes del delwrite~. Entonces las muestras x[N],...,x[N + B - 1] aún no han sido almacenadas en la línea de retraso, de tal manera que las muestras más recientes que pueden leídas pertenecen al bloque previo: delread~ → x[N - B],...,x[N - 1] x[N],...,x[N + B - 1] → delwrite~ Aquí el retraso mínimo que posiblemente obtengamos es el tamaño del bloque B. Así el retraso mínimo es 0 ó B, dependiendo del orden en el cual los objetos y

delread~ y delwrite~ están organizados en una secuencia de ejecución. Regresando a los parches de las figuras 7.24 y 7.25, los cuales presentan retrasos recirculantes, los objetos delread~ o vd~ deben colocarse antes en la secuencia que el objeto delwrite~. Esto sucede en cualquier diseño en el cual la salida de un retraso es retroalimentada a su entrada. El retraso mínimo es B muestras. Para una velocidad de muestras (típica) de 44100 Hertz y tamaño de bloque de 64 muestras, este viene a ser 1.45 milisegundos. Esto podría no sonar en principio como una restricción importante. Pero si usted está tratando de afinar un filtro peine recirculante en un tono específico, el más alto que usted puede obtener es cercano a sólo 690 Hertz. Para obtener retrasos de recirculación más cortos usted debe incrementar la velocidad de las muestras o reducir el tamaño del bloque. El ejemplo G04.control.blocksize.pd (figura 7.27) muestra cómo el tamaño del bloque puede ser controlado en Pd utilizando un nuevo objeto: block~, switch~: Ajusta el tamaño del bloque local de la ventana del parche en la cual está ubicado el objeto. Los tamaños de los bloques están normlmente en potencias de dos. El objeto switch~, adicionalmente, puede ser utilizado para encender y apagar el cómputo de audio en la ventana, utilizando mensajes de control. La creación de argumentos adicionales puede ajustar la velocidad de las muestras y especificar las operaciones de traslape (demostradas en el capítulo 9). En la parte (a) de la figura (el parche principal), un pulso rectangular es enviado al sub-parche pd delay-writer, cuya salida retorna luego al parche principal. La parte (b) muestra el contenido del subparche, el cual envía los pulsos a un retraso recirculante. El objeto block~ especifica que, en este subparche, la señal de cómputo utiliza un tamaño de bloque (B) de sólo uno. Así el retraso mínimo que se puede obtener es de una muestra, en vez de 64. El poner un pulso (u otra señal de excitación) en un filtro peine con recirculación es a veces llamado síntesis de Karplus-Strong, habiendo sido descrita por ellos en un ensayo [KS83], aunque la idea parece ser anterior. Esta se muestra por ejemplo en la pieza de Paul Lansky de 1979, Seis Fantasías sobre un Poema de Thomas Campion. Orden de ejecución en las líneas de retrasos sin recirculación En las redes de retraso sin recirculación, es posible ubicar la operación de escritura dentro de la línea de retraso, anterior en la secuencia a la de lectura. No debería haber así límite inferior a lo largo de la línea de retraso (a excepción de lo que se imponga por el esquema de interpolación; ver sección 7.7). En lenguages tales como Csound, la secuencia de los cómputos de la unidad de generación es (casi siempre) explícita, así que es fácil especificarla. En ambientes de parches gráficos, sin embargo, el orden es implícito y se debe tomar otra aproximación para asegurar que, por ejemplo, un objeto delwrite~ sea computado antes que el obejeto delread~ correspondiente. Una manera de lograr esto se muestra en el ejemplo G05.execution.order.pd (figura 7.28). En la parte (a) de la figura, las conexiones en el parche no determian cuál es el orden en el que aparecen las dos operaciones de retraso, en la secuencia de cómputo clasificada de los objetos tilde; el objeto delwrite~ puede computarse antes o después del objeto vd~. Si deseamos asegurar que la operación de escritura suceda antes de la operación de lectura, podemos proceder como en la parte (b) de la figura y poner las dos operaciones en subparches, conectando los dos vía señales de audio de tal forma que el primer subparche deba ser computado antes que el segundo. (El cómputo de audio en los subparches es realizado automáticamente, en el sentido de que los contenidos del subparche entero son considerados como el cómputo de audio para el subparche como un todo. Así todo en el primer subparche sucede antes que cualquier cosa suceda en el segundo

subparche.) En este ejemplo, la forma “correcta”·y la forma “incorrecta” para hacer un filtro peine tienen resultados audibles diferentes. Para retrasos de menos de 64 muestras, el lado derecho del parche (el que utiliza los subparches) da el resultado correcto, pero el parche del lado izquierdo no puede producir retrasos en tamaños de bloques por debajo de 64 muestras. Filtro peine sin recirculación como duplicador de octava En el ejemplo G06.octave.doubler.pd (figura 7.29) retomamos la idea de un modificador de octava basado en el tono, que introdujimos antes en E03.octave.divider.pd. Allí, conocer la periodicidad de un sonido a la entrada nos permitió afinar un modulador de anillo para introducir subarmónicos. Aquí realizamos el duplicador de octava descrito en la sección 7.3. Utilizando un filtro peine sin recirculación, variable, tomamos los armónicos impares, dejando únicamente los pares, dará como resultado un sonido una octava más alta. Como antes, la envolvente espectral del sonido es preservada con aproximación por la operación, de tal manera que podemos evitar el efecto “chipmunk” que podríamos haber tenido utilizando el cambio de velocidad para hacer la transposición. El filtrado peine se hace combinando dos copias retrasadas de la señal de entrada (del subparche pd looper en la parte superior). La copia fija (delread~) es ajustada al tamaño de la ventana a la altura que sigue al algoritmo. Toda vez que en el ejemplo anterior esta estaba escondida en otro subparche, podemos mostrarla ahora de manera explícita. El retraso en milisegundos es estimado como igual a la ventana de las 2048 muestras utilizada por el objeto fiddle~; en milisegundos esto viene a ser 1000•2048/R donde R es la velocidad de las muestras. El retraso variable es el mismo, más 1/2 del período medido del sonido entrante, o 1000/(2f) milisegundos, donde f es la frecuencia en ciclos por segundo. La suma de este y el tiempo de retraso fijo es luego suavizado utilizando un objeto line~ para hacer la señal de entrada por la línea de retraso variable. Dado que la diferencia entre los dos retrasos es de 1/(2f), las frecuencias resonantes del filtrado peine resultante son 2f, 4f, 6f...; la respuesta a la frecuencia (sección 7.3) es cero en las frecuencias f, 3f,..., de tal manera que el sonido resultante contiene sólo parciales en los múltiplos de 2f -una octava por encima de la original. Visto de otra manera, el sonido entrante es la salida duplicada, con medio ciclo de diferencia; los armónicos impares son de este modo desplazados 180 grados (¼ radianes) y cancelados; los armónicos pares están en fase con sus copias retrasadas y permanecen en la suma. Tanto este como el divisor de octava puede alterarse haciendo cambios de 3 o 4 a uno en la frecuencia, y también pueden combinarse para hacer cambios compuestos tales como el de una quinta musical (razón de 3:2) descendiendo una octava y luego ascendiendo, multiplicando por un factor de tres. (Debe hacer el descenso de octava antes del cambio ascendente para mejores resultados.) Filtros peine complejos variantes en el tiempo: agitadores El ejemplo G07.shaker.pd (figura 7.30) muestra una manera diferente de extender la idea de un filtro peine. Aquí combinamos la señal de entrada en cuatro cambios de tiempo diferentes (en lugar de dos, como en filtro peine sin recirculación original), cada uno a una ganancia diferente positiva o negativa. Para hacer esto, insertamos la señal de entrada en una línea de retraso y la insertamos en tres puntos diferentes; el cuarto “inserto” es la señal original, sin retraso. Una manera de pensar la respuesta a la frecuencia de un filtro peine de cuatro

insertos, es considerar primero lo que sucede cuando dos de las cuatro ganancias son cercanas a cero. Terminamos con un filtro peine sin recirculación, simple, con la ligera complicación que las ganancias de las dos copias retrasadas pueden ser diferentes. Si son del mismo signo, obtenemos los mismos picos y valles que se predicen en la sección 7.3, sólo que con los valles entre los picos posiblemente menos profundos. Si son de signos opuestos, los valles se vuelven picos y los picos se vuelven valles. Dependiendo de cuáles de los dos insertos supongamos diferente de cero, los espacios entre los picos y los valles son de diferente magnitud; los tiempos de retraso se escogen de tal manera que 6 diferentes tiempos de retraso pueden aparecer de esta manera, con rangos entre los 6 y los 30 milisegundos. En el caso general en cual todas las ganancias son diferentes de cero, podemos imaginar la función de respuesta a la frecuencia variando continuamente entre estos extremos, dando una sucesión de patrones complejos. Esto tiene el efecto de elevar y disminuir las amplitudes de los parciales de la señal de entrada, todos independientemente de los otros, en un patrón complicado, para dar un timbre continuamente variable en el tiempo. El lado derecho del parche se encarga de la ganancia de la señal de entrada y de las de sus tres copias cambiantes en el tiempo. Cada vez que el objeto metro dispara, un contador se incrementa (los objetos f, + 1, mod 4). Este controla cuáles de las amplitudes serán cambiadas. La amplitud misma se computa fabricando un número aleatorio y normalizándolo para que su valor caiga entre -0.7 y 1.3. El valor aleatorio y el índice se empacan (junto con un tercer valor, un intervalo de tiempo) y esta tripleta va al objeto route. El primer elemento de la tripleta (el contador) selecciona a qué salida enviar los otros dos valores; como resultado, a uno de los cuatro posibles objetos line~ le llega un mensaje para ir en rampa a un nuevo valor. Si la variación de tiempo se realiza con la rapidez suficiente, hay también un efecto de modulación sobre la señal original; en esta situación los segmentos de línea recta utilizados en este ejemplo deben ser reemplazados por señales de modulación con un contenido de frecuencia más controlable, por ejemplo, utilizando filtros (materia del capítulo 8). Reverberador El ejemplo G08.reverb.pd (figura 7.31) muestra un reverberador artificial simple, en escencia una realización del diseño mostrado en la figura 7.15. Cuatro líneas de retraso se alimentan con la entrada y con su propia salida recirculada. Las salidas retrasadas son entremezcladas utilizando matrices de rotación, construidas de rotaciones elementales de ¼/4 como en la figura 7.13 (parte a). La multiplicación de normalización (por √1/2 en cada estadio) es absorbida por la ganancia de retroalimentación, la cual de esta manera no puede exceder 1/2. Con una ganancia de retroalimentación de exactamente 1/2, toda la energía de salida de las líneas de retraso es reinsertada a estas, de tal manera que la reverberación es perpetua. La figura 7.32 muestra el interior de la abstracción reverb-echo utlizada en el reverberador. Las dos entradas se mezclan (utilizando la misma matriz de rotación y dejando de nuevo la renormalización para después). Luego un canal se retrasa. Los tiempos de retraso se seleccionan para crecer de manera aproximadamente exponencial; esto asegura un patrón de ecos suaves y esparcidos. Son posibles muchas extensiones de esta idea de las cuales nombraremos una cuantas. Es natural, en primer lugar, poner filtros pasa-bajos al final de las líneas de retraso, para imitar el decaimiento típicamente más rápido de las frecuencias altas con respecto a las frecuencias bajas. Es común utilizar más de cuatro retrasos recirculantes; un reverberador en la distribución Pd usa

dieciséis. Finalmente es común permitir el control separado de las amplitudes de los ecos tempranos (escuchados directamente) con respecto al de la señal recirculante; parámetros como estos son tomados para controlar cualidades sónicas tales como “presencia”, “calidez”, “claridad”, etc. Modificador de altura El ejemplo G09.pitchshifter.pd (figura 7.33) muestra la realización del modificador de altura descrito en la sección 7.9. Una línea de retraso (definida y escrita en cualquier sitio en el parche) es leída utilizando dos objetos vd~. Los tiempos de retraso varían entre un retraso mínimo (provisto como el control “delay”) y ese mínimo más un tamaño de ventana (el control “window”). El cambio de altura deseado, en semitonos (h) es convertido primero en un factor de transposición

t = 2h/12 = elog(2)/12.h ≈ e0.05776h (llamado “speed change” en el parche). El cómputo etiquetado “tap head rotation speed” es el mismo de la fórmula para f dada en la página 206. Aquí el intervalo positivo (siete semitonos) hace que se eleve a un factor de transposición mayor que uno, y de esta manera a un valor negativo para f. Una vez se calcula f, la producción de las dos señales de fase diente de sierra y las envolventes correspondientes, son un paralelo exacto del lazo de muestras traslapado (ejemplo B10.sampler.overlap.pd, página 54). El retraso mínimo se adiciona a cada una de las dos señales dientes de sierra para hacer entradas de retraso para los objetos vd~, cuyas salidas son multiplicadas por las envolventes correspondientes y sumadas. Ejercicios 1. Un número complejo tiene magnitud 1 y argumento ¼/4. Cuáles son sus partes real e imaginaria? 2. Un número complejo tiene magnitud uno y parte real 1/2. Cuál es su parte imaginaria? (Hay dos posibles valores.) 3. Qué tiempo de retraso debería darle a un filtro peine para que su primer pico de respuesta a la frecuencia esté a 440 Hertz? Si la velocidad de las muestras es de 44100, qué frecuencia deberá corresponder al retraso entero más cercano? 4. Suponga que hizo una variación en un filtro peine sin recirculación de tal manera que la señal retrasada es sustraída de la original, en lugar de adicionarla. Cuál debería ser la nueva respuesta a la frecuencia? 5. Si usted quiere hacer un vibrato de 6 Hertz con sinusoidalmente, y si quiere que la frecuencia del tan grande podría necesitar que fuera la variación cambiar esto si la misma profundidad de vibrato se

una línea de retraso variando vibrato cambie en un 5%, qué del retraso? Cómo debería quisiera a 12 Hertz?

6. Una sinusoide compleja X[n] tiene frecuencia de 11025 Hertz, amplitud 50 y fase inicial de 135 grados. Otra, Y[n] tiene la misma frecuencia pero amplitud 20 y fase inicial 45 grados. Cuál es la amplitud y la fase inicial de la suma de X y Y?

7. Cuáles son la frecuencia, la fase inicial y la amplitud de la señal obtenida cuando X[n] (arriba) es retrasada 4 muestras? 8. Muestre que la respuesta a la frecuencia de un filtro peine con recirculación, con un retraso d y una ganancia de retroalimentación g, como función de la frecuencia angular !, es igual a

Capítulo 8

Filtros En el capítulo previo vimos que una red de retrasos puede tener una respuesta a la frecuencia no uniforme -una ganancia que varía en función de la frecuencia. Las redes de retraso también cambian típicamente la fase de las señales de entrada de manera variable, dependiendo de la frecuencia. Cuando los tiempos de retraso utilizados son muy cortos, las propiedades más importantes de una red de retrasos vienen a ser su respuesta a la frecuencia y a la fase. Una red de retrasos que está diseñada específicamente para su respuesta a la frecuencia o a la fase es llamada un filtro. En diagramas de bloques, los filtros se muestran como en la figura 8.1 (parte a). La curva que se ve dentro del bloque da una representación cualitativa de la respuesta a la frecuencia del filtro. La respuesta a la frecuencia puede variar con el tiempo, y dependiendo del diseño del filtro, uno o más controles (o entradas de audio adicionales) podrían utilizarse para cambiarla. Suponga, siguiendo el procedimiento de la sección 7.3, que ponemos una sinusoide de una unidad de amplitud, de valor complejo con frecuencia angular ! dentro del filtro. Esperamos obtener una sinusoide de la misma frecuencia y alguna amplitud que depende de !. Esto nos da una función H(!) de valor complejo, llamada función de transferencia del filtro. La respuesta a la frecuencia es la ganancia como una función de la frecuencia !. Esta es igual a la magnitud de la función de transferencia. Una respuesta a la frecuencia de un filtro se acostumbra graficar como en la figura 8.1 (parte b). Una sinusoide entrante de amplitud unitaria de frecuencia ! sale del filtro con magnitud |H(!)|. A veces es útil conocer la respuesta a la fase de un filtro, igual a /(H(!)). Para una frecuencia fija ! la fase de salida del filtro será /(H(!)) radianes por delante de su fase de entrada. El diseño y la utilización de los filtros es una materia completa, debido a que el amplio rango de los usos de un filtro podría sugerir una variedad amplia de procesos para sus diseños. En algunas aplicaciones un filtro debe seguir exactamente una respuesta a la frecuencia prescrita, en otros es importante minimizar el tiempo de cómputo, en otros la respuesta a la fase es importante, y en otros aún, el filtro debe comportarse bien cuando sus parámetros cambian rápidamente con el tiempo. 8.1 Taxonomía de los filtros A lo largo de la historia de la música electrónica la tecnología para la construcción de filtros ha cambiado continuamente, pero cierto tipo de filtros reaparecen con frecuencia. En esta sección daremos alguna nomenclatura que describe filtros de varios tipos genéricos y recurrentes. Luego desarrollaremos algunas estrategias para fabricar filtros con características deseadas y finalmente discutiremos algunas aplicaciones comunes de los filtros en la música electrónica. 8.1.1 Filtros pasa-bajos y pasa-altos El propósito más frecuente para el uso de un filtro es extraer la porción de las frecuencias bajas o de las frecuencias altas de una señal de audio, atenuando el resto. Esto se logra utilizando un filtro pasa-bajos o pasa-altos. Idealmente un filtro pasa-bajos o pasa-altos debe tener una respuesta a la

frecuencia de uno para una frecuencia de corte específica hacia arriba (o hacia abajo) y de cero si se pasa de allí; pero tales filtros no pueden realizarse en la práctica. En lugar de esto tratamos de encontrar aproximaciones viables para esta respuesta ideal. Ponemos en esto la mayor parte del esfuerzo de diseño y de tiempo de cómputo, para acercarnos a esto lo mejor posible. La figura 8.2 muestra la respuesta a la frecuencia de un filtro pasa-bajos. La frecuencia está dividida en tres bandas, etiquetadas en el eje horizontal. La banda de paso es la región (banda de frecuencia) en la cual filtro debe pasar su entrada a su salida con ganancia unitaria. Para un filtro pasa-bajos (como el que se muestra), la banda de paso va desde una frecuencia de cero hasta un cierto límite de frecuencia hacia arriba. Para un filtro pasa-altos la banda de paso debe aparecer en el lado de la derecha de la gráfica y extenderse desde el límite de frecuencia hasta la más alta frecuencia posible. Cualquier banda de paso de un filtro real será únicamente aproximadamente plana; la desviación de la planitud es llamada rizo, y usualmente se especifica dando la razón entre la ganancia más alta y la más baja en la banda de paso, expresada en decibeles. El filtro pasa-bajos o pasa-altos ideal debe tener un rizo de 0 dB. La banda de parada de un filtro pasa-bajos o pasa-altos es la banda de frecuencia sobre la cual el filtro intenta no transmitir su entrada. La atenuación de la banda de parada es la diferencia, en decibeles, entre la ganancia más baja en la banda de paso y la ganancia más alta en la banda de parada. Idealmente esta debería ser infinita, y entre más alta, mejor. Finalmente un filtro realizable, cuya respuesta a la frecuencia es siempre una función continua de la frecuencia, debe tener una banda de frecuencia sobre la cual la ganancia cae desde la ganancia de la banda de paso hasta la ganancia de la banda de parada; esta es llamada banda de transición. Mientras más delgada se hace esta banda, se acerca más al filtro ideal. 8.1.2 Filtros pasa-banda y de banda de parada Un filtro pasa-banda admite frecuencias dentro de una banda dada, rechazando frecuencias por debajo y por encima de esta. La figura 8.3 muestra la respuesta a la frecuencia de un filtro pasa-banda, indicando sus parámetros claves. Un filtro de banda de parada hace lo contrario, rechazando las frecuencias dentro de la banda y dejando pasar las frecuencias por fuera de ésta. En la práctica, un idioma más simple es utilizado con frecuencia para describir los filtros pasa-banda, como se muestra en la figura 8.4. Aquí hay únicamente dos parámetros: un centro de frecuencia y un ancho de banda. Se considera que la banda de paso es la región donde el filtro tiene hasta la mitad de la ganancia pico de potencia (es decir, la ganancia está a 3 decibeles de su máximo). El ancho de banda es el ancho, medido en unidades de frecuencia, de la banda de paso. El centro de frecuencia es el punto de la máxima ganancia, el cual es aproximadamente el punto medio de la banda de paso. 8.1.3 Filtros de ecualización En algunas aplicaciones, tales como la ecualización, el objetivo no es el paso de señales con ciertas frecuencias, deteniendo otras al mismo tiempo, si no realizar ajustes controlables, acentuando o atenuando una señal, sobre un rango de frecuencia, por una ganancia deseada. Dos tipos de filtros son útiles para esto. Primero, un filtro de realce (figura 8.5) es utilizado para acentuar o reducir selectivamente ya sea lo más grave o lo más agudo del rango de frecuencia. Por debajo de un cruce de frecuencia seleccionada, el filtro tiende a una ganancia de frecuencias graves, y por encima de ésta, tiende a una ganancia de las altas. La frecuencia de cruce, la ganancia de las frecuencias bajas y la ganancia de las frecuencias altas puede ser ajustada de manera independiente.

El segundo, un filtro de pico (figura 8.6), es capaz de acentuar o atenuar señales dentro de un rango de frecuencias. La frecuencia central y el ancho de banda (los cuales controlan de manera conjunta el rango de frecuencias afectado), y las ganancias dentro de la banda y por fuera de la banda, son ajustadas por separado. Los ecualizadores paramétricos usualmente emplean dos filtros de realce (uno para ajustar los bajos y otro para los agudos) y dos o tres filtros de pico para ajustar las bandas entre aquéllos. 8.2 Filtros elementales Vimos en el capítulo 7 cómo predecir la respuesta a la frecuencia y a la fase de las redes de retrasos. El arte del diseño de filtros está en encontrar una red de retraso cuya función de transferencia (la que controla la respuesta a la frecuencia y a la fase) tiene una forma deseada. Desarrollaremos una aproximación para la construcción de tales redes de retraso con los dos tipos de filtros peine desarrollados en el capítulo 7: con recirculación y sin recirculación. Aquí estaremos interesados en el caso especial en cual el retraso es de sólo una muestra de longitud. En esta situación, las respuestas a la frecuencia mostradas en las figuras 7.6 y 7.10 ya no parecerán peines; el segundo pico desaparece del todo para la velocidad de muestras 2¼ radianes, cuando d = 1. Ya que únicamente las frecuencias entre 0 y la frecuencia de Nyquist (¼ radianes) son audibles, en efecto hay un solo pico cuando d = 1. En los filtros peine mostrados en el capítulo 7, los picos están situados en DC (frecuencia cero), pero usualmente queremos ubicarlos en otras frecuencias diferentes de cero. Esto se hace utilizando redes de retraso -filtros peine- con ganancias de valor complejo. 8.2.1 Filtro elemental sin recirculación Los filtros peine sin recirculación pueden ser generalizados dando lugar al diseño mostrado en la figura 8.7. Este es el filtro elemental sin recirculación, de la primera forma. Su único parámetro de valor complejo Q controla la ganancia compleja de la señal retrasada sustraída de la señal original. Para encontrar su respuesta a la frecuencia, como en el capítulo 7 alimentamos la red de retraso con una sinusoide compleja 1, Z, Z2, ... con frecuencia ! = arg(Z). La n-ésima muestra de la entrada es Zn y la salida de esta es (1 - QZ-1)Zn de tal manera que la función de transferencia es

H(Z) = 1 - QZ-1 Esto puede analizarse gráficamante como se muestra en la figura 8.8. Los números reales r y ® son la magnitud y el argumento del número complejo Q:

Q = r • (cos(®) + isen(®)) La ganancia del filtro es la distancia desde el punto Q al punto Z en el plano complejo. Analíticamente podemos ver esto porque |1 - QZ-1| = |Z||1 - QZ-1| = |Q - Z| Gráficamente, el número QZ-1 es precisamente el número Q rotado hacia atrás (en el sentido de las agujas del reloj) por la frecuencia angular ! de la sinusoide de entrada. El valor |1 - QZ-1| es la distancia desde QZ-1 a 1 en el plano complejo, la cual es igual a la distancia de Q a Z.

Ya que la frecuencia de entrada va y viene de 0 a 2¼, el punto Z viaja en el sentido contrario a las manecillas de reloj alrededor del círculo unitario. En el punto donde ! = ®, la distancia es como mínimo, igual a 1 - r. El máximo ocurre cuando Z está en el punto opuesto del círculo. La figura 8.9 muestra la función de transferencia para tres valores diferentes de r = |Q|. 8.2.2 Filtro sin recirculación, segunda forma Algunas veces necesitaremos una variante del filtro anterior, como se ve en la figura 8.10, llamado el filtro sin recirculación segunda forma. En lugar de multiplicar el retraso de salida por Q, multiplicamos la señal directa por su complejo conjugado Q. Si

A = a + bi

= r • (cos(®) + isen(®))

es un número complejo, su complejo conjugado está definido como:

A = a - bi

= r • (cos(®) - isen(®))

Gráficamente este refleja puntos del plano complejo arriba y abajo alrededor del eje real. La función de transferencia del nuevo filtro es

H(Z) = Q - Z-1 Esto da lugar a la misma respuesta a la frecuencia de antes ya que |Q - Z-1| = |Q - Z-1 | = |Q - Z| Aquí utilizamos el hecho de que Z = Z-1 para cualquier número complejo unitario Z, tal como puede ser verificado al escribir ZZ ya sea en la forma rectangular o en la forma polar. Aunque las dos formas del filtro elemental sin recirculación tienen la misma respuesta a la frecuencia, sus respuestas a la fase son diferentes; esto ocasionalmente nos hará preferir la segunda forma. 8.2.3 Filtro elemental con recirculación El filtro elemental con recirculación es el filtro peine con recirculación de la figura 7.7 con una ganancia de retroalimentación compleja P, como se muestra en la figura 8.11 (parte a). Con el mismo análisis de antes, alimentamos esta red con una sinusoide cuya n-ésima muestra Zn da una salida de:

Zn/(1 - PZ-1) de tal manera que la función de transferencia es

H(Z) = 1/(1 - PZ-1) El filtro con recirculación es estable cuando |P| < 1; si por el contrario, |P| > 1, la salida crece exponencialmente cada que la muestra retrasada recircula. La función de transferencia es de esta manera precisamente la inversa de la del filtro sin recirculación (primera forma). Al poner los dos en serie con P = Q, la salida teóricamente iguala la entrada. (Este análisis sólo cumple para entradas sinusoidales; que se cumple también para otras señales, puede ser verificado trabajando la respuesta al impulso combinada de la red). 8.2.4 Filtros compuestos

Podemos utilizar los filtros con recirculación y sin recirculación desarrollados aquí para crear un filtro compuesto poniendo varios de los filtros elementales en serie. Si los parámetros de los no recirculantes (del primer tipo) son Q1,...Qj y los de los recirculantes son P1,...Pk, entonces, al ponerlos a todos en serie, en cualquier orden, nos dará la función de transferencia:

H(Z) = [(1 - Q1Z-1)...(1 – QjZ-1)]/[(1 – P1Z-1)...(1 - PkZ-1)] La respuesta a la frecuencia del filtro compuesto resultante es el producto de las respuestas de sus elementales. (Uno podría combinar también filtros elementales sumando sus salidas o haciendo redes de ellos más complicadas; pero para la mayoría de los propósitos la configuración en serie es con la que se trabaja más fácilmente.) 8.2.5 Salidas reales de filtros complejos En la mayoría de las aplicaciones, comenzamos con una señal de valor real para filtrar y requerimos una salida de valor real, pero en general un filtro compuesto con una función de transferencia como la anterior nos dará una salida de valor complejo. Sin embargo podemos construir filtros con coeficientes no reales los cuales no obstante dan salidas con valores reales, de tal manera que el análisis que hacemos utilizando números complejos puede ser utilizado para predecir, explicar y controlar señales de salida de valor real. Hacemos esto emparejando cada filtro elemental (con coeficiente P o Q) con otro que tenga como su coeficiente el complejo conjugado P o Q. Por ejemplo, al poner dos filtros sin recirculación, con coeficientes Q y Q en serie, nos queda una función de transferencia igual a:

H(Z) = (1 – QZ-1) • (1 – QZ-1) la cual tiene la propiedad de que:

H(Z) = H(Z) Ahora si ponemos una sinusoide de valor real:

Xn = 2re(AZn) = AZn + AZn obtenemos:

A • H(Z) • Zn + A • H(Z) • Zn la cual, por inspección, es otra sinusoide. Aquí estamos utilizando dos propiedades de los complejos conjugados. La primera, que se puede sumarlos y multiplicarlos a voluntad:

A + B = A + B AB = A • B y segundo que cualquier suma con su complejo conjugado es real y es precisamente dos veces su parte real:

A + A = 2re(A) Este resultado para dos filtros conjugados se extiende para cualquier filtro compuesto; en general, siempre obtenemos una salida con valor real de una entrada con valor real si disponemos para que cada coeficiente Qi y Pi en el filtro compuesto sea de valor real o aparezca emparejado con su complejo

conjugado. 8.2.6 Dos filtros con recirculación por el precio de uno Cuando emparejamos filtros con recirculación elementales, es posible evitar el cómputo de cada par, siempre y cuando la entrada sea de valor real (y por lo tanto la salida también.) Suponiendo que la entrada es una sinusoide real de la forma:

AZn + AZ-n y aplicamos un solo filtro son recirculación con coeficiente P. Siendo a[n] la parte real de la salida, tenemos:

a[n] = re[AZn/(1 - PZ-1) + AZ-n/(1 - PZ)] = re[AZn/(1 - PZ-1) + AZn/(1 – PZ-1)] = re[(AZn)(2 – 2re(P)Z-1)/((1 - PZ-1)(1 – PZ-1))] = re[[(AZn)(1 – re(P)Z-1)/((1 - PZ-1)(1 – PZ-1)) + [(AZ-n)(1 – re(P)Z-1)/ ((1 - PZ-1)(1 – PZ-1))]] (En el segundo paso usamos el hecho de que usted puede conjugar parte o el total de una expresión, sin cambiar el resultado, si usted de todas maneras, sólo va a tomar la parte real. En el cuarto paso se hizo lo mismo, pero en sentido inverso.) Comparando la entrada con la salida, vemos que el efecto de pasar una señal real a través de un filtro complejo de un polo y luego tomar su parte real, es equivalente a pasar la señal a través de un filtro con un cero, dos polos, con función de transferencia igual a:

Hre(Z) = (1 – re(P)Z-1)/((1 - PZ-1)(1 – PZ-1)) Unos cálculos similares muestran que tomar la parte imaginaria (considerada como una señal real) es equivalente a filtrar la entrada con la función de transferencia:

Him(Z) = (im(P)Z-1)/((1 - PZ-1)(1 – PZ-1)) Así, al tomar la parte real o imaginaria de un filtro de un polo, a la salida obtenemos dos filtros con dos polos conjugados. Las dos partes pueden ser combinadas para sintetizar filtros con otros posibles numeradores; en otras palabras, con un filtro con recirculación complejo podemos sintetizar un filtro que actúe sobre las señales reales con dos polos (complejos conjugados) y un cero (real). Esta técnica, conocida como fracciones parciales, puede ser repetida por cualquier número de etapas en serie, siempre y cuando computemos la combinación apropiada de las partes real e imaginaria a la salida de cada etapa para formar la entrada (real) de la siguiente etapa. No parecen existir atajos similares para los filtros sin recirculación; para ellos es necesario computar cada miembro de cada par complejo conjugado explícitamente. 8.3 Diseño de filtros La respuesta a la frecuencia de una serie de filtros elementales con recirculación y sin recirculación puede estimarse gráficamante dibujando todos los coeficientes Q1,...Qj y P1,...Pk en el plano complejo y razonando como en la figura 8.8. La respuesta a la frecuencia general es el producto de todas las distancias desde el punto Z a cada uno de los Qi, dividida por el producto de las distancias a cada uno de los Pi.

Uno habitualmente marca cada uno de los Qi con una “o” (y lo llama un “cero”) y cada uno de los Pi con una “x” (un “polo”); sus nombres son prestados del campo del análisis complejo. Un gráfico mostrando los polos y los ceros asociados con un filtro es llamado con poca imaginación, gráfico polo-cero. Cuando Z está cercano a cero la respuesta a la frecuencia tiende a sumergirse, y cuando está cerca a un polo, tiende a elevarse. El efecto de un polo o de un cero es más pronunciado, y también más localizado, si está cerca al círculo unitario en el cual está constreñido Z. Los polos deben quedar dentro del círculo unitario para ser un filtro estable. Los ceros pueden quedar sobre o por fuera de este, pero cualquier cero Q por fuera del círculo unitario puede ser reemplazado por uno dentro de el, en el punto 1/Q, para dar un múltiple constante de la misma respuesta a la frecuencia. Excepto en casos especiales mantendremos los ceros dentro del círculo al igual que los polos. En el resto de esta sección mostraremos cómo construir algunos de los tipos de filtros más ampliamente utilizados en la música electrónica. La teoría del diseño del filtro digital es vasta, y aquí únicamente daremos una introducción. Un tratamiento más profundo está disponible en línea por Julius Smith en ccrma.stanford.edu. Ver también [Ste96] para una introducción al diseño de filtros desde el punto de vista más general del procesamiento de señal digital. 8.3.1 Filtro pasa-bajos de un polo El filtro pasa-bajos de un polo posee un solo polo localizado en un número real positivo p, como se ilustra en la figura 8.12. Este es sólo un filtro peine con recirculación con retraso de longitud d = 1, y se aplica el análisis de la sección 7.7. La ganancia máxima ocurre a la frecuencia cero, correspondiendo al punto en el círculo más cercano al punto p. La ganancia aquí es 1/(1 – p). Asumiendo que p es cercano a uno, si nos movemos una distancia de 1 – p unidades hacia arriba o hacia abajo del eje real (horizontal), la distancia se incrementa por un factor de aproximadamente √2, y de esta manera esperamos que el punto de mitad de potencia ocurre en una frecuencia angular de aproximadamente 1 – p. Este cálculo es usualmente hecho a la inversa: si queremos que el punto de mitad de la potencia quede a una frecuencia angular !, hacemos p = 1 - !. Esta aproximación sólo trabaja bien si el valor ! está bien por debajo de ¼/2, como es usual en la práctica. Es costumbre normalizar el filtro pasa-bajos de un polo, multiplicándolo por el factor constante 1 – p para dar una ganancia de 1 a la frecuencia cero; las frecuencias que no son cero tendrán entonces una ganancia menor que uno. La respuesta a la frecuencia es graficada en la figura 8.12 (parte b). Las frecuencias audibles únicamente alcanzan la mitad de la gráfica; el lado derecho de la curva de respuesta a la frecuencia queda toda por encima de la frecuencia de Nyquist ¼. El filtro pasa-bajos de un polo se utiliza con frecuencia para buscar las tendencias en señales ruidosas. Por ejemplo, si se utiliza un controlador físico y sólo interesan los cambios en el orden de 1/10 de segundo, se pueden suavizar los valores con un filtro pasa-bajos cuyo punto de mitad de potencia es de 20 o 30 ciclos por segundo. 8.3.2 Filtro pasa-altos de un polo y un cero A veces una señal de audio lleva una constante desviada que no se desea, o en otras palabras, un componente de frecuencia cero. Por ejemplo, el espectro de onda de la sección 5.3 casi siempre contiene un componente constante. Este es inaudible, pero, debido a que especifica la potencia eléctrica que es enviada a

sus parlantes, su presencia reduce el nivel de volumen que usted puede alcanzar sin distorsión. Otro nombre para un componente de señal constante es “DC”, que significa “corriente directa”. Una forma fácil y práctica para remover el componente de frecuencia cero de una señal de audio es utilizar un filtro pasa-bajos de un polo para extraerlo, y luego sustraer el resultado de la señal. La función de transferencia resultante es uno menos la función de transferencia del filtro pasa-bajos:

H(Z) = 1 – (1 - p)/(1 – pZ-1) = p (1 - Z-1)/(1 – pZ-1) El factor de 1 - p en el numerador de la función de transferencia del filtro pasa-bajos es el factor de normalización requerido para que la ganancia sea uno en la frecuencia cero. Examinando el lado derecho de la ecuación (comparándolo con la fórmula general para los filros compuestos), vemos que todavía hay un polo en el número real p, y hay ahora también un cero en el punto 1. El gráfico del polo cero se muestra en la figura 8.13 (parte a), y la respuesta a la frecuencia en la parte (b). (A partir de ahora graficaremos únicamente respuestas hasta la frecuencia de Nyquist ¼; en el ejemplo previo graficamos todo hasta la velocidad de las muestras 2¼.) 8.3.3 Filtros de realce Generalizando el filtro anterior de un polo y un cero, suponga que ubicamos el cero en un punto q, un número menor que uno pero cercano a este. El polo, en el punto p, está situado de manera similar, y podría ser mayor que o menor que q, es decir, a la derecha o a la izquierda respectivamente, pero con ambos, p y q dentro del círculo unitario. Esta situación se diagrama en la figura 8.14. En los puntos del círculo que están lejos de p y q los efectos del polo y del cero son casi inversos (las distancias hasta ellos son casi iguales), de tal manera que el filtro pasa aquellas frecuencias casi sin alteraciones. En las vecindades de p y q, del otro lado, el filtro tendrá una ganancia mayor o menor que uno dependiendo de cuál de los dos p o q está más cercano al círculo. Esta configuración actúa de esta manera como un filtro realce de baja frecuencia. (para fabricar un filtro realce de alta frecuencia hacemos lo mismo, sólo que ubicamos p y q cercanos a -1 en lugar de 1.) Para encontrar los parámetros de un filtro de realce dada una transición de frecuencia ! (en unidades angulares) y ganancia de baja frecuencia g, escogemos primero una distancia promedio d, como se ilustra en la figura, desde el polo y el cero hacia el borde del círculo. Para valores pequeños de d, la región de influencia es cerca de d radianes, así que simplemente hacemos d = ! para obtener la transición de frecuencia deseada. Ponemos luego el polo en p = 1 - d/√g y el cero en q = 1 - d/√g. La ganancia en la frecuencia cero es entonces (1 – q)/(1 – p) = g tal como se quería. Por ejemplo, en la figura, d es 0.25 radianes y g es 2. 8.3.4 Filtro pasa-banda Comenzando con los tres tipos de filtros mostrados arriba, todos con polos y ceros de valor real, los transformamos ahora para operar en bandas localizadas por fuera del eje real. Los filtros pasa-bajos, pasa-altos y de realce se convertirán en filtros pasa-banda, banda de parada y de pico. Desarrollemos

primero el filtro pasa-banda. Suponga que queremos un centro de frecuencia a ! radianes y un ancho de banda de ¯, aproximadamente a p = 1 - ¯. Rote ahora este valor en ! radianes en el plano complejo, es decir, multiplique por el número complejo cos! + isen!. El nuevo polo queda en

P1 = (1 - ¯)(cos! + isen!) Para tener una salida de valor real, esta debe estar emparejada con otro polo:

P2 = P1 = (1 - ¯)(cos! - isen!) El gráfico polo-cero resultante se muestra en la figura 8.15. El pico está aproximadamente (no exactamente) en el centro de frecuencia deseado !, y la respuesta a la frecuencia cae en 3 decibeles aproximadamente ¯ radianes por encima y por debajo de este. Usualmente se quiere normalizar el filtro para tener una ganancia pico cercana a la unidad; esto se hace multiplicando la entrada o la salida por el producto de las distancias de los dos polos al pico en el círculo, o (muy aproximadamente):

¯*(¯ + 2!) Para alguna aplicaciones es deseable adicionar un cero en los puntos 1 y -1, de tal manera que la ganancia cae a cero en las frecuencias angulares 0 y ¼. 8.3.5 Filtro pico y banda de parada De la misma manera un filtro polo y el cero, y proveyendo figura 8.16. Si el centro de del cero son p y q, entonces

pico se obtiene de un filtro de realce rotando el un polo y un cero conjugados, como se muestra en la frecuencia deseado es ! y los radios del polo y ubicamos el polo y el cero de arriba en

P1 = p • (cos! + isen!) Q1 = q • (cos! + isen!) Como un caso especial, colocar el cero sobre el círculo unitario da un filtro de banda de parada; en este caso la ganancia en el centro de frecuencia es cero. Este es análogo al filtro pasa-altos de un polo y un cero visto anteriormente. 8.3.6 Filtros Butterworth Un filtro con un polo real y un cero real puede ser configurado como un filtro de realce, como un filtro pasa-altos (poniendo el cero en el punto 1) o como un filtro pasa-bajos (poniendo el cero a -1). La respuesta a la frecuencia de estos filtros es muy contundente; en otras palabras, las regiones de transición son amplias. Con frecuencia es deseable un filtro más nítido, sea de realce, pasaaltos o bajos, cuyas dos bandas sean más planas y separadas por una región de transición más estrecha. Un procedimiento prestado del mundo de los filtros análogos transforma filtros de un polo y un cero a sus correspondientes filtros Butterworth, los cuales poseen regiones de transición más estrechas. Este procedimiento se describe clara y elegantemente en [Ste96]. La derivación utiliza más conocimientos matemáticos que los que hemos desarrollado aquí, y simplemente presentaremos el resultado, sin derivarlo. Para hacer un filtro Butterworth pasa-altos, pasa-bajos o filtro de realce, suponga que tanto el polo como el cero están dados por la expresión (1 – r2)/(1 + r2) donde r es un parámetro con rango de 1 a ∞. Si r = 0 este es el punto 1, y si

r = ∞ es -1. Entonces, por razones que quedarán en el misterio, reemplazaremos el punto (ya sea polo o cero) por n puntos dados por: [(1 – r2) – (2rsen(®))i]/[1 + r2 + 2rsen(®)] donde el rango de ® está sobre los valores: (¼/2)(1/n – 1), (¼/2)(3/n – 1),...,(¼/2)((2n – 1)/n - 1) En otras palabras, ® queda en n ángulos igualmente espaciados entre -¼/2 y ¼/2. Los puntos están organizados en el plano complejo como se muestra en la figura 8.17. Ellos están sobre un círculo que cruza el punto de valor real original, que corta a su vez el círculo unitario en ángulos rectos. Un buen estimado para la frecuencia de corte o de transición definida por estas colecciones circulares de polos o ceros es sencillamente el punto donde el círculo intersecta al círculo unitario, correspondiendo a ® = ¼/2. Esto da el punto [(1 – r2) – 2ri]/(1 + r2) el cual, luego de algo de álgebra, da una frecuencia angular igual a

¯ = 2arctan(r) La figura 8.18 (parte a) muestra un diagrama de polo cero y respuesta a la frecuencia para un filtro pasa-bajos Butterworth con tres polos y tres ceros. La parte (b) muestra la respuesta a la frecuencia del filtro pasa-bajos y de los otros tres filtros que se obtiene al escoger diferentes valores de ¯ (y por lo tanto de r) para los ceros, mientras deja los polos estacionarios. Mientras los ceros progresan de ¯ = ¼ a ¯ = 0, el filtro, que comienza como un filtro pasabajos, se convierte en un filtro de realce y luego en uno pasa-altos. 8.3.7 Estirando el círculo unitario con funciones racionales En la sección 8.3.4 vimos una forma simple de convertir un filtro pasa-bajos en uno pasa-banda. Es tentador aplicar el mismo método para convertir nuestro filtro pasa-bajos Butterworth en un filtro pasa-banda de alta calidad; pero si queremos preservar la alta calidad del filtro Butterworth debemos ser más cuidadosos que antes en el diseño de la transformación utilizada. En esta sección prepararemos la manera de fabricar el filtro Butterworth pasa-banda usando un tipo de transformaciones racionales del plano complejo, las cuales preservan el círculo unitario. Esta discusión es adaptada de [PB87], págs.201-206 (estoy agradecido con Julius Smith por este punto). Aquí la transformación es llevada en el tiempo continuo, pero hemos adaptado el método para operar en el tiempo discreto, con el fin de hacer una discusión auto-contenida. La idea es comenzar con cualquier filtro con una función de transferencia como se vio anteriormente:

H(Z) = [(1 - Q1Z-1)...(1 – QjZ-1)]/[(1 – P1Z-1)...(1 - PkZ-1)] cuya respuesta a la frecuencia (la ganancia a la frecuencia !) está dada por: |H(cos(!) + isen(!))| Suponga ahora que podemos encontrar una función racional, R(Z), que distorsiona

el círculo unitario de una manera deseable. Que R sea una función racional significa que puede escribirse como el cociente de dos polinomios (por ejemplo la función H es una función racional). Que R envíe puntos sobre el círculo unitario a otros puntos sobre el mismo círculo unitario es precisamente la condición de que |R(Z)| = 1 siempre que Z = 1. Puede comprobarse fácilmente que cualquier función de la forma

R(Z) = U • (AnZn + An-1Zn-1 + ... + A0)/(A0Zn + A1Zn-1 + … + An) (donde |U| = 1) tiene esta propiedad. El mismo razonamiento de la sección 8.2.2 confirma que |R(Z)| = 1 siempre que Z = 1. Una vez tenemos una función racional apropiada R, podemos simplemente componer esta con la función de transferencia original H para fabricar una nueva función racional,

J(Z) = H(R(Z)) La ganancia del nuevo filtro J en la frecuencia ! es entonces igual a la de H a una diferencia de frecuencia Á, escogida de tal manera que: cos(Á) + isen(Á) = R(cos(!) + isen(!)) La función R mueve puntos alrededor del círculo unitario; J en cualquier punto es igual a H sobre el punto R que lo mueve. Por ejemplo, suponga que comenzamos con un filtro pasa-bajos de un cero y un polo:

H(Z) = (1 + Z-1)/(1 - gZ-1) y aplicamos la función

R(Z) = -Z2 = -(1 • Z2 + 0 • Z + 0)/(0 • Z2 + 0 • Z + 1) Geométricamente esta opción de R estira el círculo unitario uniformemente a dos veces su circunferencia y lo envuelve completamente dos veces. Los puntos 1 y -1 son enviados ambos al punto -1, y los puntos i y -i son enviados al punto 1. La función de transferencia resultante es

J(Z) = (1 + Z-2)/(1 – gZ-2) = [(1 – Z-1)(1 + Z-1)]/[(1 – i√gZ1)(1 + i√gZ1)] Las gráficas del polo cero de H y J se muestran en la figura 8.19. Partiendo de un filtro pasa-bajos terminamos con un filtro pasa-banda. Los puntos i y -i a los cuales R envía a 1 (donde la ganancia del filtro original es la más alta) se convierten en los puntos de más alta ganancia para el nuevo filtro. 8.3.8 Filtro Butterworth pasa-banda Podemos aplicar la transformación R(Z) = -Z2 para convertir el filtro Butterworth en un filtro pasa-banda de alta calidad con centro de frecuencia ¼/2. Una transformación adicional puede aplicarse después para cambiar el centro de frecuencia a cualquier valor ! deseado entre 0 y ¼. La transformación será de la forma,

S(Z) = (aZ + b)/(bZ + a) donde a y b son números reales y ninguno es cero. Este es un caso particular de

la forma general dada anteriormente para las funciones racionales que preservan el círculo unitario. Tenemos S(1) = 1 y S(-1) = -1, y las mitades superior e inferior del círculo unitario son transformadas simétricamente (si Z va a W entonces Z va a W). El efecto cualitativo de la transformación S es aplastar los puntos del círculo unitario hacia 1 o -1. En particular, dado un centro de frecuencia ! deseado, queremos escoger S de tal manera que:

S(cos(!) + isen(!)) = i Si hacemos R = -Z2 como antes, y dejamos que H sea la función de transferencia para un filtro pasa-bajos Butterworth, entonces el filtro combinado con la función de transferencia H(R(S(Z))) será un filtro pasa-banda con centro de frecuencia !. Al resolver para a y b da:

a = cos(¼/4 - !/2), b = sen(¼/4 - !/2) La nueva función de transferencia, H(R(S(Z))), tendrá 2n polos y 2n ceros (siendo n el grado del filtro Butterworth H). Conocer la función de transferencia es bueno, pero es mucho mejor conocer la localización de todos los polos y ceros del nuevo filtro, los cuales requerimos poder computar usando filtros elementales. Si Z es un polo de la función de transferencia J(Z) = H(R(S(Z))), esto es, si J(Z) = ∞, entonces R(S(Z)) debe ser un polo de H. Lo mismo para los ceros. Para encontrar un polo o cero, sea R(S(Z)) = W , donde W es un polo o un cero de H, y resuelve para Z. Esto da: -[(aZ + b)/(bZ + a)]2 = W (aZ + b)/(bZ + a) = ±√-W

Z = (±a√-W – b)/(∓b√-W + a) (Aquí a y b están tal cual se dieron antes y utilizamos el hecho de que a2 + b2 = 1). Un ejemplo de un gráfico de polo-cero y de respuesta a la frecuencia de J se muestra en la figura 8.20. 8.3.9 Coeficientes que varían con el tiempo En algunos diseños de filtro recursivos, cambiar los coeficientes del filtro puede inyectar energía al sistema. Una analogía física es la de un niño en su columpio. El niño oscila hacia atrás y hacia adelante con la frecuencia de resonancia del sistema, y empujar o halar del niño inyecta o extrae energía del sistema suavemente. Sin embargo, si usted decide acortar la cadena o mover el columpio usted mismo, puede inyectar una cantidad impredecible de energía al sistema. Lo mismo sucede cuando usted cambia los coeficientes en un filtro resonante con recirculación. Los filtros simples de un polo y un cero utilizados aquí no tienen esta dificultad; si la ganancia de retroalimentación o de ante-alimentación es cambiada suavemente (en el sentido de una envolvente de amplitud) la salida se comportará también de manera suave. Pero una sutileza aparece al tratar de normalizar la salida de un filtro recursivo, cuando la ganancia de retroalimentación es cercana a uno. Por ejemplo, suponga que tenemos un filtro pasa-bajos de un polo con ganancia 0.99 (para una frecuencia de corte de 0.01 radianes, o 70 Hertz a la velocidad de muestras que es usual). Para normalizarlo para una unidad de ganancia en DC, multiplicamos por 0.01. Suponga que ahora queremos el doble de la frecuencia de corte cambiando la ganancia ligeramente a 0.98. Esto está bien, excepto que el factor de normalización súbitamente se

dobla. Si multiplicamos la salida del filtro por el factor de normalización, la salida súbitamente, pero sólo por un momento, saltará a un factor de dos. El truco es normalizar a la entrada del filtro, no a la salida. La figura 8.21 (parte a) muestra un filtro con recirculación complejo, con ganancia de retroalimentación P, normalizado a la entrada por 1 - |P|, de tal forma que el pico de ganancia es uno. La parte (b) muestra la manera incorrecta de hacerlo, multiplicando a la salida. Las cosas se vuelven más complicadas cuando varios filtros elementales con recirculación se ponen en serie, ya que el factor de normalización correcto está, en general, en función de todos los coeficientes. Una aproximación posible es que cuando se vaya a cambiar rápidamente algún filtro, normalizar cada entrada por separado, y multiplicar luego la salida, finalmente, por la corrección que se necesite posteriormente. 8.3.10 Respuesta al impulso de los filtros con recirculación En la sección 7.4 analizamos la respuesta al impulso de un filtro peine con recirculación, del cual el filtro pasa-bajos de un polo es un caso especial. La figura 8.22 muestra el resultado para dos filtros pasa-bajos y un filtro resonante complejo de un polo. Todos son filtros elementales con recirculación como los introducidos en la sección 8.2.3. Cada uno está normalizado para tener una unidad de ganancia como máximo. En el caso de un filtro pasa-bajos, la respuesta al impulso se alarga (y desciende) cuando el polo se acerca más a uno. Suponga que el polo está en un punto 1 – 1/n (de tal forma que la frecuencia de corte es 1/n radianes). El factor de normalización es también 1/n. Después de n puntos, la salida disminuye por un factor de (1 – 1/n)n ≈ 1/e donde e es la constante de Euler, aproximadamente 2.718. Se puede decir que el filtro tiene un ajuste de tiempo de n muestras. En la figura n = 5 para la parte (a) y n = 10 para la parte (b). En general, el ajuste del tiempo (en muestras) es aproximadamente uno sobre la frecuencia de corte (en unidades angulares). La situación se vuelve más interesante cuando miramos un filtro resonante de un polo, esto es, uno cuyo polo está sobre el eje real. En la parte (c) de la figura, el polo P tiene un valor absoluto de 0.9 (como en la parte b), pero su argumento se ajusta a 2¼/10 radianes. Obtenemos el mismo ajuste de tiempo de la parte (b), pero la salida timbra a la frecuencia de resonancia (y de esta manera a un periodo de 10 muestras en este ejemplo). Una pregunta natural es cuántos períodos de timbrado obtenemos antes de que el filtro decaiga a una fuerza de 1/e? Si el polo de un filtro resonante tiene una magnitud de 1 – 1/n como se muestra arriba, vimos en la sección 8.2.3 que el ancho de banda (llamado b) es aproximadamente 1 – 1/n, y vemos aquí que el ajuste de tiempo es aproximadamente n. La frecuencia de resonancia (llamada !) es el argumento del polo, y el período en muestras del timbrado es 2¼/!. El número de períodos que hacen el ajuste de tiempo es, de esta manera:

n/(2¼/!) = (1/2¼)(!/b) = q/2¼ donde q es la calidad del filtro, definida como el centro de frecuencia dividida por el ancho de banda. Los filtros resonantes están usualmente especificados en términos del centro de frecuencia y de “q”, en lugar del ancho de banda.

8.3.11 Filtros pasa-todo A veces un filtro se aplica para obtener un cambio de fase deseado, en lugar de alterar las amplitudes de los componentes de la frecuencia de un sonido. Para hacer esto podríamos necesitar una manera de diseñar filtros con una respuesta a la frecuencia constante unitaria, pero que cambie la fase de una sinusoide de entrada de una manera que dependa de su frecuencia. Ya vimos en el capítulo 7 que un retraso de longitud d introduce un cambio de fase de -d!, a una frecuencia angular !. Otro tipo de filtros llamados filtros pasa-todo, puede hacer cambios de fase, las cuales pueden ser las funciones más interesantes de !. Para diseñar un filtro pasa-todo, comenzamos con dos hechos: primero un filtro elemental con recirculación y uno elemental sin recirculación se cancelan entre sí si tienen el mismo coeficiente de ganancia. En otras palabras, si una señal pasa a través de un filtro de un cero, ya sea real o compleja, el efecto puede revertirse al aplicarse secuencialmente un filtro de un polo, y viceversa. El segundo hecho es que un filtro elemental sin recirculación, de la segunda forma tiene la misma respuesta a la frecuencia que el de la primera forma; ellos sólo difieren en la respuesta a la fase. Así si combinamos un filtro elemental con recirculación con otro elemental sin recirculación de la segunda forma, las respuestas a la frecuencia se cancelan (para una ganancia plana independiente de la frecuencia) pero la respuesta a la fase no es constante. Para encontrar la función de transferencia, escogemos el mismo número complejo P < 1 como coeficiente para ambos filtros elementales y multiplicamos sus funciones de transferencia:

H(Z) = (P – Z-1)/(1 - PZ-1) El coeficiente P controla tanto la ubicación de un polo (en P mismo) y la del cero (en 1/P). la figura 8.23 muestra la respuesta a la fase del filtro pasatodo para cuatro opciones de valor real del coeficiente p. En las frecuencias 0, ¼ y 2¼ la respuesta a la fase es precisamente la de un retraso de una muestra; pero para las frecuencias en el medio, la respuesta a la fase es curvada hacia arriba o hacia abajo dependiendo del coeficiente. Los coeficientes complejos dan curvas de respuesta a la fase similares, pero las frecuencias a las cuales ellos cruzan la línea diagonal en la figura es cambiada según el argumento del coeficiente P. 8.4 Aplicaciones Los filtros son utilizados en un amplio rango de aplicaciones tanto en la ingeniería del audio como en la música electrónica. La primera incluye, por ejemplo, ecualizadores, divisores de frecuencia de parlantes, convertidores de velocidades de muestras, y supresores de componentes DC (que ya utilizamos en los primeros capítulos). Aquí sin embargo, nos ocuparemos de las aplicaciones específicamente musicales. 8.4.1 Síntesis sustractiva La síntesis sustractiva es una técnica que utiliza filtros para dar forma a la envolvente espectral de un sonido, formando otro sonido, usualmente preservando las cualidades del sonido original tales como su afinación, su dureza, lo ruidoso, o lo granuloso de este. La envolvente espectral del sonido resultante es el producto de la envolvente del sonido original con la respuesta a la frecuencia del filtro. La figura 8.24 muestra una configuración posible de la fuente, el filtro, y el resultado.

El filtro puede ser constante o variante en el tiempo. Siendo ya ampliamente utilizada a mediados de la década de 1950, la síntesis sustractiva tuvo su auge con la introducción del filtro controlado por voltaje (VCF), el cual estuvo ampliamente disponible en a mediados de la década de 1960 con la aparición de la síntesis modular. Un VCF típico tiene dos entradas: una para el sonido que se va a filtrar y otra para variar la frecuencia central o de corte. Un uso popular de un VCF es controlar el centro de frecuencia de un filtro resonante del mismo generador ADSR que controla la amplitud; un posible diagrama de bloques se muestra en la figura 8.25. En esta configuración, la porción con mayor volumen de una nota (el volumen controlado de manera aproximada por el multiplicador de la parte inferior) puede también hacerse sonar más brillante, utilizando el filtro, que las partes más silenciosas; esto puede simular la evolución espectral de las cuerdas o de los instrumentos de viento metal durante la vida de una nota. 8.4.2 Seguidor de envolvente Es con frecuencia deseable utilizar la potencia variable en el tiempo de una señal de entrada para disparar o controlar un proceso musical. Para hacer esto necesitaremos un proceso para medir la potencia de una señal de audio. Ya que la mayoría de las señales de audio pasan por el cero muchas veces por segundo, no será suficiente tomar valores instantáneos de la señal para medir su potencia; en lugar de eso, debemos calcular la potencia promedio en un intervalo de tiempo lo suficientemente largo para que sus variaciones no vayan a mostrar incremento en la potencia estimada, pero lo suficientemente corto como para que los cambios en la señal sean reportados rápidamente. Un proceso de cómputo que provea un estimado de la variación de la potencia en el tiempo de una señal es llamado un seguidor de envolvente. La salida de un filtro pasa-bajos puede ser vista como un movimiento promedio de su entrada. Por ejemplo, suponga que aplicamos un filtro pasa-bajos de un polo normalizado con coeficiente p, como en la figura 8.21, a una señal de entrada x[n]. La salida (llamada y[n]) es la suma de la salida retrasada p veces, con la entrada 1 - p veces:

y[n] = p • y[n – 1] + (1 - p) • x[n] de tal manera que cada entrada está promediada, con peso 1 - p, en la salida previa para producir una nueva salida. De tal manera que usted puede hacer un movimiento promedio del cuadrado de una señal de audio utilizando el diagrama de la figura 8.26. La salida es un promedio que varía en el tiempo, de la potencia instantánea x[n]2, y el diseño del filtro pasa-bajos controla, entre otras cosas, el ajuste del tiempo del movimiento promedio. Para adentrarnos más en el diseño de un filtro pasa-bajos apropiado para un seguidor de envolvente, lo analizamos desde el punto de vista del espectro de la señal. Si, por ejemplo, ponemos una sinusoide de valor real:

x[n] = a • cos(®n) el resultado de su cuadrado es:

x[n]2 = (a2/2)(cos(2®n) + 1) y así, si el filtro pasa-bajos detiene efectivamente el componente de frecuencia 2® obtendremos aproximadamente la constante a2/2 la cual es en realidad la potencia promedio. La situación para señales con varios componentes es similar. Suponga que la

señal de entrada es ahora,

x[n] = a • cos(®n) + b • cos(¯n) cuyo espectro es graficado en la figura 8.27 (parte a). (Hemos omitido los dos términos de las fases, pero no tendrán efecto en el resultado.) Al elevar al cuadrado la señal, se produce el espectro mostrado en la parte (b) (ver sección 5.2).) Podemos obtener el valor fijo deseado de (a2 + b2)/2 simplemente filtrando todos los demás componentes; idealmente el resultado será una señal constante DC. En tanto filtremos todos los parciales, además de las diferencias de afinación, lograremos una salida estable que estima correctamente la potencia promedio. Los seguidores de envolventes pueden ser utiliados también en señales ruidosas, las cuales pueden pensarse como señales con espectros densos. En esta situación habrá diferencias de frecuencias arbitrariamente cercanas a cero, y filtrarlas por completo será imposible; siempre tendremos fluctuaciones a la salida, pero ellas decrecerán proporcionalmente en tanto la banda de paso se estrecha. 8.4.3 Modulación simple de banda lateral Tal como lo vimos en el capítulo 5, al multiplicar dos sinusoides reales tenemos como resultado una señal con dos componentes nuevos que son la suma y la diferencia de las frecuencias originales. Si llevamos a cabo la misma operación con sinusoides complejas, obtenemos únicamente una nueva frecuencia resultante; este es un resultado de la mayor simplicidad matemática de las sinusoides complejas comparadas con las reales. Si multiplicamos una sinusoide compleja 1, Z, Z2,... con otra 1, W, W2,... el resultado es 1, ZW, (ZW)2,... la cual es otra sinusoide compleja cuya frecuencia, /(ZW), es la suma de las dos frecuencias originales. En general, ya que las sinusoides complejas tienen propiedades más simples que las reales, es con frecuencia útil hacer la conversión de una sinusoide real a una compleja. En otras palabras, de la sinusoide real:

x[n] = a • cos(®n) (con un pico espectral de amplitud a/2 y frecuencia !) quisiéramos una manera de computar la sinusoide compleja:

X[n] = a(cos(!n) + isen(!n)) de tal manera que

x[n] = re(X[n]) Quisiéramos un proceso lineal para hacer esto, de tal manera que la superposición de las sinusoides sea lleve a cabo como si estuvieran separadas. Por supuesto hubiéramos podido escoger las sinusoides complejas igualmente con frecuencia -!:

X'[n] = a(cos(!n) - isen(!n)) y en efecto x[n] es precisamente la mitad de la suma de las dos. En escencia necesitamos un filtro que pase a través de las frecuencias positivas (en realidad las frecuencias entre 0 y ¼, corresponden a los valores de Z en la mitad superior del círculo unitario complejo) Uno puede diseñar un filtro así diseñando un filtro pasa-bajos con frecuencia de corte ¼/2, y luego ejecutar una rotación por ¼/2 radianes utilizando la técnica

de la sección 8.3.4. Sin embargo puede hacerse más fácilmente usando dos redes de filtros pasa-bajos especialmente diseñada, con coeficientes reales. Llamando la función de transferencia de los dos filtros H1 y H2 diseñamos los filtros de tal manera que /(H1(Z)) - /(H2(Z)) ≈

¼/2

0 < /(Z) < ¼

-¼/2

-¼ < /(Z) < 0

o en otras palabras

H1(Z) ≈ iH2(Z), 0 < /(Z) < ¼ H2(Z) ≈ -iH2(Z), -¼ < /(Z) < 0 Luego, para cualquier señal de entrada de valor real x[n] simplemente formamos un número complejo a[n] + ib[n] donde a[n] es la salida del primer filtro y b[n] es la salida del segundo. Cualquier componente sinusoidal complejo de x[n] (llamado Zn) será transformado a:

H1(Z) + iH2(Z) ≈

2H1(Z)

0 < /(Z) < ¼

0

para los demás valores

Habiendo comenzado con una señal de valor real, cuya energía es dividida por igual en frecuencias positivas y negativas, terminamos con una de valor real con sólo frecuencias positivas. 8.5 Ejemplos En esta sección introducimos primero algunos filtros prefabricados fáciles de usar disponibles en Pd para desarrollar ejemplos que muestren aplicaciones de la sección previa. Luego mostraremos algunas aplicaciones más sofisticadas que requieren de filtros especialmente diseñados. Filtros pasa-altos, pasa-bajos y pasa-banda prefabricados Los parches H01.low-pass.pd, H02.high-pass.pd y H03.band-pass.pd (fgura 8.28) muestran filtros de Pd, que implementan diseños de filtros descritos en las secciones 8.3.1, 8.3.2 y 8.3.4. Dos de los parches usan también un generador de ruido que no hemos introducido anteriormente. Necesitaremos de cuatro nuevos objetos Pd: lop~: filtro pasa-bajos de un polo. La entrada izquierda toma una señal que se va a filtrar, y la entrada derecha toma los mensajes de control para ajustar la frecuencia de corte del filtro. El filtro está normalizado de tal manera que la ganancia es uno cuando la frecuencia es 0. hip~: filtro pasa-altos de un polo y un cero, con las mismas entradas y salidas de lop~, normalizado para tener ganancia uno a la frecuencia de Nyquist. bp~: filtro resonante. La entrada de la mitad toma mensajes de control para ajustar el centro de frecuencia, y la entrada de la derecha para ajustar “q”. noise: generador de ruido blanco. Cada muestra es un número seudo-aleatorio, distribuidos uniformemente de -1 a 1. Los primeros tres parches de los ejemplos muestran estos tres filtros (ver la figura 8.28). los objetos lop~ y bp~ se demuesran con ruido en su entrada; hip~

se muestra removiendo el componente DC (frecuencia cero) de una señal. Filtro pasa-banda variante en el tiempo, prefabricado El filtrado pasa-banda variante en el tiempo, tal como se utiliza con frecuencia en la síntesis sustractiva clásica (sección 8.4.1), puede hacerse utilizando el objeto vcf~, introducido aquí: vcf~: un filtro pasa-banda “controlado por voltaje”, similar a bp~, pero con una señal de entrada para controlar el centro de frecuencia. Tanto bp~ como vcf~ son filtros resonantes de un polo como los desarrollados en la sección 8.3.4; bp~ tiene como salida la parte real de la señal resultante, mientras que vcf~ tiene a la salida las partes real e imaginaria por separado. El ejemplo H04.filter.sweep.pd (figura 8.29) demuestra el uso del objeto vcf~ para una tarea simple y característica de síntesis sustractiva. Un objeto phasor~ (en la parte superior) crea una onda diente de sierra para filtrar. (Esta no es en especial una buena práctica ya que no estamos controlando la posibilidad del sobre-doblado; un mejor generador de onda diente de sierra para este propósito será desarrollado en el capítulo 10.) El segundo objeto phasor~ (etiquetado “LFO for sweep”) controla el centro de frecuencia variable en el tiempo. Después de hacer los ajustes para la profundidad y un centro de frecuencia base (dado en unidades MIDI), el resultado se convierte Hertz (usando el objeto tabread4~ ) y es pasado a vcf~ para ajustar su centro de frecuencia. Otro ejemplo del uso del objeto vcf~ para la síntesis sustractiva se demuestra en el ejemplo H05.filter.floyd.pd. Seguidores de envolvente El ejemplo H06.envelope.follower.pd muestra una simple y didáctica realización del seguidor de envolvente descrita en la sección 8.4.2. Una aplicación interesante del seguidor de envolvente se muestra en el ejemplo H07.measure.spectrum.pd (figura 8.30, parte a). Una muestra famosa de una campana es ejecutada en lazo como sonido de chequeo. En lugar de obtener la media cuadrática general de la potencia, nos gustaría estimar la potencia y la frecuencia de cada uno de sus parciales. Para hacer esto movemos un filtro pasabajos arriba y abajo en la frecuencia, escuchando el resultado y/o mirando la potencia de salida del filtro utilizando un seguidor de envolvente. (Utilizamos dos filtros pasa-banda en serie para un mejor aislamiento de los parciales; este no es un diseño especialmente bueno de filtro, pero trabajará en este contexto.) Cuando el filtro es afinado en un parcial, el seguidor de envolvente reporta su fortaleza. El ejemplo H08.heterodyning.pd (parte (b) de la figura) muestra una manera alternativa para mostrar los parciales de una señal de entrada; tiene la ventaja de reportar la fase así como la fortaleza. Primero modulamos el parcial deseado a cero frecuencia. Utilizamos una sinuside de valor complejo como un modulador, de tal manera que obtenemos sólo una banda lateral por cada componente de la entrada. La frecuencia de chequeo es la única frecuencia que se modula a DC; las demás van a otras partes. Luego hacemos pasa-bajos de la señal compleja resultante. (Podemos utilizar un filtro pasa-bajos de valor real por separado para las partes real e imaginaria.) Este remueve escencialmente todos los parciales exceptuando el DC, el cual luego recolectamos. Esta técnica es la base del análisis de Fourier, materia del capítulo 9. Modulación de banda lateral simple Como se describió en la sección 8.4.3, un par de filtros pasa-todo pueden ser construidos para dar aproximadamente ¼/2 de fase de diferencia para frecuencias positivas y -¼/2 para las negativas. El diseño de estos pares está más allá del

objetivo de esta discusión (ver por ejemplo, [Reg93]) pero Pd provee una abstracción, hilbert~, para hacer esto. El ejemplo H09.ssb.modulation.pd, mostrado en la figura 8.31, demuestra cómo utilizar la abstracción hilbert~ para hacer la modulación de banda lateral de una señal. La transformación Hilbert data de la era análoga [Str95, págs.129-132]. Las dos salidas de hilbert~, consideradas como las partes real e imaginaria de una señal de valor complejo, son multiplicadas por una sinusoide (a la derecha en la figura), y la parte real es la salida. Los componentes de la señal resultante son aquellos de la entrada cambiados por una frecuencia (positiva o negativa) que se especifica en la caja de números. Utilizando filtros elementales: de realce y de pico No hay un conjunto finito de filtros que pudiera llenar todas las necesidades posibles, y por eso Pd provee los filtros elementales de las secciones 8.2.18.2.3 en forma no elaborada, de tal manera que el usuario pueda suministrar los coeficientes del filtro explícitamente. En esta seccion describiremos parches que realizan los filtros de realce y de pico de las secciones 8.3.3 y 8.3.5 directamente desde los filtros elementales. Primero introducimos los seis objetos Pd que realizan los filtros elementales: rzero~, rzero_rev~, rpole~: filtros elementales con coeficientes de valor real operando en señales de valor real. Los tres implementan filtros sin recirculación del primer y segundo tipo, y el filtro con recirculación. Todos ellos tienen una entrada, a la derecha, para suministrar el coeficiente que ajusta la localización del cero o del polo. La entrada para el coeficiente (así como la entrada izquierda de la señal a filtrar) toma señales de audio. No se ejecuta examen de estabilidad. czero~, czero_rev~, cpole~: filtros elementales con coeficientes de valor complejo, operando sobre señales de valor complejo, correspondientes a los anteriores de valor real. En lugar de dos entradas y de una salida, cada uno de estos filtros tiene cuatro entradas (partes real e imaginaria de la señal a filtrar, y partes real e imaginaria del coeficiente) y dos salidas para la señal compleja de salida. Los parches de los ejemplos utilizan un par de abstracciones para graficar la respuesta a la frecuencia y a la fase de los filtros según se explicó en el ejemplo H10.measurement.pd. El ejemplo H11.shelving.pd (figura 8.32, parte a) muestra cómo fabricar un filtro shelving. Un filtro elemental sin recirculación (rzero~) y uno elemental con recirculación (rpole~) se ponen en serie. Como podría sugerir el análisis de la sección 8.3.9, el objeto rzero~ es colocado de primero. El ejemplo H12.peaking.pd (parte (b) de la figura) implementa un filtro pico. Aquí el polo y el cero son rotados por un ángulo ! para controlar el centro de frecuencia del filtro. La ganancia del ancho de banda y del centro de frecuencia son iguales a la ganancia de la frecuencia de realce y del DC del filtro de realce correspondiente. El ejemplo H13.butterworth.pd demuestra un filtro Butterworth de realce, de tres polos y tres ceros. El filtro mismo es una abstracción, butterworth3~, para reutilizar con facilidad. Haciendo y utilizando filtros pasa-todo. El ejemplo H14.all.pass.pd (la figura 8.33, parte a) muestra cómo fabricar un filtro pasa-todo, partiendo de un filtro sin recirculación de la segunda forma (rzero_rev~) y un filtro con recirculación (rpole~). El coeficiente, que va de -1 a 1, está controlado en centésimos.

El ejemplo H15.phaser.pd (parte b de la figura) muestra cómo utilizar cuatro filtros pasa-todo para hacer un fasor clásico. El fasor trabaja sumando la señal de entrada con una versión de fase alterada de este, haciendo efectos de interferencia. La cantidad de cambio de la fase es variada en el tiempo al variar el coeficiente (compartido) de los filtros pasa-todo. El efecto general es algo similar a un flanger (filtro peine variable en el tiempo) pero el fasor no impone una afinación como lo hace el filtro peine. Ejercicios 1. Un filtro elemental con recirculación tiene un polo en i/2. A qué frecuencia angular está su mayor ganancia, y cuál es su valor? A qué frecuencia es su ganancia más baja y cuál es su valor? 2. Un filtro de realce tiene un polo en 0.9 y un cero en 0.8. Cuáles son: la ganancia DC; la ganancia en la frecuencia de Nyquist; la frecuencia de transición aproximada? 3. Suponga que un filtro con recirculación complejo tiene un polo en P. Suponga además que usted quiere combinar su salida real e imaginaria para fabricar una señal única, de valor real equivalente a la de un filtro con dos polos en P y en P. Cómo debería usted ponderar las dos salidas? 4. Suponga que desea diseñar un filtro pico con ganancia 2 a 1000 Hertz y ancho de banda de 200 Hertz (a una velocidad de muestras de 44100 Hertz). Dónde, aproximadamente debería poner el polo y el cero superiores? 5. En la misma situación, dónde debería poner el polo y el cero (superiores) para remover una sinusoide a 1000 Hertz por completo, mientras atenúa sólo 3 decibeles en los 1001 Hertz? 6. Un filtro complejo de un polo es excitado por un impulso para fabricar un sonido a 1000 Hertz, el cual decae 10 decibeles en un segundo (a una velocidad de muestras de 44100 Hertz). Dónde debería ubicar el polo? Cuál es el valor de “q”?

Capítulo 9

Análisis y resíntesis de Fourier Entre las aplicaciones de los filtros discutidos en el capítulo 8, vimos cómo utilizar el heterodino, combinado con un filtro pasa-bajo, para encontrar la amplitud y la fase de un componente sinusoidal de una señal (pág.”257”). En este capítulo refinaremos esta técnica dentro de lo que se ha llamado el análisis de Fourier. En su forma más simple el análisis de Fourier, toma camo su entrada cualquier señal periódica (de período N) y sus salidas son amplitudes de valor complejo de sus N posibles componentes sinusoidales. Estas N amplitudes complejas pueden ser utilizadas, en teoría, para reconstruír exactamente la señal original. Esta reconstrucción es llamada resíntesis de Fourier. En este capítulo comenzaremos por desarrollar la teoría del análisis y la resíntesis de Fourier de señales periódicas en muestras. Luego mostraremos cómo aplicar la misma técnica para señales arbitrarias, periódicas o no. Fnalmente desarrollaremos algunas aplicaciones comunes tales como el vocoder de fase. 9.1 Análisis de Fourier para señales periódicas Suponga que X[n] es una señal de valor complejo que se repite cada N muestras. (Continuamos con el uso de las señales de valor complejo en lugar de valor real para para simplificar las matemáticas.) Debido a su período N, los valores de X[n] para n = 0,...,N - 1 determinan a X[n] para todos los valores enteros de n. Suponga, además, que X[n] puede escribirse como una suma de sinusoides complejas de frecuencia 0, 2¼/N, 4¼/N,...,2(N -1)¼/N. Estos son los parciales, comenzando con el cero, para una señal de período N. Nos detenemos en el término N-ésimo debido a que el siguiente deberá tener frecuencia 2¼, equivalente a la frecuencia 0, que ya está en el listado. Dados los valores de X, deseamos encontrar las amplitudes complejas de los parciales. Suponga que queremos el k-ésimo parcial, donde 0 ≤ k < N. La frecuencia de este parcial es 2¼k/N. Podemos encontrar su amplitud compleja modulando hacia abajo 2¼k/N radianes de frecuencia por muestra, de tal manera que el k-ésimo parcial esté modulado a la frecuencia cero. Pasamos luego la señal por un filtro pasa-bajos con una frecuencia de corte tal que nada, excepto el parcial de frecuencia cero, permanezca. Podemos hacer esto en efecto promediando sobre todas las muestras; pero debido a que la señal se repite cada N muestras, este promedio complejo, es el mismo que el promedio de las primeras N muestras. En resumen, para medir un componente sinusoidal de una señal periódica, modúlela a DC y promedie luego sobre un período. Sea ! = 2¼/N la frecuencia fundamental para el período N y sea U el número complejo de magnitud unitaria con argumento !:

U = cos(!) + isen(!) El k-ésimo parcial de la señal X[n] es de la forma:

Pk[n] = Ak[Uk]n donde Ak es la amplitud compleja del parcial, y la frecuencia del parcial es: /(Uk) = k/(U) = k!

Asumimos por el momento que la señal X[n] puede ser escrita como la suma de n parciales, o en otras palabras:

X[n] = A0[U0] + A1[U1] + ... + AN-1[UN-1]n Por el argumento del filtrado heterodino anterior, esperamos ser capaces de medir cada Ak multiplicando por la sinusoide de frecuencia -k! y promediando sobre la mitad de un período:

Ak = ([U-k]0X[0] + [U-k]1X[1] + ... + [U-k]N-1X[N -1])/N Es esta una fórmula tan útil que tiene su propia notación. La transformada de Fourier de una señal X[n], sobre N muestras está definida como:

FT{X[n]}(k) = V0X[0] + V1X[1] + ... + VN-1X[N -1] donde V = U-k. La transformada de Fourier es una función de la variable k, que es igual a N veces la amplitud de la entrada del k-ésimo parcial. Hasta aquí hemos tomado a k como un enetero pero la fórmula tiene sentido para cualquier valor de k si definimos V más generalmente como:

V = cos(-k!) + isen(-k!) donde como antes, ! = 2¼/N es la frecuencia fundamental (angular) asociada con el período N. 9.1.1 Periodicidad de la transformada de Fourier Si X[n] es, como se dijo, una señal que se repite cada N muestras, la transformada de Fourier de X[n] también se repite cada N unidadaes de frecuencia, esto es,

FT{X[n]}(k + N) = FT{X[n]}(k) para todos los valores reales de k. Esto se sigue inmediatamente de la definición de la transformada de Fourier, ya que el factor

V = cos(-k!) + isen(-k!) no cambia cuando añadimos N (o múltiplos de N) a k. 9.1.2 Transformada de Fourier como síntesis aditiva Consideremos (Previamente aún no hemos manera). Sea

ahora una señal arbitraria X[n] que se repite cada N muestras. asumimos que X[n] se puede obtener como una suma de sinusoides y encontrado las X[n] periódicas que pueden ser obtenidas de esa Y[k] la transformada de Fourier de X para k = 0,..., N – 1:

Y[k] = FT{X[n]}(k) = [U-k]0X[0] + [U-k]1X[1] + ... + [U-k]N-1X[N -1] = [U0]-kX[0] + [U1]-kX[1] + ... +

[U-(N-1)]kX[N -1]

En la segunda versión reacomodamos los exponentes para mostrar que Y[k] es una suma de sinusoides complejas, con amplitudes complejas X[m] y frecuencias -m! para m = 0,..., N – 1. En otras palabras, Y[k] puede ser considerada como una

serie de Fourier por derecho propio, cuyos m-ésimos componentes tienen fortaleza X[-m]. (La expresión X[m] tiene sentido ya que X es una señal periódica. También podemos exprear la amplitud de los parciales de Y[k] en términos de su transformada de Fourier. Igualando ambas obtenemos: (1/N)FT{Y[k]}(m) = X[-m] Esto significa, en cambio, que X[-m] se puede obtener por la suma de sinusoides con amplitudes Y[k]/N. Haciendo n = -m tenemos:

X[n] = (1/N)FT{Y[k]}(-n) = [U0]nX[0] + [U1]nX[1] + ... + [UN-1]nX[N -1] Esto indica una suma de reconstruir los enteros

que cualquier X[n] periódica puede ser obtenida de esta manera como sinusoides. Es más, la fórmula muestra explícitamente cómo X[n] de su transformada de Fourier Y[k], si conocemos su valor para k = 0,..., N – 1.

9.2 Propiedades de las transformadas de Fourier En esta sección investigaremos qué sucede cuando tomamos la transformada de Fourier de una sinusoide (compleja). La más simple de éstas es “DC”, la sinusoide especial de frecuencia cero. Luego de que derivemos la transformada de Fourier de esta, desarrollaremos algunas propiedades de las transformadas de Fourier que nos permitirán aplicar el resultado para cualquier otra sinusoide. 9.2.1 La transformada de Fourier de DC Sea X[n] = 1 para todo n (que se repite para cualquier período entero que queramos N > 1). De la discusión precedente esperamos encontrar que

N

k = 0

0

k = 0,..., N – 1

FT{X[n]}(k) =

Sin embargo, usualmente necesitaremos conocer la respuesta para los valores no enteros de k, y para esto no se puede hace nada mejor que calcular el valor directamente:

FT{X[n]}(k) = V0X[0] + V1X[1] + ... + VN-1X[N -1] donde V es, como antes, un número complejo de magnitud unitario con argumento -k!. Esto es una serie geométrica; siempre que V ≠ 1, tenemos:

FT{X[n]}(k) = (VN - 1)/(V - 1) Simetrizamos ahora la parate superior y la parte inferior de la misma manera que lo hicimos antes en la sección 7.3. Para esto, hacemos:

» = cos(¼k/N) - isen(¼k/N) de tal manera que »2 = V. Luego factorizando las potencias de » apropiadas del numerador y el denominador, tenemos:

FT{X[n]}(k) = (»N-1)[(»N - »-N)/(» - »-1)]

Es fácil simplificar ahora el numerador:

»N - »-N = (cos(¼k) – isen(¼k)) - (cos(¼k) + isen(¼k)) = -2isen(¼k) y de manera similar para el denominador, tenemos:

FT{X[n]}(k) = (cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N))(sen(¼k)/(sen(¼k/N) Sea que V = 1 o no, tenemos

FT{X[n]}(k) = (cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N))DN(k) donde DN(k), conocido como el núcleo de Dirichlet, está definido como

N DN(k) =

k = 0

(sen(¼k)/(sen(¼k/N)

k ≠ 0, -N < k < N

La figura 9.1 muestra la transformada de Fourier de X[n], con N = 100. La transformada se repita cada 100 muestras, con un pico a k = 0, otro a k = 100, y así sucesivamente. La figura se esfuerza en mostrar el comportamiento tanto de la fase como de la magnitud utilizando una gráfica tridimensional proyectada sobre el papel. El término de la fase cos(¼k(N – 1)/N) – isen(¼k(N – 1)/N) tiene la función de hacer dar vueltas a los valores de FT{X[n]}(k) alrededor

del eje k con un período de aproximadamente dos. El núcleo Dirichlet DN(k), mostrado en la figura 9.2, controla la magnitud de FT{X[n]}(k). Tiene un pico de dos unidades de amplitud, alrededor de k = 0. Este está rodeado de lóbulos laterales de una unidad de ancho, alternando en signos y decreciendo gradualmente en magnitud mientras k se incrementa o disminuye partiendo del cero. El término de la fase rota casi ¼ radianes cada vez que el núcleo de Dirichlet cambia de signo, de tal manera que el producto de los dos permanece aproximadamente en la misma mitad del plano complejo para k > 1 (y en la mitad opuesta para k < -1). La fase rota por casi 2¼ radianes sobre el pico desde k = -1 a k = 1. 9.2.2 Movimientos y cambios de fase La sección 7.2 mostró cómo los cambios de tiempo de una señal cambia las fases de sus componentes sinusoidales, y la sección 8.4.3 mostró cómo al multiplicar una señal por una sinusoide compleja se cambian las frecuencias que la componen. Estos dos efectos tienen identidades correspondientes dentro de la transformada de Fourier. Consideremos primero un cambio de tiempo. Si X[n], como es usual, es una señal de valor complejo que se repite cada N muestras, hagamos que Y[n] sea X[n] retrasada d muestras:

Y[n] = X[n - d] que se repite también cada N muestras según lo hace X. Podemos rducir la transformada de Fourier de Y[n] de esta manera:

FT{Y[n]}(k) = V0Y[0] + V1Y[1] + ... + VN-1Y[N -1] = V0X[-d] + V1X[-d + 1] + ... + VN-1X[-d + N -1] = VdX[-d] + Vd+1 X[1] + ... + Vd+N-1X[N -1] = Vd(V0X[0] + V1X[1] + ... + VN-1X[N -1]) = VdFT{X[n]}(k) (La tercera línea es sólo la segunda con los términos sumados en un orden diferente). De esta manera obtenemos la Fórmula del Cambio de Tiempo para las Transformadas de Fourier:

FT{X[n - d]}(k) = (cos(-dk!) + isen(-dk!))FT{X[n]}(k) La transformada de Fourier de X[n - d] es un término de fases que multiplica la transformada de Fourier de X[n]. La fase se cambió por -dk!, una función lineal de la frecuencia k. Suponga ahora que cambiamos nuestra señal inicial X[n] multiplicándola por una exponencial compleja Zn con frecuencia angular ®:

Y[n] = ZnX[n] Z = cos(®) + isen(®) La transformada de Fourier es:

FT{Y[n]}(k) = V0Y[0] + V1Y[1] + ... + VN-1Y[N -1] = V0X[0] + V1ZX[1] + ... + VN-1ZN-1X[N -1] = (VZ)0X[0] + (VZ)1X[1] + ... + (VZ)N-1X[N -1] = FT{X[n]}(k - ®/!) Obtenemos así la Fórmula del Cambio de Fase para las Transformadas de Fourier:

FT{(cos(®) + isen(®))X[n]}(k) = FT{X[n]}(k - ®N/2¼) 9.2.3 Transformada de Fourier de una sinusoide Podemos usar la fórmula del cambio de fase anterior para encontrar la transformada de Fourier de cualquier sinusoide compleja Zn con frecuencia ®, haciendo simplemente X[n] = 1 en la fórmula y utilizando la transformada de Fourier para DC:

FT{Zn}(k) = FT{1}(k - ®/!) = [cos(©(k)) + isen(©(k))]DN(k - ®/!) donde DN es el núcleo de Dirichlet y © es un término de fase feo:

©(k) = -¼•(k - ®/!)•(N – 1)/N Si la frecuencia de la sinusoide ® es un entero múltiplo de la frecuencia

fundamental !, el núcleo de Dirichlet es cambiado a la izaquierda o a la derecha por un entero. En este caso los ceros del núcleo de Dirichlet están alineados con valores enteros de k, de tal manera que únicamente un parcial no es cero. Esto se ilustra en la figura 9.3 (parte a). La parte b muestra el resultado cuando la frecuencia ® cae en el medio de los dos enteros. Los parciales tienen amplitudes que caen aproximadamente en 1/k en ambas direcciones, medidas desde la frecuencia actual ®. Que la energía se deba esparcir entre muchos parciales cuando después de todo iniciamos con una sola sinusoide, podría parecer sorprendente al principio. Sin embargo, como se muestra en la figura 9.4, la señal se repite en el período N que no concuerda con la frecuencia de la sinusoide. Como resultado, hay aquí una discontinuidad al comienzo de cada período y la energía se arroja sobre un rango amplio de frecuencias. 9.3 El análisis de Fourier de señales no periódicas La mayoría de las señales no son periódicas, e incluso una periódica podría tener un período desconocido. De esta manera debería estar preparado para hacer el análisis de Fourier en señales sin hacer la confortable suposición de que la señal a analizar se repita a un período fijo N. Por supuesto podemos simplemente tomar N muestras de la señal y hacerla periódica; esto es escencialmente lo que hicimos en la sección previa, en la cual una sinusoide pura nos dio la complicada transformada de Fourier de la figura 9.3 (parte b). Sin embargo, debería ser mejor para tener un resultado en el cual la respuesta a una sinusoide pura estuviera mejor localizada alrededor del valor correspondiente de k. Podemos lograr esto usando la técnica de envolvente que introdujimos en la figura 2.7 (página “38”). Aplicando esta técnica para el análisis de Fourier no solamente mejorará nuestro análisis, si no que también arroja nueva luz en el muestreador de lazo con envolvente del capítulo 2. Dada una señal X[n], periódica o no, definida en los puntos 0 a N – 1, la técnica es envolver la señal antes del análisis de Fourier. La forma de la envolvente es conocida como la función ventana. Dada una función ventana ![n], la transformada de Fourier de ventana es:

FT{![n]X[n]}(k) Mucha tinta se ha derramado acerca de las funciones de ventana apropiadas para situaciones particulares, pero consideraremos aquí la más sencilla, llamada la función ventana de Hann (el nombre a veces se corrompe a “Hanning” en los círculos del DSP). La ventana de Hann es:

![n] = 1/2 – (1/2)cos(2¼n/N) Es fácil analizar el efecto de multiplicar una señal por la ventana de Hann antes de tomar la transformada de Fourier, debido a que la ventana de Hann puede escribirse como la suma de tres exponenciales complejas:

![n] = 1/2 – (1/4)Un - (1/4)U-n donde como antes, U es el número complejo de magnitud unitaria con argumento 2¼/N. Podemos ahora calcular la transformada de Fourier de ventana de una sinusoide Zn con frecuencia angular ® como antes. Las fases viene confusas y las reemplazaremos con aproximaciones simplificadas:

FT{![n]Zn}(k)

= FT{(1/2)Zn – (1/4)(UZ)n - (1/4)(U-1Z)n}(k) ≈ [cos(©(k)) + isen(©(k))]M(k - ®/!) donde el término fase es (aproximadamente):

©(k) = -¼•(k - ®/!) y la magnitud de la función es:

M(k) = [(1/2)DN(k) + (1/4)DN(k + 1) + (1/4)DN(k - 1)] La magnitud de la función M(k) es graficada en la figura 9.5. Los tres componentes del núcleo de Dirichlet se muestran también separadamente. El lóbulo principal de M(k) es de cuatro armónicos de ancho, dos veces el ancho del lóbulo principal del núcleo de Dirichlet. Los lóbulos laterales, de otro lado, tienen una magnitud mucho más pequeña. Cada lóbulo lateral de M(k) es una suma de tres lóbulos laterales de DN(k), uno atenuado por 1/2 y los otros de signo opuesto, atenuados por 1/4. No se cancelan perfectamente, pero lo hacen aproximadamente bien. Los lóbulos laterales alcanzan su amplitud máxima carca a sus puntos medios, y podemos estimar sus amplitudes allí, usando la aproximación:

DN(k) = [Nsen(¼k)]/(¼k) Haciendo k = 3/2,5/2,... se obtienen las amplitudes de los lóbulos laterales, relativos a la altura de pico N de: 2/(3¼) ≈ -13dB, 2/(5¼) ≈ -18dB, 2/(7¼) ≈ -21dB, 2/(9¼) ≈ -23dB,... Los lóbulos laterales caen progresivamente más lento de tal manera que el décimo es atenuado únicamente en cerca de 30 dB y el 32o en cerca de -40 dB. De otro lado los lóbulos laterales de la ventana de Hann son atenuados en: 2/(5¼) – (1/2)[2/(3¼) + 2/(7¼)] ≈ -32.30dB y -42, -49, -54 y -59 dB para los siguientes cuatro lóbulos laterales. Esto muestra que aplicar la ventana de Hann antes de tomar la transformada e Fourier nos permitirá aislar mejor los componentes sinusoidales. Si una señal tiene muchos componentes sinusoidales, los lóbulos laterales engendrados por cada uno, interferirán con el lóbulo principal de los demás. Reducir la amplitud de los lóbulos laterales reducirá esta interferencia. La figura 9.6 muestra un análisis de Fourier en ventana de Hann de una señal con componentes sinusoidales. Ambos están separados por cerca de 5 veces la frecuencia fundamental !, y para cada uno vemos claramente la forma de la transformada de Fourier de venana de Hann. Cuatro puntos del análisis de Fourier caen dentro del lóbulo principal M(k) correspondientes a cada sinusoide. La amplitud y la fase de cada sinusoide individual están reflejadas en las de los picos (de cuatro puntos de ancho). Los cuatro puntos dentro de un pico los cuales caen en valores enteros de k están sucesivamente fuera de fase en casi medio ciclo. Para resolver por completo los parciales de una señal, debemos escoger el tamaño N del análisis suficientemente grande de tal manera que ! = 2¼/N no sea mayor que un cuarto de la frecuencia de separación que hay entre los parciales vecinos. Para una señal periódica por ejemplo los parciales están separados por

la frecuencia fundamental. En el análisis para resolver totalmente los parciales, el período de análisis N debe ser por lo menos cuatro períodos de la señal. En alguna aplicaciones esto funciona de tal forma que permite el traslape de los picos en tanto el centro de frecuencia de cada pico es aislado de todos los demás picos; en este caso la regla de los cuatro períodos puede relajarse a tres o incluso un poco menos. 9.4 Análisis de Fourier y reconstrucción de señales de audo El análisis de Fourier puede utilizarse a veces para resolver los componentes sinusoidales de una señal de audio. Incluso cuando este no puede ir así de lelos, se puede separar una señal de audo en dos regiones de frecuencias, en el sentido de que para cada k el k-ésimo punto de la transformada de Fourier deberá estar afectado por únicamente por los componentes cercanos a la frecuencia nominal k!. Esto sugiere muchas operaciones interesantes que podemos ejecutar sobre una señal tomando su transformada de Fourier, transformando el resultado y reconstruyendo luego una señal nueva, transformada, partiendo de la transformación modificada. La figura 9.7 muestra cómo llevar a cabo un análisis de Fourier, la moficación y la reconstrucción de una señal de audio. El primer paso es dividir la señal en ventanas, las cuales son segmentos de la señal, de N muestras cada una, usualmente con algún traslape. Cada ventana es luego conformada multiplicándola por una función ventana (Hann, por ejemplo). Luego la transformada de Fourier es calculada para los N puntos k = 0,1,..., N -1. (A veces es deseable calcular la transformada de Fourier para más puntos que estos, pero estos N puntos serán suficientes aquí.) Los análisis de Fourier nos dan un arreglo bi-dimensional de número complejos. Sea H el tamaño del salto, el número de muestras que avanza cada ventana pasada la ventana previa. Luego para cada m = ...,0,1,.. la m-ésima ventana consiste de N puntos iniciando en el punto mH. El n-ésimo punto de la m-ésima ventana es mH + n. La transformada de Fourier de ventana es así igual a:

S[m, k] = FT{![n]X[n - mH]}(k) Esta es una función del tiempo (m en unidades de H muestras) y de la frecuencia (k, como un múltiplo de la frecuencia fundamental !. Fijando el número marco m y buscando la transformada de Fourier de ventana como una función de k:

S[k] = S[m, k] Nos da una medida del espectro momentáneo de la señal X[n]. De otro lado, fijarndo un frecuencia k podemos buscar esta como el k-ésimo canal de una señal de N canales:

C[m] = S[m, k] Desde este punto de vista la transformada de Fourier de ventana separa la señal original X[n] en N regiones de frecuencia estrechas, llamadas bandas. Habiendo computado la transformada de Fourier de ventana, aplicamos a continuación la modificación que queramos. En la figura la modificación es simplemente reemplazar la mitad superior del espectro por cero, el cual nos da una filtro pasa-bajos altamente selectivo. (Otras dos posibles modificaciones son la compansión de banda estrecha y el vocoder, que son descritas en las secciones siguientes.)

Finalmente reconstruimos la señal de salida. Para hacer esto aplicamos la inversa de la transformada de Fourier (etiquetada “iFT” en la figura). Como se mostró en la sección 9.1.2 esto puede ser hecho tomando otra transformada de Fourier, normalizando y moviendo de un tirón el resultado hacia atrás. En el caso de que la ventana reconstruida no vaya a cero suavemente en sus dos extremos, aplicamos la función ventana de Hannpor segunda vez. Al hacer esto a cada ventana sucesiva de la entrada, adicionamos entonces las salidas, usando el mismo traslape del análisis. Si usamos la ventana de Hann y un traslape de cuatro (esto es, escoger N como un múltiplo de cuatro y cada espacio de ventana H = N/4 pasado el previo), podemos reconstruír la señal original fielmente omitiendo el paso de la “modificación”. Esto debido a que iFT deshace el trabajo de FT , y de esta manera estamos multiplicando cada ventana por la función de Hann al cuadrado. La salida es así la entrada, multiplicada por la ventana de Hann elevada al cuadrado, y traslape adicionado por cuatro. Un examen fácil muestra que este se convierte en la constante 3/2, de tal manera que la salida es igual a la entrada multiplicada por un factor constante. La habilidad para reconstruir la señal de entrada exactamente es útil porque algunos tipos de modificaciones pueden ser hechas por grados, y así la salida se puede hacer variar suavemente entre la entrada y alguna modificación de esta. 9.4.1 Compansión de banda estrecha Un compansor es una herramienta que amplifica una señal con una ganancia variable, dependiendo de la medida de amplitud de la señal. El término es una contracción de “compresor” y “expansor”. La ganancia de un compresor decrece mientras el nivel de entrada se incrementa, de tal manera que el rango dinámico, esto es, la variación general del nivel de la señal, se reduce. Un expansor hace lo inverso, incrementando el rango dinámico. Frecuentemente la ganancia depende no sólo del nivel de señal inmediato, si no de su historia; por ejemplo, la velocidad de cambio podría estar limitada o debería ser un retraso de tiempo. Utilizando el análisis de Fourier y la resíntesis, podemos hacer compansión individualmente en canales de banda estrecha. Si C[m] es tal banda, le aplicamos una ganancia g[m], para tener g[m]C[m]. Aunque C[m] es un número complejo, la ganancia es número real no negativo. En general la ganancia debería ser una función no solamente de C[m] si no también de cualquiera o de todos las muestras previas en el canal: C[m – 1], C[m – 2], y así sucesivamente. Consideraremos aquí la situación más sencilla donde la ganancia es simplemente una función de la magnitud de la muestra corriente |C[m – 1]|. El parche diagramado en la figura 9.8 muestra una aplicación muy útil de la compansión, llamada compuerta de ruido. Aquí la ganancia g[m] depende de la amplitud del canal C[m] y del ruido de fondo que es una función f del número de canal k. Para claridad aplicaremos la frecuencia k suscrita a la ganancia, escrita ahora como g[m, k], y para la transformada de Fourier de ventana S[m, k] = C[m]. la ganancia está dada por: 1 – f[k]/|S[m, k]|

|S[m, k]| > f[k]

0

en otros casos

g[m, k] = Siempre que la magnitud S[m, k] sea menor que el umbral f[k] la ganancia es cero y así la amplitud S[m, k] se reemplaza por cero. De otra manera, multiplicar la amplitud por g[m, k] reduce la magnitud hacia abajo para |S[m, k]| - f[k]. Ya que la ganancia es un número real no negativo, la fase se preserva.

En la figura la ganancia se computa como una función de umbral de la razón x = f[k]/|S[m, k]| de la magnitud de la señal para el ruido de fondo; el umbral es g(x) = 1 1/x cuando x < 1 y cero en los demás casos, aunque otras funciones de umbral pueden ser sustituidas fácilmente. Esta técnica es útil para remover el ruido de un sonido grabado. Medimos o suponemos valores del ruido de fondo f[k]. Debido al diseño de la función de ganancia g[m, k], solamente las amplitudes que están por encima del ruido de fondo alcanzan la salida. Ya que esto es hecho sobre bandas de frecuencias estrechas, a veces es posible eliminar la mayor parte del ruido incluso mientras la señal misma, en los rangos de frecuencia donde es más fuerte que el ruido de fondo, es preservada en su mayor parte. La técnica también es útil como preparación para aplicar una operación no lineal, tal como la distorsión, a un sonido. Es usualmente mejor distorsionar sólo las frecuencias más sobresalientes del sonido. Al sustraer el sonido que se ha extraído por la compuerta de ruido, del original, se obtiene una señal residual que puede pasar sin distorsión. 9.4.2 Estampado de timbre (vocoder clásico) Una segunda aplicación del análisis de Fourier y la resíntesis es un filtro variable en el tiempo capaza de hacer que un sonido evolucione espectralmente sobre la envolvente de otro. Esto es ampliamente conocido en los círculos de la música electrónica como un vocoder, llamado así, no con mucha exactitud, después del dispositivo de análisis/síntesis vocal original de los Laboratorios Bell. La técnica descrita aquí es llamada más acertadamente estampado de timbre. Se utilizan dos señales de entrada, una para ser filtrada, y la otra para controlar el filtro vía su envolvente espectral variante en el tiempo. La transformada de Fourier de ventana es utilizada tanto en la entrada de la señal de control para estimar su envolvente espectral, como sobre la entrada del filtro, para aplicarlo. Un diagrama de bloque para el estampado de timbre es mostrado en la figura 9.9. Como en el ejemplo previo, el estampado del timbre actúa multiplicando la transformada de Fourier de ventana de valor complejo del filtro de entrada, por números reales no negativos, cambiando por lo tanto sus magnitudes pero dejando sus fases intactas. El giro aquí es que simplemente reemplazamos las magnitudes del |S[m, k]| original, con las magnitudes otenidas de la entrada de control (llamémosla |T[m, k]|). La ganancia necesaria deberá ser,

g[m, k]| = |T[m, k]|/|S[m, k]| En la práctica es mejor limitar la ganancia a algún valor máximo (que podría depender de la frecuencia) ya que de otra manera los canales no contienen más que ruido, lóbulos laterales, o incluso el error de truncado podría volverse audible. De tal amnera que una función de límite apropiada se aplica a la ganancia antes de utilizarla. 9.5 Fase Hasta aquí hemos operado las señales alterando las magnitudes de sus transformadas de Fourier de ventana, pero dejando las fases intactas. Las magnitudes codifican la envolvente espectral del sonido. Las fases de otro lado, codifican frecuencia y tiempo, en el sentido de que el cambio de fase desde una ventana a otra diferente se acumula, en el tiempo, de acuerdo a la frecuencia. Para hacer una transformación que permita el control independiente sobre la frecuencia y el tiempo, se requiere analizar y reconstrír la fase. En los ejemplos de análisis/síntesis de la sección previa, la fase de la salida

es copiada directamente de la fase de la entrada. Esto es apropiado cuando la señal de salida se corresponde con la señal de entrada. A veces se requieren modificaciones del tiempo, por ejemplo para hacer estiramiento o contracción dl tiempo. Alternativamente, la fase de la salida podría depender de más de una entrada, por ejemplo para modificar un sonido y obtener otro. La figra 9.10 muestra cómo la fase de la transformada de Fourier cambia de ventana a ventana, dando una sinusoide compleja como entrada. La frecuencia de la sinusoide es ® = 3!, de tal amnera que el pico en la transformada de Fourier está a k = 3. Si la fase inicial es Á, entonces las fases vecinas se pueden llenar así: /S[0,2] = Á + ¼ /S[1,2] = Á + H® + ¼ /S[2,2] = Á + 2H® + ¼

/S[0,3] = Á /S[1,3] = Á + H® /S[2,3] = Á + 2H®

/S[0,4] = Á + ¼ /S[1,4] = Á + H® + ¼ /S[2,4] = Á + 2H® + ¼

Esto da una forma excelente de estimar la frecuencia ®: seleccionar cualquier canal cuya amplitud esté dominada por la sinusoide y sustraiga dos fases sucesivas para obtener H®:

H® = /S[1,3] - /S[0,3] ® = (/S[1,3] - /S[0,3] + 2p¼)/H donde p es un entero. Hay H posibles frecuencias, espaciadas por 2¼/H. Si estamos utilizando un traslape de 4, esto es H = N/4, las frecuencias están espaciadas por 8¼/N = 4!. Felizmente, este es el ancho del lóbulo principal para la ventana de Hann, de tal manera que no hay más que un valor posible de ® que pueda explicar cualquier diferencia de fase medida dentro del lóbulo principal, de un pico. El valor correcto de p para escoger es aquel que da la frecuencia más cercana a la frecuencia nominal del canal, k!. Cuando computamos fases para sintetizar una señal nueva o modificada, queremos mantener las relaciones de fase apropiadas entre las sucesivas ventanas de resíntesis y también, simultáneamente, entre los canales adyacentes. Sin embargo estos dos conjuntos de relaciones no son siempe compatibles. Haremos de nuestra primera obligación honrar las relaciones entre las ventanas sucesivas de resíntesis, y nos ocuparemos de las relaciones de fase entre los canales, después. Suponga que queremos construir el m-ésimo espectro S[m, k] para resíntesis (habiendo ya construido el previo, m – 1). SUponga que queremos que la las relaciones de fase entre las ventanas m – 1 y m sean aquellas de la señal x[n], pero que las fases de la ventana m – 1 podrían haber venido de algún otro sitio y no podemos asumir que estén alineadas como lo queremos. Para encontrar qué tanto difiere la fase de cada canal, del canal previo, realizamos dos análisis de la señal x[n], separadas por el mismo salto de tamaño H que estamos utilizando para la resíntesis:

T[k] = FT(W[n]X[n])(k) T'[k] = FT(W[n]X[n + H])(k) La figura 9.11 muestra el proceso de acumulación de fase, en el cual cada fase a la salida depende de la fase de salida previa, y de la diferencia de la fase para dos análisis de ventana a la entrada. La figura 9.12 ilustra la relación de fase en el plano complejo. La fase de la nueva salida S[m, k] debe ser la de la

previa, más la diferencia entre las fases de los dos análisis: /S[m, k] = /S[m - 1, k] + (/T'[k] - /T[k]) = /(S[m - 1, k]T'[k]/T[k]) Aquí utilizamos el hecho de que al multiplicar o dividir dos números complejos obtenemos la suma o diferencia de sus argumentos. Si la magnitud deseada es un número real a, debemos ajustar entonces S[m, k] para:

S[m, k] = a • |S[m - 1, k]T'[k]/T[k]|-1 • S[m - 1, k]T'[k]/T[k] Las magnitudes del segundo y del tercer término se cancelan, y así la magnitud de S[m, k] se reduce a a; el primero de los dos términos son números reales de tal manera que su argumento está controlado por el último término. Si queremos finalizar con la magnitud del espectro T de la misma manera, podemos hacer a =|T'[k]| y simplificar:

S[m, k] = |S[m - 1, k]/T[k]|-1 • S[m - 1, k]T'[k]/T[k] 9.5.1 Relaciones de fase entre los canales En el esquema anterior, la fase de cada S[m, k] depende únicamente del valor previo del mismo canal. Las relaciones de fase entre los canales vecinos son dejadas al azar. Estas a veces trabajan bien, pero a veces la incoherencia de los canales vecinos da lugar a un efecto de chorus no buscado. Podríamos querer idealmente que S[m, k] y S[m, k + 1] tuvieran la misma relación de fase que hay entre T'[k] y T[k]. Estas 2N ecuaciones para N fases en general no tendrá solución, pero podemos alterar la ecuación anterior de S[m, k] de tal manera que siempre que ocurra una solución en el sobre-apretado sistema de ecuaciones, el algoritmo de reconstrucción se aloje en la solución. Este enfoque es llamado aseguramiento de fase [Puc95b], y tiene la virtud de la simplicidad, aunque están disponibles técnicas más sofisticadas [DL97]. La relación de fase de salida deseada, en el cuadro m -1, es: /T[k + 1] - /T[k] = /S[m - 1, k + 1] - /S[m - 1, k] o re-ordenando: /{S[m - 1, k + 1]/T[k + 1]} = /{S[m - 1, k]/T[k]} En otras palabras, la fase del cociente S/T no debería depender de k. Con esto en mente podemos re-escribir la fórmula de recursión para S[m, k]:

S[m, k] = |R[k]|-1 • R'[k]T'[k] con

R[k] = (T[k] • S[m - 1, k])/|S[m - 1, k]| y según la ecuación previa, los R[k] deberán estar todos en fase. El truco es ahora reemplazar R[k] para cada k con la suma de tres vecinos. El cómputo es entonces:

S[m, k] = |R'[k]|-1 • R'[k]T'[k] con

R'[k] = R[k + 1] + R[k] + R[k - 1] Si los canales están ya en la relación de fase correcta, esto no tiene efecto (la fase resultante será la misma que si se utilizara únicamente R[k].) Pero en general, la suma compartirá dos términos en común con su vecino en k + 1:

R'[k + 1] = R[k + 2] + R[k + 1] + R[k] de tal manera que R' tenderá a apuntar más en la misma dirección que R. Aplicando esto iterativamente, eventualmente todo se alineará R' a la misma fase, en tanto las relaciones de fase entre los espectros medidos de T y T' lo permitan. 9.6 Bashing de fase En la sección 2.3 en el muestreo con envolvente vimos cómo fabricar una onda periódica desde un sonido grabado, y así prestar el timbre del sonido original pero ejecutandolo a una altura específica. Si a la ventana del sonido grabado se le aplica precesión en el tiempo, el timbre resultante varía en la imitación del sonido grabado. Aparece un problema importante, y es que si tomamos formas de onda de diferentes ventanas de una muestra ( ode diferentes muestras), no hay garantía de que las dos fases coincidan. Si no lo hacen el resultado es puede ser feo, ya que los cambios aleatorios de fase son escuchados como fluctuaciones de la frecuencia. Esto puede ser corregido utilizando análisis de Fourier y resíntesis [Puc05]. La figura 9.13 muestra una manera sencilla de utilizar el análisis de Fourier para alinear las fases en una serie de ventanas de una grabación. Simplemente tomamos el FFT de la ventana y luego ajustamos cada fase a cero para valores pares de k y a ¼ cuando son impares. La fase en el centro de la ventana es, de esta manera, cero, tanto para los valores pares como para los valores impares de k. Para ajustar las fases (los argumentos de las amplitudes complejas del espectro) en la forma deseada, primero encontramos la magnitud, la cual puede ser considerada un número complejo con argumento cero. Luego, al multiplicar por (-1)k se ajusta la amplitud de tal forma que esta es positiva y negativa de manera alternada. A continuación tomamos la transformada inversa de Fourier sin siquiera molestarse en tomar la ventana de nuevo en el camino de regreso; probablemente querremos aplicar una envolvente de ventana más tarde, de todas maneras, tal como se mostró en la figura 2.7. Los resultados pueden combinarse con las técnicas de modulación del capítulo 6 produciendo herramientas poderosas para voces y otras síntesis imitativas. 9.7 Ejemplos Análisis de Fourier y resíntesis en Pd El ejemplo I01.Fourier.analysis.pd (figura 9.14, parte a) demuestra el cómputo de la transformada de Fourier de una señal de audio utilizando el objeto fft~: fft~: Transformada de Fourier Rápida. Las dos entradas toman señales de audio que representan la parte real y la parte imaginaria de una señal de valor complejo. El tamaño N de ventana está dado por el tamaño de bloque de Pd. Una transformada de Fourier está hecha para cada bloque. La transformada de Fourier Rápida [SI03] reduce el costo computacional del

análisis de Fourier en Pd a sólo de 5 a 15 objetos osc~ en configuraciones típicas. El algoritmo en su forma más simple toma N como una potencia de dos, lo cual es también (normalmente) una restricción en el tamaño de los bloques en Pd. El ejemplo I02.Hann.window.pd (figura 9.14, partes b y c) muestra cómo controlar el tamaño del bloque utilizando un obejeto block~, cómo aplicar una ventana de Hann, y una versión diferente de la transformada de Fourier. La parte (b) muestra la invocación de una sub-ventana la cual se muestra, a su vez, en la parte (c). Los nuevos objetos son: rfft~: transformada de Fourier Rápida real. Se asume que la parte imaginaria de la entrada es cero. Ünicamente los dos primeros N/2 + 1 canales de salida se llenan (los otros son determinados por simetría). Este toma la mitad del tiempo de cómputo del objeto fft~, más general. tabreceive~: da salidas repetidas del contenido de la tabla de ondas. Cada bloque de cómputo da a la salida las mismas primeras N muestras de la tabla. En este ejemplo, la tabla “$0-hann” contiene una función ventana de Hann de longitud 512, de acuerdo con el tamaño especificado para los bloques. La señal que va a ser analizada aparece (desde el parche padre) vía el objeto inlet~. Las amplitudes de los canales (la salida del objeto rfft~) son reducidas a magnitudes de valor real: las partes real e imaginaria son elevadas al cuadrado y sumadas, y el resultado se hace pasar por el objeto sqrt~. Finalmente la magnitud es escrita (controlada por una conexión que no se muestra en la figura) vía tabwrite~ a otra tabla, “$0-magnitude”, para graficar. El ejemplo I03.resynthesis.pd (figura 9.15) muestra cómo analizar y resintetizar una señal de audio siguiendo la estrategia de la figura 9.7. Como antes, hay una sub-ventana para realizar el trabajo con un tamaño de bloque apropiado para la tarea; la figura muesra únicamente la sub-ventana. Necesitamos un objeto nuevo para la transformada inversa de Fourier: rifft~: transformada inversa de Fourier Rápida, real. Utilizando N/2 + 1 puntos de su entrada (tomados como un par real/imaginario), y asumiendo los valores apropiados para los otros canales por simetría, se reconstrye una salida de valor real. No se ha hecho ninguna normalización, de tal manera que un par rfft~/rifft~ junto, resulta con una ganancia de N. El objeto ifft~ está disponible igualmente, y computa un inverso no normalizado para el objeto fft~, reconstruyendo una salida de valor complejo. El objeto block~, en la sub-ventana, es invocado con un segundo argumento que especifica un traslape de 4. Esto hará que la sub-ventana corra cuatro veces cada N = 512 muestras, en intervalos regulares de 128 muestras. El objeto inlet~ realiza el búfer necesario y la reorganización de las muestras de tal manera que su salida siempre da las últimas 512 muestras de la entrada, en orden. En la otra dirección, el objeto outlet~ adiciona segmentos de sus cuatro entradas previas para llevarlas al esquema de traslape sumado en la figura 9.7. Los bloques de 512 muestras están multiplicados por la ventana de Hann tanto en la entrada como en la salida. Si los objetos rfft~ y rifft~ fueron conectados entre ellos sin ninguna modificación, la salida deberá reconstruír la entrada fielmente. Sin embargo, una modificación es aplicada: cada canal está multiplicado por una ganacia (positiva y de valor real). La amplitud de valor complejo para cada canal es escalada separadamente, multiplicando las partes real e imaginaria por la ganancia. La ganancia (que depende del canal) viene de otra tabla, llamada “$0-gain”. El resultado es un filtro de ecualización gráfica; aplicando el ratón en la ventana gráfica de esta tabla, puede diseñar curvas de ganancia de

frecuencia. Hay un retraso inherente introducido al utilizar block~ para incrementar el tamaño del bloque (pero no lo hay si es utilizado, como se muestra en el capítulo 7, para reducir el tamaño del bloque relativo a la ventana padre.) El retraso puede medirse desde la entrada hasta la salida del sub-parche, y es igual a la diferencia de los dos tamaños de los bloques. En este ejemplo el retraso del búfer es de 512-64=448 muestras. El retraso del bloque no depende del traslape, sólo de los tamaños del bloque. Compansión de banda estrecha: reducción de ruido El ejemplo I04.noisegate.pd (figura 9.16) muestra un ejemplo de compansión de banda estrechautilizando análisis/resíntesis de Fourier. (Esta es una realización del diagrama de bloques de la figura 9.8.) La parte (a) de la figura muestra una configuración de filtro similar al del ejemplo previo, excepto que la ganancia para cada canal es ahora una función de la magnitud del canal. Para cada k, si s[k] denota la potencia en el canal k y m[k] es el nivel de máscara (un nivel presumiblemente algo mayor que la potencia del ruido para el canal k), entonces la ganancia en el canal k está dada por

√(s[k]-m[k])/s[k]

s[k] > m[k]

0

para los demás valores

La potencia en el k-ésimo canal es reducida de esta manera por m[k] si es posible, y de otra manera, es reemplazada por cero. La máscara misma es el producto del promedio de ruido medido en cada canal, el cual está contenido en la tabla “$0-mask”, multiplicado por un valor llamado “mask-level”. El ruido promedio es medido en un sub-parche (pd calculate-mask), cuyos contenidos se muestran en la parte (b) de la figura. Para computar la máscara estamos utilizando dos objetos nuevos: bang~: envía un disparo con anticipación a cada bloque de cómputo. El disparo aparece en el tiempo lógico de la primera muestra en cada bloque (el primer tiempo lógico cuyo cómputo de control afecta a ese bloque y no al previo), siguiendo el esquema mostrado en la figura 3.2. tabsend~: el objeto complementario de tabreceive~, copia repetidamente su entrada a los contenidos de una tabla, afectando las primeras N muestras de la tabla. El proceso de promediar la potencia es iniciado al enviar un tiempo de duración en milisegundos para “hacer la máscara”. El parche computa el número equivalente de bloques b y genera una secuencia de pesos: 1, 1/2, 1/3,..., 1/b por los cuales cada una de las potencias de los bloques que siguen a continuación es promediada en lo que contenga la tabla de la máscara en el bloque previo. Al final de los b bloques la tabla contiene los promedios de igual peso de todas las medidas de la potencia b. Después de eso, el peso del promedio de las nuevas medidas de potencias es cero, de tal manera que el promedio medido detiene su evolución. El uso de este parche para la supresión clásica de ruido requiere por lo menos unos pocos segundos de ruido grabado sin que “la señal” esté presente. Esta es reproducida en el parche, y su duración es enviada a “make-mask”, de tal manera que la tabla “$0-mask” contiene el promedio de la potencia medida del ruido para cada canal. Luego, asumiendo que la parte ruidosa de la señal raramente excede 10 veces su potencia promedio (por ejemplo), “mask-level” es enviada a 10, y la señal a la que se le suprimirá el ruido es enviada a través de la parte (a) del parche. El ruido se habrá ido en su mayor parte, pero aquellos canales en los

cuales la señal excede 20 veces la potencia del ruido serán atenuados únicamente en 3 dB, y los canales con mayor potencia serán atenuados progresivamente menos. (Por supuesto, la supresión actual del ruido podría no ser la aplicación más interesante del parche, uno podría tratar de enmascarar una señal cualquiera, de otra.) Estampado de timbre (“vocoder”) El ejemplo I05.compressor.pd (figura 9.17) es otro compansor de canal presentado como preparación para el ejemplo I06.timbre.stamp.pd, que examinaremos a continuación. Este es una realización del estampado de timbre de la figura 9.9, ligeramente modificado. Hay dos entradas, una a la izquierda, para ser filtrada (y cuya transformada de Fourier es utilizada para resíntesis después de modificar las magnitudes), y otra a la derecha que actúa como una fuente de control. En términos generales, si las dos magnitudes son f[k] para la entrada de filtro y c[k] para la fuente de control, sólo “blanquearemos” la entrada de filtro, multiplicándola por 1/f[k], y luego estampamos las magnitudes de control sobre el resultado, al multiplicarlas por c[k]. En la práctica, debemos limitar la ganancia a un valor máximo razonable. En el parche esto se hace limitando el factor de blanqueamiento 1/f[k] a un valor máximo especificado utilizando el objeto clip~. El límite está controlado por el parámetro “squelch”, que es elevado al cuadrado y dividido por 100 para mapear los valores de 0 a 100 a un rango útil. Otro esquema posible es limitar la ganancia después de la formación del cociente c[k]/f[k]. La limitación de la ganancia puede ser en cualquier caso dependiente de la frecuencia. A veces es conveniente elevar la ganancia a una potencia p entre 0 y 1; si es 1 se trata de un estampado de timbre y si es 0, pasa la entrada del timbre sin cambios; los valores intermedios dan una suave interpolación entre ambos. Ondulación de tiempo de vocoder de fase El vocoder de fase usualmente se refiere a la técnica general de pasar de un canal de amplitudes (complejas) a pares consistentes en magnitudes (reales) y velocidades de precesión de fase (“frecuencias”), y al contrario, como se describió en la figura 9.11 (sección 9.5). En el ejemplo I07.phase.vocoder.pd (figura 9.18) utilizamos esta técnica con el ánimo específico de aplicar estiramiento o contracción del tiempo de un sonido grabado, con control de tiempo real. Es decir, controlamos en cualquier momento en el tiempo real, la localización del sonido grabado que estamos escuchando. Son utilizados dos nuevos objetos: lrshift~: cambia un bloque de izquierdo o derecho (según el argumento de creación). Si el argumento es positivo, cada bloque de la salida es la entrada cambiada en ese número de espacios a la derecha, llenando con ceros, según se requiera, a la izquierda. Un argumento negativo cambia a la izquierda, llenando con ceros a la derecha. q8_rsqrt~: raíz cuadrada rápida y aproximadamente recíproca. La salida del recíproco de la raíz cuadrada es su entrada, bien para una aproximación de una parte en 256, utilizando mucho menos cómputo que la de una raíz cuadrada de total precisión y recíproca. El proceso comienza con un sub-parche, pd read-windows, que tiene como salida dos bloques de ventana de Hann de un sonido grabado, uno “atrás” y el otro “adelante”, con 1/4 de ventana adelantada en la grabación. La ventana mostrada utiliza las dos salidas del sub-parche para guiar el cambio de amplitud y fase de cada canal en su propia salida.

Los dos objetos tabreceive~ de la parte superior llaman al bloque previo de amplitudes complejas enviado al objeto rifft~ de la parte inferior, correspondiente al S[m – 1, k] de la discusión de la sección 9.5. El parche como un todo computa S[m, k] y luego hace TF inversa de ventana de Hann, para la salida. Después de normalizar S[m – 1, k], su complejo conjugado (el inverso normalizado) es multiplicado por la transformada de Fourier de la ventana de “atrás” T[k], dando el producto R[k] de la página “283”. A continuación, dependiendo del valor del parámetro “lock”, el valor computado de R[k] es reemplazado condicionalmente con la versión de aseguramiento de fase R'[k]. Esto se hace utilizando los objetos lrshift~, cuyas salidas se adicionan a R[k], si “lock” es ajustado a uno, o de la otra manera, si es cero. El resultado es luego normalizado y multiplicado por la transformada de Fourier de ventana de Hann de la ventana “delantera” (T'[k]), para dar S[m, k]. Otras tres aplicaciones de síntesis/resíntesis de Fourie, que no se ilustran aquí, están provistas en los ejemplos de Pd. La primera, el ejemplo I08.pvoc.reverb.pd muestra cómo fabricar un vocoder de fase cuya salida recircula como en un reverberador, excepto que los canales individuales se han reemplazado por la entrada cuando esta es más poderosa de lo que es cuando ya está recirculando. El resultado es un efecto de revereración de sonido más coherente, que el que se logra con la forma clásica utilizando líneas de retrasos. El ejemplo I09.sheep.from.goats.pd demuestra la técnica (imperfecta) para separar señales afinadas de las señales ruidosas, canal por canal, basado en la coherencia de fase que deberíamos esperar de una sinusoide en ventana de Hann. Si los tres canales adyacentes están desfasados aproximadamente en ¼ radianes uno del otro, son juzgados para belong un pico sinusoidal. Los canales belonging los picos sinusoidales son reemplazados con ceros para extraer la porción ruidosa de la señal, o todos los demás son reemplazados por cero para obtener la porción sinusoidal. El ejemplo I10.phase.bash.pd nos regresa al muestreador de lazo de tabla de ondas de la figura 2.7, y muestra cómo alinear las fases de la muestra de tal amnera que todos los componentes de la señal tengan fase cero en los puntos 0, N, 2N, y sucesivamente. De esta manera dos copias de un muestreador de lazo ubicadas N muestras aparte pueden hacer cruzamiento atenuado coherentemente. Se puede fabricar una versión sintética, afinada del archivo de sonido original, utilizando cruzamiento atenuado en cadena daisy. Ejercicios 1. Una señal x[n] es 1 para n = 0 y cero para cualquier otro valor (un impulso). Cuál es su transformada de Fourier (N puntos) como una función de k? 2. Asumiendo además que N es un número par, cómo es la transformada de Fourier si x[n] es 1 en n = N/2 en lugar de serlo en n = 0? 3. Para qué valores enteros de k = 0 es no cero la transformada de Fourier de N puntos de ventana de Hann? 4. Con el fin de realizar el análisis de Fourier de un sonido periódico de 100 Hertz (a una velocidad de muestras de 44100 Hertz) utilizando una ventana de Hann, qué valor de N se necesitará para resolver completamente los parciales

del sonido (en el sentido de tener picos que no se traslapen en el espectro)? 5. Suponga que una transformada de Fourier de N puntos está hecha sobre una sinusoide compleja de frecuencia de 2.5! donde ! = 2¼/N es la frecuencia fundamental. Qué porcentaje de la energía de la señal cae sobre el lóbulo principal, en los canales k = 2 y k = 3? Si a la señal se le aplica ventana de Hann, qué porcentaje de la energía está en el lóbulo principal (el cual está entonces en los canales 1 a 4)?