定義
離散傅立葉變換(DFT),是
傅立葉變換在時域和頻域上都呈現離散的形式,將時域信號的採樣變換為在
離散時間傅立葉變換(DTFT)頻域的採樣。在形式上,變換兩端(時域和頻域上)的序列是有限長的,而實際上這兩組序列都應當被認為是離散周期信號的
主值序列。即使對有限長的離散信號作DFT,也應當將其看作經過
周期延拓成為周期信號再作變換。在實際套用中通常採用
快速傅立葉變換以高效計算DFT。
物理意義
(1)物理意義
設x(n)是長度為N的有限長序列,則其傅立葉變換,Z變換與離散傅立葉變換分別用以下三個關係式表示
X(e^jω)= ∑n={0,N-1}x(n) e^j-ωn
X(z)= ∑n={0,N-1}x(n)z^-n
X(k)= ∑n={0,N-1}x(n) e^-j2πkn/N
單位圓上的Z變換就是序列的傅立葉變換
離散傅立葉變換是x(n)的頻譜X(ejω)在[0,2π]上的N點等間隔採樣,也就是對序列頻譜的離散化,這就是DFT的物理意義.
基本性質
1.線性性質
如果X1(n)和X2(N)是兩個有限長序列,長度分別為N1和N2,且Y(N)=AX1(N)+BX2(N)
式中A,B為常數,取N=max[N1,N2],則Y(N)地N點DFT為
Y(K)=DFT[Y(N)]=AX1(K)+BX2(K), 0≤K≤N-1;
2.循環移位特性
設X(N)為有限長序列,長度為N,則X(N)地循環移位定義為
Y(N)=X((N+M))下標nR(N)
式中表明將X(N)以N為周期進行周期拓延得到新序列X'(N)=X((N))下標n,再將X'(N)左移M位,最後取主值序列得到循環移位序列Y(N)
隱含的周期性
DFT的一個重要特點就是隱含的周期性,從表面上看,離散傅立葉變換在時域和頻域都是非周期的,有限長的序列,但實質上DFT是從DFS引申出來的,它們的本質是一致的,因此DTS的周期性決定DFT具有隱含的周期性。可以從以下三個不同的角度去理解這種隱含的周期性
(1)從序列DFT與序列FT之間的關係考慮X(k)是對頻譜X(ejω)在[0,2π]上的N點等間隔採樣,當不限定k的取值範圍在[0,N-1]時,那么k的取值就在[0,2π]以外,從而形成了對頻譜X(ejω)的等間隔採樣。由於X(ejω)是周期的,這種採樣就必然形成一個周期序列
(2)從DFT與DFS之間的關係考慮。X(k)= ∑n={0,N-1}x(n) WNexp^nk,當不限定N時,具有周期性
(3)從WN來考慮,當不限定N時,具有周期性
用DFT對模擬信號進行譜分析
在工程實際中經常遇到的模擬信號xn(t),其頻譜函式Xn(jΩ)也是連續函式,為了利用DFT對xn(t)進行譜分析,對xn(t)進行時域採樣得到x(n)= xn(nT),再對x(n)進行DFT,得到X(k)則是x(n)的傅立葉變換X(ejω)在頻率區間[0,2π]上的N點等間隔採樣,這裡x(n)和X(k)都是有限長序列
然而,傅立葉變換理論證明,時間有限長的信號其頻譜是無限寬的,反之,弱信號的頻譜有限寬的則其持續時間將為無限長,因此,按採樣定理採樣時,採樣序列應為無限長,這不滿足DFT的條件。實際中,對於頻譜很寬的信號,為防止時域採樣後產生‘頻譜混疊’,一般用前置濾波器濾除幅度較小的高頻成分,使信號的頻寬小於摺疊頻率;同樣對於持續時間很長的信號,採樣點數太多也會導致存儲和計算困難,一般也是截取有限點進行計算。上述可以看出,用DFT對模擬信號進行譜分析,只能是近似的,其近似程度取決於信號頻寬、採樣頻率和截取長度
模擬信號xn(t)的傅立葉變換對為
X(jΩ)={-∞,+∞}x(t)*exp^-jΩt dt
x(t)=1/2π{-∞,+∞} X(JΩ)*e^jΩt dt
用DFT方法計算這對變換對的方法如下:
(a)對xn(t)以T為間隔進行採樣,即xn(t)|t=nT= xa(nT)= x(n),由於
t→nT,dt→T, {-∞,+∞}→∑n={-∞,+∞}
因此得到
X(jΩ)≈∑n={-∞,+∞}x(nT)*exp^-jΩnT*T
x(nT)≈1/2π{0, Ωs} X(JΩ)*e^jΩnT Dω
(b)將序列x(n)= xn(t)截斷成包含有N個抽樣點的有限長序列
X(jΩ)≈T∑n={0,N-1}x(nT)*exp^-jΩnT*T
由於時域抽樣,抽樣頻率為fs=1/T,則頻域產生以fs為周期的周期延拓,如果頻域是帶限信號,則有可能不產生頻譜混疊,成為連續周期頻譜序列,頻譜的周期為fs=1/T
(c)為了數值計算,頻域上也要抽樣,即在頻域的一個周期中取N個樣點,fs=NF0,每個樣點間隔為F0,頻域抽樣使頻域的積分式變成求和式,而在時域就得到原來已經截斷的離散時間序列的周期延拓,時間周期為T0=1/F0。因此有
Ω→kΩ0,dΩ→Ω0,{-∞,+∞} dΩ→∑n={-∞,+∞}Ω0
T0=1/F0=N/fs=NT
Ω0=2ΠF0
Ω0T=Ω0/fs=2π/N
X(jkΩ0)≈T∑n={0,N-1}x(nT)*exp^-jkΩ0nT
判斷方法
判斷系統是否為最小相位系統的簡單方法是:如果兩個系統的傳遞函式分子和分母的最高次數都分別是m,n,則頻率ω趨於無窮時,兩個系統的對數幅頻曲線斜率均為-20(n-m)dB/dec但對數相頻曲線卻不同:最小相位系統趨於-90°(n-m),而非最小相位系統卻不這樣。
注意事項
(1)時域和頻域混疊
根據採樣定理,只有當採樣頻率大於信號最高頻率的兩倍時,才能避免頻域混疊。實際信號的持續時間是有限的,因而從理論上來說,其頻譜寬度是無限的,無論多 大的採樣頻率也不能滿足採樣定理。但是超過一定範圍的高頻分量對信號已沒有多大的影響,因而在工程上總是對信號先進行低通濾波
另一方面,DFT得到的頻率函式也是離散的,其頻域抽樣間隔為F0,即頻率分辨力。為了對全部信號進行採樣,必須是抽樣點數N滿足條件
N=T0/T=fs/F0
從以上兩個公式來看,信號最高頻率分量fc和頻率分辨力F0有矛盾。若要fc增加,則抽樣間隔T就要減小,而FS就要增加,若在抽樣點數N不變的情況下,必然是F0增加,分辨力下降。唯一有效的方法是增加記錄長度內的點數N,在fc和F0給定的條件下,N必須滿足
N>2fc/F0
(2)截斷效應
在實際中遇到的序列x(n),其長度往往是有限長,甚至是無限長,用DFT對其進行譜分析時,必須將其截斷為長度為N的有限長序列
Y(n)=x(n).RN(n)
根據頻率卷積定理
Y(e)=1/2Πx(e)*H(e)
|ω|<2π/N叫做主瓣,其餘部分叫做旁瓣
(3)頻譜泄露
原序列x(n)的頻譜是離散譜線,經截斷後使每根譜線都帶上一個辛格譜,就好像使譜線向兩邊延申,通常將這種是遇上的截斷導致頻譜展寬成為泄露,泄露使得頻譜變得模糊,解析度降低
(4)譜間干擾
因截斷使主譜線兩邊形成許多旁瓣,引起不同分量間的干擾,成為譜間干擾,這不僅影響頻譜解析度,嚴重時強信號的旁瓣可能湮滅弱信號的主譜線。
截斷效應是無法完全消除的,只能根據要求折中選擇有關參量。
(5)柵欄效應
N點DFT是在頻率區間[0,2π]上對信號的頻譜進行N點等間隔採樣,得到的是若干個離散點X(k),且它們之限制為基頻F0的整數倍,這部好像在柵欄的一邊通過縫隙看另一邊的景象,只能在離散點的地方看到真實的景象,其餘部分頻譜成分被遮攔,所以稱為柵欄效應。
減小柵欄效應,可以在時域數據末端增加一些零值點,是一個周期內的點數增加
(6)信號長度的選擇
在時域內對信號長度的選擇會影響DFT運算的正確性。實際的信號往往是隨機的,沒有確定的周期,因此在實際中,應經可能估計出幾個典型的、帶有一定周期性的信號區域進行頻譜分析,然後在取其平均值,從而得到合理的結果。
基本性質
1.線性性質
如果X1(n)和X2(N)是兩個有限長序列,長度分別為N1和N2,且Y(N)=AX1(N)+BX2(N)
式中A,B為常數,取N=max[N1,N2],則Y(N)地N點DFT為
Y(K)=DFT[Y(N)]=AX1(K)+BX2(K), 0≤K≤N-1;
2.循環移位特性
設X(N)為有限長序列,長度為N,則X(N)地循環移位定義為
Y(N)=X((N+M))下標nR(N)
式中表明將X(N)以N為
周期進行周期拓延得到新序列X'(N)=X((N))下標n,再將X'(N)左移M位,最後取
主值序列得到循環移位序列Y(N)
計算機代碼
int DFT(int dir,int m,double *x1,double *y1){ long i,k; double arg; double cosarg,sinarg; double *x2=NULL,*y2=NULL; x2=malloc(m*sizeof(double)); y2=malloc(m*sizeof(double)); if(x2==NULL||y2==NULL)return(FALSE); for(i=0;i<m;i++) { x2[i]=0; y2[i]=0; arg=-dir*2.0*3.141592654*(double)i/(double)m; for(k=0;k<m;k++) { cosarg=cos(k*arg); sinarg=sin(k*arg); x2[i]+=(x1[k]*cosarg-y1[k]*sinarg); y2[i]+=(x1[k]*sinarg+y1[k]*cosarg); } }/*Copythedataback*/ if(dir==1) { for(i=0;i<m;i++) { x1[i]=x2[i]/(double)m; y1[i]=y2[i]/(double)m; } } else { for(i=0;i<m;i++) { x1[i]=x2[i]; y1[i]=y2[i]; } } free(x2); free(y2); return(TRUE);}