2011-12-20 15 views
7

Sto usando la funzione FFT in NumPy per eseguire l'elaborazione del segnale. Ho un array chiamato signal che ha un punto dati per ogni ora e ha un totale di 576 punti dati. Io uso il seguente codice su signal per esaminare la sua trasformata di Fourier.Unità di frequenza quando si utilizza FFT in NumPy

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

Vedo due picchi, ma non sono sicuro di ciò che le unità dell'asse x sono cioè, come mappa su ore? Qualsiasi aiuto sarebbe apprezzato.

risposta

11

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) 
+2

Vedere anche 'np.fft.fftfreq' –

+0

@JoeKington - Grazie! Non riuscivo a trovarlo nei documenti di oggi, pensavo di averlo allucinato. – mtrw

+0

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

0

Risultato di FFT trasformazione non mappa a ore, ma a frequenze contenute nel set di dati. Sarebbe utile avere il grafico trasformato in modo da poter vedere dove sono le punte.

Si potrebbe avere un picco all'inizio del buffer trasformato, poiché non è stata eseguita alcuna finestra.

0

In generale, le unità dimensionali di frequenza da una FFT sono le stesse delle unità dimensionali della frequenza di campionamento attribuite ai dati inviati alla FFT, ad esempio: per metro, per radianti, al secondo o nel vostro caso, all'ora.

Le unità di frequenza ridimensionate, per indice del risultato del risultato FFT, sono N/theSampleRate, con le stesse unità dimensionali di cui sopra, dove N è la lunghezza dell'intera FFT (si potrebbe tracciare solo metà di questa lunghezza nel caso di dati strettamente reali).

Si noti che ogni picco del picco di risultato FFT rappresenta un filtro con larghezza di banda diversa da zero, quindi è possibile aggiungere alcuni limiti di incertezza o di errore ai punti dei risultati mappati sui valori di frequenza. O anche utilizzare un metodo di stima dell'interpolazione, se necessario e appropriato per i dati di origine.

Problemi correlati