Wie nehme ich die FFT von Daten mit ungleichem Abstand?


55

Die schnelle Fourier - Transformations - Algorithmus , um eine Fourier - Zerlegung unter der Annahme berechnet , dass seine Eingangspunkte gleichermaßen in dem Zeitbereich beabstandet sind, . Was ist, wenn sie nicht sind? Gibt es einen anderen Algorithmus, den ich verwenden oder den ich auf irgendeine Weise modifizieren könnte, um zu berücksichtigen, was effektiv eine variable Abtastrate ist?tk=kT

Wenn die Lösung von der Verteilung der Beispiele abhängt, gibt es zwei Situationen, die mich am meisten interessieren:

  • Konstante Abtastrate mit Jitter: wobei δ t k eine zufällig verteilte Variable ist. Angenommen , es ist sicher zu sagen | δ t k | < T / 2 .tk=kT+δtkδtk|δtk|<T/2
  • Abgeworfene Proben von einer ansonsten konstanten Abtastrate: wobei n kZk isttk=nkTnkZk

Motivation: Dies war zuallererst eine der am häufigsten gestellten Fragen zum Vorschlag für diese Website. Vor einiger Zeit war ich jedoch in eine Diskussion über die Verwendung von FFT verwickelt (ausgelöst durch eine Frage zum Stapelüberlauf ), in der einige Eingabedaten mit ungleichmäßig abgetasteten Punkten auftauchten. Es stellte sich heraus, dass die Zeitstempel in den Daten falsch waren, aber ich dachte darüber nach, wie man dieses Problem angehen könnte.

Antworten:


40

Es gibt eine Vielzahl von Techniken für ungleichmäßige FFT, und die effizientesten sind genau für Ihren Fall gedacht: quasi gleichmäßige Proben. Die Grundidee besteht darin, die ungleichmäßig abgetasteten Quellen durch lokale Windungen gegen Gaußsche auf ein etwas feineres ("überabgetastetes") gleichmäßiges Gitter zu schmieren. Eine Standard-FFT kann dann auf dem überabgetasteten gleichmäßigen Gitter ausgeführt werden, und dann kann die Faltung gegen die Gaußschen rückgängig gemacht werden. Gute Implementierungen sind etwa -mal teurer als eine Standard-FFT in d- Dimensionen, wobei C in der Nähe von 4 oder 5 liegt.CddC

Ich empfehle, die ungleichmäßige schnelle Fouriertransformation von Greengard und Lee zu beschleunigen .

O(NdlogN)

Ein wichtiger Punkt ist, dass alle obigen Techniken Näherungen sind, die auf Kosten längerer Laufzeiten willkürlich genau gemacht werden können, während der Standard-FFT-Algorithmus genau ist.


9

Bei der Signalverarbeitung wird Aliasing vermieden, indem vor dem Abtasten ein Signal durch ein Tiefpassfilter gesendet wird. Jack Poulson hat bereits eine Technik für ungleichmäßige FFT unter Verwendung von abgeschnittenen Gaußschen als Tiefpassfilter erläutert. Eine unbequeme Eigenschaft von abgeschnittenen Gaußschen ist, dass Sie auch nachdem Sie den Rasterabstand für die FFT (= die Abtastrate bei der Signalverarbeitung) festgelegt haben, noch zwei freie Parameter haben: Die Breite des Gaußschen und den Abschneidungsradius.

Ich bevorzuge daher die "Hut" -Funktion mit einer Breite von zwei Gitterzellen als Tiefpassfilter. Dies hat zur Folge, dass die nullte Fourier-Ordnung genau ist und die unteren Fourier-Ordnungen quadratisch konvergieren. Die Fourier-Transformation der "Hut" -Funktion ist einfach zu berechnen (es ist das Quadrat der Sinusfunktion), was das Rückgängigmachen der Faltung nach der FFT vereinfacht. Man beachte, dass die "Hut" -Funktion die Faltung der charakteristischen Funktion der (zentrierten) Einheitszelle mit sich selbst ist. Jede gewünschte Konvergenzrate kann erreicht werden, indem die Einheitszelle mehr als einmal mit sich selbst gefaltet wird und die resultierende Funktion anstelle der "Hut" -Funktion verwendet wird.


6

Wenn Sie sich für Software interessieren, kann ich Ihnen die NFFT-Bibliothek (in C mit einer Schnittstelle zu MATLAB) empfehlen, die Sie hier finden . Beachten Sie, dass es von denselben Entwicklern auch eine PFFT-Bibliothek für die parallele FFT-Berechnung und sogar eine PNFFT-Bibliothek für parallele Nicht-Equispaces-FFTs gibt .


1
Soweit ich weiß, ist PNFFT die schnellste Bibliothek für parallele 3D-ungleichmäßige FFTs.
Jack Poulson

Die Verbindung für PNFFT scheint unterbrochen zu sein.
Foad

2

Ergänzung zur akzeptierten Antwort. Hier ist ein Link zu einer Open-Source-Implementierung von Greengards und Lees Methode: https://finufft.readthedocs.io/en/latest/ Es enthält Wrapper für C, Fortran, MATLAB, Octave und Python. Ich glaube, die FINUFFT ist in C ++ geschrieben.

Es wird am NYU Courant Institute, am SFU, am Flatiron Institute (offensichtlich), an der University of Texas in Austin und an der Florida State University gewartet und verwendet. Zumindest sind es die, die ich kenne.

Ich benutze selbst eine ältere Version, weil ich faul bin. Siehe: https://cims.nyu.edu/cmcl/nufft/nufft.html


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.