1、数字信号处理实验指导书 前 言数字信号处理是是电子信息工程专业的一门专业基础课。本课程主要研究如何对信号进行分析、变换、综合、估计与识别等加工处理的基本理论和方法,数字信号处理实验是验证、巩固和补充课堂讲授的理论知识的必要环节。通过实验,使学生巩固所学基本理论,掌握最基本的数字信号处理的理论和方法,提高综合运用所学知识,提高计算机编程的能力。进一步加强学生独立分析问题、解决问题的能力、综合设计及创新能力的培养,同时注意培养学生实事求是、严肃认真的科学作风和良好的实验习惯,为今后的工作打下良好的基础。数字信号处理实验指导书针对每个实验介绍了MATLAB语言数字信号处理工具箱中的相应函数,举例并附
2、有相应的程序。为配合课堂理论教学,实验内容安排仍从认识性和验证性入手,逐步增加设计性和工程应用性内容,达到训练实验技能和积累工程实际应用经验之目的。数字信号处理实验成绩按百分制核定。预习占20%,实验过程占40%,实验报告占40%。电气电子信息工程系电工电子基础教研室2007.03 实 验 要 求在实验过程中,要求学生做到:(1) 预习实验指导书有关部分,认真做好实验内容的准备工作,就实验可能出现的情况提前作出思考和分析,需要计算的参数提前完成计算工作,并认真写出预习报告。(2) 仔细观察实验过程中图形随参数的变化,记录图形变化的主要情况,作出必要说明和分析。(3) 认真书写实验报告并在规定的
3、时间内把实验报告交给辅导教师。实验报告包括实验目的和要求,实验情况及其分析。对需要编程的实验,写出程序设计说明,给出源程序框图和清单。(4) 遵守机房纪律,服从辅导教师指挥,爱护实验设备。(5) 实验课程不迟到。如有事不能出席,所缺实验一般不补。实验验收分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交书面的实验报告。每个实验都应当在规定的时间内完成并检查通过,过期视为未完成该实验,扣该实验操作成绩。为避免期末集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。目 录第一部分 MATLAB 简介5一、MATLAB简介及其安装使用说明5二、Matla
4、b基本语句11三、Matlab基本数值运算15四、Matlab函数、及其调用方法18第二部分 实验内容22实验一 MATLAB软件的使用22实验二 信号、系统及系统响应23实验三 离散系统的时域分析27实验四 线性卷积与循环卷积的计算33实验五 应用快速离散傅里叶变换对信号进行频谱分析38实验六 利用FFT实现快速卷积44实验七 离散系统的变换域分析49实验八 用双线性变换法设计IIR滤波器54实验九 用窗口法设计FIR滤波器60实验十 用频率采样法设计FIR滤波器65实验十一 IIR和FIR滤波器过滤信号的实现及比较68实验十二 研究性实验71实验1 图像信号的抽取与插值71实验2 语音及音
5、乐信号的采样、滤波72实验3 双音多频(DTMF)信号的合成和识别73实验4 音乐信号处理74第一部分 MATLAB 简介一、MATLAB简介及其安装使用说明1、 MATLAB程序设计语言简介MATLAB,Matrix Laboratory的缩写,是由Mathworks公司开发的一套用于科学工程计算的可视化高性能语言,具有强大的矩阵运算能力。 与大家常用的Fortran和C等高级语言相比,MATLAB的语法规则更简单,更贴近人的思维方式,被称之为“草稿纸式的语言”。截至目前,MATLAB已经发展到7.x版, 适用于所有32位的Windows操作系统, 按NTFS(NT文件系统)格式下完全安装约
6、需 850 MB。MATLAB软件主要由主包、仿真系统和工具箱三大部分组成。2、 MATLAB应用入门(1) MATLAB的安装与卸载 MATLAB软件在用户接口设计上具有较强的亲和力,其安装过程比较典型, 直接运行光盘中的安装向导支撑程序SETUP.exe, 按其提示一步步选择即可。MATLAB自身带有卸载程序,在其安装目录下有uninstall子目录,运行该目录下的uninstall.exe即可; 也可以通过Windows系统的安装卸载程序进行卸载。(2) MATLAB的启动与退出 MATLAB安装完成后,会自动在Windows桌面上生成一个快捷方式, 它是指向安装目录下binwin32m
7、atlab.exe的链接, 双击它即可来到MATLAB集成环境的基本窗口,通常称之为命令窗口。 MATLAB的退出与普通WIN32的程序一样, 值得一提的是它有一个自身专有的快捷键Ctrl+Q。(3) MATLAB界面简介 图 1 MATLAB基本界面命令窗口 图2图3 图4 图5图6 指令历史图71) 菜单栏菜单栏中包括File、Edit、View、Web、Window和Help六个菜单项。这里着重介绍File、help项。File项:数据输入/输出的接口, 包括10个子项, 这里重点介绍其中的5个子项:New:新建文件项。 有四个选择:M File(*.M,文本格式的MATLAB程序文件,
8、可以直接通过文件名的方式在MATLAB环境下解释运行;Figure(图形); Model(仿真模型文件)和GUI(可视化界面文件)。 Open:打开所有MATLAB支持的文件格式,系统将自动识别并采用相应的程序对文件进行处理。例如, 打开一个.m文件, 系统将自动打开M文件编辑器对它进行编辑。 Set Path.:设置工作路径。可以打开路径设置(Set Path)对话框(图2),将用户自己建立的目录加入MATLAB的目录系统中, 以便所编制的文件能够在MATLAB环境中直接调用。图8 路径设置对话框单击Add Folder.按钮可以将你的一个文件夹加入到系统路径中;Add with Subfo
9、lders.允许把一个文件夹包括其所有的子文件夹加入到系统路径中。这两种操作均可以直观地在右侧的路径栏内看到结果。选中一个加入的文件夹,你可以利用Move to Top(移至所有路径的最前面),Move Up(上移一个),Move Down(下移一个),Move to Bottom(移至所有路径的最后面)等四个按钮将改变文件在系统路径中的排列位置以利于对文件的搜索使用, 也可以利用Remove按钮将其删除。对路径操作完毕后,按Save按钮予以保存; Help 项:Matlab Help:打开以html超文本形式存储的的帮助文件主页;Demos:打开matlab演示窗主页;About Matla
10、b:Matlab注册图标、版本、制造商和用户信息;图9 Help选项图10 Help窗口2) 命令行区进行通用操作,数值计算,编程和数据类型,输入输出,绘图,用户界面等命令,例如,命令:help函数名(*.m文件);edit编辑函数、文件对输入命令的解释MATLAB按以下顺序进行: 检查它是否是工作空间中的变量, 是则显示变量内容。 检查它是否是嵌入函数,是则运行之。 检查它是否是子函数。 检查它是否是私有函数。 检查它是否是位于MATLAB搜索路径范围内的函数文件或脚本文件。请注意,如果有两个以上的方案与输入的命令相匹配, MATLAB将只执行第一个匹配。二、Matlab基本语句1、 程序控
11、制语句(1) 循环语句 MATLAB的循环语句包括for循环和while循环两种类型。1) for循环语法格式:for 循环变量 = 起始值:步长:终止值循环体end起始值和终止值为一整形数,步长可以为整数或小数,省略步长时,默认步长为1。执行for循环时,判定循环变量的值是否大于(步长为负时则判定是否小于)终止值,不大于(步长为负时则小于)则执行循环体,执行完毕后加上步长, 大于(步长为负时则小于)终止值后退出循环。例1 给矩阵A、B赋值。MATLAB 语句及运行结果如下:k=5;a=zeros(k, k) %矩阵赋零初值for m=1 : kfor n=1: ka(m,n)=1/(m+n-
12、1); endendfor i=m : -1 : 1b(i)=i; end运行结果: a=1.0000 0.5000 0.3333 0.2500?0.20000.5000 0.3333 0.2500 0.2000 0.16670.3333 0.2500 0.2000 0.1667 0.14290.2500 0.2000 0.1667 0.1429 0.12500.2000 0.1667 0.1429 0.1250 0.1111b= 1 2?3 4 52) while循环语法格式: while 表达式循环体end 其执行方式为:若表达式为真(运算值非0),则执行循环体; 若表达式为假(运算结果为
13、0),则退出循环体,执行end后的语句。例2a=3;while aa=a-1end输出:a=2a=1a=0(2) 条件转移语句条件转移语句有if和switch两种。1) if语句MATLAB中if语句的用法与其他高级语言相类似, 其基本语法格式有以下几种:格式一:if 逻辑表达式执行语句end格式二:if 逻辑表达式执行语句1else执行语句2end格式三:if 逻辑表达式1执行语句1else? if 逻辑表达式2执行语句2end2) switch语句switch语句的用法与其他高级语言相类似,其基本语法格式为:switch表达式(标量或字符串)case 值1语句1case 值2语句2othe
14、rwise语句nend2、 绘图语句常用的MATLAB绘图语句有figure、plot、subplot、stem等, 图形修饰语句有title、axis、text等。(1) figure figure有两种用法,只用一句figure命令,会创建一个新的图形窗口,并返回一个整数型的窗口编号。figure(n)表示将第n号图形窗口作为当前的图形窗口, 并将其显示在所有窗口的最前面; 如果该图形窗口不存在, 则新建一个窗口,并赋以编号n。 (2) plot线型绘图函数。用法为plot(x,y,s)。参数x为横轴变量,y为纵轴变量,s用以控制图形的基本特征如颜色、粗细等,通常可以省略,常用方法如表1所
15、示。表1 (3) Stem绘制离散序列图,常用格式stem(y)和stem(x,y)分别和相应的plot函数的绘图规则相同,只是用stem命令绘制的是离散序列图。(4) subplotsubplot(m,n,i)图形显示时分割窗口命令,把一个图形窗口分为m行,n列,mn个小窗口,并指定第i个小窗口为当前窗口。(5) 绘图修饰命令在绘制图形时,我们通常需要为图形添加各种注记以增加可读性。 在plot语句后使用title(标题)可以在图形上方添加标题, 使用xlabel(标记)或ylabel(标记)为X轴或Y轴添加说明,使用text(X值、Y值、想加的标示)可以在图形中任意位置添加标示。例3 画图
16、基本语句如图1所示。MATLAB 语句及运行结果如下:x=0:0.1*pi:2*pi; %定义x向量figure(1); %创建一个新的图形窗口,编号为1subplot(2,2,1); %将窗口划分为2行,2列,在第1个窗口中作图plot(x,sin(x); %画图title(正弦线); %给图形加标题subplot(2,2,2); %在第2个窗口中作图plot(x,sin(x),r); %画一正弦波,红色xlabel(X); %给x轴加说明ylabel(SIN(X); %给y轴加说明subplot(2,2,3); %在第3个窗口中作图plot(x,sin(x),-); %画一正弦波,破折线s
17、ubplot(2,2,4); %在第4个窗口中作图plot(x,sin(x),r+); %画一正弦波,红色+线text(4,0,注记);图1三、Matlab基本数值运算1、 MATLAB内部特殊变量和常数(1) MATLAB内部有很多变量和常数,用以表达特殊含义。常用的有: 1) 变量ans: 指示当前未定义变量名的答案; 2) 常数eps:表示浮点相对精度,其值是从1.0到下一个最大浮点数之间的差值。该变量值作为一些MATLAB函数计算的相对浮点精度,按IEEE标准,如:,近似为2.2204e-016; 3) 常数Inf:表示无穷大。当输入或计算中有除以0时产生Inf; 4) 虚数单位i,j
18、:表示复数虚部单位,相当于; 5) NaN:表示不定型值,是由0/0运算产生的。 6) 常数pi:表示圆周率,其值为3.1415926535897; (2) MATLAB中可表示的数字的近似范围从1) 有效数字表示的典型例子如下:1234.56789,123456.789E-2,1.23456789e3(format指令可以控制显示格式) 2) 复数形式:3.5+4*j, -2.1-7.4*j(i 也可以) 取绝对值:abs()语法格式:abs(x)。当x为实数时计算x的绝对值;x为复数时得到的是复数的模值;x为字符串时得到各字符的ASCII码。 取相角:angle()语法格式:angle(z
19、)。求复矢量或复矩阵的相角,结果为一个以弧度为单位介于-和+之间的值。 2、 变量(1) 变量命名规则 1) MATLAB中对变量的命名应遵循以下规则:变量名可以由字母、数字和下划线混合组成,但必须以字母开头;2) 字符长度不能大于31;3) 变量命名区分大小写。(2) 局部变量和全局变量 局部变量是指那些每个函数体内自己定义的,不能从其他函数和MATLAB工作空间访问的变量。全局变量是指用关键字“global”声明的变量。全局变量名应尽量大写,并能反映它本身的含义。如果需要在工作空间和几个函数中都能访问一个全局变量,必须在工作空间和这几个函数中都声明该变量是全局的。 3、 矩阵及其运算MAT
20、LAB具有强大的矩阵运算和数据处理功能, 对矩阵的处理必须遵从代数规则。(1) 矩阵生成 1) 一般矩阵的生成对于一般的矩阵MATLAB的生成方法有多种。最简单的方法是从键盘直接输入矩阵元素。直接输入矩阵元素时应注意:各元素之间用空格或逗号隔开,用分号或回车结束矩阵行,用中括号把矩阵所有元素括起来。例1 在工作空间产生一个33矩阵A可用MATLAB语言描述如下:A=1 2 3; 4 5 6; 7 8 9或A=1 2 34 5 67 8 9运行结果:A=1 2 34 5 67 8 9Size(A)得到矩阵的大小,ans =3 32) 特殊矩阵的生成对于特殊的矩阵可直接调用MATLAB的函数生成。
21、用函数zeros生成全0矩阵:格式 B=zeros(m,n)生成mn的全0阵。用函数ones生成全1矩阵:格式 B=ones(m,n)生成mn的全1阵。用函数eye生成单位阵:格式 B=eye(m,n)生成mn矩阵, 其中对角线元素全为1,其他元素为0。(2) 矩阵的运算 矩阵的运算有基本运算和函数运算两种类型。基本运算包括矩阵的加、减、乘、除、乘方、求转置、求逆等,其主要特点是通过MATLAB提供的基本运算符、*、/()、等即可完成。函数运算主要是通过调用MATLAB系统内置的运算函数来求取矩阵的行列式(det(A)),求秩(rank(A)),求逆(inv(A),求特征值和特征向量(V, D
22、eig(A)), 求Jordan标准形(jordan(A))和矩阵分解等。需要用时可以参阅联机帮助和相关参考书。(.*,.,表示逐个元素的乘积和相除;矩阵X/Y 相当于X*inv(Y), XY相当于inv(Y)*X)例2 矩阵的基本运算。 A=1, 2, 3; 4, 5, 6;B =6, 5, 4; 3, 2, 1;C =A+B %计算两个矩阵的和D =B %计算矩阵B的转置E=A*D %做矩阵乘法,必须要满足矩阵乘法的基本要求E应该是2阶方阵F=det(E) %求E的行列式值G=E(-1) %求E的逆 输出结果:C=7 7 77 7 7D=6 35 24 1E=28 1073 28F=54G
23、=0.5185 -0.1852-1.3519 0.5185四、Matlab函数、及其调用方法在MATLAB语言中,M文件有两种形式:脚本和函数。脚本没有输入/输出参数,只是一些函数和命令的组合。它可以在MATLAB环境下直接执行,也可以访问存在于整个工作空间内的数据。由脚本建立的变量在脚本执行完后仍将保留在工作空间中可以继续对其进行操作,直到使用clear命令对其清除为止。函数是MATLAB语言的重要组成部分。MATLAB提供的各种工具箱中的M文件几乎都是以函数的形式给出的。函数接收输入参数,返回输出参数,且只能访问该函数本身工作空间中的变量,从命令窗或其他函数中不能对其工作空间的变量进行访问
24、。1、 函数结构MATLAB语言中提供的函数通常由以下五个部分组成:(1) 函数定义行: 以function开头,函数名(必须与文件名相同)及函数输入输出参数在此定义;(2) H1行:第一注释行,供lookfor和help在线帮助使用;(3) 函数帮助文件;通常包括函数输入输出参数的含义,调用格式说明;(4) 函数体:它包括进行运算和赋值的所有MATLAB程序代码。函数体中可以包括流程控制、输入/输出、计算、赋值、注释以及函数调用和脚本文件调用等。 在函数体中完成对输出参数的计算;(5) 注释。这五个部分中最重要的是函数定义行和函数体。函数定义行是一个MATLAB函数所必需的,其他各部分的内容
25、可以没有, 这种函数称为空函数。例1function sa=circle(r,s)% Circle plot a circle of radii r in the line specified by s% r raddi% s line color% sa area of the circle% circle(r) use blue line to draw a circle of radii r% circle(r,s) use s to draw circle% sa=circle(r) compute the area of the circle and draw it in blue%
26、 sa=circle(r,s) compute the area of the circle and draw it in color sif nargin2 error(to many input );endclf; t=0:pi/100:2*pi;x=r*exp(i*t);if nargout=0plot(x,s);elsesa=pi*r*r;fill(real(x),imag(x),s)endaxis(square); %makes the current axis box square in size.例2function y = imp_fun(n,n0)% IMP_FUN Unit
27、 impulse function.% IMP_FUN(N,N0), where N is a vector of sequential integers,% returns a vector the same length as N with zeros everywhere except % N = N0.m1,n1 = size(n);if (m1 = 1 | n1 = 1)error(The sample vector must be one-dimensional.);endy = zeros(m1,n1);i = find(n = n0);if isempty(i)returnen
28、dy(i(1) = 1; % where n = n0, set output to 12、 函数调用函数调用的过程实际上就是参数传递的过程。例如,在一个脚本文件里调用函数“max”可采用如下方式:n=1:20;a=sin(2*pi*n/20);Y,I=max(a);图1该调用过程把变量“a”传给了函数中的输入参数“x”,然后把函数运算的返回值传给输出参数“Y”和“I”。其中,Y是a序列的最大值,I是最大值Y对应的坐标值。例3构造:yn = n-3:调用函数: n = 0:6;y = imp_fun(n,3);stem(n,y) 例4图2构造:yn = 5n - n-2:调用函数: y=5*i
29、mp_fun(n,0) - imp_fun(n,2);stem(n,y);第二部分 实验内容实验一 MATLAB软件的使用1、 实验目的(1) 掌握MATLAB软件的安装方法;(2) 掌握MATLAB程序设计的基本方法;2、 实验原理与方法参照前面介绍的关于MATLAB基础知识,熟悉、掌握MATLAB程序设计的基本方法。3、 实验内容及要求(1) 熟悉并掌握MATLAB软件的安装方法;(2) 熟悉并掌握MATLAB程序设计的基本方法;(3) 记录(打印)正弦函数的线型图和离散序列图。4、 实验报告要求(1) 简述实验目的。(2) 打印正弦函数的线型图和离散序列图。(3) 总结实验的主要结论。实
30、验二 信号、系统及系统响应1、 实验目的(1) 熟悉连续信号经理想采样前后的频谱变换关系,加深对时域采样定理的理解;(2) 熟悉时域离散系统的时域特性;(3) 利用卷积方法观察分析系统的时域特性;(4) 掌握序列傅里叶变换的计算机实现方法,利用序列的傅里叶变换对连续信号、离散信号及系统响应进行频域分析。2、 实验原理与方法采样是连续信号数字处理的第一个关键环节。对采样过程的研究不仅可以了解采样前后信号时域和频域特性发生的变化以及信号信息不丢失的条件,而且可以加深对傅里叶变换、Z变换和序列傅里叶变换之间关系式的理解。我们知道,对一个连续信号xa(t)进行理想采样的过程可用(2-1)表示。 其中为
31、的理想采样,为周期冲激脉冲,即 的傅里叶变换为 (2-3)式表明为的周期延拓,其延拓周期为采样角频率。其采样前后信号的频谱只有满足采样定理时,才不会发生频率混叠失真。 将(2-2)带入(2-1)式并进行傅里叶变换: 式中就是采样后得到的序列,即的傅里叶变换为 比较(2-5)和(2-4)可知在数字计算机上观察分析各种序列的频域特性, 通常对X(ej)在0, 2上进行M点采样来观察分析。 对长度为N的有限长序列x(n), 有式中一个时域离散线性非移变系统的输入/输出关系为上述卷积运算也可以在频域实现3、 实验内容及要求(1) 认真复习采样理论、 离散信号与系统、 线性卷积、 序列的傅里叶变换及性质
32、等有关内容, 阅读本实验原理与方法。(2) 编制实验用主程序及相应子程序。 信号产生子程序, 用于产生实验中要用到的下列信号序列:a.采样信号序列:对下面连续信号: xa(t)=Ae-at sin(0t)u(t)进行采样, 可得到采样序列 xa(n)=xa(nT)=Ae-anT sin(0nT)u(n), 0n=(ij1)-1, n的长度与补零后x1的长度相等,若x1中补a个零值(a=j-1),则Nia1。实验四 线性卷积与循环卷积的计算1、 实验目的(1) 进一步加深对线性卷积的理解和分析能力;(2) 通过编程,上机调试程序,进一步增强使用计算机解决问题的能力;(3) 掌握线性卷积与循环卷积软件实现的方法,并验证二者之间的关系。2、 实验原理与方法(1) 线性卷积线性时不变系统(Linear Time-Invariant System, or L. T. I系统)输入、输出间的关系为:当系统输入序列为,系统的单位脉冲响应为,输出序列为,则系统输出为:或 上式称为离散卷积或线性卷积。图4.1示出线性时不变系统的输入、输出关系。L. T. Ih(n)