0

我正在尝试在 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 bin 的值,我希望看到 1/2*pi = 1.57079。相反,我看到从 (441, -1.53​​9) 到 (445, 1.603) 的几乎不连续的跳跃。为什么 441 与正确值相差甚远?为什么445这么近?

除了 441 赫兹之外,所有分档的值对我来说都是一个谜。我还尝试了其他几种恢复相位的方法,包括 unwrap(angle(sFFT)) 和 atan2(imag(sFFT), real(sFFT)); 这些改变了输出,但对我来说也没有任何意义。为什么除了 441 之外的 bin 是除 0 之外的任何值(如 abs(FFT) 所示?)。为什么 441 bin 关闭但不是正确的值?

谢谢您的帮助!

4

1 回答 1

0

为了更好地估计相位,通过执行 fftshift 将 0 相位参考更改为窗口中心,这应该消除大多数交替相位不连续性,然后进行插值,但请注意您已经更改了 0 点。

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

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

于 2013-03-21T20:38:05.677 回答