domingo, 20 de mayo de 2012

Recolección de audio y cálculo de energía de la señal


Ahora que ya hemos construido todos los módulos de generación de sonido, pasamos a operar con toda la información que tenemos disponible de las instrucciones MIDI y del audio generado para crear una serie de visualizaciones, las cuales serán posteriormente representadas en la matriz de LEDs.


En primer lugar, queremos coger todo el audio generado en el programa o en los sintetizadores externos y mezclarlo, sumar todos los canales. De esta forma ya tenemos en un sólo flujo de audio estéreo todos los sonidos producidos y podemos operar con él.
Para mostrar la energía por bandas de la señal introducimos la señal ya mezclada en el módulo de visualización de energías que se encuentra en el patch ‘as_energyDisplayPanel.pd’.


En este módulo se realizan 3 tareas diferentes:

  • Envío del audio final al DAC del ordenador Es en este módulo donde enviamos la suma de todos los canales de audio existentes en el programa a la salida de audio del Pure Data, que conectamos por defecto a la salida de audio del sistema.
  • Representación de la señal de audio Además, se dibuja en pantalla la señal de audio en el tiempo.
  • Visualización de la energía por bandas Por último, y empalmando con el envío de datos a la matriz LED, se calcula la energía de la señal en 16 bandas de frecuencia diferentes utilizando un banco de filtros paso banda.

En cuanto a la visualización de energía, se pasa la señal a través de 16 filtros paso banda de 2º orden centrados en 25, 40, 63, 100, 160, 250, 380, 550, 790, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, y 16kHz. Su ancho de banda se expresa en octavas respecto de la frecuencia central, siendo el valor 100 equivalente a una octava. Nuestros filtros están configurados con un valor de 20, es decir, 1/5 de octava.
8 primeros filtros
Para calcular la energía de la señal utilizamos el objeto ‘env~’, que devuelve la amplitud RMS de la misma en dB (tomando el valor 1 como 100 dB). Esta configurado para utilizar una ventana de 512 muestras y realizar el cálculo cada 256 muestras. A continuación, se realiza la media aritmética de cada pareja de filtros (se suman por parejas y se normaliza: (filtro 1 + filtro 2)/2, (filtro 3 + filtro 4)/2, etc.) y se obtienen 8 valores de energía a lo largo de casi todo el rango de frecuencias audible.


A estos valores se les aplica una función de transferencia con el objetivo de ajustar los diferentes valores a la cantidad de LEDs que deben encenderse en cada caso y se restringe su valor entre 0 y 199 (por especificación del protocolo que hemos diseñado para comunicarnos con el micro).


Los datos generados por los filtros se muestran por pantalla utilizando una serie de vúmetros individuales. Y, por último, una vez obtenidos, los 8 bytes que contienen esos valores se empaquetan en un mensaje y se envían cada 50 milisegundos al último módulo del programa, el subsistema de visualización. Este es el encargado de hacer llegar al Arduino toda la información que queremos ver en la matriz LED.

No hay comentarios:

Publicar un comentario