当前位置:文档之家› 数字信号处理 实验一 FFT变换及其应用

数字信号处理 实验一 FFT变换及其应用

实验一 FFT变换及其应用一、实验目的和要求1.在理论课学习的基础上,通过本次实验,加深对DFT原理的理解,懂得频域DFT与时域卷积的关系,进一步加深对DFT基本性质的理解;2.研究FFT算法的主要途径和编程思路,掌握FFT算法及其程序的编写过程,掌握最基本的时域基-2FFT算法原理及程序框图;3.熟悉应用FFT实现两个序列的线性卷积的方法,利用FFT进行卷积,通过实验比较出快速卷积优越性,掌握循环卷积和线性卷积两者之间的关系;4.熟悉应用FFT对典型信号进行频谱分析的方法,初步了解用周期图法作随机信号谱分析的方法,了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT;5.掌握使用MATLAB等基本开发工具实现对FFT编程。

二、实验设备和分组1.每人一台PC机;2.Windows 2000/XP以上版本的操作环境;3.MatLab 6.5及以上版本的开发软件。

三、实验内容(一)实验准备1.用FFT进行谱分析涉及的基础知识如下:信号的谱分析就是计算信号的傅里叶变换。

若信号是模拟信号,用FFT进行谱分析时,首先必须对信号进行采样,使之变成离散信号,然后用FFT来对连续信号进行谱分析。

若信号本身是有限长的序列,计算序列的频谱就是直接对序列进行FFT运算求得X(k),X(k)就代表了序列在[0,2]之间的频谱值。

幅度谱:相位谱:为避免产生混叠现象,采样频率fs 应大于2倍信号的最高频率fc ,为了满足采样定理,一般在采样之前要设置一个抗混叠低通滤波器。

用FFT 对模拟信号进行谱分析的方框图如下所示。

图1.1 FFT 对模拟信号进行谱分析的方框图2. 应用FFT 实现快速卷积涉及的基础知识如下: 一个信号序列x(n)与系统的卷积可表示为下式:Y(n)=x(n)*h(n)=∑+∞-∞=-m m n h m x )()(当是一个有限长序列,且0≤n ≤N-1时,有:Y(n)=∑-=-1)()(N n m n x m h此时就可以应用FFT 来快速计算有限长度序列的线性卷积。

也就是先将输入信号x (n )通过FFT 变换为它的频谱采样值X(k),然后再和滤波器的频响采样值H(k)相乘,最后再将乘积通过快速傅里叶变换(简称IFFT )还原为时域序列,即得到输出。

如下图所示。

图1.2 FFT 实现卷积的过程示意图2.1.当序列x(n)和h(n)的长度差不多时设x(n)的长度为N1,h(n)的长度为N2,则用FFT 完成卷积的具体步骤如下: ①为使两有限长序列的线性卷积可用其循环卷积代替而不发生混叠,必须选择循环卷积长度N ≥N1+N2-1②用补零方法使x(n)和h(n)变成列长为N 的序列。

③用FFT 计算x(n)和h(n)的N 点离散傅里叶变换 ④完成X(k)和H(k)的乘积Y(k)。

⑤用FFT计算的离散傅里叶反变换得 y(n)2.2 当x(n)长度很长时可采用分段卷积的方法即重叠相加法和重叠保留法。

(二)实验项目(1)用FFT进行频谱分析1)对高斯序列进行频谱分析代码如下:n=0:15;p=8;q=2;x =exp(-1*(n-p).^2/q);close all;subplot(3,1,1);stem(fft(x)) ; %利用fft 函数实现傅里叶变换subplot(3,1,2);stem(abs(fft(x))); %绘制幅度谱subplot(3,1,3);stem(angle(fft(x))) %绘制相位谱代码是为了得出此高斯序列的快速傅里叶变换,得到DFT的频谱特征图、幅频特征图和相频特征图。

a)固定信号参数P=8,改变q的值依次为2、4、8,结果如下图:P=8,q=2图2-1P=8,q=4图2-2P=8,q=8图2-3结果分析:从图中可以看出,当固定p的值,改变q,可观察到:随着q的增加,幅频图中趋近与0和等于0的个数增多。

可见q的增大使DFT幅频图中幅度平均值减小,且p是序列的对称轴,时域轴都关于n=8对称。

当q=2、4、8时,频域变化越来越快,中间水平部分越来越大,混叠减弱。

b)固定信号参数q=8,改变p的值依次为8、13、14,结果如下图:q=8,P=8图2-4 q=8,p=13图2-5 p=14,q=8图2-6结果分析:当固定q的值,改变p,可观察到:随着p的增大,图形越来越偏离真实值,当p=14时泄漏现象较明显,频域波形随p的增大频率分量会增多,易产生混叠。

2)对正弦序列进行频谱分析代码如下:n=0:15; %定义序列长度a=0.1;f=0.0625;x=exp(-a*n).*sin(2*pi*f*n);close all;subplot(2,1,1);stem(x);title('衰减正弦序列');subplot(2,1,2);stem(abs(fft(x))); %绘制幅度谱title('x 信号的频谱')a)固定参数a=0.1,改变f,分别为0.5625、0.4375、0.0625,结果如下图:f=0.5625图2-7f=0.4375图2-8f=0.0625图2-9结果分析:观察可知,当f=0.4375,0.5625时,时域图像关于Y轴对称,频域完全相同。

随着f值增大,时域序列周期变小。

频域序列的高频分量逐渐增多,低频分量逐渐减少,因为所取的频率不符合采样定理,以致发生严重的频谱混叠和泄漏。

3)对三角序列进行频谱分析代码如下:for i=1:4x(i)=i;endfor i=5:8x(i)=9-i;endfor i=9:16x(i)=0;endclose allsubplot(2,1,1);stem(x);subplot(2,1,2);stem(abs(fft(x))) %绘制幅度谱其频谱图如下所示:图2-10结果分析:此编程实现三角序列,中间两个值是相等的,然后我们根据fft函数快速求出x在各个n值上所对应的傅里叶变换值,得到结果如下:Y=[18.4640 3.1605 -16.3681i -5.3021 - 2.2394i -0.3336 + 0.3570i0.1333 + 0.0145i 0.7981 - 0.5599i -0.0955 - 0.4109i 0.3750 –0.0802i 0.0646 0.3750 + 0.0802i -0.0955 + 0.4109i 0.7981 +0.5599i 0.1333 - 0.0145i -0.3336 - 0.3570i -5.3021 + 2.2394i3.1605 +16.3681i ]然后分别求出各点处的大小(实部的平方加虚部的平方开根号),得出来的大小和图像近似相等。

此三角序列的时域表达式为:当1≤n≤4时x(n)=n;当5≤n≤8时x(n)=9-n。

a)反三角序列:代码如下:For i=1:4x(i)=5-i;endFor i=5:8x(i)=i-4;endclose allsubplot(2,1,1);stem(x);subplot(2,1,2);stem(abs(fft(x,16)))图2-11b)半三角序列(直角三角形序列):代码1如下:for i=1 :8x(i)=i-1;endclose allsubplot(2,1,1);stem(x);subplot(2,1,2);stem(abs(fft(x)))图2-2代码2如下:for i=1 :8x(i)=8-i;endclose allsubplot(2,1,1);stem(x);subplot(2,1,2);stem(abs(fft(x)))图2-13 c)只有一个峰值:代码如下:for i=1:4x(i)=i;endfor i=5:8x(i)=8-i;endclose allsubplot(2,1,1);stem(x);subplot(2,1,2);stem(abs(fft(x,16)))图2-14(2)使用FFT实现卷积运算已知:x1(n)=RN(n), 1≤N≤10; x2(n)=8sin(0.5*pi*n+4) 1≤N≤10; x3(n)=0.8*exp(3*n)1≤N≤10;使用FFT实现以上3种卷积。

代码如下:n=[1:1:10];N1=length(n);xn1=ones(1,N1);xn2=8*sin(0.5*pi*n+4);xn3=0.8*exp(3*n);N=N1+N1-1;X1k=fft(xn1,N);X2k=fft(xn2,N);X3k=fft(xn3,N);Yk1=X1k.*X2k;Yk2=X1k.*X3k;Yk3=X2k.*X3k;yn1=ifft(Yk1,N);yn2=ifft(Yk2,N);yn3=ifft(Yk3,N);x=0:N-1;subplot(3,1,1);stem(x,yn1,'.')subplot(3,1,2);stem(x,yn2,'.')subplot(3,1,3);stem(x,yn3,'.')用FFT计算卷积,实验结果如下图:图2-15结果分析:X1n=[1 1 1 1 1 1 1 1 1 ]; x2n=[8 0 -8 0 8 0 -8 0 8 0];X1n*x2n=[08 8 0 0 8 8 0 0 8 0 0 8 8 0 0 8 8 0],其IFFT变换为8*(exp(j*2*w)+exp(j*3*w)+exp(j*6*w)+exp(j*7*w)+exp(j*10*w)+exp(j*13*w)+exp(j*14*w)+exp(j*17*w)+exp(j*18*w))=8*(1+exp(j*w))*(exp(j*2*w)+exp(j*6*w)+exp(j*13*w)+exp(j*17*w))+8*exp(j*10*w),Matlab运行的结果与手工计算的结果完全一致,由此可知此代码是正确的。

(3)一个综合性实例1)创建简易界面使用MATLAB中的图形用户接口功能,设计简单的操作界面,如图1.6所示。

界面中包含列表框,滑动块,按钮和静态文本。

其中列表中,包含正弦波、方波和锯齿波;移动滑动块可以改变图形的周期,且周期数在静态文本中显示;点击“退出”按钮则退出程序。

界面如下图:图2-16a)当列表框中选择‘正弦波’,周期数为4时,产生的时域波形和频谱图如下:图2-17c)当列表框中选择‘三角波’,周期数为4时,产生的时域波形和频谱图如下:图2-19图2-20四、实验小结本次实验按照实验指导书,基本是按照原有的代码和步骤基础上来做的,实验中也遇到了一系列的问题:一,前后参数不一致,即在改变参数的时候,由于粗心使得前后参数形式不一致,而导致运行出错;二,在matlab中新建文件,若以中文命名,然后保存后运行,则系统会因为识别不了所命名的中文而导致运行会出错;三,只会用data cursor来将坐标点贴标签,仍然不会用编写代码的方式将各坐标点的数值贴标签。

相关主题