Come calcolare in modo efficiente solo i coefficienti bassi di una FFT a zero zero


14

Ho un algoritmo che azzera una sequenza a 4N, fa una FFT e usa solo la frequenza più bassa N punti rispetto alla 4N generata.

Sembra un sacco di lavoro sprecato, qualche idea su come farlo più velocemente?


@Dilip. Userò le librerie FFTW o IMKL. Ovviamente potrei usare la mia libreria kissfft, ma sta iniziando con uno svantaggio di velocità rispetto agli altri
Mark Borgerding,

2
Ho eliminato il commento a cui hai risposto poiché intendevo dire la decimazione in frequenza, ma invece ho scritto la decimazione in tempo. Ma guarda il diagramma a farfalla qui. Se si scrive un codice per i primi due stadi per -FFT per tenere conto del gran numero di zeri e saltare le moltiplicazioni corrispondenti, è possibile quindi chiamare la subroutine della libreria FFT 4 volte per N -FFT in cui i vettori di input sono "pieni". Naturalmente, per ogni chiamata di subroutine sono necessari solo N / 4 degli output. 4N4NN/4
Dilip Sarwate,

Risposte:


2

Se hai solo pochi bin, allora quanto segue potrebbe essere molto efficiente per te:
1. Fai semplicemente il DFT di ogni frequenza di cui hai bisogno.
2. Utilizzare l'algoritmo Goertzel per ciascuna frequenza in questione.


Mark ha detto che aveva bisogno di bidoni su 4 N , quindi 1) non sembra essere un'opzione ragionevole. L'algoritmo di Goertzel presenta vantaggi come il calcolo on-line in quanto i dati vengono ricevuti, una piccola memoria, ecc., Ma necessita di 2 moltiplicazioni N + 4 per bin, mentre ogni bin viene calcolato come valutazione polinomiale tramite la regola di Horner richiede solo N moltiplicazioni. Pertanto, anche 2) non sembra essere un'opzione particolarmente ragionevole. N4N2N+4N
Dilip Sarwate,

Hai ragione, mentre leggevo la domanda in qualche modo mi mancavano i dettagli. Mentre rispondevo pensavo "Accidenti, sarebbe bello sapere quanti contenitori vuole ..." Immagino che dovrei rileggere la domanda prima di rispondere.
Jacob,

2

Lo zero padding alla lunghezza 4X, calcolando il FFT più lungo, e quindi usando solo i bidoni 1/4 in basso produce risultati quasi identici all'interpolazione Sinc con finestra del FFT lunghezza originale.

Quindi basta usare la lunghezza FFT originale e interpolare usando un kernel di interpolazione Sinc a 3 fasi con una larghezza della finestra adatta.


0

Lo zero padding nel dominio del tempo offre una soluzione a frequenza più elevata ma nessuna nuova informazione, quindi fornisce essenzialmente l'interpolazione nel dominio della frequenza. A seconda della natura dei segnali e della precisione richiesta, potresti essere in grado di ottenere i punti di frequenza aggiuntivi con una FFT regolare di N punti e di eseguire un'interpolazione adeguata (lineare, spline, pchip, sinc ecc.).


Let un polinomio (possibilmente con coefficienti complessi x i ) di grado N - 1 . Lo valutiamo allax(z)=i=0N1xizixiN1punti N α n , 0 n N - 1 dove α = exp ( - j 2 π / N ) è una NNαn,0nN1α=exp(j2π/N)N-th radice dell'unità per ottenere numeri X n = x ( α n ) . Questi sono valori di x ( z ) in N punti equidistanti sul cerchio unitario. Ciò che vogliamo veramente sono i valori di x ( z ) a β n , 0 n N - 1 dove β = exp ( - j 2 π / 4 N ) , che sonoNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N) punti sulprimo quadrantedel cerchio unitario. Non vedo come funzionerà l'interpolazione lineare, spline ecc. Spiega per favore. N
Dilip Sarwate,

Spiacente, quella penultima frase del mio commento precedente avrebbe dovuto dire il quarto quadrante del cerchio unitario. Poiché , ogni quarto valore desiderato x ( β 4 k )β4=αx(β4k) è già stato calcolato dall'FFT: . x(β4k)=x(αk)
Dilip Sarwate,

Ho il sospetto che sarebbe difficile fare un'interpolazione decente più velocemente rispetto alla FFT più grande.
Mark Borgerding,

Supponiamo che tu abbia una frequenza di campionamento di 128 punti FFT e 12800Hz. Un FFT a 128 punti fornisce valori a 0Hz, 100Hz, 200Hz, 300Hz, ecc. Ciò che fa il padding zero è di aumentare la risoluzione della frequenza a 0 Hz, 25Hz, 50 Hz, 100Hz ecc. Questo può essere visto come un problema di interpolazione. Per me matematicamente precisi, devi fare una sincera intperpolazione circolare del 128 ° ordine. Ciò non vale certo la pena, ma a seconda dell'applicazione e della precisione richieste un'interpolazione di ordine molto inferiore sarebbe abbastanza buona
Hilmar,
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.