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)
Ver también 'np.fft.fftfreq' –
@JoeKington - ¡Gracias! No pude encontrar eso en los documentos hoy, pensé que lo había alucinado. – mtrw
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