70 votos

Necesita ayuda comprensión FFT salida

Necesito un poco de ayuda para la comprensión de la salida de la DFT/cálculo de la FFT.

Soy un experimentado ingeniero de software y la necesidad de interpretar algunos smartphone acelerómetro lecturas, tales como la búsqueda de un director de frecuencias. Por desgracia, me dormí a través de la mayor parte de mis estudios universitarios de EE clases de hace quince años, pero he estado leyendo en la DFT y FFT para los últimos días (con poco éxito, al parecer).

Por favor, no hay respuestas de "ir a tomar un EE de clase". De hecho estoy planeando hacer si mi empleador me va a pagar. :)

Así que aquí está mi problema:

He capturado una señal a 32 Hz. Aquí es un 1 segunda muestra de 32 puntos, que me he trazado en Excel.

enter image description here

Conseguí algunos FFT código escrito en Java de la Universidad de Columbia (después de seguir las sugerencias en un post sobre "rápido y Fiable de la FFT en Java").

La salida de este programa es como sigue. Creo que es la ejecución en lugar de la FFT, por lo que re-utiliza el mismo buffer de 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  ]

Así, en este punto, no puedo hacer cara o cruz de la salida. Entiendo que la DFT conceptos, tales como el real porción siendo la amplitud de la componente de ondas coseno y el imaginario porción siendo la amplitud de la componente de ondas sinusoidales. Yo también puede seguir este diagrama de el gran libro "El Científico y el Ingeniero de Guía para el Procesamiento de la Señal Digital": enter image description here

Así que mis preguntas concretas son:

  1. Desde la salida de la FFT, ¿cómo puedo encontrar "la mayoría de las frecuencias de origen"? Esto es parte de mi análisis de mis datos del acelerómetro. Debería leer el real (coseno) o imaginario (sine) matrices?

  2. Yo tengo una de 32 puntos de entrada en el dominio del tiempo. No debería la salida de la FFT ser una de 16 elementos de la matriz de reales y una de 16 elementos de la matriz para el imaginario? ¿Por qué el programa me dé la real e imaginaria de la matriz de salidas tanto de tamaño de 32?

  3. Relacionado con la pregunta anterior, ¿cómo analizar los índices de la salida de matrices? Dada mi entrada de 32 muestras de la muestra a 32 Hz, a mi entender, es que una de 16 elementos de la matriz de salida debe tener su índice de distribuir de forma uniforme hasta 1/2 de la frecuencia de muestreo (de 32 Hz), por lo que estoy en lo correcto en la comprensión de que cada elemento de la matriz representa (32 Hz * 1/2) / 16 = 1 Hz?

  4. ¿Por qué la FFT de salida tienen valores negativos? Pensé que los valores representan las amplitudes de una sinusoide. Por ejemplo, la salida de Real[ 3 ] = -1.075 debe significar una amplitud de -1.075 para una onda coseno de frecuencia 3. Es ese derecho? ¿Cómo puede una amplitud ser negativo?

71voto

Nils Pipenbrinck Puntos 41006
  1. Usted no debe buscar el verdadero o imaginativa parte de un número complejo (que lo es su real e imaginaria de la matriz). En cambio quieres ver la magnitud de la frecuencia con la que se define como la raíz cuadrada (real * real + imag * imag). Este número siempre será positivo. Ahora todo lo que tienes que buscar es el máximo valor (ignorar la primera entrada de su matriz. Que es el DC offset y no tiene dependientes de la frecuencia de la información).

  2. Usted obtener 32 reales y 32 imaginario salidas porque usted está usando un complejo de complejo de FFT. Recuerde que usted haya convertido sus 32 muestras en los 64 valores (o 32 complejo de valores) mediante la ampliación con cero imaginaria. Esto se traduce en una simétricos FFT de salida donde la frecuencia resultado se produce dos veces. Una vez listo para su uso en las salidas de 0 a N/2, y una vez reflejado en las salidas de N/2 a N. En su caso es más fácil simplemente hacer caso omiso de las salidas de N/2 a N. no los necesita, ellos son sólo un artefacto sobre cómo calcular la FFT.

  3. La frecuencia fft-bin ecuación es (bin_id * freq/2) / (N/2), donde la frecuencia es la muestra de frecuencia (aka 32 Hz, y N es el tamaño de la FFT). En el caso de que esto se simplifica a 1 Hz por bin. Los contenedores de N/2 para N representan las frecuencias negativas (concepto extraño, lo sé). Para tu caso no contienen ninguna información significativa, porque son un espejo de los primeros N/2 frecuencias.

  4. Sus partes reales e imaginarias de cada bin forma de un número complejo. Está bien si las partes reales e imaginarias son negativos, mientras que la magnitud de la frecuencia de la misma es positiva (véase mi respuesta a la pregunta 1). Le sugiero que lea los números complejos. Explicar cómo funcionan (y por qué son útiles) excede lo que es posible explicar en una sola stackoverflow-pregunta.

Nota: Usted también puede querer leer lo de autocorrelación es 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.

8voto

Paul R Puntos 104036

Ya tienes algunas buenas respuestas, pero solo agregare que realmente necesita para aplicar una función de ventana a los datos de dominio de tiempo antes de la FFT, de lo contrario obtendrá desagradables artefactos en su espectro.

5voto

duskwuff Puntos 69245

1) busca los índices en el real de la matriz con los valores más altos, además de la primera (que es la componente continua (DC). Usted probablemente tendrá una frecuencia de muestreo considerablemente más alto que el de 32 Hz, y un mayor tamaño de la ventana, para conseguir mucho en la forma de resultados significativos.

2) en 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 elemento (1.774), y el último elemento del imaginario de la matriz (1.474) es el negativo del segundo elemento.

3) La frecuencia máxima que se puede recoger con una frecuencia de muestreo de 32 Hz es de 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 (he.e, el DC offset).

4) Asegúrese de que, de una amplitud negativa tiene perfecto sentido. Sólo significa que la señal es "volteado" -- un estándar de la FFT se basa en un coseno, que normalmente tiene un valor = 1 en t = 0, por lo que una señal de que tenía valor = -1 a = 0 tendría una amplitud negativa.

5voto

hotpaw2 Puntos 40796

Tenga en cuenta que la «mayoría frecuencia ocurrir» puede conseguir salpicada en varios compartimientos de la FFT, incluso con una función de ventana. Por lo que tenga que usar una ventana más, múltiples ventanas o interpolación para estimar mejor la frecuencia de los picos espectrales.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X