簡體   English   中英

從FFT恢復相位

[英]Recovering Phase from FFT

我正在嘗試在matlab中恢復簡單(音頻)信號的相位:在matlab中,我執行以下操作:

% This wave is perfectly periodic in the sample.  That is, 
% there are exactly 1000 periods.
swave = sin( 2 * pi * (0:10000) * 441/44100);

% Find the fft
sFFT = fft(swave);
% Remove the duplicate data in the FFT
sFFT = sFFT(1:length(sFFT)/2);

% Take a look a the amplitudes from the FFT and it checks out
freqs = 44100/ 2*linspace(0,1,length(sFFT);
plot(freqs, abs(sFFT));

% Now to get the phase
plot(freqs, angle(sFFT));

這個結果對我來說幾乎沒有任何意義。 因為這是一個正弦波(不是余弦波)。 我希望441hz bin的值看到1/2 * pi = 1.57079。 相反,我看到從(441,-1.53​​9)到(445,1.603)幾乎不連續的跳躍。 為什么441與正確的值相差甚遠? 為什么445這么近?

除了441 hz之外,所有垃圾箱的價值對我來說都是一個謎。 我還嘗試了其他幾種恢復相位的方法,包括unwrap(angle(sFFT))和atan2(imag(sFFT),real(sFFT)); 這些改變了輸出,但對我來說也沒有任何意義。 為什么除441以外的bin都為0以外的任何值(如abs(FFT)所示?)。 為什么441 bin關閉但值不正確?

謝謝您的幫助!

為了更好地估計相位,可通過執行fftshift將0相位參考更改為窗口的中心,這應消除大多數交替相位不連續性,然后進行插值,但要注意您已更改了0點。

注意,在大多數情況下,長度為零的向量的相位是沒有意義的,因此由於有限精度數學的緣故,任何接近的東西都可能只是數值噪聲(在各個隨機方向上接近零向量)。

因此,對於低於某個本底噪聲的任何幅度,某些人只會將繪制的相位鉗位為零。

暫無
暫無

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

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