zaskoczony widmem fazowym fft!

9

Bardzo prosty eksperyment MATLAB:

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

A oto wynik: wprowadź opis zdjęcia tutaj

Teraz dokonałem niewielkiej zmiany powyższego fragmentu kodu; skrócenie czasu trwania o zaledwie 1 próbkę, jak następuje:

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

A spektrum fazowe jest całkowicie szalone:

wprowadź opis zdjęcia tutaj

Pytania:

  1. Na pierwszym wykresie miałem nadzieję zobaczyć fazę zerową w bin 700, która odpowiada dodatniej częstotliwości 200 w tym przykładzie. Wydaje się, że tak nie jest. Po drugie, nie rozumiem liniowych części wykresu na wykresie 1. Doceniam składowe fazowe, które mogłyby potencjalnie istnieć z powodu tak zwanego szumu numerycznego, ale w takim razie jak ten szum może być tak „liniowy” w fazie?

  2. Na drugim wykresie, dlaczego usunięcie tylko jednej próbki miałoby tak drastyczny wpływ na wykres fazowy?

  3. Czy robię tu coś zasadniczo nie tak?

użytkownik4673
źródło

Odpowiedzi:

18

Nie robisz nic złego, ale również nie zastanawiasz się dokładnie, czego powinieneś się spodziewać, i dlatego jesteś zaskoczony rezultatem. W przypadku pytania 1 twoje przypuszczenie jest bliskie, ale faktycznie masz rzeczy do tyłu; to szum numeryczny, który dręczy twój drugi, a nie pierwszy.

Zdjęcia mogą pomóc. Oto wykresy wielkości i fazy dla pierwszej próby:

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

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

A drugi:

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]

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Co się tu dzieje? Drugi jest najłatwiejszy do wyjaśnienia. Po pierwsze, FFT drugiego ma wszędzie zerową amplitudę, z wyjątkiem dwóch pików widocznych w widmie wielkości; wynika to z tego, że definicja FFT z wykorzystaniem 1000 punktów danych zwraca częstotliwości w postaci dla , a zatem sygnał spada dokładnie na przedział częstotliwości. W rezultacie w pozostałych 998 punktach twój sygnał jest całkowicie spowodowany szumem maszyny z powodu błędów zmiennoprzecinkowych, a zatem twoje spektrum fazowe jest nonsensowne, ponieważ jest to dosłownie faza liczb pseudolosowych.k/10000k999

Jednak dla pierwszego definicja FFT obejmuje częstotliwości formy dla , podczas gdy częstotliwość sygnału wynosi , która nie ma formy . W rezultacie twój sygnał zostaje poszerzony przez wyciek widmowy i prawie wszędzie będzie niezerowy. Nie będę komentował fizycznej postaci wykresu fazowego, ale powiem, że przyjmuje on zamkniętą formę analityczną.k/10010k1000200/1000k/1001

Ogólnie myślę, że same wykresy kąta fazowego są naprawdę złym pomysłem na przekazywanie informacji właśnie z tego powodu; po pierwsze, nie możesz stwierdzić, czy patrzysz na fazę śmieci o niskiej amplitudzie, czy rzeczywisty sygnał, a po drugie, nie jest on niezmienny dla translacji i łatwo jest uzyskać całkowicie oszałamiające wykresy dla prostych danych wejściowych. O wiele lepiej, jeśli nadal szukasz czegoś, co przekazuje informacje o fazie, to wykres, który jednocześnie przedstawia informacje o fazie i amplitudzie w ten sam wizualny sposób, na przykład wykres, w którym faza jest kodowana jako odcień, a wielkość jest kodowana jako jasność.

DODATEK: Oto kilka zdjęć z Mathematiki, które ilustrują zasadę, którą podałem w poprzednim akapicie:

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]

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Wszystkie trzy obrazy to transformaty Fouriera 2D tego samego sygnału wejściowego ( kwadrat z 1 wypełniony zerami o długości ), ale wejścia były cyklicznie obracane o 5, 4 i 0, oraz 200 punktów danych. Widma jasności (zakodowane przez jasność pikseli) są identyczne, ale widma fazowe są zupełnie inne! Kodowanie fazowe odbywa się tak, że 1 mapuje na czerwony, mapuje na zielony, mapuje na cyjan i11×11500×500i1iodwzorowuje na fioletowy. Mam na myśli to, co mówię, gdy widma fazowe są niezmienne i nie podlegają zmianom, a zatem nie podlegają ludzkiemu zrozumieniu wizualnemu. Na przykład, przy cyklicznym przesunięciu 200 punktów danych, zupełnie nie można powiedzieć, co dzieje się w fazie, ponieważ wygląda to po prostu na statyczny, ale sygnał wejściowy nie jest bardziej skomplikowany niż inne przypadki wejściowe.

DumpsterDoofus
źródło
0

Jeśli chcesz zmienić częstotliwość sygnału lub długość FFT, aby sygnał zmieniał się pomiędzy dokładnie okresową a niezupełnie okresową w otworze FFT, i nie chcesz widzieć fazy przedziału wielkości szczytowej dla tej zmiany sygnału, początkową fazę sygnału można odnieść do środka, jeśli otwór FFT zamiast początku (dla wygenerowanego sin (t), umieść t = 0 na środku tablicy FFT).

hotpaw2
źródło
-1

Witryna Fale Gaussa szczegółowo opisuje część dotyczącą fazy i jej losowego zachowania: tylko kwestia błędu zmiennoprzecinkowego, jak powiedział DumpsterDoofus

Gim
źródło