数字信号处理FFT变换及其应用.docx
《数字信号处理FFT变换及其应用.docx》由会员分享,可在线阅读,更多相关《数字信号处理FFT变换及其应用.docx(14页珍藏版)》请在冰点文库上搜索。
数字信号处理FFT变换及其应用
实验一FFT变换及其应用
一、实验目的和要求
1.在理论课学习的基础上,通过本次实验,加深对DFT原理的理解,懂得频域DFT与时域卷积的关系,进一步加深对DFT基本性质的理解;
2.研究FFT算法的主要途径和编程思路,掌握FFT算法及其程序的编写过程,掌握最基本的时域基-2FFT算法原理及程序框图;
3.熟悉应用FFT实现两个序列的线性卷积的方法,利用FFT进行卷积,通过实验比较出快速卷积优越性,掌握循环卷积和线性两者之间的关系;
4.熟悉应用FFT对典型信号进行频谱分析的方法,初行了解用周期图法作随机信号谱分析的方法,了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT;
5.掌握使用MATLAB等基本开发工具实现对FFT编程。
二、实验设备和分组
1.每人一台PC机;
2.Windows2000/XP以上版本的操作环境;
3.MatLab6.5及以上版本的开发软件。
三、实验内容
(一)实验准备
在开始实验之前,首先要对FFT的变换及其应用做一些概念上的了解,并针对可能在实验中出现的问题作出合理的假设,并提出应对的方案。
另一方面,还要对DFT做一定的了解,方便实验的顺利进行。
因为实验的工具是MATLAB,所以在本次实验之前要对MATLAB做一些必要的预习,不至于在实验的过程中手忙脚乱。
最后,要着重做好实验的预习工作,将合理的思路及方案提前你定好,在实验的过程中可以进行差错和修改。
(二)实验项目
(一)用FFT进行谱分析
1高斯序列
代码:
n=0:
15;
p=8;
q=2;
x=exp(-1*(n-p).^2/q);
closeall;
subplot(3,1,1);
stem(fft(x));
subplot(3,1,2);
stem(abs(fft(x)));
subplot(3,1,3);
stem(angle(fft(x)));
运行结果如图1.1:
图1.1高斯序列频谱图
(1)
q=4时,运行结果如图1.2:
图1.2高斯序列频谱图
(2)
q=8时,运行结果如图1.3:
图1.3高斯序列频谱图(3)
q决定高频,P决定相位,p变大,高频衰减;q变大,相位改变。
2正弦序列
代码:
n=0:
15;
a=0.1;
f=0.0625;
x=exp(-a*n).*sin(2*pi*f*n);
closeall;
subplot(2,1,1);
stem(x);
title('衰减正弦序列');
subplot(2,1,2);
stem(abs(fft(x)));
title('x信号的频谱')
原代码运行结果如图1.4:
图1.4正弦序列频谱图
(1)
f=0.4375时,运行结果如图1.5:
图1.5正弦序列频谱图
(2)
f=0.5625时,运行结果如图1.6:
图1.6正弦序列频谱图(3)
F控制正弦波的频率,f变大,波峰右移。
3三角序列
代码:
fori=1:
4
x(i)=i;
end
fori=5:
8
x(i)=9-i;
end
closeall
subplot(2,1,1);
stem(x);
subplot(2,1,2);
stem(abs(fft(x)))
运行结果如图1.7:
图1.7三角序列频谱图
(二)使用FFT实现卷积
代码:
n=1:
10;
x1=n./n;
x2=8*sin(0.5*pi.*n+4);
x3=0.8*exp(3.*n);
X1k=fft(x1,20);
X2k=fft(x2,20);
X3k=fft(x3,20);
y1=X1k.*X2k;
y2=X1k.*X3k;
y3=X2k.*X3k;
Y1k=ifft(y1,20);
Y2k=ifft(y2,20);
Y3k=ifft(y3,20);
subplot(5,3,1);
stem(x1);
title('x1(n)');
subplot(5,3,2);
stem(x2);
title('x2(n)');
subplot(5,3,3);
stem(x3);
title('x3(n)');
subplot(5,3,4);
stem(X1k);
title('X1(k)');
subplot(5,3,5);
stem(X2k);
title('X2(k)');
subplot(5,3,6);
stem(X3k);
title('X3(k)');
subplot(5,3,7);
stem(y1);
title('y1(k)');
subplot(5,3,8);
stem(y2);
title('y2(k)');
subplot(5,3,9);
stem(y3);
title('y3(k)');
subplot(5,3,10);
stem(Y1k);
title('Y1(n)');
subplot(5,3,11);
stem(Y2k);
title('Y2(n)');
subplot(5,3,12);
stem(Y3k);
title('Y3(n)');
a1=conv(x1,x2);
a2=conv(x1,x3);
a3=conv(x2,x3);
subplot(5,3,13);
stem(a1);
title('a1(n)');
subplot(5,3,14);
stem(a2);
title('a2(n)');
subplot(5,3,15);
stem(a3);
title('a3(n)');
运行结果如图1.8:
图1.8FFT实现卷积运算
(三)综合实验
代码如下:
functionfig=DFTMain()
loadDFTMain
ho=figure('Color',[0.80.80.8],...
'Colormap',mat0,...
'HandleVisibility',off,...
'Name','DFTGUI',...
'NumberTitle','off',...
'PointerShapeCData',matl,...
'Position',[2898342112],...
'Resize','off',...
'Tag','Fig1');
h1=uicontrol('Parent',h0,...
'Units','points',...
'Callback','eval("set_sig");',...
'ListboxTop',0,...
'Position',[17.252167.515.75],...
'String',mat2,...
'Style','popupmeunu',...
'Tag','Pop_name',...
'Value',1);
h1=uicontrol('Parent',h0,...
'Units','points',...
'BackgroundColor',[0.7529411764705880.752941176470588
0.752941176470588],...
'ListboxTop',0,...
'Position',[101.2536.7554.7512],...
'String','周期数',...
'Style','text',...
'Tag','StaticText1');
h1=uicontrol('Parent',h0,...
'Units','points',...
'BackgroundColor',[0.7529411764705880.752941176470588
0.752941176470588],...
'FontSize',14,...
'ListboxTop',0,...
'Position',[14.255423116.5]...
'String','离散傅里叶变换',...
'Style','text',...
'Tag','StaticText2');
h1=uicontrol('Parent',h0,...
'Units','points',...
'Callback','exit;',...
'ListboxTop',0,...
'Position',[192.7524.7555.512],...
'String','退出',...
'Tag','Pushbutton1');...
h1=uicontrol('Parent',h0,...
'Units','points',...
'BackgroundColor',[0.7529411764705880.752941176470588
0.752941176470588],...
'Callback','eval("set_sig");',...
'ListboxTop',0,...
'Max',20,...
'Min',1,...
'Position',[93.7515.7569.7512],...
'SliderStep',[0.051],...
'Style','slider',...
'Tag','Slider_cycle',...
'Value',2.9);
h1=uicontrol('Parent',h0,...
'Units','points',...
'BackgroundColor',[111],...
'ListboxTop',0,...
'Position',[169.513.51815],...
'String','2',...
'Style','text',...
'Tag','Static_cycle');
ifnargout>0,fig=h0;end
functionset_sig
names_hndl=findobj(gcbf,'Tag','Pop_name');
cyc_hndl=findobj(gcbf,'Tag','Slider_cycle');
static_hndl=findobj(gcbf,'Tag','Static_cycle');
cycles=floor(get(cyc_hndl,'Value'));
set(static_hndl,'String',num2str(cycles));
if(isempty(cycles)|(cycles<=0))
errordlg('请重新输入合法的周期数N>0');
return;
end;
N1=16;
N=N1*cycles;
time=linspace(0,1,N+1);
names=get(names_hndl,'String');
val=get(names_hndl,'Value');
sig_type=names{val};
switch(sig_type)
case('正弦波'),
sig=sin(2*pi*cycles*time);
case('方波'),
sig=square(2*pi*cycles*time);
case('三角波'),
sig=sawtooh(2*pi*cycles*time,0.5);
case('锯齿波'),
sig=sawtooh(2*pi*cycles*time);
end;
sig(end)=[];
show_plots(sig);
functionshow_plot(sig)
figure
(2);
U=length(sig);
L=5*U;
time_ind=linspace(0,U-1,U);
time_index_1=linspace(0,U-U/U,U);
time_index_2=linspace(0,U-U/L,L);
F=fft(sig);
F1=fft(sig,L);
subplot(2,1,1);stem(time_ind,sig);
subplot(2,1,2);stem(time_index_1,abs(F));
holdon;
plot(time_index_2,abs(F1),'r');
holdoff;
zoomon;
运行结果如图1.9~1.13:
图1.9综合性列子的界面图
图1.10三角波的效果图
图1.11方波的效果图
图1.12正弦波的效果图
四、实验小结
本次实验相对较为简单,可以说只是小试牛刀,一切才刚刚开始,更多的知识和实验心得还要在不断地实践中汲取。
实验中的结论和老师在课堂上讲的知识不谋而合,客观真实的将知识呈现在我们的面前,有助于提高我们对这门课的兴趣。