Paso 4: Versión simplificada e iniciación
La parte más compleja del hardware es la etapa de entrada de audio. Si no desea utilizar un equipo de música, pero una señal mono, simplemente puede cortar una de las etapas de entrada. Si desea aún más sencillo podrías sólo una muy simple etapa de entrada, que tiene una alta resistencia y sólo un filtro. Puede que necesite agregar otra etapa de amplificador a esto.
Si está utilizando un Arduino no es posible copiar y pegar el código fuente proporcionado, ya que la placa Arduino no se basa en un controlador de atxmega.
Si desea utilizar este proyecto con otro controlador, necesita adaptar el código usted mismo. Los siguientes pasos le dará una idea sobre qué hacer:
Lo primero que tienes que hacer es la señal de audio de la muestra. Nos necesita 128 puntos de datos y una frecuencia de muestreo de 32kHz aproximadamente. La forma más sencilla de hacer esto es hacer un bucle, que lee al ADC y luego hace una pausa de sobre 30µs. El retraso de 30µs en combinación con el tiempo necesario para leer los datos debe dar una frecuencia de muestreo más o menos precisa.
El siguiente paso es la FFT. Un chico puso la biblioteca FFT utilizada en este proyecto en una biblioteca conveniente para Arduino. Esto viene con un ejemplo, que explica cómo usarlo. En el ejemplo se utiliza el modo recorrido libre de la ADC, que lamentablemente no funciona a 30kHz. Esto no es necesariamente una mala cosa, pero su rango de frecuencias se verán afectada y tus cubos FFT tendrá una resolución diferente. Por supuesto también puede consultar el proyecto oficial de la biblioteca de la FFT.
Si desea implementar una detección de beat solo mirar la explicación en la parte del software o el código de mi proyecto. Esto es matemática básica y se puede copiar/pegar.
Qué sucede después de que es tú imaginación. Los métodos más utilizados para hacer animaciones dulce, pérdida de color o lo que quieras hacer son estas:
- valor objetivo: el valor objetivo se deriva de los datos de la FFT. El valor real cambia poco a poco hasta alcanzar el valor objetivo.
- media móvil: Recuerdas los últimos X valores. Esos valores se suman y dividen por X. Esto le da la media móvil
- ponderación media móvil: esto es un poco como la media móvil, pero valores más nuevos tienen una mayor influencia en el resultado que los mayores valores. valor = ((valor * (NUM - 1)) + new_value) NUM NUM puede ser libremente elegido; Más alto significa que se adapta más lento/suavizador
Estos métodos le permiten hacer animaciones de aspecto fluidos. Si usted toma los datos dirigen de la FFT que puede ver saltos súbitos en por ejemplo el desvanecimiento del color. Utilizo el sistema de valor real/objetivo y ponderado móvil promedio mayor parte del tiempo.
Un ejemplo muy sencillo sobre cómo utilizar esta fórmulas es esta línea de código: color = ((color * 15) + fft_bucket_h_l) / 16;
Calcula una media móvil ponderada de la canastilla de la FFT con el valor más alto en el canal izquierdo. Este valor puede utilizarse entonces para establecer el color de un LED RGB. ¡ Felicidades! Usted acaba de hacer un LED, que cambia su color dependiendo de la frecuencia más dominante.
A primera vista este Matemáticas pueden parecer abrumadora, pero por suerte todo el trabajo duro ya está hecho. Si pasas algún tiempo a su forma de trabajo en este proyecto a ver que puede hacer impresionantes efectos con algunos simples de matemáticas que has aprendido en la escuela.
Datos importantes para su uso
Los datos de la FFT se pueden acceder mediante la fft clase como esta:
fft_result_t * fft_left = fft.getLeft(); para el canal 1
fft_result_t * fft_right = fft.getRight(); para el canal 2
La estructura del resultado se ve así:
typedef struct {}
espectro de uint16_t [FFT_N / 2];
uint16_t adc_min, adc_max;
} fft_result_t;
espectro es un array de 64 elementos, que el resultado de la FFT. adc_min y adc_max son los valores mínimos y máximos de la señal.
Dentro de la animation.cpp, donde debe colocar su código de animación tienes acceso a las siguientes variables globales
uint16_t bands_l [ANIM_BAND_NUM], bands_r [ANIM_BAND_NUM]; condensan de matrices que contienen los datos del 7
bandas uint16_t amplitude_l, amplitude_r; amplitud, por los valores adc_min y adc_max
uint8_t beats, bpm_h, bpm_m, bpm_l, bpm_all; Late contiene una máscara de bits, que permite comprobar si hubo un golpe en una banda específica. La otra variable darle los golpes por minuto para alta, media, baja y todo (cualquier) banda
uint8_t fft_bucket_h_l, fft_bucket_h_r, fft_bucket_l_l, fft_bucket_l_r; número (0... 63) de la FFT cubo con el valor más alto y más bajo de todas las variables _l se refiere al canal izquierdo y _r a la derecha.