2013-03-20 74 views
0

我试图恢复在Matlab的简单(音频)信号的相位: 在MATLAB我做了以下内容:恢复时期从FFT

% 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波)。我期望看到1/2 * pi = 1.57079的441hz bin值。相反,我看到从(441,-1.53​​9)到(445,1.603)几乎不连续跳跃。为什么441距离正确的值太远?为什么445如此接近?

所有除了441赫兹的二进制位的值是一个谜给我。我还尝试了其他几种恢复相位的方法,包括展开(角度(sFFT))和atan2(图像(sFFT),真实(sFFT));这些改变了输出,但对我也没有任何意义。为什么441除了0之外的任何值(像abs(FFT)所示?)。为什么441料仓关闭但不是正确的值?

感谢您的帮助!

+3

你试过'unwrap'吗?其校正的相位角,以产生平滑的相位图,看到http://www.mathworks.com/help/matlab/ref/unwrap.html – bla 2013-03-20 19:56:05

回答

0

为了更好地估计相位,通过执行fftshift(将消除大部分交替相位不连续性),然后插值,但是注意到您已更改了0点,将0相位参考更改为窗口中心。

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

因此,一些人只是夹住绘制阶段为零下面一些噪声底限的任何大小。

+0

我已经转移的FFT,以便被为0Hz在曲线图上的中心;图的左半部分是 - 频率,右半部分是+频率。这对此有什么帮助?当你说这个“应该消除大部分交替相位不连续性”时,你是什么意思。另外,你建议我做什么插值? 您建议置零相位测量中不高于特定阈值是在除去大部分的“噪声”的相位数据的有帮助的。然而,它并没有帮助我理解441hz的相位读数,这是我最感兴趣的。 – user2109 2013-03-25 19:02:14

+0

fft shift在FFT之前移动数据,或者在之后旋转每个其他复杂bin。这将零阶段的参考移动到没有不连续的中间数据样本。用Sinc内核插入(窗口)将是最好的。 – hotpaw2 2013-03-25 20:03:29