从FFT恢复相位

时间:2013-03-20 18:58:05

标签: matlab signal-processing fft sin phase

我正在尝试在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));

这个结果对我来说几乎没有任何意义。因为这是一个sin波(不是cos波)。我期望看到441hz箱的值为1/2 * pi = 1.57079。相反,我看到从(441,-1.53​​9)到(445,1.603)的几乎不连续的跳跃。为什么441到目前为止还没有正确的值?为什么445如此接近?

除了441赫兹之外,所有垃圾箱的价值对我来说都是个谜。我还尝试了几种恢复相位的方法,包括展开(角度(sFFT))和atan2(图像(sFFT),真实(sFFT));这些改变了输出但对我没有任何意义。除了441之外,为什么除了0之外的任何值(如abs(FFT)显示?)。为什么441箱关闭但没有正确值?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

为了更好地估计相位,通过执行ffthift将0相位参考更改为窗口中心,这应消除大部分交替相位不连续,然后进行插值,但注意到您已更改了0点。 / p>

注意长度为零的向量的相位在大多数情况下是没有意义的,因此由于有限精度数学,任何接近的可能只是数值噪声(在各种随机方向上接近零向量)。

因此,有些人只是将绘制的相位钳制到零,以达到低于某些本底噪声的任何幅度。