实验四应用FFT实现信号频谱分析一、实验目的(1)能够熟练掌握快速离散傅里叶变换(FastFourierTransform,FFT)的原理及应用FFT进行频谱分析的基础方法。(2)对离散傅里叶变换的主要性质及FFT在数字信号处理中的重要作用有进一步的了解。二、基本原理1.离散傅里叶变换(DFT)及其主要性质DFT表示离散信号的离散频谱,DFT的主要性质中有奇偶对称特性`虚实特性等。通过实验可以加深理解。实序列的DFT具有偶对称的实部和奇对称的虚部,这可以证明如下:由定义,可得][mX=10][NkkmNwkx=10)2cos(][NkkmNkx-j10)2sin(][NkkmNkx][mNX=10)(][NkkmNNwkx=knNNkNkNwwkx10][=10][NkkmNwkx=10)2cos(][NkkmNkx-j10)2sin(][NkkmNkx所以:x[k]=k]-[N*x实序列DFT的这个特性,在本实验中可以通过实指数序列及三角序列看出来。对于单一频率的三角序列来说,它的DFT谱线也是单一的,这个物理意义可以从实验中得到验证,在理论上可以推导如下:设:]Xk=sin)2(kN][kRN其DFT为:][mX=102][NkkmNjekx=102)2sin(NkkmNjekN=j21kmNjkNjNkkNjeee22102)(=j21)()1(210)1(2kmNjNkkmNjee从而X(0)=j21)(2102kNjNkkNjee=0X(1)=j21)1(410kNjNke=jN2=-j2NX(N-2)=0……X(N-1)=22)(21102)2(2NjjNeeJNknjNNj以上这串式中]0[X反应了][kx的支流分量,]1[X是][kx的一次谐波,又根据虚实特性]1[]1[*XNX而其他分量均为零。当周期减小时显然sin)32(kNRN[k]的谱只应该在k=3及k=N-3才有分量,实验者可以通过可上述相同的步骤加以理论证明。由于][)2cos(kRkNN及][)2sin(kRkNN相位差2,所以它的DFT只包括实部而没有虚部,以上这些性质可在本实验中得到验证。2.利用DFT对信号进行频谱分析DFT的重要应用之一是对时域连续信号的频谱进行分析,称为傅里叶分析,时域连续信号离散傅里叶分析的基本步骤如图5—1所示。图5—1时域连续信号离散傅里叶分析的处理步骤其中消混叠低通滤波器LPF(预滤波器)的引入,是为了消除或减少时域连续信号转换成序列时可能出现的频谱混叠的影响。实际工作中,时域离散信号][kx的时宽是很长的甚至是无限长的(例如语言或音乐信号)。由于DFT的需要,必须把][kx限制在一定的时间间隔之内,即进行数据截断。数据的截断相当于加窗处理。因此,在计算][kx的DFT之前,用一个时域有限的窗函数][kwN加到][kx上是非常必要的。Xc(t)通过A/D变换器转成取样序列][kx进行加窗处理,即][][][kwkxkvN。加窗对频域的影响,用周期卷积表示。nnsjTnTjXTnjXTeX))2((1))((1)(其中)(jeX或)(TjeX的频谱。为)(txc在实际应用中,消混叠低通滤波器的阻带不可能式无限衰减的,故由)(jXc周期延拓得到的)(jeX由非零混叠,即出现混叠现象。由于进行DFT的需要,必须对序列][kx进行加窗处理,即][][][kwkxkvN,加窗对频域的影响,用周期卷积表示。)(jeV=deweXwjj)(()(21最后是进行DFT应算。加窗后的DFT为V[m]=102][NkmkNjekv01Nm其中假设窗函数长L小于或等于DFT长度N。有限长序列][][][kwkxkvN的DFT相当于][kv傅里叶变换的等间隔取样。V[m]=)(jeVmN2][mV便是Sc(t)的离散频率函数。因为DFT频率间隔为N2,且模拟频率和数字频率间的关系为T,所以离散频率点对应的模拟频率为NTk2显然频率分辨率△f为NTf1利用DFT计算频谱,只给出频谱mNm2或mNTm2的频率分量,即频率的取样值,而不可能得到连续的频谱函数。如果在两个离散的谱线之间有一个特别大的频谱分量,就无法检测出来了。为了在保持原来频谱形状不变的情况下,使谱线加密,即使频域取样点数增加,从而使原来看不到的频谱分量变得可以看到,可以通过在信号数据的末端补加一些零值点,使DFT计算周期内点数增加,但又不改变原有的记录数据的方法来实现。3.快速离散傅里叶变换(FFT)快速离散傅里叶变换是计算离散傅立叶变换的一种快速算法,为了提高应算速度,FFT将DFT的计算逐次分解成较小点数的DFT。按时间抽取(Decimation-In-Time,DIT)FFT算法把输入序列][kx按起k值为偶数或是奇数分解成越来越短的序列。按频域抽取(Decimation-In-Time,DIT)FFT算法是把输出序列][mx按其m值是偶数或是奇数来分解成越来越短的序列。具体推导过程及原理可参见《数字信号处理》教科书。三、实验内容及要求(1)实验前学生应认真学习《数字信号处理》中有关章节的内容,掌握DFT的基本理论和应用FFT计算信号频谱的原理与方法。(2)编写一个调用FFT函数的通用程序,可计算下列三种序列的离散频谱。指数序列:][9.0][1kukxk周期为N的余弦序列:)2cos(][2kNkx,且.10Nk复合函数序列:)33sin(6.0)2sin(9.0][3kNkNkx(3)计算实指数序列][1kx的N点离散频谱][1mX,记录N为不同的2的幂次方时的][1mX值,并与理论值][mX进行分析比较。(4)计算周期为N的余弦序列][2mX的N点FFT,2N点FFT及(N+2)点FFT,记录结果并作分析说明。(5)已知信号x(t)=0.15sin(2)2sin()21tftf()23tf,其中f1=1Hzk,f2=2Hzk,f3=3Hz,取样频率为32Hz。编程实现:①32点FFT,画出其幅度谱。②64点FFT,画出其幅度谱,比较两者间的差异,思考实际频率与离散频谱图中横坐标m的对应关系。四、实验报告要求⑴简述实验原理,画出程序框图,列出实验程序清单,并附上必要的程序说明。⑵记录调运行情况及所遇问题的解决办法。⑶记录实验结果,对结果进行分析。⑷阐述分析信号频谱的意义。思考:利用DFT对连续信号进行傅里叶分析可能造成哪些误差及造成这些误差原因?五、实验用MATLAB函数简介MATLAB中计算序列的离散傅里叶变换和逆变换是采用快速算法,利用fft和ifft函数实现。1.求序列的DFT函数fft[xk]=fft(xn,N)输入参数:为待计算DFT的序列,N为序列的长度。输出参数:为序列的IDFT。2.求IDFT函数ifft),(ifftNXxkn输入参数:xk为待计算IDFT的序列,N为序列xk的长度。输出参数:Xn为序列xk的IDFT。例5.1已知序列x(n)=2sin(0.48pin)+cos(0.52pi*n),试绘制x(n)及它的离散傅里叶变换|X(k)|图。MATLAB实现程序:clearallN=100;n=0:N-1;xn=2*sin(0.48*pi*n)+cos(0.52*pi*n);XK=fft(xn,N);magXK=abs(XK);phaXK=angle(XK);subplot(1,2,1)plot(n,xn)xlabel('n');ylabel('x(n)');title('x(n)N=100')subplot(1,2,2)k=0:length(magXK)-1;k=k*(2/100)stem(k,magXK,'.');xlabel('k');ylabel('|X(k)|');title('X(k)N=100');远行结果如图5-2所示。图5-2序列x(n)及利用FFT求解的相应频谱