离散傅里叶变换

信号分析基本方法
展开5个同名词条
收藏
0有用+1
0
同义词DFT(离散傅里叶变换)一般指离散傅里叶变换
离散傅里叶变换(Discrete Fourier Transform,DFT)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律。
中文名
离散傅里叶变换
外文名
Discrete Fourier Transform,DFT
计    算
快速傅里叶变换
应用学科
通信
特    点
傅里叶、离散

定义

播报
编辑
离散傅里叶变换(DFT),是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT,也应当将其看作经过周期延拓成为周期信号再作变换。在实际应用中通常采用快速傅里叶变换以高效计算DFT。

物理意义

播报
编辑
(1)物理意义
设x(n)是长度为N的有限长序列,则其傅里叶变换,Z变换与离散傅里叶变换分别用以下三个关系式表示
单位圆上的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之间的关系考虑。
,当不限定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)的傅里叶变换对为
用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.C语言实现代码
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); }