轉自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,得到初始相位。