离散傅里叶变换(Discrete Fourier Transform,DFT)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT,也应当将其看作经过周期延拓成为周期信号再作变换。在实际应用中通常采用快速傅里叶变换以高效计算DFT

中文名

离散傅里叶变换

外文名

Discrete Fourier Transform

时域信号

离散时间傅里叶变换

计算

快速傅里叶变换

应用学科

通信

特点

傅里叶、离散

定义

离散傅里叶变换

离散傅里叶变换(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时,具有周期性

模拟信号分析

在工程实际中经常遇到的模拟信号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 dΩ

用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. 1.C语言实现代码
  2. int DFT(int dir,int m,double *x1,double *y1)
  3. {
  4.     long i,k;
  5.     double arg;
  6.     double cosarg,sinarg;
  7.     double *x2=NULL,*y2=NULL;
  8.     x2=malloc(m*sizeof(double));
  9.     y2=malloc(m*sizeof(double));
  10.     if(x2==NULL||y2==NULL)return(FALSE);
  11.     for(i=0;i<m;i++)
  12.     {
  13.         x2[i]=0;
  14.         y2[i]=0;
  15.         arg=-dir*2.0*3.141592654*(double)i/(double)m;
  16.         for(k=0;k<m;k++)
  17.         {
  18.             cosarg=cos(k*arg);
  19.             sinarg=sin(k*arg);
  20.             x2[i]+=(x1[k]*cosarg-y1[k]*sinarg);
  21.             y2[i]+=(x1[k]*sinarg+y1[k]*cosarg);
  22.         }
  23.     }
  24. /*Copythedataback*/
  25.     if(dir==1)
  26.     {
  27.         for(i=0;i<m;i++)
  28.         {
  29.             x1[i]=x2[i]/(double)m;
  30.             y1[i]=y2[i]/(double)m;
  31.         }
  32.     }
  33.     else
  34.     {
  35.         for(i=0;i<m;i++)
  36.         {
  37.             x1[i]=x2[i];
  38.             y1[i]=y2[i];
  39.         }
  40.     }
  41.     free(x2);
  42.     free(y2);
  43.     return(TRUE);