1. 程式人生 > >離散正(餘)弦訊號的時域與FFT變換後所得頻域之間的關係(幅值和相角)

離散正(餘)弦訊號的時域與FFT變換後所得頻域之間的關係(幅值和相角)

離散正(餘)弦訊號的時域與FFT變換後所得頻域之間的關係

作者:jbb0523(彬彬有禮)

        正弦訊號在訊號處理中是很常見的,比如通訊領域的載波。由於正弦與餘弦只是相差π/2的初相,因此這裡統稱正弦訊號。給出連續正弦訊號的表示式:


式中,A為振幅,Ω為模擬角頻率(rad/s),φ為初相,f為模擬頻率(Hz),Ω=2πf

在滿足奈奎斯特取樣定理條件下對訊號x(t)進行取樣得到離散正弦訊號x(n)

式中,fs為取樣頻率,Ts為取樣間隔,Ts=1/fs,ω為數字角頻率(rad),ω=2πf/fs

根據ω可以判斷x(n)的週期性,若2π/ω為有理數則x(n)為週期訊號,週期為有理數的分母,詳情可參考數字訊號處理類教科書。

對N點長的x(n)進行FFT可得其N點長的離散傅立葉變換(DFT),記為X(k)。注意,FFT只是DFT的快速演算法的總稱。由於x(n)是實訊號,所以X(k)為對稱的,只須關注其前N/2點即可。

今天要討論的問題來自一篇文件《為什麼要進行傅立葉變換》,這是一篇網上很熱門文章,原文出處不詳,給出參考連結:網易部落格百度文庫豆瓣

在原文第七部分“七、用Matlab實現快速傅立葉變換”中有一段話是這樣子寫的:

假設FFT之後某點n用複數a+bi表示,那麼這個複數的模就是An=根號a*a+b*b,相位就是Pn=atan2(b,a)。根據以上的結果,就可以計算出n點(n≠1,且n<=N/2)對應的訊號的表示式為:

An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。對於n=1點的訊號,是直流分量,幅度即為A1/N

這裡用本文的符號翻譯一下:對於x(n)的離散傅立葉變換X(k)來說,X(k)一般為複數,可設為X(k)=a(k)+ jb(k),其模值|X(k)|和相角arg[X(k)]分別為


對於任意一項X(k)(0<k<N/2),它所對應的時域訊號表示式為


其中。若k=0,即直流分量,其幅度為|X(k)|/N。

有關模擬頻率f與離散頻率k的關係可參見數字訊號處理類教科書,下面對時域訊號幅度相角與離散頻域的幅值相角的關係結論進證明。

為了避免頻譜洩漏,取f

fs和N均為正整數,且N=mfsm為正整數。

對離散正弦訊號x(n)進行DFT變換:

上面推導過程中使用了尤拉公式和三角函式積化和差公式。令


  。

mf+k≠0時,根據離散正弦訊號的週期性判斷方法,我們知道XRe1(k)和XIm1(k)求和式中的正弦訊號一定是以N為週期的,所以從0到N-1求和必為零;同理,當mfk≠0時,XRe2(k)和XIm2(k)求和式中的正弦訊號一定是以N為週期的,所以從0到N-1求和也必為零。若要使mf+k項為零,則必有f=k=0,若要使mfk項為零,則要滿足mf=k

下面以文件《為什麼要進行傅立葉變換》中的例子為例來說明:

S=2+3*cos(2*pi*50*tpi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)。式中cos引數為弧度,所以-30度和90度要分別換算成弧度。我們以256Hz的取樣率對這個訊號進行取樣,總共取樣256點。

我們取訊號S的50Hz成份。這裡fs=256Hz,N=256,f=50Hz,m=1,代入得


可以通過週期性討論得知,若k≠50,則必有X(k)=0(當然k=256-50時與k=50對稱,前面我們說了只討論前N/2=128個點)。當k=50時


因此可得時域幅值相角與頻域模擬相角的關係


這裡模擬頻率f與離散頻率k的關係為


同理可以討論f=75Hz成份。對於直流成份,可以認為是如下正弦訊號


f=0Hz,φ=0,代入得


可以通過週期性討論得知,若k≠0,則必有X(k)=0;當k=0時


其實對於直流成分沒有必要這麼複雜,直流成分就是一個常數,對常數序列A做DFT


若k≠0,求和項復正弦序列以N為週期,求和後必為零;若k=0,求和通項等於1,則


推導了半天,可能有些糊塗,最後再把結論清晰的給出來,以便查閱:

【結論1若有離散正弦訊號

x(n)做N點FFT得X(k),則在0<k<N/2範圍內僅在k=f/(fs/N)處有值,若設此值為X=a+jb,則此值與離散正弦訊號有如下關係


其中


結論中,為保證k=f/(fs/N)為整數(即不發生頻譜洩漏,要求ffs,N均為正整數,且N=mfsm為正整數,即N為整數倍的fs

【結論2若有直流訊號x(n)=A,對x(n)做N點FFT得X(k),則僅在k=0處有值,且此值X=AN,也可以寫為A=X/N。

附:三角函式積化和差公式