数字信号处理实验指导书武汉理工大学教材中心2012年7月1实验一时域离散信号的产生一、实验目的1、了解常用时域离散信号及其特点;2、掌握MATLAB程序的编程方法;3、熟悉MATLAB函数的调用方法。二、实验原理在时间轴上的离散点取值的信号,称为离散时间信号。离散时间信号只在某些离散的瞬时给出函数值,而在其他时刻无定义。它是时间上不连续按一定先后次序排列的一组数的集合,称为时间序列,用x(n)表示,n取整数代表时间的离散时刻。在MATLAB中用向量来表示一个有限长度的序列。常用离散信号:1、单位抽样序列10()(00nnn0001n=n或n-n)=0nn2、单位阶跃序列0110()(-)000nnununnnn00n或n3、实指数序列()nxna4、复指数序列()()jtxne5、正(余)弦序列0()sin()mxnUn6、随机序列在利用计算机进行系统的研究时,经常需要产生随机信号,MATLAB提供一个工具函数rand来产生随机信号。7、周期序列()()xnxnN2三、实验用函数1、stem功能:绘制二维图形。调用格式:stem(n,x);n为横轴,x为纵轴的线性图形。2、length功能:计算某一变量的长度或采样点数。调用格式:N=length(t);计算时间向量t的个数并赋给变量N。3、axis功能:限定图形坐标的范围。调用格式:axis([x1,x2,y1,y2]);横坐标从x1—x2,纵坐标从y1—y2。4、zeros功能:产生一个全0序列。调用格式:x=zeros(1,n);产生n个0的序列。5、ones功能:产生一个全1序列。调用格式:y=ones(1,n);产生n个1的序列。四、参考实例例1.1用Matlab产生单位抽样序列。%先建立函数impseq(n1,n2,n0)function[x,n]=impseq(n1,n2,n0)n=[n1:n2];x=[(n-n0)==0];%编写主程序调用该函数[x,n]=impseq(-2,8,2);3stem(n,x)程序运行结果如图1-1所示:图1-1单位抽样序列例1.2实数指数序列(运算符“.^”)Matlab程序如下:n=[0:10];x=0.9.^n;stem(n,x)程序运行结果如图1-2所示图1-2实数指数序列4例1.3复数指数序列((0.10.3)()(1010)jnxnen)Matlab程序如下:n=[-10:10];alpha=-0.1+0.3*j;x=exp(alpha*n);real_x=real(x);image_x=imag(x);mag_x=abs(x);phase_x=angle(x);subplot(2,2,1);stem(n,real_x)subplot(2,2,2);stem(n,image_x)subplot(2,2,3);stem(n,mag_x)subplot(2,2,4);stem(n,phase_x)程序运行结果如图1-3所示图1-3复数指数序列例1.4正、余弦序列(0()sin()mxnUn)Matlab程序如下:n=[0:10];x=3*cos(0.1*pi*n+pi/3);stem(n,x)程序运行结果如图1-4所示5图1-4正、余弦序列例1.5随机序列rand(1,N)产生其元素在[0,1]之间均匀分布长度为N的随机序列randn(1,N)产生均值为0,方差为1,长度为N的高斯随机序列例1.6周期序列如何生成周期序列1、将一个周期复制p次;2、借助矩阵运算、matlab下标能力。先生成一个包含p列x(n)值的矩阵,然后用结构(:)来把p列串接成一个长周期序列。因为这个结构只能用于列向,最后还需要做矩阵转置获得所需序列。Matlab程序如下:x=[1,2,3];%一个x(n)xn=x'*ones(1,3)%生成p列x(n)xn=xn(:)'%将p列串接成长列序列并转置stem(xn)程序运行的结果如图1-5所示6图1-5周期序列五、实验任务1、调试部分例题程序,掌握Matlab基本操作方法。2、编写程序,完成下列函数波形:1)利用zeros函数生成单位抽样序列;2)利用zeros函数和ones函数生成单位阶跃序列;六、实验报告1、简述实验目的、原理。2、写出上机调试通过的实验任务的程序并描述其图形曲线。7实验二离散序列的基本运算一、实验目的1、加强MATLAB运用。2、了解离散时间序列在时域中的基本运算。3、熟悉相关函数的使用方法,掌握离散序列运算程序的编写方法。二、实验原理离散序列的时域运算包括信号的相加、相乘,信号的时域变换包括信号的移位、反折、倒相及尺度变换等。在MATLAB中,序列的相加和相乘运算是两个向量之间的运算,因此参加运算的两个序列必须具有相同的长度,否则不能直接进行运算,需要进行相应的处理后再进行运算。三、实验用函数1、find功能:寻找非零元素的索引号。调用格式:find((n=min(n1))&(n=max(n1))):在符号关系运算条件的范围内寻找非零元素的索引号。2、fliplr功能:对矩阵行元素进行左右翻转。调用格式:x1=fliplr(x):将x的行元素进行左右翻转,赋给变量x1。四、实例1、信号的时域变换1)序列移位将一个离散序列进行移位,形成新的序列:x1(n)=x(n-m)。当m0时,原序列向右移m位,当m0时,原序列向左移。%建立移位函数(sigshift(x,m,n0))function[y,n]=sigshift(x,m,n0)n=m+n0;y=x;82)序列反折在这个运算中,x(n)以n=0为基准点,以纵轴为对称轴反折得到一个新的序列。y(n)=|x(-n)|在MATLAB中提供了fliplr函数实现序列反折。%建立反折函数(sigfold(x,n))function[y,n]=sigfold(x,n)y=fliplr(x);n=-fliplr(n);3)序列倒相是求一个与原序列的向量值相反,对应的时间向量不变的新序列。4)序列的尺度变换通过对时间轴的放大或压缩形成新的序列。2、序列的算术运算1)序列相加序列相加是指两个序列中相同序号的序列值逐项对应相加,形成新的序列。参加运算的两个序列的维数不同时%建立通用函数function[y,n]=sigadd(x1,n1,x2,n2)n=min(min(n1),min(n2)):max(max(n1),max(n2));y1=zeros(1,length(n));y2=y1;y1(find((n=min(n1))&(n=max(n1))==1))=x1;y2(find((n=min(n2))&(n=max(n2))==1))=x2;y=y1+y2;1)序列相乘序列相加是指两个序列中相同序号的序列值逐项对应相乘,形成新的序列。参加运算的两个序列的维数不同时处理方法与序列相加相同。9五、实验任务1、理解序列运算的性质,了解函数语句的意义。2、利用例题函数完成下列序列运算1)已知x1(n)=u(n+1)(-3n5);x2(n)=u(n-3)(-4n7)求:x(n)=x1(n)+x2(n)2)已知x1(n)=3e-0.25n(-2n8)x2(n)=u(n+1)(-3n6)求:x(n)=x1(n)*x2(n)六、实验报告1、简述实验目的和原理。2、列写上机调试通过的程序,并描绘其波形曲线。10实验三离散卷积的原理及应用一、实验目的1、通过实验进一步理解卷积定理,了解卷积过程;2、掌握应用线性卷积求解离散时间系统响应的基本方法。二、实验原理对于线性移不变离散系统,任意的输入信号x(n)可以用()n及其位移的线性组合来表示,即()()()kxnxknk当输入为()n时,系统的输出y(n)=h(n),由系统的线性移不变性质可以得到系统对x(n)的响应y(n)为()()()kynxkhnk称为离散系统的线性卷积,简写为y(n)=x(n)*h(n)也就是说,如果已知系统的冲激响应,将输入信号与系统的冲激响应进行卷积运算,即可求得系统的响应。三、实验用函数1、卷积函数conv功能:进行两个序列的卷积运算。调用格式:y=conv(x,h);用于求解两有限长序列的卷积。2、sum功能:求各元素之和。调用格式:y=sum(x);求序列x中各元素之和。3、hold功能:控制当前图形窗口是否刷新的双向切换开关。调用格式:holdon:使当前图形窗口中的图形保持且不被刷新,准备接受绘制新的图形。holdoff:使当前图形窗口中的图形不具备不被刷新的性质。114、impz功能:求解数字系统的冲激响应。调用格式:[h,t]=impz(b,a);求解数字系统的冲激响应h,取样点数为缺省值。[h,t]=impz(b,a,n);求解数字系统的冲激响应h,取样点数由n确定。impz(b,a);在当前窗口用stem(t,h)函数绘制图形。5、dstep功能:求解数字系统的阶跃响应。调用格式:[h,t]=dstep(b,a);求解数字系统的冲激响应h,取样点数为缺省值。[h,t]=dstep(b,a,n);求解数字系统的冲激响应h,取样点数由n确定。dstep(b,a);在当前窗口用stairs(t,h)函数绘制图形。四、参考实例在利用Matlab提供的卷积函数进行卷积运算时,主要是确定卷积结果的时间区间。conv函数默认两信号的时间序列从n=0开始,卷积结果对应的时间序列也从n=0开始。如果信号不是从0开始,则编程时必须用两个数组确定一个信号,其中,一个数组是信号波形的幅度样值,另一个数组是其对应的时间向量。%建立一个适用于信号从任意时间开始的通用函数function[y,ny]=sconv(x,h,nx,nh,p)y=conv(x,h);n1=nx(1)+nh(1);%计算y的非零样值的起点位置n2=nx(length(x))+nh(length(h));%计算y的非零样值的宽度ny=n1:p:n2;%确定y的非零样值的时间向量五、实验任务已知一个IIR数字低通滤波器的系统函数公式为1231230.13210.39630.39630.1321()10.343190.604390.20407zzzHzzzz输入一个矩形信号序列x=square(n/5)(-2n10),求该系统的响应。12六、实验报告1、简述实验目的、原理。2、写出上机调试通过的实验任务的程序并描述其图形曲线。13实验四离散傅立叶级数一、实验目的1、加深对离散周期序列傅里叶级数基本概念的理解。2、掌握MATLAB求解周期序列傅里叶级数变换和逆变换的方法。3、观察离散周期序列的重复周期数对频谱特性的影响。二、实验原理离散时间序列x(n)满足x(n)=x(n+rN),称为离散周期序列,其中N为周期,x(n)为主值序列。周期序列可用离散傅里叶级数表示成2101()()[()]NjknNkxnXkeIDFSXkNn=0,1,…,N-1其中,()Xk是周期序列离散傅里叶级数第K次谐波分量的系数,也称为周期序列的频谱,可表示为210()()[()]NjknNnXkxneDFSxnk=0,1,…,N-1上面两式是周期序列的一对傅里叶级数变换对。令2jNNWe,以上两式可简写为:1010()[()]()1()[()]()NnkNnNnkNnXkDFSxnxnWxnIDFSXkXkWN三、实验用函数1、mod功能:模除求余。调用格式:mod(x,m):x整除m取正余数。2、floor功能:向-舍入为整数。14调用格式:floor(x):将x向-舍入为整数。四、实例1、周期序列的傅里叶变换和逆变换依据变换公式编写通用函数1)离散傅里叶级数正变换