java audio signal-processing accelerometer fft

java - Comprender la salida de FFT



audio signal-processing (4)

Necesito ayuda para entender el resultado del cálculo DFT / FFT.

Soy un experimentado ingeniero de software y necesito interpretar algunas lecturas de acelerómetros de teléfonos inteligentes, como encontrar las frecuencias principales. Desafortunadamente, dormí durante la mayoría de mis clases de EE de la universidad hace quince años, pero he estado leyendo sobre DFT y FFT durante los últimos días (aparentemente, al parecer).

Por favor, no hay respuestas de "ve a tomar una clase de EE". De hecho, estoy planeando hacer eso si mi empleador me paga. :)

Pues aqui esta mi problema:

He capturado 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ápida 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 buffer para entrada y 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 hacer cara o cruz de la salida. Entiendo los conceptos de DFT, como la porción real que es la amplitud de las ondas de coseno componentes y la parte imaginaria son las amplitudes de las ondas sinusoidales componentes. También puedo seguir este diagrama del gran libro " The Scientist and Engineer''s Guide to Digital Signal Processing ":

Entonces mis preguntas específicas son:

  1. 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 reales (coseno) o imaginarias (sinusoidales)?

  2. Tengo una entrada de 32 puntos en el dominio del tiempo. ¿No debería el resultado de la FFT ser una matriz de 16 elementos para los reales y una matriz de 16 elementos para los imaginarios? ¿Por qué el programa me da salidas de matriz reales e imaginarias de tamaño 32?

  3. En relación con la pregunta anterior, ¿cómo puedo analizar 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 debería tener su índice uniformemente extendido hasta 1/2 de la frecuencia de muestreo (de 32 Hz), así que estoy en lo cierto al comprender que cada elemento de la matriz representa (32 Hz * 1/2) / 16 = 1 Hz?

  4. ¿Por qué la salida de FFT tiene valores negativos? Pensé que los valores representan las amplitudes de una sinusoide. Por ejemplo, la salida de Real [3] = -1.075 debería significar una amplitud de -1.075 para una onda de coseno de frecuencia 3. ¿Es correcto? ¿Cómo puede una amplitud ser negativa?


  1. Tampoco debes buscar la parte real o imaginativa de un número complejo (esa es tu 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).

  2. Obtiene 32 salidas reales y 32 imaginarias porque está utilizando una FFT compleja o compleja. Recuerde que ha convertido sus 32 muestras en 64 valores (o 32 valores complejos) extendiéndolo con cero partes imaginarias. Esto da como resultado una salida de FFT simétrica donde el resultado de la frecuencia ocurre dos veces. Una vez 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 solo un artefacto sobre cómo calcula su FFT.

  3. La frecuencia de la ecuación fft-bin es (bin_id * freq / 2) / (N / 2) donde freq es la frecuencia de muestreo (también conocida como 32 Hz, y N es el tamaño de tu 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.

  4. Sus 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 (ver mi respuesta a la pregunta 1). Sugiero que leas sobre números complejos. Explicar cómo funcionan (y por qué son útiles) excede lo que es posible explicar en una sola pregunta .

Nota: También puede leer qué es la autocorrelación y cómo se usa para encontrar la frecuencia fundamental de una señal. Tengo la sensación de que esto es lo que realmente quieres.


1) Busque los índices en la matriz real con los valores más altos, además del primero (ese es el componente DC). Probablemente necesites 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, tenga en cuenta que el último elemento de la matriz real (1.774) es el mismo que el segundo (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á "volteada": una FFT estándar se basa en un coseno, que normalmente tiene valor = 1 en t = 0, por lo que una señal que tenía valor = -1 en el tiempo = 0 tendría una amplitud negativa .


Tenga en cuenta que la "frecuencia más frecuente" puede salpicar en varios contenedores FFT, incluso con una función de ventana. Por lo tanto, es posible que deba usar una ventana más larga, ventanas múltiples o interpolación para estimar mejor la frecuencia de cualquier pico espectral.


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.