Come posso ottenere le frequenze di ciascun valore in una FFT?


148

Ho un risultato FFT. Questi sono memorizzati in due doublearray: un array di parti reali e un array di parti immaginario. Come posso determinare le frequenze che corrispondono a ciascun elemento in questi array?

In altre parole, vorrei creare un array che memorizzi le frequenze per ogni componente reale e immaginario del mio FFT.


Lo faccio in C # .net. Mi potete aiutare?
Rango,

9
Se non capisci la pertinenza delle parti reali e immaginarie di una FFT, non otterrai risultati significativi, quindi dovresti cercare alcuni tutorial FFT e di elaborazione del segnale per capire come interpretare i risultati. Penso che sia abbastanza probabile che qualunque cosa tu lo stia utilizzando, desideri la grandezza della FFT o della densità spettrale di potenza.
the_mandrill,

Grazie! Voglio ottenere le frequenze di picco di ciascun fotogramma (la lunghezza del fotogramma dipende da Lunghezza finestra e Lunghezza spostamento)
Rango

Risposte:


351

Il primo bin nell'FFT è DC (0 Hz), il secondo bin è Fs / N, dove Fsè la frequenza di campionamento e Nla dimensione dell'FFT. Il prossimo cestino è 2 * Fs / N. Per esprimerlo in termini generali, l' ennesimo bin è n * Fs / N.

Quindi, se la frequenza di campionamento, ad Fsesempio 44,1 kHz e la dimensione FFT, Nè 1024, i bin di uscita FFT sono a:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Si noti che per un segnale di ingresso reale (parti immaginarie tutte a zero) la seconda metà della FFT (bin da N / 2 + 1a N - 1) non contiene informazioni aggiuntive utili (hanno una simmetria coniugata complessa con i primi N / 2 - 1bin). L'ultimo cestino utile (per applicazioni pratiche) è a N / 2 - 1, che corrisponde a 22006,9 Hz nell'esempio sopra. Il contenitore a N / 2rappresenta l'energia alla frequenza di Nyquist, ovvero Fs / 2(= 22050 Hz in questo esempio), ma questo non è in generale di alcun uso pratico, poiché i filtri anti-aliasing in genere attenuano qualsiasi segnale in e sopra Fs / 2.


8
Nota: la risposta è leggermente sbagliata: il 512 ° bucket contiene il livello per 22050, il limite di nyquist. I bin da 0 a N / 2 inclusi contengono valori utili.
David Van Brink,

4
Grazie per la modifica e il chiarimento ... Immagino che sia qui che rivelo una mancanza di praticità. Io: Ma padrone, la FFT lavora fino alla ninja! Tu: Padawan, dovresti davvero filtrarlo.
David Van Brink,

5
Vorrei poter rispondere a stelle. Questa risposta è persino migliore della domanda originale!
Skylion,

14
@PaulR - Volevo ringraziarti per questa meravigliosa risposta che mi ha servito negli anni. Visiterei questa risposta prima di avere un account StackOverflow e in realtà mi ero dimenticato di ringraziarti dopo essermi registrato. Di recente ho dato un'occhiata alle cose della FFT e mi sono ricordato della tua risposta e l'ho appena visitata. Una volta arrivato qui, mi sono ricordato di ringraziarti ... quindi grazie! Ogni volta che ho un dibattito con qualcuno sull'interpretazione di ciò che è ciascun punto sull'asse orizzontale della FFT, li indico solo a questo link.
Rayryeng,

6
@rayryeng: grazie mille - Penso che sia il miglior riconoscimento che abbia mai avuto in ~ 5 anni di domande qui su SO!
Paul R,

55

Dai un'occhiata alla mia risposta qui .

Rispondi al commento:

La FFT calcola effettivamente la correlazione incrociata del segnale di ingresso con le funzioni seno e coseno (funzioni di base) a una gamma di frequenze equidistanti. Per una determinata uscita FFT, esiste una frequenza corrispondente (F) come indicato dalla risposta che ho pubblicato. La parte reale del campione di output è la correlazione incrociata del segnale di input con cos(2*pi*F*t)e la parte immaginaria è la correlazione incrociata del segnale di input con sin(2*pi*F*t). Il motivo per cui il segnale di ingresso è correlato sine le cosfunzioni è di tenere conto delle differenze di fase tra il segnale di ingresso e le funzioni di base.

Prendendo la grandezza della complessa uscita FFT, si ottiene una misura di quanto il segnale di ingresso sia correlato ai sinusoidi a un set di frequenze indipendentemente dalla fase del segnale di ingresso. Se stai solo analizzando il contenuto di frequenza di un segnale, prenderai quasi sempre la grandezza o la magnitudine al quadrato della complessa uscita della FFT.


La parte reale e immaginaria sono i risultati di FFT che hanno usato per? Per favore, spiegami per me. Grazie
Rango il

5
questa risposta merita più amore.
stella luminosa il

1
Potrebbe essere che l'ampiezza delle uscite complesse debba essere raddoppiata ciascuna? (se restringo la mia interpretazione alla metà inferiore)
Wolf

18

Ho usato il seguente:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

Gli input sono:

  • i: Bin per accedere
  • samples: Frequenza di campionamento in Hertz (ovvero 8000 Hz, 44100Hz, ecc.)
  • nFFT: Dimensione del vettore FFT

7
Le persone non possono sapere esattamente cosa rappresenti con sampleso nFFT. Quindi, per favore, rendilo più esplicativo.
mostar

14
La risposta accettata dice che dovrebbe essere i * samples / nFFT. Perché c'è un extra 2lì? Mi sto perdendo qualcosa?
Yati Sagade,

13

I coefficienti di uscita FFT (per input complessi di dimensione N) sono compresi tra 0 e N - 1 raggruppati come frequenza [LOW, MID, HI, HI, MID, LOW].

Considererei che l'elemento in k ha la stessa frequenza dell'elemento in Nk poiché per i dati reali, FFT [Nk] = coniugato complesso di FFT [k].

L'ordine di scansione da BASSA a ALTA frequenza è

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

Esistono [N / 2] +1 gruppi di frequenza dall'indice i = 0 a [N / 2], ciascuno con il frequency = i * SamplingFrequency / N

Quindi la frequenza nel bin FFT [k] è:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

5

Il tuo k esima frequenza di risultato FFT è 2 * pi * k / N.


6
Immagino che questo sarà in radianti
Barnaby l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.