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.He leído decenas de explicaciones de que frecuencia representa cada bin de la FFT hasta que encontré un documento (que no tengo acá, esta en la facu) donde explicaba a la perfeccion y pude comprobar prácticamente. Si mal no recuerdo, el bin 0 no tiene solo la componente de continua. Cada bin de la FFT, por ser ésta discreta, presenta el contenido de un grupo de frecuencias y tiene una respuesta más precisa a una frecuencia central. Entonces con una Fs de 20.000Hz y una FFT de 1024puntos tenemos una resolucion de 19.53 Hz. Yo creo que eso no significa que el bin 1 me indique la potencia de la señal solo de 19.53Hz. De hecho, si coloco el GAF y voy variando la frecuencia de a 1 Hz puedo ver como el espectro se mueve de un bin a otro "de a poco" no hay un salto discreto entre 19.53 y 39.06, si no que se va "transfiriendo" de un bin a otro. Lo que no recuerdo es si el bin 0 es una excepcion y solo mide el contenido de DC (leí en muchos lugares que es así, pero en lugares donde para mi erran en el concepto anterior). Aquí tengo algunas dudas ya que la transferencia entre bines es medio rara, ya mostrare un video de lo que digo para que me ayuden a entender.
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...
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)
Hola elgarbe
Creo saber qué es lo que pasa con el sampleo del ADC que tienes al momento de manipular los datos...
El tema está en el formato de los datos, veras:
Tu mencionas que simplemente acomodaste la señal para que quedara a la mitad, o sea, a 2047 - 2048 medido en el ADC...
Eso qué estas haciendo tiene un nombre: "positive straight offset binary code" o sea, es un OFFSET pero tus muestras NO tienen un formato numérico real...
Pues bien, te falta ese paso en ese punto, ya qué el sistema debe estar en complemento a 2 o con signo para leer de + - 2048
La idea es simple: Negar el bit MSB de tus muestras:
En mi caso por ejemplo, usando 8 bits, el primer paso me entrega valores como...
0 1 2 .... 127 - 128 ... 129 ... 255, tomando la mitad es el offset positivo binario...
todo lo qué tengo que hacer es negar el bit MSB del ADC, para que me quede algo como...
128 129 130.... 255 ... 0 1 2 ... 127... (viendolo como un valor entero)
Pero en realidad considerando el bit MSB como el signo, tengo...
- 128 -127 -126... -3 -2 - 1 0 1 2 3 4 ... 127
Y entonces ya la FFT puede procesar correctamente los valores, pues estarán con signo desde el inicio, de ahí que precisamente tu primer BIN salga hasta el tope...
Este es un test interesante, es largo el video pero explica mucho:
Como realizas el cómputo de lo que muestras?
Porque hay 2 efectos que son vistosos, pero ireales.
El primero es que hay una "latido" en los bines, es como si fuesen "bailando" con una frecuencia de 0.5Hz o algo así
El segundo es que nunca tienes bines puros, siempre tienes perdida (frequency leckage) alrededor del bin y simpre es la misma cantidad, en ves de tener un bin tiene una "campana". Eso no parece real. A medida que la frecuencia va subiendo, llega un punto que pasa por la frecuencia central de un bin de la FFT, en ese momento deberías tener un baston perfecto. Luego entre 2 frecuenicas centrales hay un efecto que creo es frequency leackage que hace que el espectro valla pasando de un bin al siguiente "desparramando" un poco el espectro...
No digo que el resultado que muestras no sea lindo, todo lo contrario, es muy vistos. Pero debe tener algo de procesamiento adicional porque no me parece real y no me permite comparar con lo que yo obtengo.
Saludos!
El primer punto que nunca estudié es que iba a pasar cuando el refresco de la pantalla (SPI + DMA1) compita por el bus con el muestreo de mediana velocidad (ADC + DMA1). En mi caso el micro (STM32F103RB) posee un solo módulo DMA y 7 canales. Cada canal puede manejar un periferico distinto. Pero la RAM es una sola y puede ser un problema si el SPI quiere LEER la RAM para escrivir en el SPI y a la vez el ADC quiere ESCRIVIR la RAM con los datos del ADC.
Estoy analizando circuitos para amplificar un poco la señal de audio de entrada.
Que les parece esta opción?
- Tienes que ingresar para ver archivos adjuntos -
No estoy seguro la amplitud de la señal de un reproductor de mp3 o la salida de audio de un celular... Tendría que hacer una medicion para ajustar la ganancia y quizá poner un preset para ajustar diferentes tipos de señal...
Saludos
Los valores que usé Yo para el op amp que amplifica son:
Rin = 680 ohms
R retroalimentacion = 2.8K
Cap In = 220 nanofaradios (evitará que satures siempre los bajos)
Cap retroalimentación = 1 nf