[英]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.539)到(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.