Necesito ayuda para comprender la salida del cálculo DFT / FFT.
Soy un ingeniero de software experimentado y necesito interpretar algunas lecturas del acelerómetro de teléfonos inteligentes, como encontrar las frecuencias principales. Desafortunadamente, dormí durante la mayoría de mis clases de EE en la universidad hace quince años, pero he estado leyendo sobre DFT y FFT durante los últimos días (aparentemente con poco éxito).
Por favor, no responda "ve a tomar una clase de EE". De hecho, planeo hacerlo si mi empleador me paga. :)
Pues aqui esta mi problema:
Capturé una señal a 32 Hz. Aquí hay una muestra de 1 segundo de 32 puntos, que he trazado en Excel.
Luego obtuve un código FFT escrito en Java de la Universidad de Columbia (después de seguir las sugerencias en una publicación sobre " FFT confiable y rápido en Java ").
El resultado de este programa es el siguiente. Creo que está ejecutando una FFT en el lugar, por lo que reutiliza el mismo búfer tanto para la entrada como para la salida.
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
Entonces, en este punto, no puedo sacar ni cara ni cruz de la salida. Entiendo los conceptos de DFT, como que la parte real son las amplitudes de las ondas del coseno componentes y la parte imaginaria son las amplitudes de las ondas sinusoidales componentes. También puedo seguir este diagrama del gran libro " La guía del científico e ingeniero para el procesamiento de señales digitales ":
Entonces mis preguntas específicas son:
A partir de la salida de la FFT, ¿cómo encuentro las "frecuencias más frecuentes"? Esto es parte de mi análisis de los datos de mi acelerómetro. ¿Debo leer las matrices real (coseno) o imaginaria (seno)?
Tengo una entrada de 32 puntos en el dominio del tiempo. ¿No debería la salida de la FFT ser una matriz de 16 elementos para reales y una matriz de 16 elementos para imaginarios? ¿Por qué el programa me da salidas de matriz reales e imaginarias de tamaño 32?
En relación con la pregunta anterior, ¿cómo analizo los índices en las matrices de salida? Dada mi entrada de 32 muestras muestreadas a 32 Hz, tengo entendido que una salida de matriz de 16 elementos debe tener su índice distribuido uniformemente hasta la mitad de la frecuencia de muestreo (de 32 Hz), así que estoy en lo correcto al entender que cada elemento de la matriz representa (32 Hz * 1/2) / 16 = 1 Hz?
¿Por qué la salida FFT tiene valores negativos? Pensé que los valores representan amplitudes de una sinusoide. Por ejemplo, la salida de Real [3] = -1.075 debería significar una amplitud de -1.075 para una onda cosenoidal de frecuencia 3. ¿Es correcto? ¿Cómo puede ser negativa una amplitud?
fuente
Respuestas:
No debe buscar la parte real o imaginativa de un número complejo (que es su matriz real e imaginaria). En su lugar, desea buscar la magnitud de la frecuencia que se define como sqrt (real * real + imag * imag). Este número siempre será positivo. Ahora todo lo que tiene que buscar es el valor máximo (ignore la primera entrada en su matriz. Esa es su compensación de CC y no contiene información dependiente de la frecuencia).
Obtiene 32 salidas reales y 32 imaginarias porque está utilizando una FFT compleja a compleja. Recuerde que ha convertido sus 32 muestras en 64 valores (o 32 valores complejos) extendiéndolos con cero partes imaginarias. Esto da como resultado una salida FFT simétrica donde el resultado de frecuencia ocurre dos veces. Una vez que esté listo para usar en las salidas 0 a N / 2, y una vez reflejado en las salidas N / 2 a N.En su caso, es más fácil simplemente ignorar las salidas N / 2 a N.No las necesita, son sólo un artefacto sobre cómo calcula su FFT.
La frecuencia de la ecuación fft-bin es (bin_id * freq / 2) / (N / 2) donde freq es su frecuencia de muestra (también conocida como 32 Hz, y N es el tamaño de su FFT). En su caso, esto se simplifica a 1 Hz por contenedor. Los contenedores N / 2 a N representan frecuencias negativas (concepto extraño, lo sé). Para su caso, no contienen ninguna información significativa porque son solo un espejo de las primeras frecuencias N / 2.
Tus partes reales e imaginarias de cada contenedor forman un número complejo. Está bien si las partes reales e imaginarias son negativas mientras que la magnitud de la frecuencia en sí es positiva (vea mi respuesta a la pregunta 1). Le sugiero que lea sobre números complejos. Explicar cómo funcionan (y por qué son útiles) excede lo que es posible explicar en una sola pregunta de stackoverflow.
Nota: es posible que también desee leer qué es la autocorrelación y cómo se utiliza para encontrar la frecuencia fundamental de una señal. Tengo la sensación de que esto es lo que realmente quieres.
fuente
Ya tiene algunas buenas respuestas, pero solo agregaré que realmente necesita aplicar una función de ventana a sus datos de dominio de tiempo antes de la FFT; de lo contrario, obtendrá artefactos desagradables en su espectro, debido a la fuga espectral .
fuente
1) Busque los índices en la matriz real con los valores más altos, además del primero (que es el componente DC). Probablemente necesite una frecuencia de muestreo considerablemente superior a 32 Hz y un tamaño de ventana más grande para obtener resultados significativos.
2) La segunda mitad de ambas matrices es el espejo de la primera mitad. Por ejemplo, observe que el último elemento de la matriz real (1.774) es el mismo que el segundo elemento (1.774), y el último elemento de la matriz imaginaria (1.474) es el negativo del segundo elemento.
3) La frecuencia máxima que puede captar a una frecuencia de muestreo de 32 Hz es 16 Hz ( límite de Nyquist ), por lo que cada paso es de 2 Hz. Como se señaló anteriormente, recuerde que el primer elemento es 0 Hz (es decir, el desplazamiento de CC).
4) Claro, una amplitud negativa tiene mucho sentido. Simplemente significa que la señal está "invertida": una FFT estándar se basa en un coseno, que normalmente tiene un valor = 1 en t = 0, por lo que una señal que tiene un valor = -1 en el momento = 0 tendría una amplitud negativa .
fuente
Tenga en cuenta que la "frecuencia más frecuente" se puede dispersar en varios contenedores FFT, incluso con una función de ventana. Por lo tanto, es posible que deba usar una ventana más larga, múltiples ventanas o interpolación para estimar mejor la frecuencia de cualquier pico espectral.
fuente