Hola elgarbe
Siempre me han gustado los páneles de LED y más con analizadores de espectros, pero déjame hacerte unas sugerencias:
1.- El primer factor de la FFT NO es tal cual el valor de frecuencia de 0 a X Hz, en realidad es el valor de voltaje DIRECTO que tiene la señal, en éste caso lo puedes notar porque la primera barra siempre está al tope, lo cual significa qué tu ADC NO esta centrado a la mitad del valor de voltaje medido, es decir, que tu FFT pareciera estar mostrando voltajes positivos cuando en realidad debería capturar el rango positivo y negativo.
2.- Hay un punto muy importante y a la vez curioso cuando se desarrolla una FFT, el cual normalmente se menciona en un solo párrafo en los libros (DSP Proakis Manolakis por ejemplo) y tiene que ver con qué tanto es tantito la resolución necesaria en bits para la FFT.
Este valor, tiene qué ver con el nivel señal ruido, el cual normalmente es de 60 dB.
¿Qué significa? Que dado un tamaño de puntos de FFT y su frecuencia, se puede determinar cuantos bits es necesario tener en el ADC para asegurar una relación señal-ruido de 60 dB, lo cual, para aplicarse en un display bien podrían ser 8 bits (12 bits está sobrado)
3.- Lo más importante al momento de hacer un analizador de espectros, es precisamente mantener en tiempo REAL la captura y despliegue de la FFT, porque si capturas un segmento de audio, lo procesas y lo envías al display y luego comienzas de nuevo, vas a perder segmentos de audio...
Es en esos pequeños segmentos de audio qué se pierden, en donde las frecuencas media-altas se encuentran, tal que podrás notar que los graves y los medios se despliegan correctamente más pareciera que los agudos no.
Ese efecto NO se nota cuando pruebas tu sistema bajo un generador de señales, pues la señal aplicada es periódica, pero en audio, el sonido de los platillos de la batería suele no graficarse con la intensidad necesaria.
Para ello, lo correcto es que el tiempo de procesamiento de tu FFT, sea igual o menor al tiempo de captura de muestras, tal qué si tomas por ejemplo 32 muestras @ 50 uS = 1.6 milisegundos, ese sea el tiempo de procesamiento máximo de tu FFT, y al mismo tiempo, por interrupción o DMA, captures el siguiente bloque de muestras mientras procesas la FFT del bloque actual...
4.- La frecuencia de sampleo que tienes es muy baja, en realidad SI qué debería de ser de 40 Khz y hasta de 80 Khz para samplear el canal izquierdo y el derecho y promediarlos, más es posible que tu procesamiento de FFT tarde mucho (debido a los 12 bits del ADC) y hayas restringido el valor de frecuencia del ADC
Ahora, te recomiendo separar en dos partes el procesamiento de FFT versus el refresco de la pantalla de LEDS, pues eso te va a permitir hacer cosas bastante interesantes:
Si estableces tu refresco de pantalla a 30 o 60 hz, lo que puedes hacer entre refresco y refresco es capturar N FFT y promediarlas u obtener los PICOS de intensidad más altos de ellas tal qué cuando procedas a graficar la señal puedas precisamente representar los picos de los bines capturados entre periodos de refresco...
Ejemplo: Si usas 30 Hz de refresco y capturas 32 puntos @ 50 uS puedes capturar 20.83 FFTs entre los tiempos de refresco de tu pantalla
Por otro lado, al tener un periodo de refresco de pantalla independiente a la captura de FFT, puedes "simular" capacitores qué hagan qué cada barrita baje suavemente en lugar de presentar a "secas" la FFT procesada, recuerda que un analizador de espectros es más un elemento estético qué un instrumento de medición...
Este es un ejemplo, pero en un PIC18, en una pantalla OLED de 256 x 64 pixeles en 16 tonos de grises, sampleando a 80 Khz para capturar canal derecho e izquierdo, obtener el valor RMS de cada canal de audio y promediarlos para generar la FFT de 128 puntos usando el ADC en modo de 8 bits.
Primero se captura el primer bloque de audio, y mientras se procesa se continua en paralelo la captura del siguiente bloque de audio, de tal manera qué al final se capturar 7 FFT, se obtienen los picos de señal de cada una y se simula un capacitor de decay para suavizar las barras...