簡體   English   中英

難以理解FFT計算的相位。 簡短的Matlab演示來說明

[英]Difficulty understanding the phase calculated by the FFT. Short matlab demo to illustrate

我正在測試正弦信號和余弦信號的fft的相位輸出。 下面的腳本創建信號並對其執行FFT。 由於我只對信號的相位感興趣,因此將振幅低於閾值的bin的相位頻譜設為零。

% 10khz 10 second long time interval
t = 0:1 / 10000:10;

%1khz cos
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);

%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

%magnitude and phases of ffts
CA = abs(C); %cos magnitude
SA = abs(S); %sin magnitude

Cthresh = max(CA) * 0.5;
Sthresh = max(SA) * 0.5;

%find all indeces below the threshold
Crange = find(CA < Cthresh);
Srange = find(SA < Sthresh);

%set the indeces below the threshold to 0 - phase will be meaningless for
%noise values
CP = angle(C);
CP(Crange) = 0;
SP = angle(S);
SP(Srange) = 0;

如果繪制CP-cos的相位-則在與cos信號的頻率相對應的倉中將獲得0.3142的相位,而在其他位置為零。 這是pi / 10。 我期望得到pi。 為什么是這樣?

如果繪制SP,則得到的值為1.2566。 我期望得到pi / 2或1.5708。 預期值的80%。 是什么導致這些錯誤?

如果輸入信號在FFT孔徑長度(完整周期的精確整數)中不是完全周期性的,則正弦曲線將在FFT孔徑的兩端不連續。 因此,您將獲得一個相位,該相位是FFT輸入向量兩端的兩個不同相位的平均值。

如果您想要更明智的相位,則將正弦曲線的相位指向FFT輸入矢量的中心,並在FFT之前進行fft移位。 這將在零相位參考位置處產生連續的正弦曲線,只有一個相位而不是一個奇怪的平均值。

還要注意,matlab可以將相位指向采樣正弦曲線中的第二個點,例如vectorElement [i = 1],而不是第一個,vectorElement [i = 0]。 對於周期= 20個樣本的正弦曲線,它將具有pi / 10的相位。

您遇到的問題正是hotpaw2所說的。 您在t中有100001個樣本,因此您沒有完美的周期性信號,因此有泄漏。 這意味着您從隱式矩形窗口中得到了sin()/ sin()函數,並與您的解決方案進行了卷積。 那就是改變您的階段的原因。

如果相反,請嘗試以下操作:

t = 0:1 / 10000:9.9999;
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);
%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

您會發現余弦的相位為零(這是您期望的),而正弦的相位為pi / 2。

在時域中執行線性移位(使用fftshift)只會在頻域中引入線性相位項,而無法解決原始問題。

在實踐中,如果要在頻域中檢查信號,則應該應用開窗,而不是試圖精確地設置序列的長度以匹配信號的周期。 在這種情況下,您確實應該確保信號正確對齊,以使窗口衰減端點,從而平滑不連續性。 這具有加寬FFT主瓣的效果,但它也控制了泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM