数字信号处理实验指导书2016

  • 格式:doc
  • 大小:387.00 KB
  • 文档页数:29

《数字信号处理》实验指导书王宏志吕洪武张李梅孙慧然计算机科学与工程学院2016年3月目录网络资源-基于WEB的数字信号处理实验教学系统 .... - 1 - 实验一熟悉MATLAB语言环境 .................................. - 2 - 实验二离散系统分析..................................................... - 7 - 实验三用FFT进行信号的频谱分析............................ - 9 - 实验四用窗函数设计FIR数字滤波器 ......................- 12 - 实验五设计IIR数字滤波器 .......................................- 13 - 实验六随机功率谱估计及MATLAB实现................- 18 - 附录:MATLAB简介 ...................................................- 19 -网络资源基于WEB的数字信号处理实验教学系统/单击”软件下载”即可下载实验系统,如下图所示:软件安装界面如下所示:软件运行界面如下所示:实验一熟悉MATLAB语言环境一、实验目的1.熟悉Matlab的基本使用方法,重点掌握常用于数字信号处理的相关指令。

2.利用Matlab实现序列的显示,运算等,加深对信号处理原理课程所学内容的理解。

二、实验内容及步骤1.双击Matlab 图标,进入主窗口,如图1所示。

其中右侧的是命令窗口(Command Window)。

Current Directory显示的是当前的目录,如果要在命令窗口中直接调用一个M文件,则必须保证其在这个目录下。

不同的机器上,Current Directory可能不同。

图1 进入Matlab时的画面2.下面的操作都在命令窗口(Command Window)中进行。

1)键入help subplot 并回车,将会看到命令subplot的使用方法的帮助。

以后遇到不会的命令可以用键入“help <某命令>”的方式来查看其使用方法。

subplot的用法:subplot(m,n,p)是将一个窗口分成m*n个小窗口,p是小窗口的编号,方向是从左至右。

2)键入help stem 并回车,将会看到命令stem的使用方法的帮助。

stem 用来画离散序列的柄状图。

3. 下面我们新建立一个M文件。

首先点击图1所示的主菜单File下的“新建”图标,将弹出图2 所示的窗口。

接着在这个弹出的窗口点击“保存”图标,建立一个文件impseq.m,将其保存在Current Directory下(当前的目录,见图1)。

图2 新建一个文件impseq.m4.我们在这个impseq.m文件中输入如下语句并保存,注意以%开头来写注释。

function[x,n]=impseq(np,ns,nf)% 生成x(n)=delta(n-np);ns≤n≤nf,即单位冲激序列δ(n)% np代表脉冲的位置, ns为序列起始位置,nf为序列终止位置。

% 调用方式[x,n]=impseq(np,ns,nf)if ns>np|ns>nf|np>nferror('输入位置参数不满足ns=<n<=nf')else n=[ns:nf];x=[(n-np)==0];%if判断语句到这里结束%上面的这条语句是关键语句,作用是如果满足条件(n-np)==0,则x=1。

%在n=ns:nf的一串值中,只有一个值会满足这个逻辑式,因而只在这个n=np%处,x为1,其余的n值处,x均为0.这样就构成了延迟np的单位冲激序列end5.下面我们再回到图1所示的窗口1)打算显示一个序列x(n)=1.5*δ(n+1)-δ(n-3),下面的操作都在命令窗口(Command Window)中进行。

注意:如果一个语句后面有分号,就不显示中间结果。

n1=[-4:5]; x1=1.5*impseq(-1,-4,5)-impseq(3,-4,5);% 列出x1序列subplot(2,2,1); stem(n1,x1,'.'); stem(n1,x1,'.');title('x(n) 的序列图')ylabel('x1(n)'); axis([-5,5,-2,3]);text(5.5,-2,'n');显示的结果如图3所示。

图3 序列x(n)=1.5*δ(n+1)-δ(n-3)2)打算显示另外一个序列x(n)=n[u(n)-u(n-8)]-10exp(-0.3(n-10))*[u (n-10)—u(n-16)],0≤n≤20新建一个文件stepseq.m,用于生成延迟的单位阶跃序列,其输入参数为序列起始位置ns,序列终止位置nf,及阶跃位置np.将刚才编辑的impseq.m另存为stepseq.m,并改动两条语句:function[x,n]=stepseq(np,ns,nf)x=[(n-np)>=0];存盘。

下面的操作都在命令窗口(Command Window)中进行。

n2=[0:20];x21 = n2.*(stepseq(0,0,20)-stepseq(8,0,20));% 列出x21序列x22 = 10*exp(-0.3*(n2-10)).*(stepseq(10,0,20)-stepseq(16,0,20));% 列出x22序列x2 = x21-x22; % x2序列是x21和x22之和subplot(2,2,2);stem(n2,x2,'.'); title('x(n) 的序列图')ylabel('x2(n)');参见附录Matlab简介实验二 离散系统分析一、实验目的:1.熟悉和掌握差分方程的求解方法。

2.熟悉和掌握离散付立叶变换和快速付立叶的算法和实现。

3.熟悉和掌握卷积运算。

二、实验内容:在实验二中,主要有差分方程的求解,DFT 及FFT 的实现,信号卷积。

差分方程可表示为:∑∑==-+--=N k Mr r n x r b k n y k a n y 00)()()()()(在设计中用到的方程是:)3(6)2(5)1()()2(3)1(2)(---+-+=-+--n u n u n u n u n y n y n y初始条件是:1)2(,1)1(,0)2(,0)1(=--=-=-=-y y x x在实验过程中可以改变系数,在这里只是为了简单,同学们可以在程序中修改一些参数来观察输出的变化。

DFT 的实现更简单,在MATLAB 语言中有专门的函数,在这里我们选择的输入信号是最简单的余弦函数:)6cos()(πn n x =,至于序列的长度的选择,同学们可以在实验中自己选择,建议不要选择太长的序列长度,以免在'处理过程中影响速度。

建议选择12—64之间。

'FFT 是DFT 的快速算法,它的执行速度远远快于DFT ,所以可以选择较大的序列长度。

信号卷积为∑∞-∞=-=*=m m n h m x n h n x n y )()()()()(,在MATLAB 中,提供了卷积函数conv ,调用十分方便。

在实验中选定的两个信号为:系统单位冲击响应:)3()2(5.2)1(5.2)()(-+-+-+=n n n n n h b δδδδ输入信号:500)sin()(0≤≤Ω=-n nT Ae n x anT a系统的序列长度可以选择的范围是50到100,信号的序列长度选择范围是20到50,采样频率一般选择在1000到3000Hz ,至于参数选定,同学们可以自己来决定,实验中用到是π250,128.444==a A当然在以上设计中信号的选择可以是随意的,并不是固定的。

三、实验报告要求:1.选择适当数据完成上述实验。

2.给出实验结果并进行分析。

四、参考程序:参见Untitled.m 文件。

实验三 用FFT 进行信号的频谱分析一、实验目的:1.在理论学习的基础上,通过实验,加深对快速傅立叶变换的理解,熟悉FFT 算法;2.熟悉应用FFT 对典型信号进行频谱分析的方法;3.了解应用FFT 进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT 。

二、实验内容:在实验中,我们分析三个序列的频谱,分别是高斯序列,衰减正弦序列,还有一般序列。

高斯序列表达式如下:⎪⎩⎪⎨⎧≤≤=--n n en x q p n a 其它,0150,)(2)( 其中,p ,q 可以在实验中自己选定,一般选择规则如下,p 选择范围6-10,q 为2-8,序列长度选择为16-32,因为太长的话,处理速度会相对比较慢。

衰减正弦序列表示如下:⎩⎨⎧≤≤=-n n fn e n x an b 其它,0150,)2sin()(π 其中,a 可以选定的范围为0-1之间,序列长度选择范围为16-32,采样选择为1000-2000之间。

实验中一般序列采用的是:)20cos()16cos()8cos()(nt nt nt n x πππ++= 其中ft 1=,f 可选的范围为1000-2000,序列长度为16-32。

三、实验报告要求:1.选择适当数据完成上述实验。

2.给出实验结果并进行分析。

四、参考程序:参见Untitled.m 文件。

1)编写程序,实现基二DIT(时域抽取) FFT 。

新建一个文件myditfft.m,输入如下语句:function y=myditfft(x)%% 用MATLAB语言编写的基2 DIT FFT子程序%% y=myditfft(x)%------------------------------------------------------------% 本程序对输入序列 x 实现DIT-FFT基2算法,% 点数取大于等于x长度的2的幂次% x为给定时间序列% y为x的离散傅立叶变换%m=nextpow2(x);N=2^m; % 求x的长度对应的2的最低幂次m if length(x)<Nx=[x,zeros(1,N-length(x))];% 若x的长度不是2的幂,补零到2的整数幂endnxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1;% 求1:2^m数列的倒序y=x(nxd); % 将x倒序排列作为y的初始值for mm=1:m% 将DFT作m次基2分解,从左到右,对每次分解作DFT运算Nmr=2^mm;u=1; % 旋转因子u初始化为WN^0=1WN=exp(-i*2*pi/Nmr); % 本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)for j=1:Nmr/2 % 本次跨越间隔内的各次蝶形运算 for k=j:Nmr:N % 本次蝶形运算的跨越间隔为Nmr=2^mmkp=k+Nmr/2; % 确定蝶形运算的对应单元下标t=y(kp)*u; % 蝶形运算的乘积项y(kp)=y(k)-t; % 蝶形运算y(k)=y(k)+t; % 蝶形运算endu=u*WN; % 修改旋转因子,多乘一个基本DFT 因子WNendend[对这个程序的说明](1)y=nextpow2(x):如果x是一个数,用来求最靠近x并大于x 的二的幂次。