Come posso prendere la FFT di dati spaziati in modo non uniforme?


55

Fast Fourier Transform algoritmo calcola un Fourier scomposizione sotto l'ipotesi che i suoi punti di ingresso sono equidistanti nel dominio del tempo, . E se non lo fossero? Esiste un altro algoritmo che potrei usare, o in qualche modo potrei modificare la FFT, per spiegare quale sia effettivamente una frequenza di campionamento variabile?tk=kT

Se la soluzione dipende da come vengono distribuiti i campioni, ci sono due situazioni particolari che mi interessano di più:

  • Frequenza di campionamento costante con jitter: dove δ t k è una variabile distribuita casualmente. Supponiamo che è sicuro di dire | δ t k | < T / 2 .tk=kT+δtkδtk|δtk|<T/2
  • Campioni rilasciati da una frequenza di campionamento altrimenti costante: dove n kZktk=nkTnkZk

Motivazione: prima di tutto, questa è stata una delle domande più votate sulla proposta per questo sito. Inoltre, qualche tempo fa sono stato coinvolto in una discussione sull'utilizzo di FFT (spinto da una domanda su Stack Overflow ) in cui sono emersi alcuni dati di input con punti campionati in modo non uniforme. Si è scoperto che i timestamp sui dati erano sbagliati, ma mi ha fatto pensare a come si potrebbe affrontare questo problema.

Risposte:


40

Esiste un'ampia varietà di tecniche per la FFT non uniforme e le più efficienti sono tutte pensate per il tuo caso: campioni quasi uniformi. L'idea di base è quella di diffondere le fonti campionate in modo non uniforme su una griglia uniforme leggermente più fine ("sovracampionata") attraverso le convoluzioni locali contro i gaussiani. Un FFT standard può quindi essere eseguito sulla griglia uniforme sottocampionata, e quindi la convoluzione contro i gaussiani può essere annullata. Le buone implementazioni sono qualcosa come volte più costoso di un FFT standard in dimensioni d , dove C è qualcosa di vicino a 4 o 5.CddC

Consiglio di leggere Accelerating the Nonuniform Fast Fourier Transform di Greengard e Lee.

O(NdlogN)

Un punto importante è che tutte le tecniche di cui sopra sono approssimazioni che possono essere rese arbitrariamente accurate a spese di runtime più lunghi, mentre l'algoritmo FFT standard è esatto.


9

Nell'elaborazione del segnale, l' aliasing viene evitato inviando un segnale attraverso un filtro passa basso prima del campionamento. Jack Poulson ha già spiegato una tecnica per la FFT non uniforme usando i gaussiani troncati come filtri passa basso. Una caratteristica scomoda dei gaussiani troncati è che anche dopo aver deciso la spaziatura della griglia per la FFT (= la frequenza di campionamento nell'elaborazione del segnale), si hanno ancora due parametri liberi: la larghezza del gaussiano e il raggio di troncamento.

Preferisco quindi la funzione "hat" con una larghezza di due celle della griglia come filtro passa basso. Ciò ha l'effetto che l'ordine di Fourier di zeroth è esatto e che gli ordini di Fourier inferiori convergeranno quadraticamente. La trasformata di Fourier della funzione "hat" è facile da calcolare (è il quadrato della funzione sinc), il che semplifica l'annullamento della convoluzione dopo la FFT. Si noti che la funzione "cappello" è la convoluzione della funzione caratteristica della cellula unitaria (centrata) con se stessa. È possibile ottenere qualsiasi tasso di convergenza desiderato, contorcendo la cella unitaria più di una volta con se stessa e utilizzando la funzione risultante invece della funzione "hat".


6

Se sei interessato al software, posso consigliare la libreria NFFT (in C con un'interfaccia a MATLAB) che puoi trovare qui . Si noti che esiste anche una libreria PFFT per il calcolo FFT parallelo e persino una libreria PNFFT per FFT paralleli non equispaziati dagli stessi sviluppatori .


1
Per quanto ne so, PNFFT è la libreria più veloce per FFT parallele 3d non uniformi.
Jack Poulson,

il collegamento per PNFFT sembra essere rotto.
Foad,

2

Aggiunta alla risposta accettata. Ecco un link per un'implementazione open source del metodo di Greengard e Lee: https://finufft.readthedocs.io/en/latest/ Ha wrapper per C, fortran, MATLAB, octave e python. Credo che FINUFFT sia scritto in C ++.

È mantenuto e utilizzato presso l'istituto Courant della New York University, SFU, istituto di Flatiron (ovviamente), Università del Texas Austin e Florida State University. Almeno questi sono quelli che conosco.

Io stesso sto usando una versione precedente, perché sono pigro. Vedi: https://cims.nyu.edu/cmcl/nufft/nufft.html


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.