frequenza di campionamento Dato FSample
e trasformare blocksize N
, è possibile calcolare la risoluzione di frequenza deltaF
, intervallo di campionamento deltaT
, e il tempo totale di acquisizione capT
utilizzando le relazioni:
deltaT = 1/FSample = capT/N
deltaF = 1/capT = FSample/N
Tenete presente, inoltre, che la FFT restituisce il valore da 0
a FSample
o equivalentemente da -FSample/2
a FSample/2
. Nella tua trama, stai già lasciando cadere la parte da -FSample/2
a 0
. NumPy include una funzione di supporto per calcolare tutto questo per te: fftfreq.
Per i vostri valori di deltaT = 1 hour
e N = 576
, si ottiene deltaF = 0.001736 cycles/hour = 0.04167 cycles/day
, -0.5 cycles/hour
-0.5 cycles/hour
. Quindi, se avete un picco di magnitudo a, diciamo, bin 48 (e Bin 528), che corrisponde a un componente di frequenza a 48*deltaF = 0.0833 cycles/hour = 2 cycles/day.
In generale, si dovrebbe applicare un window function ai dati nel dominio del tempo prima di calcolare la FFT, per ridurre spectral leakage. La finestra di Hann non è quasi mai una cattiva scelta. È anche possibile utilizzare la funzione rfft
per saltare la parte -FSample/2, 0
dell'output. Allora, il codice sarebbe:
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)
Vedere anche 'np.fft.fftfreq' –
@JoeKington - Grazie! Non riuscivo a trovarlo nei documenti di oggi, pensavo di averlo allucinato. – mtrw
Nota inoltre che ogni scomparto dei risultati FFT ha una larghezza, quindi un potenziale intervallo di errore, di circa mezz'ora nel tuo caso. O di circa 1 ora o più di più se hai una finestra. – hotpaw2