数字信号处理实验一FFT变换及其应用Word文档格式.docx
《数字信号处理实验一FFT变换及其应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字信号处理实验一FFT变换及其应用Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
]之间的频谱值。
幅度谱:
相位谱:
为防止产生混叠现象,采样频率fs应大于2倍信号的最高频率fc,为了满足采样定理,一般在采样之前要设置一个抗混叠低通滤波器。
用FFT对模拟信号进行谱分析的方框图如下所示。
图1.1FFT对模拟信号进行谱分析的方框图
2.应用FFT实现快速卷积涉及的根底知识如下:
一个信号序列x(n)与系统的卷积可表示为下式:
Y(n)=x(n)*h(n)=
当是一个有限长序列,且0
n
N-1时,有:
Y(n)=
此时就可以应用FFT来快速计算有限长度序列的线性卷积。
也就是先将输入信号x〔n〕通过FFT变换为它的频谱采样值X(k),然后再和滤波器的频响采样值H(k)相乘,最后再将乘积通过快速傅里叶变换〔简称IFFT〕复原为时域序列,即得到输出。
如下列图所示。
图1.2FFT实现卷积的过程示意图
.当序列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);
closeall;
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-1
P=8,q=4
图2-2
P=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)对正弦序列进行频谱分析
%定义序列长度
a=0.1;
f=0.0625;
x=exp(-a*n).*sin(2*pi*f*n);
subplot(2,1,1);
stem(x);
title('
衰减正弦序列'
);
subplot(2,1,2);
%绘制幅度谱
x信号的频谱'
)
a)固定参数a=0.1,改变f,分别为、、,结果如下列图:
图2-7
图2-8
图2-9
观察可知,当f=0.4375,0.5625时,时域图像关于Y轴对称,频域完
全相同。
随着f值增大,时域序列周期变小。
频域序列的高频分量逐渐
增多,低频分量逐渐减少,因为所取的频率不符合采样定理,以致发
生严重的频谱混叠和泄漏。
3)对三角序列进行频谱分析
fori=1:
4
x(i)=i;
end
fori=5:
8
x(i)=9-i;
fori=9:
16
x(i)=0;
closeall
stem(abs(fft(x)))%绘制幅度谱
其频谱图如下所示:
图2-10
此编程实现三角序列,中间两个值是相等的,然后我们根据fft函数快
速求出x在各个n值上所对应的傅里叶变换值,得到结果如下:
Y=[18.46403.1605-16.3681i-5.3021-2.2394i-0.3336+0.3570i
0.1333+0.0145i0.7981-0.5599i-0.0955-0.4109i0.3750–
0.0802i0.06460.3750+0.0802i-0.0955+0.4109i0.7981+
0.5599i0.1333-0.0145i-0.3336-0.3570i-5.3021+2.2394i
3.1605+16.3681i]然后分别求出各点处的大小〔实部的平方加虚部的
平方开根号〕,得出来的大小和图像近似相等。
此三角序列的时域表达
式为:
当1≤n≤4时x(n)=n;
当5≤n≤8时x(n)=9-n。
a)反三角序列:
Fori=1:
x(i)=5-i;
end
Fori=5:
x(i)=i-4;
closeall
stem(abs(fft(x,16)))
图2-11
b)半三角序列〔直角三角形序列〕:
代码1如下:
fori=1:
8
x(i)=i-1;
end
stem(abs(fft(x)))
代码2如下:
x(i)=8-i;
图2-13
c)只有一个峰值:
x(i)=i;
x(i)=8-i;
图2-14
〔2〕使用FFT实现卷积运算
:
x1(n)=RN(n),1
N
10;
x2(n)=8sin(0.5*pi*n+4)1
x3〔n〕=0.8*exp〔3*n〕1
使用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;
stem(x,yn1,'
.'
)
stem(x,yn2,'
stem(x,yn3,'
用FFT计算卷积,实验结果如下列图:
图2-15
X1n=[111111111];
x2n=[80-8080-8080];
X1n*x2n=[0
880088008008800880],其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中的图形用户接口功能,设计简单的操作界面,如下图。
界面中包含列表框,滑动块,按钮和静态文本。
其中列表中,包含正弦波、方波和锯齿波;
移动滑动块可以改变图形的周期,且周期数在静态文本中显示;
点击“退出〞按钮那么退出程序。
界面如下列图:
图2-16
a)当列表框中选择‘正弦波’,周期数为4时,产生的时域波形和频谱图如下:
图2-17
b)当列表框中选择‘方波’,周期数为4时,产生的时域波形和频谱图如下:
图2-18
c)当列表框中选择‘三角波’,周期数为4时,产生的时域波形和频谱图如下:
图2-19
d)当列表框中选择‘锯齿波’,周期数为4时,产生的时域波形和频谱图如下:
图2-20
四、实验小结
本次实验按照实验指导书,根本是按照原有的代码和步骤根底上来做的,实验中也遇到了一系列的问题:
一,前后参数不一致,即在改变参数的时候,由于粗心使得前后参数形式不一致,而导致运行出错;
二,在matlab中新建文件,假设以中文命名,然后保存后运行,那么系统会因为识别不了所命名的中文而导致运行会出错;
三,只会用datacursor来将坐标点贴标签,仍然不会用编写代码的方式将各坐标点的数值贴标签。
当然,在试验中我也学到了一些知识:
一,使用FFT实现卷积运算时,三个序列互相形成的三个卷积可以整合一下,显示在一个图像中,这样节省了时间也提高了效率。
二,在三角序列中,可通过函数的改变来实现正三角、倒三角以及直角三角等;
对于快速傅里叶变换,知道如何用MATLAB解决卷积问题,通过此次实验发现,用FFT函数变化,要比手工计算要方便的多,而且既准确又省时间;
三,在编写matlab代码的时候,放在新建文件中编写,更方便去改变相应的参数。