2011-12-20 11 views
7

Estoy usando la función FFT en NumPy para hacer algo de procesamiento de señal. Tengo una matriz llamada signal que tiene un punto de datos por cada hora y tiene un total de 576 puntos de datos. Uso el siguiente código en signal para ver su transformación de Fourier.Unidades de frecuencia cuando se usa FFT en NumPy

t = len(signal) 
ft = fft(signal,n=t) 
mgft=abs(ft) 
plot(mgft[0:t/2+1]) 

Veo dos picos, pero estoy seguro de lo que las unidades del eje X son, es decir, como se asocian a horas? Cualquier ayuda sería apreciada.

Respuesta

11

tasa de muestreo dada FSample y transformar de bloque N, se puede calcular la resolución de frecuencia deltaF, intervalo de muestreo deltaT, y el tiempo total de la captura capT usando las relaciones:

deltaT = 1/FSample = capT/N 
deltaF = 1/capT = FSample/N 

Tenga en cuenta también que la FFT devuelve el valor de 0 a FSample, o equivalentemente -FSample/2 a FSample/2. En su trama, ya está abandonando la parte -FSample/2 a 0. NumPy incluye una función auxiliar para calcular todo esto para usted: fftfreq.

Por sus valores de deltaT = 1 hour y N = 576, se obtiene deltaF = 0.001736 cycles/hour = 0.04167 cycles/day, -0.5 cycles/hour-0.5 cycles/hour. Así que si usted tiene un pico de magnitud en, por ejemplo, Bin 48 (y Bin 528), que corresponde a un componente de frecuencia en 48*deltaF = 0.0833 cycles/hour = 2 cycles/day.

En general, se debe aplicar una window function a sus datos de dominio de tiempo antes de calcular la FFT, a reducir spectral leakage. La ventana de Hann casi nunca es una mala elección. También puede usar la función rfft para omitir la parte -FSample/2, 0 de la salida. Así pues, el código sería:

ft = np.fft.rfft(signal*np.hanning(len(signal))) 
mgft = abs(ft) 
xVals = np.fft.fftfreq(len(signal), d=1.0) # in hours, or d=1.0/24 in days 
plot(xVals[:len(mgft)], mgft) 
+2

Ver también 'np.fft.fftfreq' –

+0

@JoeKington - ¡Gracias! No pude encontrar eso en los documentos hoy, pensé que lo había alucinado. – mtrw

+0

También tenga en cuenta que cada contenedor de resultados de FFT tiene un ancho, por lo tanto un rango de error potencial, de alrededor de media hora en su caso. O de una ventana más grande de 1 hora o más. – hotpaw2

0

resultado de la transformación FFT no se asigna a horas, pero a frecuencias contenido en el conjunto de datos. Sería beneficioso tener su gráfica transformada para que podamos ver dónde están los picos.

Es posible que tenga spike al principio del búfer transformado, ya que no hizo ninguna ventana.

0

En general, las unidades de frecuencia dimensionales de una FFT son las mismas que las unidades dimensionales de la frecuencia de muestreo atribuidas a los datos alimentados a la FFT, por ejemplo: por metro, por radianes, por segundo o en su caso, por hora.

Las unidades de frecuencia escaladas, por índice de contenedor de resultados de FFT, son N/theSampleRate, con las mismas unidades dimensionales que en el caso anterior, donde N es la longitud de FFT completa (es posible que solo grabe la mitad de esta longitud en caso de datos estrictamente reales).

Tenga en cuenta que cada bin pico de resultados FFT representa un filtro con un ancho de banda distinto de cero, por lo que puede agregar algunos límites de incertidumbre o error a los puntos de resultados que asigna a los valores de frecuencia. O incluso use un método de estimación de interpolación, si es necesario y apropiado para los datos fuente.

Cuestiones relacionadas