Matlab 从FFT中恢复相位

Matlab 从FFT中恢复相位,matlab,signal-processing,fft,trigonometry,phase,Matlab,Signal Processing,Fft,Trigonometry,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

我试图在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));
这个结果对我来说几乎毫无意义。因为这是一个正弦波(不是cos波)。我希望441hz bin的值为1/2*pi=1.57079。相反,我看到从(441,-1.539)到(445,1.603)几乎不连续的跳跃。为什么441与正确值相差这么远?为什么445这么近

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


谢谢你的帮助

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

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


因此,有些人只是将绘制的相位钳制在某个噪声底以下的任何量级。

您是否尝试过
展开
?它修正相位角以产生更平滑的相位图,请看,我已经移动了fft,使0hz在图形上居中;图的左1/2为-频率,右半部分为+频率。这有什么帮助?当你说这“应该消除大多数交替相位不连续性”是什么意思?还有,你建议我做什么插值?您建议将不高于某个阈值的相位测量归零,这有助于去除大多数“噪声”相位数据。然而,这并不能帮助我理解441hz的相位读数,这是我最感兴趣的。FFT移位在FFT之前移动数据,或在FFT之后每隔一个复数位旋转一次。这将零相位的参考移动到中间数据样本,在中间数据样本中没有不连续性。最好使用Sinc内核(加窗)进行插值。