Warum sollte ich ein Signal auf Null setzen, bevor ich die Fourier-Transformation durchführe?


77

In einer Antwort auf eine vorherige Frage wurde angegeben, dass man sollte

Null-Pad der Eingangssignale (fügen Sie am Ende Nullen hinzu, so dass mindestens die Hälfte der Welle "leer" ist)

Was ist der Grund dafür?


Es hängt davon ab, was Sie tun. Dies hätte ein Kommentar zu meiner Antwort sein können. Ich habe eine Erklärung hinzugefügt.
Endolith

@endolith: Ich dachte zuerst, es als Kommentar zu formulieren, aber ich denke, die Frage könnte von allgemeinem Interesse sein und es wäre schade, wenn eine gute Antwort darauf irgendwo in Kommentaren vergraben wäre. Wenn Sie nicht einverstanden sind, lösche ich diese Frage.
Jonas

9
Nun, das ist eine sehr allgemeine Frage. Sie können ein Pad auf Null setzen, um eine Potenz von 2 zu erhalten. Sie können ein Pad auf Null setzen, um eine kreisförmige Transformation wie eine nicht kreisförmige Transformation durchzuführen. Sie können damit ein Signal neu abtasten, die Frequenzauflösung ändern usw. usw.
Endolith

Antworten:


82

Das Auffüllen mit Nullen ermöglicht die Verwendung einer längeren FFT, wodurch ein längerer FFT-Ergebnisvektor erzeugt wird.

Ein längeres FFT-Ergebnis hat mehr Frequenzbereiche, deren Frequenz enger beieinander liegt. Sie liefern jedoch im Wesentlichen das gleiche Ergebnis wie eine hochqualitative Sinc-Interpolation einer kürzeren, nicht mit Nullen aufgefüllten FFT der ursprünglichen Daten.

Dies kann zu einem glatter aussehenden Spektrum führen, wenn es ohne weitere Interpolation geplottet wird.

Diese Interpolation hilft zwar nicht beim Auflösen oder der Auflösung von und / oder zwischen benachbarten oder nahe gelegenen Frequenzen, erleichtert jedoch möglicherweise das visuelle Auflösen der Spitze einer einzelnen isolierten Frequenz, die keine signifikanten benachbarten Signale oder Rauschen im Spektrum aufweist . Statistisch gesehen macht es die höhere Dichte der FFT-Ergebnisbereiche wahrscheinlich wahrscheinlicher, dass der Spitzengrößenbereich näher an der Frequenz einer zufälligen isolierten Eingangsfrequenz-Sinuskurve liegt und nicht weiter interpoliert wird (parabolisch usw.).

Das Auffüllen mit Nullen vor einer DFT / FFT ist jedoch im Wesentlichen eine rechnerisch effiziente Methode zum Interpolieren einer großen Anzahl von Punkten.

Null-Auffüllung für Kreuzkorrelation, Autokorrelation oder Faltungsfilterung wird verwendet, um Faltungsergebnisse nicht zu mischen (aufgrund von Kreisfaltung). Das volle Ergebnis einer linearen Faltung ist länger als einer der beiden Eingangsvektoren. Wenn Sie keinen Ort angeben, an dem das Ende dieses längeren Faltungsergebnisses erreicht werden kann, wird es von FFT Fast Convolution nur mit dem gewünschten Ergebnis gemischt und zusammengestellt. Das Auffüllen mit Nullen bietet eine Reihe von Nullen, in die das längere Ergebnis gemischt werden kann. Und es ist weitaus einfacher, etwas zu entmischen, das nur mit einem Vektor von Nullen gemischt / summiert wurde.


12
Der letzte Absatz ist die zentrale Antwort auf die ursprüngliche Frage, obwohl ich denke, dass dies klarer formuliert werden könnte. Null-Auffüllen im Zusammenhang mit Korrelation oder Faltung kann durchgeführt werden, um sicherzustellen, dass die Implementierung des Prozesses im Frequenzbereich eine lineare anstatt einer zirkulären Faltung / Korrelation ergibt . Dies ist jedoch nicht erforderlich, wenn Sie bereit sind, einige Buchhaltungsarbeiten nebenbei auszuführen, z. B. bei den Algorithmen zum Speichern und Hinzufügen von Überlappungen.
Jason R

4
@ Jason R: Eigentlich sind sie beide kreisförmige Faltung. Eine normale (nicht beschnittene) FFT führt alle Multiplikationen und Additionen für den Wrap-Around-Teil des Ergebnisses aus. Es ist nur so, dass in dem ausreichend mit Nullen aufgefüllten Fall alle diese Multiplikationen und Additionen den Wert Null haben, sodass sich niemand um das Nichts kümmert, das berechnet und um den Kreis gewickelt wird.
hotpaw2

9
Tatsächlich; Die Multiplikation der DFTs zweier Signale führt immer zu einer Kreisfaltung. Ich hätte es anders formulieren sollen: Sie fügen Nullen am Ende eines Signals ein, um sicherzustellen, dass das Ergebnis, das Sie durch zirkulares Falten erhalten, dasselbe ist wie das, was Sie erhalten, wenn Sie sie linear falten (vorausgesetzt, Sie wollen eine lineare Faltung, das ist es) in der Regel der Fall).
Jason R

27

Es gibt ein paar Dinge zu beachten, bevor Sie sich entscheiden, Ihr Zeitdomänensignal auf Null zu setzen. Möglicherweise müssen Sie das Signal gar nicht auf Null setzen!

1) Verlängern Sie die Zeitbereichsdaten (nicht das Auffüllen mit Nullen), um eine bessere Auflösung im Frequenzbereich zu erzielen.

2) Erhöhen Sie die Anzahl der FFT-Punkte über Ihre Zeitbereichs-Signallänge hinaus (Null-Auffüllung), wenn Sie eine bessere Definition der FFT-Bins wünschen, obwohl Sie dadurch keine echte Auflösung mehr erhalten. Sie können auch auffüllen, um eine Potenz von 2 FFT-Punkten zu erhalten.

3) Achten Sie beim Spielen mit den FFT-Punkten (im vorherigen Punkt) darauf, dass Ihre Frequenzpunkte dort landen, wo Sie sie haben möchten. Der Abstand der Punkte beträgt , wobei die Abtastfrequenz und die Anzahl der FFT-Punkte ist.f s Nfs/NfsN

Unter http://www.bitweenie.com/listings/fft-zero-padding/ gibt es einige nette Zahlen, die diese Punkte veranschaulichen.

Eine letzte zu erwähnende Sache: Wenn Sie das Signal in der Zeitdomäne auf Null setzen und eine Fensterfunktion verwenden möchten, stellen Sie sicher, dass Sie das Signal vor dem Nullsetzen anzeigen. Wenn Sie die Fensterfunktion nach dem Auffüllen mit Nullen anwenden, werden Sie nicht erreichen, was das Fenster erreichen soll. Genauer gesagt haben Sie immer noch einen scharfen Übergang vom Signal zu Null anstatt eines sanften Übergangs zu Null.


8

Im Allgemeinen ist das Auffüllen mit Nullen vor der DFT gleichbedeutend mit einer Interpolation oder einer häufigeren Abtastung in der transformierten Domäne.

Hier ist eine kurze Visualisierung, wie das Gegenteil funktioniert. Wenn Sie ein bandbegrenztes Signal zeitlich mit einer höheren Rate abtasten, erhalten Sie ein "gequetschteres" Spektrum, dh ein Spektrum mit mehr Nullen an beiden Enden. Mit anderen Worten, Sie können zeitlich mehr Abtastwerte erhalten, indem Sie nach dem DFT-Vorgang einfach die Frequenz auf Null setzen und dann das Ergebnis mit Nullen auffüllen.

Der gleiche Effekt gilt umgekehrt, wenn das Auffüllen mit Nullen im Laufe der Zeit erfolgt. Dies ist alles, weil die perfekte Signalrekonstruktion möglich ist, solange ein Signal bandbegrenzt ist und mindestens mit der Nyquist-Rate abgetastet wird.

Der Begriff "Auflösung" hängt davon ab, wie Sie ihn definieren. Für mich bedeutet dies, wie gut die beiden benachbarten Beobachtungszeitpunkte oder -häufigkeiten zuverlässig (statistisch) unterschieden werden können. In diesem Fall hängt die Auflösung aufgrund der spektralen Leckage tatsächlich von der DFT-Größe ab. Das heißt, die Fenstergröße ist kleiner, das transformierte Signal verschwommener oder verschmiert und umgekehrt. Es unterscheidet sich davon, wie oft Sie Stichproben nehmen oder was ich als "Definition" bezeichne. Sie können beispielsweise ein sehr unscharfes Bild mit hoher Abtastrate (High Definition) aufnehmen, aber Sie können immer noch nicht mehr Informationen erhalten als mit niedrigerer Abtastrate. Zusammenfassend kann gesagt werden, dass das Auffüllen mit Nullen die Auflösung überhaupt nicht verbessert, da Sie nicht mehr Informationen als zuvor erhalten.


6

Wenn jemand Interesse an dem Spektrum der Fensterfunktion hat, die zum Isolieren der Zeitbereichsabtastung verwendet wird, erhöht das Auffüllen mit Nullen die Frequenzauflösung der Fensterfunktion.

Wenn das Zeitsignal , wobei die Fensterfunktion ist, dann ist das Gesamtspektrum · , wobei die Faltung auslöst. w ( t ) X ( f ) W ( f ) x(t)w(t)w(t)X(f)W(f)

Wenn Ihre Fensterfunktion ein einfaches Rechteck ist (eine Extraktion einiger Werte aus . Dann ist die Synchronisationsfunktion. Wenn also beispielsweise Nfft der Breite Ihres Rechtecks ​​entspricht, und Wenn Sie bei genau einer der Bin-Frequenzen eine Sinuskurve hatten, fallen die Samples der Synchronisationsfunktion, die auf diesem Bin zentriert erscheinen würden, genau auf die Nulldurchgänge außerhalb der Spitzen und Sie sehen die Form der Synchronisation nicht in das Spektrum überhaupt. Wenn Sie jetzt Null-Pad Ihre Daten in die FFT gehenX ( f )x(t)X(f)Sie werden einige Samples an anderen Stellen als dem Peak und den Nulldurchgängen sehen, wodurch die Form der Synchronisationsfunktion im resultierenden Spektrum sichtbar wird. Was nützt das Auffüllen mit Nullen? Es ist sicherlich von pädagogischem Nutzen, wenn es darum geht, die Art der diskreten Transformation von Fenstersignalen aufzudecken, wie dies in der Regel der Fall ist. In praktischer Hinsicht kann es in jedem Fall nützlich sein, wenn Sie sich für die spektrale Form einer isolierten Hüllkurve auf einer Trägerwelle interessieren.


4

Dies kann verschiedene Gründe haben, je nachdem, welche Prozesse vor und nach der Fouriertransformation ausgeführt werden. Der häufigste Grund ist, bei jeder resultierenden Transformation eine höhere Frequenzauflösung zu erzielen. Das heißt, je größer die Anzahl der in Ihrer Transformation verwendeten Abtastwerte ist, desto schmaler ist die Binbreite im resultierenden Leistungsspektrum. Denken Sie daran: binwidth = sample_frequency / transform_size (häufig als Fenstergröße bezeichnet). Daraus können Sie sich vorstellen, dass mit zunehmender Transformation die Binbreite abnimmt (= bessere Frequenzauflösung). Das Auffüllen mit Nullen ist eine Möglichkeit, die Transformationsgröße zu erhöhen, ohne neue Informationen in das Signal einzufügen.

Warum also nicht einfach eine größere Transformation ohne Auffüllen durchführen? Würde das nicht den gleichen Effekt erzielen? Gute Frage. In vielen Fällen möchten Sie möglicherweise einen Strom von Zeitbereichsdaten analysieren, für die Sie möglicherweise eine Kurzzeit-Fouriertransformation (stft) verwenden. Dazu wird alle N Abtastwerte eine Transformation entsprechend der Zeitauflösung durchgeführt, die Sie zur Charakterisierung von Änderungen im Frequenzspektrum benötigen. Hier liegt das Problem. Wenn Sie ein zu großes Fenster haben, verlieren Sie die Zeitauflösung, wenn Sie ein zu kleines Fenster haben, verlieren Sie die Frequenzauflösung. Die Lösung besteht dann darin, kleine Zeitbereichsfenster für eine gute Zeitauflösung zu nehmen und diese dann mit Nullen zu füllen, um eine gute Frequenzauflösung zu erzielen. Hoffe das ist nützlich für dich

Update habe
ich nicht gut erklärt. Ich hätte es besser klären sollen. Bezogen auf eine Fenstertransformation erhalten Sie zwar keine "tatsächliche" höhere Frequenzauflösung, aber für Visualisierungszwecke (Lesen des Leistungsspektrums mit dem Auge) können klarere Ergebnisse erzielt werden. Bei Verwendung der kritischen Abtastrate belegt jede Nebenkeule ein einzelnes Bin, was je nach Grafiktechnik irreführend sein kann. Das Auffüllen mit Nullen liefert ein interpoliertes Frequenzspektrum, das aufschlussreicher sein kann. Wenn Sie für die Frequenzschätzung eine einfache Peak-Picking-Methode verwenden, erhalten Sie durch den spektralen Interpolationseffekt des Null-Paddings eine spektrale Probe, die näher am wahren Peak der Hauptkeule liegt. Dieser Link enthält einige nützliche Diagramme: http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html


9
Diese Antwort ist nicht richtig. Das Auffüllen mit Nullen verbessert die Frequenzauflösung überhaupt nicht. es interpoliert lediglich zwischen den Ausgängen der kleineren Transformation. Sie können sich das Auffüllen mit Nullen vorstellen, indem Sie mehr Frequenzbereiche hinzufügen, die dieselbe Bandbreite haben wie bei der kleineren Transformation. Aus Sicht der Filterbank überlappen sich daher ihre Durchlassbereiche.
Jason R

1
Wenn es zum Verständnis beiträgt: Sie können auch das Gegenteil tun: Nehmen Sie die FFT eines Signals, füllen Sie das Ergebnis mit Nullen auf und kehren Sie die FFT um. Dadurch wird das ursprüngliche Signal interpoliert. Natürlich ist das Signal immer noch das gleiche Signal mit der gleichen Nyquist-Bandbreite. Durch die Interpolation erhalten Sie nicht mehr Informationen zu höheren Frequenzen als ursprünglich vorhanden.
Endolith

1
@Jason R - Du hast recht, meine Antwort war irreführend, ich habe versucht, oben den ursprünglichen Beitrag zu klären. Ich hätte nicht sagen sollen, dass das Auffüllen mit Null die Frequenzauflösung erhöht.
Dan Barry

2

Ich habe diese in den vorherigen guten Antworten nicht erwähnt, daher füge ich die folgenden zusätzlichen wichtigen Gründe für das Auffüllen mit Null hinzu:

Radix-2-Algorithmen sind effizienter, sodass die Leistung in Echtzeit verbessert werden kann, wenn keine Auffüllung auf die nächste Potenz von 2 (oder in einigen Fällen auf die Potenz von 4 für Radix-4) erfolgt. Auch wenn die FFT für die Analyse verwendet wird, wird häufig eine Null-Auffüllung durchgeführt, um Abtastwerte der DTFT zu berechnen, beispielsweise um den Frequenzgang einer FIR zu bestimmen: Vergleichen Sie fft ([1 1 1 1]) mit fft ([1 1 1 1], 512), der mit freqz ([1 1 1 1]) identisch ist.

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.