¿Cuál es el significado de los resultados de mi transformada de Fourier?

He estado experimentando con transformadas de Fourier y me gustaría entender algunos de los resultados que estoy viendo.

He escrito un simulador que genera un flujo de datos de 1/120 segundos de duración, muestreado a intervalos de 33,92 nS. Los datos representan una onda semisinusoidal generada por un inversor. Concatené este flujo con su propio inverso negativo, para crear una sola onda sinusoidal de 60 Hz perfectamente simétrica de 491,352 muestras de largo.

ingrese la descripción de la imagen aquí

Luego ejecuté una FFT de los resultados usando numpy . La mayoría de los resultados tenían sentido para mí: la FFT tenía la misma longitud que la señal original. Los resultados discretos de Fourier son simétricos con respecto a la fundamental, por lo que tengo la mitad de "contenedores" (alrededor de 246,000) para representar armónicos. El contenido de frecuencia más bajo en la señal original es de 60 Hz. Según Nyqist, la señal original no puede representar frecuencias superiores a 1/(2*33,92 nS) = 14,74 MHz, que también es el armónico de aproximadamente 246 000 de 60 Hz. Entonces, cada contenedor representa un armónico de la fundamental de 60 Hz, sin contenedores omitidos. Si traté de transformar cinco ondas sinusoidales completas en lugar de solo una, cuatro de cada cinco contenedores eran cero, lo cual tiene sentido; esos contenedores representan armónicos fraccionarios, que no tienen sentido.

Volviendo a mi FFT de onda única, cada entrada de índice par (índice desde cero) de mis resultados de FFT es cero. Cada entrada impar es distinta de cero, siendo el índice 1, con mucho, el más grande. Esto tiene sentido si 1 es el fundamental, porque los armónicos pares no aparecerán en una onda sinusoidal simétrica. Pero, ¿por qué la primera entrada en los resultados de la FFT no es la fundamental?

Después de esto, apliqué un filtro LC, iterando los resultados de FFT y multiplicando cada contenedor por la ganancia del filtro en esa frecuencia. Luego hice una FFT inversa, dándome la señal filtrada en el dominio del tiempo. El resultado tiene componentes tanto reales como imaginarios. El componente real y el componente imaginario, cuando se toman por separado, cada uno se ve como esperaba que se viera la señal en el dominio del tiempo: una onda sinusoidal de mejor aspecto que la que tenía al principio, desplazada 90 grados entre sí.

ingrese la descripción de la imagen aquí

Pero la magnitud es bastante constante, en lugar de mirar todas las líneas como una onda sinusoidal. Esto no es en absoluto lo que esperaba. ¿Cuál es el significado de este resultado?

Un par de tramas harían esto más fácil de seguir.
¿Es numpy almacenar un número complejo en cada elemento de la matriz? En las implementaciones de C con las que trabajé hasta ahora, siempre había que tener cuidado de dónde terminaba la parte real y compleja en la matriz.
IIRC, numpy ofrece varias FFT diferentes. Por ejemplo, rfft(...)supone que los datos en el dominio del tiempo tienen un valor real, por lo que no es necesario calcular ni almacenar los términos de frecuencia negativos. Sería útil saber exactamente qué rutina FFT está utilizando.
@ThePhoton Estoy usando fft()
@Arsenal numpy está almacenando números complejos, sí.

Respuestas (2)

Pero, ¿por qué la primera entrada en los resultados de la FFT no es la fundamental?

Normalmente, la entrada 0 almacena el término DC. En algunos esquemas, la entrada [N/2]'th podría ser el término DC y la entrada [N/2+1]'th sería la fundamental.

Apliqué un filtro LC, iterando a través de los resultados de FFT y multiplicando cada contenedor por la ganancia del filtro en esa frecuencia. Luego hice una FFT inversa... El resultado tiene componentes tanto reales como imaginarios.

¿Consideraste el efecto de fase del filtro? Debe multiplicar por un valor complejo que tenga en cuenta tanto la magnitud como la respuesta de fase del filtro LC.

Incluso entonces, debido a problemas de precisión finita, a menudo obtendrá componentes imaginarios distintos de cero en la señal de dominio de tiempo transformada inversamente. Pero por lo general estos son muy pequeños, por ejemplo del orden de 10 15 × los componentes reales. Por lo general, estos se solucionan simplemente ignorándolos (tomando solo la parte real del resultado). Algunas herramientas incluso ofrecen una función integrada (Mathematica Chop, por ejemplo) para eliminar estos artefactos.

¡Ajá! ¡De hecho, no tomé en cuenta el efecto de fase del filtro!

La primera entrada [1] en la FFT es su fundamental, ¡pero la entrada cero [0] es DC!

Una FFT estándar tendrá el mismo número de muestras de salida que de entrada y todas serán complejas.

Los resultados no son necesariamente simétricos con respecto a DC. Sin embargo en el caso especial de una única entrada real, son complejos conjugados sobre DC, que parece simétrica en todo el mundo si tomas la potencia, o no notas el signo de la parte imaginaria. La mayoría de los paquetes FFT tendrán un modo especial de 'entrada real' que ahorra tiempo de procesamiento y tamaño de matriz al producir solo la mitad + cinco de los resultados cuando se le da una entrada real.

Cuando invirtió FFT'd back, presumiblemente estaba usando solo la mitad + ve de los coeficientes de frecuencia. Esto le dará una señal analítica en el dominio del tiempo. Esto es como describe un seno y un coseno, en ángulo recto, con un módulo constante. La señal de entrada real tiene componentes de frecuencia +ve y -ve, que la FFT separa.

Si, en cambio, invierte la FFT usando todo el espectro de frecuencia, ya sea haciendo una FFT de complejo completo a complejo completo para obtener los coeficientes de frecuencia, o mediante un conjugado complejo reflejándolos a través de cero, reconstruirá su forma de onda original en tiempo real (con algunos cambios). 1e-15s dando vueltas donde debería haber ceros debido a la precisión finita). La IFFT de la mitad del espectro +ve produce el resultado que viste, la IFFT de la mitad -ve produce una señal similar con los cosenos en fase, pero los senos en fase inversa, por lo que la suma resultante es coseno puro y seno cero.