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=0N−1xizixiN−1punti N α n , 0 ≤ n ≤ N - 1 dove α = exp ( - j 2 π / N ) è una NNαn,0≤n≤N−1α=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,0≤n≤N−1β=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.