Quanto è importante utilizzare la potenza di 2 quando si utilizza FFT?


8

Ecco il problema Ho una matrice di dati 2D, la prima colonna rappresenta i dati temporali e la seconda colonna rappresenta i dati di risposta sinusoidali, basati sui dati temporali. Applico fft e ottengo la mia frequenza (con cui ho iniziato) in un contenitore specifico come mi aspettavo e trovo l'ampiezza e l'angolo di fase da quel contenitore. Ora il problema è che ho lo stesso set ma con più punti dati, applico di nuovo il file fft e il numero del cestino cambia (che è normale ed è dove mi aspetto che sia), l'ampiezza è la stessa ma l'angolo di fase è diverso) prima è normale? secondo, quale approccio dovrei adottare? Grazie

PS: nessuno dei set up (menzionato sopra) fornisce dati di lunghezza della potenza di 2, ad esempio il primo fornisce 1620 punti dati e il secondo dà 1745 punti dati, quindi dovrebbe prendere la potenza successiva di 2 per entrambi dal inizio?

Risposte:


5

Le librerie FFT moderne, come FFTW e il framework Accelerate di Apple, possono eseguire FFT non power-of-2 in modo molto efficiente, a condizione che tutti i divisori primi della lunghezza composita siano abbastanza piccoli (2,3,5, ecc.)

Una potenza di 2 rende più semplice (circa 1 pagina di codice sorgente) se per qualche motivo devi codificare la tua FFT o se sei altrimenti vincolato alla lunghezza massima del programma (o porte FPGA, ecc.)

Per la misurazione di fase, potrebbe essere più semplice eseguire un cambio di direzione (pre-ruotare i dati di N / 2) per fare riferimento alla fase FFT al centro della finestra dei dati, dove il rapporto di uniformità / dispari e quindi la fase non cambierà o si alternano con il numero del contenitore (per una fase uguale al centro di quella finestra di dati) anche per segnali non periodici nella lunghezza FFT, quando si varia la lunghezza.


Ciao hotpaw2, scusa se ho dimenticato di dire che sto usando Matlab FFT, fa qualche differenza? grazie ancora.
lamia,

Matlab può utilizzare internamente una moderna libreria FFT, come FFTW. Controlla la documentazione matlab per la tua versione.
hotpaw2,

Inoltre, @ hotpaw2, sto già usando fftshift ...
lamia,

Con fftshift, posiziona il data center di Windows dove vuoi misurare la fase. Oppure calcola la fase dal centro indietro nel tempo usando una buona stima della frequenza.
hotpaw2,

5

Non c'è nulla di intrinsecamente 'magico' nell'eseguire una potenza di 2 DFT, a parte il fatto che eseguire una potenza di 2 DFT consente di eseguire la DFT in O(Nlog(N)) invece di O(N2). Quindi la potenza di 2 DFT, (l' algoritmo che lo fa è noto come FFT), ti consente semplicemente di velocizzare il tuo calcolo DFT di un fattore enorme.

Applico di nuovo il file fft e il numero del contenitore cambia (che è normale ed è dove mi aspetto che sia), l'ampiezza è la stessa ma l'angolo di fase è diverso) per prima cosa è normale?

Se si esegue un DFT più grande del vettore di dati, si interpolerà essenzialmente nel dominio della frequenza. Pertanto, il tuo nuovo picco potrebbe non essere il vecchio picco equivalente che hai rilevato per la prima volta, prima di prendere un DFT più grande. E poiché non è lo stesso, questa volta stai essenzialmente scegliendo una diversa base esponenziale complessa (seno più coseno), il che significa che probabilmente avresti un diverso valore di fase, sì.

PS: nessuno dei set up (menzionato sopra) fornisce dati di lunghezza della potenza di 2, ad esempio il primo fornisce 1620 punti dati e il secondo dà 1745 punti dati, quindi dovrebbe prendere la potenza successiva di 2 per entrambi dal inizio?

Sì, se vuoi prendere una potenza di 2 FFT, allora sceglieresti semplicemente la potenza successiva di 2 lunghezze FFT che è maggiore della lunghezza del tuo record di dati.

non voglio o non voglio necessariamente prendere la potenza di 2 FFT (le prestazioni temporali non sono affatto il mio problema), più simile, devo?

Non dovresti mai prendere una FFT di lunghezza inferiore alla lunghezza del tuo record, a meno che tu non voglia scartare i dati. La domanda "Quanto deve essere grande la mia FFT", supponendo che la lunghezza della FFT sia maggiore della lunghezza del tuo record di dati, quindi diventa rapidamente dipendente dall'applicazione. Di solito puoi cavartela con una lunghezza FFT uguale alla lunghezza del tuo record. Tuttavia, a volte vuoi scegliere un picco da una FFT "più fluida". In questo caso, puoi prendere una lunghezza FFT maggiore (2 volte di più, 3 volte di più, 10 volte di più, ecc.) E avresti interpolato il tuo picco nel dominio della frequenza. Non esiste un numero magico, tuttavia. Ricorda che la granularità del tuo risultato FFT è semprefsN.


Grazie utente4619 per le risposte, non voglio o non voglio necessariamente prendere la potenza di 2 FFT (le prestazioni temporali non sono affatto il mio problema), più simile, devo?
lamia,

Inoltre, @ user4619, poiché hai detto che sì, l'angolo di fase potrebbe cambiare, di quale dovrei fidarmi che mi sta dando la risposta corretta? (non conosco l'angolo di fase prima della mano o l'ampiezza, conosco solo la frequenza prima della mano) ... grazie
lamia

@lamia Power-of-2 è solo per problemi di velocità. Questo è tutto. Altrimenti non c'è nulla di magico. A proposito dell'angolo di fase - ricorda che anche se l'angolo di fase cambia, anche la frequenza di picco cambia. Se esegui una FFT di 1000 punti, scegli il bin di frequenza 100 come picco e ne trovi l'angolo di fase. È corretto. Quindi esegui una FFT di 343212 punti e scegli una frequenza 34321 come picco e ha un angolo di fase diverso. Questo è ancora corretto. "Fase" è una funzione della frequenza. (Se lo hai trovato utile, non esitare a votare)
Tarin Ziyaee,

@lamia Vedi anche le mie modifiche.
Tarin Ziyaee,

Grazie mille per le spiegazioni che hai fornito :)
lamia,

3

Mostra la risposta di @ user4619:

Utilizzando IPython, che è simile a Matlab

In[1]: fft(arange(2**22))
1 loops, best of 3: 354 ms per loop

In[2]: fft(arange(4*1000*90*12)) # close to 2**22
# equal to 2*2 * 2*5*2*5*2*5 * 3*3*2*5 * 2*2*3
1 loops, best of 3: 295 ms per loop

In[2]: fft(arange(2**22+1))
1 loops, best of 3: 14 s per loop

Se stai usando numeri davvero primi, piuttosto importanti (un fattore di 50!). Se stai usando numeri con fattori bassi, non è importante. Ma farlo con solo numeri primi lo fa solo più velocemente - non cambia affatto la risposta.

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.