(转载)关于FFT的相位谱

转自于http://blog.sina.com.cn/s/blog_4a854d240100vdmq.html

 先看一下我收到的程序,作为研究对象的信号是这样产生的:
T=128;
N=128;
dt=T/N;
t=dt*(1:N);
x=2*cos(2*t-pi/4);
...
      (我觉得这个信号存在一点问题,因为t是从1开始的,所以它的初相应该和-pi/4有点差别吧。)
      为什么进行FFT,用angle得到相位-频率特性却不能反映这个信号的初始相位?
      胡广书的《数字信号处理-理论、算法与实现(第二版)》第三章第八节《关于正弦信号抽样的讨论》,得出了关于正弦信号抽样的六个结论,最后总结了一个总的原则:抽样频率应为信号频率的整数倍,抽样点数应包含整周期。
      书中的结论五与采样频率和抽样点数有很大的关联。结论五主要说只有满足了上面的那个总的原则,频谱泄漏才不会发生。我想不光是幅度谱的频谱泄漏现象,抽样频率和抽样点数同样会对相位谱产生影响。
      考虑一个无限长的正弦信号(相当于初相为-90°),如果我们截取它的整数个周期,然后对截短的信号进行周期延拓,则得到的延拓的信号与原无限长正弦没有区别。
      现在我们再次对这个无限长的正弦进行截短,长度为1.5个周期,然后对截短信号进行周期延拓,看看我们得到了什么?
下图、无限长正弦:

 

下图、截短信号

一点五个周期正弦

下图、对截短信号周期延拓:

周期延拓之后

      可以看出,此时进行周期延拓得到的信号与原来的正弦信号大相径庭。新的周期信号是一个周期的偶函数,原无限长正弦是一个周期的奇函数,两者奇偶性都不一样了,因此不能指望利用新的信号的DFT求出原信号的初相。exp(-jωt)=cos(ωt)-jsin(ωt),进行变换的时候,若f(t)为实偶函数,则f(t)sin(ωt)就是奇函数,对一个奇函数在对称区间内积分只能得到0,因此实偶函数的傅立叶变换肯定是实的,对一个实数用angle求相位,当然相位是0。而原正弦肯定是初相为-90°。
      我想这就是问题所在,DFT就是DFS,只不过DFT先将有限长信号进行周期延拓,然后求DFS,再截取一个周期。
      使用DFT,在有限的观测时间内采集信号的信息。如若观测时间内正好得到了整数个正弦周期,则DFT的周期延拓可以不失真的表示原正弦,可是如果观测时间内得到的信号不是整数个周期,那么问题随之而来,就像上面的例子,观测时间内得到了1.5个周期的正弦,然后进行周期延拓,显然乱了套。
      如果满足了胡广书老师所总结的抽样条件,则对正弦的DFT谱无疑可以很好地反映初相,我写了两个例子:
      第一个例子,信号只包含一个正弦:
t=linspace(0,2-0.125,16);
x=cos(2*pi*t+pi/4);
X=fft(x);
stem(abs(X));
figure;
stem(angle(X)/pi*180);

幅度谱:

一个正弦

相位谱:

一个正弦相位


      可以看见DFT相位谱第三个点对应正弦的相位,刚好是45°。
      第二个例子信号中包含两个正弦:
t=linspace(0,2-0.125,16);
x=cos(2*pi*t+pi/4)+2*cos(2*pi*0.5*t+pi/8);
X=fft(x);
stem(abs(X));
figure;
stem(angle(X)/pi*180);

幅度谱:

两个正弦

相位谱:

两个正弦相位
      可以看见DFT相位谱第二个和第三个点对应两个正弦的相位,刚好是22.5°和45°。
      如果没有满足上面所说的条件,就会得到不准确的结果,有兴趣可试试下面的代码:
t=linspace(0,2.5-0.125,32);
x=cos(2*pi*t+pi/4);
X=fft(x);
stem(abs(X));
figure;
stem(angle(X)/pi*180);
      如何克服这个问题?我觉得这非常困难。在不能预知信号频率的情况下,无法确定采样频率和观测点数。也许可以先进行一次观测,通过幅度谱估计出正弦的频率,然后根据频率调整抽样频率,重新对信号进行采样,使采样符合上面所述的条件。但是这样做有很多的问题,例如硬件可能不好实现。而且虽然第二次调整了采样频率和抽样点数,可是初始相位已经无法得到了,因为第二次采样不可能再从零时刻开始。

      Sandygreta同学说可以这样做,先以较高的抽样频率对信号进行采样,通过FFT幅度谱估算出正弦信号的频率,然后计算出满足抽样条件的最佳的抽样频率和观测时间,使抽样频率为正弦频率的整数倍(大于2倍),且观测时间内能正好得到整数个正弦周期。然后对刚才采集的信号样本进行插值,接着使用计算出来的采样频率和观测时间对插值的结果重新采样,计算FFT,得到初始相位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章