“Desarrollo de aplicaciones para espacialización de Sonido y Música”

Carrerra de Composición con Medios Electroacústicos

Universidad Nacional de Quilmes - Argentina

 

Gtkonvolve (Abril  2009) -  Download

Pablo Di Liscia (odiliscia@unq.edu.ar)

Esteban Calcagno (esteban_calca@yahoo.com.ar)

 

Información General

gtkonvolve es un programa que realiza convolución rápida entre dos señales de audio (utilizando el método overlap/add, Véase Moore, 1990, pp. 144). A partir de dos archivos de audio (uno que contenga la señal a procesar y otro la respuesta a impulso) se puede generar una señal en un archivo de salida con la cantidad de canales que se necesiten. Además, el proceso puede incluir un retardo y el control de la amplitud independiente de la señal procesada  (el resultado de la convolución) y de la señal sin procesar. gtkonvolve usa las librerías GTK+ (http://www.gtk.org/) para la gestión de los objetos gráficos y, para la lectura/escritura de los archivos de audio, la librería sndlib (Bill Schottstaedt, http://ccrma.stanford.edu/software/snd/sndlib/).

gtkonvolve puede ser utilizado en cualquier SO que soporte las mencionadas librerías como, por ejemplo, Linux y MS Windows. La interfaz gráfica de gtkonvolve para Windows fue realizada íntegramente con winGTK (http://wingtk.sourceforge.net/), la librería GTK para Windows.

gtkonvolve es de uso, copia y distribución libre y gratuita. Su código fuente, escrito en lenguaje C es abierto y permite que el usuario incluya modificaciones y/o agregados. Los autores no se hacen responsables por las modificaciones realizadas por terceros y solicitan se los informe en este caso.

gtkonvolve fue realizado como parte del proyecto I+D “Desarrollo de aplicaciones para espacialización de Sonido y Música” (UNQ, Argentina) y el Sub Proyecto DEV del PICT “El Espacio en la Composición Musical del Teatro Acústico (ANPCyT, UNQ, Argentina)”.

 

Para usar y/o compilar gtkonvolve bajo Windows

 

Para usar:

1-Por favor, leer cuidadosamente el archivo copyright.txt.

1-Instalar en el sistema WinGtk 1.2 (es posible obtenerla en la siguiente URL:  http://wingtk.sourceforge.net/ )

2-Copiar todo el contenido del paquete gtkonvolve.zip en el disco duro de su sistema.

3-Localizar y correr el archivo gtkonvolve.exe.

 

Para compilar:

Además de los pasos 1 y 2 del punto anterior:

1-Instalar en el sistema el compilador MinGW (http://www.mingw.org/)

2-En el directorio src/ localizar el archivo makefile y editarlo para reflejar los paths de sus sistema.

3-En una ventana de DOS correr: make.

4-Si el proceso es exitoso, se habrá generado el archivo ejecutable gtkconvolve.exe

Funcionamiento de gtkonvolve:

                                               

 

 

·        En primer lugar se debe indicar cual es el archivo de entrada (Open Input – Figura 1-1) que vamos a utilizar, esto debe realizarse seleccionando un archivo de audio desde el boton Browse. gtkonvolve contempla el uso de formatos de audio  wav, snd y aif, de la cantidad de canales que se desee.

 

·        Luego debe indicarse cual será la respuesta impulso (Open Impulse Response – Figura 1-2), un archivo también de audio que debe ser seleccionado utilizando  el botón Browse que le corresponde. gtkonvolve contempla el uso de formatos de audio  wav, snd y aif, de la cantidad de canales que se desee.

 

·        El tercer ítem a indicar es el archivo de salida (Output File – Figura 1-3), que será en definitiva donde se guardara el proceso. Se puede seleccionar la resolución y el formato de salida mediante la pestaña OUTPUT FILE FORMAT AND RESOLUTION (Figura 1-6).

 

·        gtkonvolve puede realizar un número indefinido de canales de salida como resultado de las diferentes combinaciones entre los diferentes canales del archivo de entrada y la respuesta a impulso. Por ejemplo, si se tiene un archivo de entrada de dos canales (estereo) y un archivo de respuesta a impulso de dos canales (también estereo), se puede generar un archivo de salida de cuatro canales con todas las combinaciones posibles, a saber: canal 1:1*1 canal2: 1*2 canal3:2*1 canal4: 2*2. En el ejemplo anterior, los números indican respectivamente los números de canales del archivo de entrada y la respuesta a impulso y el * simboliza la operación de convolución. Por ello, luego de haber seleccionado los archivos de entrada (Open Input), respuesta impulso (Open Impulse Response) y salida (Output File) utilizaremos el botón Add Output Channel  (Figura 1-4), para agregar un nuevo canal de salida a la lista que se encuentra a la derecha del programa. En esta lista aparecen los datos que se pueden modificar del canal de salida. Inicialmente se tienen valores por defecto que en general son los siguientes:

 

Output Channel (Figura 1-7): Número de canal de salida. Valor por defecto: 1 (mientras más canales agreguemos con Add Output Channel , este número subirá).

 

InputChannel (Figura 1-8): Número de canal del archivo de entrada que se usará para generar el nuevo canal de salida. Valor por defecto: 1 (se comienza con el canal uno).

 

Input Response Channel (Figura 1-9): Número de canal del archivo de respuesta impulso que se usará para generar el nuevo canal de salida. Valor por defecto: 1 (se inicia con el canal uno).

 

Original Signal Amplitude (Figura 1-10): Para ciertas aplicaciones es útil mezclar una porción de la señal sin procesar con la señal procesada. Aquí se indica la amplitud que debe tener el la señal sin procesar a incluir en el canal de salida. Si se desea solo señal procesada, la amplitud debe ser cero en este caso. Los valores de amplitud se indican en unidades lineales arbitrarias, siendo el 1 equivalente a la amplitud original. Valor por defecto: 0.500.

 

Processed Signal Amplitude (Figura 1-11): Se indica que amplitud debe tener la señal procesada del canal de salida. Valor por defecto: 0.300.

 

Delay (Figura 1-12): Se indica que retardo habrá entre la señal original y la señal procesada. Valor por defecto: 0 (este valor está en segundos y solo puede alcanzar los 0.250 segundos).

 

Salvo el valor del canal de salida (Output Channel) todos lo otros valores pueden ser editados con solo hacer doble click (botón izquierdo) con el cursor del Mouse en la casilla que se desea editar. Por supuesto cada una de estas casillas tienen las limitaciones que corresponde. Una vez que editamos un canal, si agregamos otro canal con Add Output Channel este tomará por defecto los valores del canal anterior haya o no sido editado.

Una vez agregado otro canal de salida, este también podrá editarse libremente dentro de los parámetros característicos del archivo en cuestión.

Se pueden agregar la cantidad de canales que se quieran, solo habrá que tener en cuenta la cantidad de memoria que se requiere para el proceso (se explica más adelante).

 

 

 

 

 

Características técnicas de gtkonvolve

 

 

 

 

a)      Se busca la potencia de dos más cercana, pero no menor, que la cantidad de muestras del archivo de respuesta impulso (ejemplo: 65536 para 44100 muestras).

b)      Se multiplica este valor por el doble de la cantidad de combinaciones de respuesta a impulso-entrada diferentes que se vayan a utilizar. Por ejemplo si las combinaciones entre canal de respuesta a impulso y canal de entrada son:

1/1,1/2,2/1,2/2 el número por el que habrá que multiplicar es 4. Si las combinaciones son: 1/1,1/2,1/1,2/2 el número será tres (ya que la combinación 1/1 está repetida). A la cantidad obtenida, se le suma el valor obtenido en (a) multiplicado por la cantidad de canales de salida. Se multiplica nuevamente el resultado por cuatro.

 

c)      El resultado es la cantidad de RAM usada en Bits.

 

 

Revisión teórica de la Convolución de señales de audio

Esta  sección (tomada de Di Liscia, 2004) trata los detalles teóricos que se relacionan con la convolución y los filtros FIR.

El proceso de convolución lineal, o aperiódica, entre dos señales, llamadas respectivamente a y x, puede explicarse de la manera siguiente: tómese una copia de la señal x y multiplíquense todas sus muestras por el valor de la primera muestra de la señal a. Al resultado, súmesele otra copia de la señal x, retrasada en una muestra, y cuyos valores sean multiplicados por el valor de la segunda muestra de la señal a. Al resultado, súmesele otra copia de la señal x, retrasada en dos muestras, y cuyos valores sean multiplicados por el valor de la tercera muestra de la señal a. Repítase el proceso hasta agotar las muestras de la señal x1. Por ejemplo, sean las dos señales:

x(n) = { 1, 3, 5 ,3 ,5, 1 }

a(n) = { 1, 2, 4, 2 }

Su convolución, h(n), puede realizarse como:

1

3

5

3

5

1

 

 

 

x(n) * a(0)

+

2

6

10

6

10

2

 

 

x(n-1) * a(1)

+

 

4

12

20

12

20

4

 

x(n-2) * a(2)

+

 

 

2

6

10

6

10

2

x(n-3) * a(3)

La señal resultante es la convolución de x y a

1

5

15

27

37

33

28

14

2

h(n)

Puede comprobarse que la secuencia resultante tiene más elementos que las dos que se procesaron. El resultado es de (Nx + Na1 = 6 + 4 -1 = 9) elementos, en donde Nx es el número de elementos de la señal x, y Na es el número de elementos de la señal a.

Ahora comparemos esto con la ecuación general para un FIR:

                M

y(n) = S am x(n - m)

                m=0

que implica:

y(n) = a0 x(n) + a1 x(n-1) + a2 x(n-2) ......+ aM x(n-m)

Se puede advertir fácilmente que, si reemplazamos a cada coeficiente a por un valor sucesivo de una señal, el proceso es perfectamente equivalente al de convolución. Es más, se denomina, precisamente convolución directa. La otra manera de realizar la convolución, se denomina no-directa o convolución rápida, dado que utiliza a la FFT (Fast Fourier Transform).

¿Cual es el efecto del proceso? El efecto es que si se realiza una convolución de una señal con otra, el espectro de la señal resultante equivale a la multiplicación de los espectros de las dos señales. En otras palabras, filtramos a una señal con otra (daría igual que fuera al revés, porque la convolución es conmutativa).

Para profundizar los conceptos básicos relacionados con éste tema, se puede consultar:

http://musica.unq.edu.ar/personales/odiliscia/papers/audig-re2.htm

Generalmente se denomina a la segunda señal (que constituye los coeficientes del FIR) respuesta a impulso. Vista de ésta manera, la convolución posibilita el diseño sencillo de filtros FIR muy variados y complejos. Pensemos, simplemente, que cualquier señal puede usarse para filtrar a otra, transfiriéndose así las características de su espectro. Por supuesto, en aplicaciones prácticas, existen límites y conveniencias. Para respuestas a impulso breves (de hasta 128 muestras), se puede usar sin inconvenientes convolución directa. En la medida en que éste número crece, el proceso se hace cada vez más lento, y la forma más eficiente de realizarlo es usar convolución rápida (vía FFT).

 

Aplicaciones de gtkonvolve

 

Como se podrá deducir por lo tratado en la sección anterior, gtkonvolve implementa un FIR por convolución indirecta (llamada también “convolución rápida”) usando la multiplicación de los espectros de respuesta a impulso y señal de entrada. De las aplicaciones prácticas posibles, se tratarán dos que son las más difundidas en el audio y la música electrónico-digital: emulación de reverberación y síntesis cruzada.

 

Los recintos actúan como filtros, modificando el balance espectral de las señales acústicas que se producen dentro de ellos. Las reflexiones de la señal directa en las paredes, piso y techo de un recinto forman una colección de ecos que, sumados, constituyen la respuesta a impulso de un recinto.

 

“Es posible “capturar” la respuesta impulso de un recinto grabando un impulso dentro de este. Este
procedimiento nos proporcionará toda la información de la reverberación del recinto para una
ubicación de fuente sonora y oyente dados. La respuesta a impulso grabado se puede  utilizar luego
procesando por convolución algún otro sonido, lo que transfiriere las características del recinto
grabado. También es posible modificar la respuesta impulso antes del proceso de convolución, si se
desea. El proceso de convolución es, en general, más preciso para emular reverberación que el de las
redes de filtros IIR, pero a un costo de computación más alto.”

 

http://musica.unq.edu.ar/personales/odiliscia/papers/spatial-listening.htm

 

 

 

Capturar por grabación la respuesta a impulso de un recinto de manera precisa no es sencillo. Los ingenieros de audio utilizan procedimientos de cierta complejidad para lograrlo. La dificultad reside en lograr una señal de excitación que reúna uniformidad espectral, omni-direccionalidad y sea reproducible. Por ejemplo, teóricamente, una Función Delta Dirac, reúne las dos primeras características, pero no existe altoparlante que pueda reproducirla. El siguiente cuadro (tomado de: http://www.acoustics-engineering.com/support/files/TN001.pdf) resume las características de las señales de excitación más usuales con sus ventajas y desventajas:

 

 

Señal de excitación

Características de la Señal

Señal de Respuesta a Impulso

Impulso Ideal(Función Dirac)

Infinitamente corto

Alto valor de energía

Unidad de energía

Omnidireccional (room)

Mouth-directional (speech)

 

Solamente en teoría

 

No necesita proceso adicional.

 

Impulso Aproximado

 

Pistola de salva, globo, aplausos, spark gap, latigo, bolsa de papel, etc.

 

Definición de directividad pobre.

 

Reproducción pobre.

No necesita proceso adicional.

 

Señal aleatoria

Ruido rosa o blanco, musica, etc.

 

Se lo considera como suma de impulsos retrasados con factores de importancia aleatorios.

Se debe realizar deconvolución con la señal original para obtener la respuesta a impulso.

 

Tiene ruido residual.

Señal MLS

 

Secuencia de Longitud Máxima

 

Ruido pseudo-aleatorio

 

Se lo considera como la suma de impulsos retrasados con factor de importancia +1 y -1

Se debe realizar deconvolución con la señal original para obtener la respuesta a impulso.

 

Señal de barrido

 

Señal seno de barrido periodico.

 

Se la considera como la suma de impulsos retrasados con valor de importancia definido.

Se debe realizar deconvolución con la señal original para obtener la respuesta a impulso.

 

Unidad de proceso.

 

 

Existen, además, sites en donde se pueden obtener respuestas a impulso de numerosas salas de concierto y/o entornos, como por ejemplo:

 

 

http://noisevault.com/nv/index.php?option=com_remository&Itemid=29

http://www.cksde.com/p_6_250.htm

http://www.voxengo.com/impulses/

http://www.1-1-1-1.net/pages/impulses/index.htm

 

 

Si no se dispone de grabaciones de respuestas impulsos de lugares reales, estas pueden sintetizarse fácilmente usando ruido blanco(con una función de distribución de la probabilidad Gaussiana resultaría mejor) con una caída de amplitud exponencial o similar.  También puede utilizarse un filtro pasa-bajos cuya frecuencia de corte se asocie a la caída en amplitud, para emular la pérdida de energía gradual que es más notable en las frecuencias altas.  Si se sintetiza una respuesta impulso estereo o de más canales, la decorrelación de ellos enfatiza la sensación de espacialidad. Si se desea el balance espectral de una sala de conciertos “bien diseñada”, se puede ecualizar la respuesta impulso artificial, con un buen filtro (particularmente, uno que atenúe o quite las frecuencias por debajo a los 30 Hz).

 

A continuación, un ejemplo de cómo sintetizar una respuesta a impulso en estereo usando el programa csound(Barry Vercoe et al):

 

Orquesta

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

/*

impulse.orc

Oscar Pablo Di Liscia

*/

 

sr    =44100

kr    =4410

ksmps =10

nchnls      =2

 

seed 0

 

      instr 1    

iamp  =p4 * 32767       ;amplitud máxima

ifcut   =p5             ;frecuencia superior de corte

ifabs =p6               ;frecuencia de partida para absorción

 

kenv  expseg      1,p3, .001  ;envolvente de amplitud

kenva transeg 1,p3,-3,0 ;envolvente para absorcion

 

ach1  gauss iamp        ;señal del canal 1     

ach2  gauss iamp        ;señal del canal 2

 

alp1  butterlp ach1,ifcut     ;pre-filtrado fijo

alp2  butterlp ach2,ifcut

 

aout1 balance alp1,ach1

aout2 balance alp2,ach2

 

absorb1     butterlp aout1, ifabs*kenva ;filtrado de absroción

absorb2     butterlp aout2, ifabs*kenva

 

outs1 absorb1 * kenv

outs2 absorb2 * kenv

     

endin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

Partitura

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

/*

impulse.sco

Oscar Pablo Di Liscia

*/

 

;     start dur   iamp  ifcut ifabsorb

i1    0     3     1     3000  6000

e

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

Agradecimientos y citas

 

El loop del proceso principal (main) de “convolve” (gtkconvolve.c) esta basado en el programa “convolvesf”, de Mark Dolson (del toolkit de programas para DSP “CARL”, que se puede ver en CCRMA:\usr\ccrma\dist\carl\src\sigsf\convolvesf.c)

 

Como en el programa de Mark Dolson, las rutinas FFT y IFFT fueron tomadas y adptadas desde la librería IEEE. Se puede buscar  o hacer una forma más rápida de estas modificando gtkonvolve.c. Todo el código fuente esta a disposición junto al programa.

 

Algunas ideas y recursos fueron tomados de “Elements of Computer Music”, de F.R.Moore (Prentice Hall, N.J., 1990).

 

 

Bibliografia

 

Di Liscia, Oscar Pablo (2004). “Generación y procesamiento de música a través del programa Csound”.Universidad Nacional de Quilmes. Bernal. Argentina.

 

Kernighan, BryanRitchie, Dennis (1991). “El lenguaje de programación C”. Prentice Hall Hispanoamericana. Mexico. 

 

Harlow, Eric (1999). “Desarrollo de aplicaciones Linux con GTK+ y GDK”. Prentice Hall Iberia. Madrid.

 

Moore, F, R (1990).  “Elements of Computer Music”. Prentice Hall, N.J.