Paso 3: Software
Usted puede encontrar el software de Atmel estudio proyecto en github
Hay 2 proyectos en esta git. El proyecto básico incluye todas las funciones básicas para medir y calcular los datos. También incluye una clase de WS2812 LED. El Matrixproject incluye todos los datos para mi proyecto basado un una matriz de LED 7 x 6 con WS2812 LED. Como esto es muy específico, este código es más de inspiración y ejemplo de lo que puede hacer.
Esta parte es la más compleja de este proyecto, el software tiene que hacer un montón de cosas.
Los datos de muestreo
En primer lugar usted necesita obtener los datos en el controlador. Esto se hace mediante el muestreo de la señal de audio con un ADC. La frecuencia de muestreo depende del rango de frecuencia que desea trabajar con. Si usted muestra la señal con una velocidad de 32kHz que puede recrear señales de hasta 16kHz con la transformación de Fourier (FT). Este es el rango de frecuencia que desea trabajar.
Para hacer este trabajo un temporizador para activar con una frecuencia de 32kHz y leer un valor desde la ADC cada vez que esto sucede. Puesto que el controlador atxmega tiene un controlador DMA, se utiliza para automatizar el proceso. DMA (acceso directo de memoria) le permite mover datos de un punto en la memoria a otro completamente en hardware. La DMA se configura de una manera, que se mueve el resultado de la ADC en un lugar específico en la RAM cada vez que se activa por el temporizador. Nos muestra los 128 valores por el canal.
Transformación de Fourier rápida (FFT)
Utilizamos la biblioteca de la FFT de elmchan para este proyecto.
Generalmente un FT utiliza mucho tiempo de cálculo, pero le permite recrear cada frecuencia dentro del espectro de la señal dada. La FFT simplifica este proceso y lo acelera. La desventaja es, que no te da las frecuencias específicas pero las bandas de frecuencia. Con el propósito de este proyecto, esta información es suficiente.
Ya que nos muestra valores de 128, la FFT nos dará 64 resultados. Debido a la frecuencia de muestreo (32 kHz) podemos recrear las frecuencias hasta 16 kHz, que se divide en bandas de 64 por la FFT. 16000 / 64 = 250. Esto significa que cada banda FFT describe el nivel de 250 Hz. FFT banda 1 le da un valor de 1Hz a 250Hz, banda 2 251 Hz a 500Hz, banda 3 Hz 501 a 750Hz y así sucesivamente. Al aumentar el número de muestras de entrada podría aumentar esta resolución, pero también aumentar el tiempo de cálculo necesario.
Esas 64 bandas se consolidan en 7 bandas, que se utilizan para la matriz, que tiene una anchura de 7 LED. Algunos efectos se basan todavía en las bandas de 64 originales.
El algoritmo para el cálculo de la FFT se codifica de manera que no todos los pasos de cálculo a la vez, pero divide en pedazos más pequeños. Esto se hace para darle tiempo al controlador para calcular otra cosa entre esas medidas. Si no haces esto, las animaciones se a veces tartamudeo, que no se ven bien.
El oído humano reacciona diferente a ciertas frecuencias. Es muy sensible a las frecuencias alrededor de 4kHz y no sensible a muy bajas y altas frecuencias. En una señal de audio que las bajas frecuencias tendrá una gran amplitud, que conduce a resultados altos de la FFT, y bajas amplitudes en las frecuencias medias, que conduce a resultados bajos de FFT. Esto hace difícil hacer cálculos con. Para contrarrestar este un sistema muy simple de una ponderación inverso se utiliza. Los coeficientes son calculados previamente para cada banda y multiplicados con cada una de las 64 bandas FFT.
Detección de Beat
La idea básica detrás de esto es simple: promedio de la potencia del nivel sonoro. Si el nivel de potencia actual es cierto superior a esta media tiene un ritmo. Para hacer esto correctamente necesita la señal de audio continuamente, que nosotros no la muestra. Pero todavía vamos a usar esta idea.
Los resultados de la FFT se dividen en 3 grupos: baja, media y alta. Esos valores son promediados en el tiempo como una media móvil. Si el nivel actual es mayor que 50% a 100% (dependiendo de la banda) de este promedio se evalúa como beat. Esto funciona muy bien con un metrónomo, que produce un sonido simple, pero no funciona demasiado bien con señales complejas como canciones. La detección de beat en la banda inferior funciona mejor y el centro de banda lo peor cuando hay voz en la canción.
¿Qué hacer con esos datos?
Como ejemplo voy a explicar cómo funciona la pantalla de espectro mono. Puede encontrar el código en el proyecto completo en animations.cpp en la función void anim_monospektrum_step(). Esta animación se utiliza en el video de intro.
Los valores de las 7 bandas consolidadas se establecen como valores objetivo para la altura de las columnas. Se escala de forma que este valor varía entre 0 y 9000. El desplazamiento de color blanco se encuentra por la amplitud. Los valores reales, que se utilizará para el cálculo de la salida, poco a poco cambian su valor para que coincida con el valor objetivo. Esto hace que la animación se vea muy fluido y evita saltos repentinos.
La matriz tiene una altura de 6 LED. Esto significa que cada LED abarca 9000 / 6 = 1500 cuentas del valor real. Si el valor real de una banda es 1500, enciende solamente el LED en la parte inferior. Si el valor es de 3000 los dos inferiores más LED se enciende. Como mucho el valor real es mayor que 1500 nos ilumina uno más dirigido y restar 1500 del valor. Si después de este proceso, el valor no es 0, el LED el LED de encendido completo pasado se enciende así, pero el brillo se ajusta con el valor. Cuanto menor el restante valor más bajo el brillo.
Como un detalle adicional las bandas parpadeará cuando se detecta un latido dentro de esta banda.