verblüfft durch fft-Phasenspektrum!


9

Ein sehr einfaches MATLAB-Experiment:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

Und hier ist die Ausgabe: Geben Sie hier die Bildbeschreibung ein

Nehmen Sie nun eine geringfügige Änderung am obigen Code-Snippet vor. Reduzieren der Zeitdauer um nur 1 Stichprobe wie folgt:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

Und das Phasenspektrum wird total verrückt:

Geben Sie hier die Bildbeschreibung ein

Fragen:

  1. In der ersten Darstellung hatte ich gehofft, eine Nullphase bei Bin 700 zu sehen, die der positiven Frequenz von 200 in diesem Beispiel entspricht. Das scheint nicht der Fall zu sein. Zweitens verstehe ich die linearen Teile des Graphen in Diagramm 1 nicht. Ich schätze Phasenkomponenten, die möglicherweise aufgrund des sogenannten numerischen Rauschens existieren könnten, aber wie könnte dieses Rauschen dann in der Phase so "linear" sein?

  2. Warum würde das Entfernen nur einer Probe im zweiten Diagramm einen so drastischen Einfluss auf das Phasendiagramm haben?

  3. Mache ich hier etwas grundlegend Falsches?

Antworten:


18

Sie machen nichts falsch, aber Sie denken auch nicht genau darüber nach, was Sie erwarten sollten, weshalb Sie über das Ergebnis überrascht sind. Bei Frage 1 ist Ihre Vermutung nah, aber Sie haben tatsächlich Dinge rückwärts; Es ist numerisches Rauschen, das dein zweites plagt, nicht dein erstes.

Bilder können helfen. Hier sind Diagramme der Größe und Phase für den ersten Versuch:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Und der zweite:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Also, was ist hier los? Der zweite ist am einfachsten zu erklären. Erstens hat die FFT der zweiten überall eine Amplitude von Null, außer bei den beiden im Betragsspektrum sichtbaren Spitzen; Dies folgt, da die Definition der FFT unter Verwendung von 1.000 Datenpunkten Frequenzen der Form für zurückgibt und Ihr Signal daher genau auf einen Frequenzbereich fällt . Infolgedessen ist Ihr Signal an den anderen 998 Punkten vollständig auf Maschinenrauschen aufgrund von Gleitkommafehlern zurückzuführen, und daher ist Ihr Phasenspektrum Unsinn, da es buchstäblich die Phase von Pseudozufallszahlen ist.k/.10000k999

Für die erste umfasst die Definition der FFT jedoch Frequenzen der Form für , während Ihre Signalfrequenz beträgt , was nicht die Form . Infolgedessen wird Ihr Signal durch spektrale Leckage verbreitert und ist fast überall ungleich Null. Ich werde die physikalische Form des Phasendiagramms nicht kommentieren, aber ich werde sagen, dass es eine geschlossene analytische Form zulässt.k/.10010k1000200/.1000k/.1001

Im Allgemeinen denke ich, dass Graphen des Phasenwinkels allein aus diesem Grund eine wirklich schlechte Idee für die Übermittlung von Informationen sind. Erstens können Sie nicht sagen, ob Sie die Phase des Mülls mit niedriger Amplitude oder des tatsächlichen Signals betrachten, und zweitens ist es nicht übersetzungsinvariant, und es ist leicht, äußerst verwirrende Diagramme für einfache Eingaben zu erhalten. Viel besser, wenn Sie immer noch nach etwas suchen, das Phaseninformationen vermittelt, ist ein Diagramm, das gleichzeitig Phasen- und Amplitudeninformationen auf dieselbe visuelle Weise darstellt, z. B. ein Diagramm, in dem die Phase als Farbton und die Größe als Helligkeit codiert sind.

ADDENDUM: Hier sind ein paar Bilder von Mathematica, die das Prinzip veranschaulichen, das ich im vorhergehenden Absatz angegeben habe:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Alle drei Bilder sind 2D-Fourier-Transformationen desselben Eingangssignals (ein Quadrat von Einsen, aufgefüllt mit Nullen bis zu einer Länge von ), aber die Eingänge wurden zyklisch um 5, 4 und 0 und gedreht 200 Datenpunkte. Die Betragsspektren (codiert durch Pixelhelligkeit) sind identisch, aber die Phasenspektren sind völlig unterschiedlich! Die Phasenkodierung erfolgt so, dass 1 auf Rot, auf Grün, auf Cyan und11×11500×500ich- -1- -ichKarten zu lila. Das meine ich, wenn ich sage, dass Phasenspektren nicht verschiebungsinvariant sind und daher dem menschlichen visuellen Verständnis nicht zugänglich sind. Bei einer zyklischen Verschiebung von 200 Datenpunkten ist es beispielsweise völlig unmöglich zu sagen, was in der Phase vor sich geht, da es nur statisch aussieht, das Eingangssignal jedoch nicht komplizierter ist als die anderen Eingangsfälle.


0

Wenn Sie die Frequenz eines Signals oder die FFT-Länge so variieren möchten, dass das Signal in der FFT-Apertur zwischen genau periodisch und nicht genau periodisch variiert, und nicht möchten, dass sich die Phase des Spitzengrößenbereichs für diese Signaländerung ändert, man kann die Anfangsphase des Signals auf die Mitte beziehen, wenn die FFT-Apertur anstelle des Anfangs ist (für eine erzeugte Sünde (t) t = 0 in die Mitte des FFT-Arrays setzen).


-1

Die Gaussian Waves-Site beschreibt den Teil über die Phase und ihr zufälliges Verhalten: nur eine Frage des Gleitkommafehlers, wie DumpsterDoofus sagte

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.