离散信号及离散系统的MATLAB编程实现.pdf
数字信号处理数字信号处理课程实验报告课程实验报告实验名称教师姓名一、实验内容1、用 MATLAB 仿真(编写)离散序列2、常见序列运算3、差分方程的求解4、系统零极点的求解。(红色部分为必做项目)离散信号及离散系统的MATLAB编程实现系别实验日期实验地点二、实验目的1.复习离散时间的信号和系统,复习离散时间重要类型的信号和它们的运算的实现。2.熟悉 MATLAB软件的集成开发环境,学会利用MATLAB 编程及获得帮助的方法。3.学会利用 MATLAB的绘图功能。三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况)matlab软件,计算机四、实验试做记录(含程序、数据记录及分析)1、Matlab 表示序列MATLAB中,可采用向量表示序列,由于MATLAB中对序列下标默认为从 1 开始递增,因此要表,x(0),x(1),.,一般应采用两个向量分别对信号的自变量和因变量示离散信号x(n).,x(-1)进行描述。如x(n)2,1,1,0,1,4,3,7,n=-34,在 MATLAB中表示为 n=-3,-2,-1,0,1,2,3,4;%自变量取值 x=2,1,-1,0,1,4,3,7;%因变量取值说明:(1)向量可用方括号 表示。(2)当向量取值连续变化时可用冒号运算符“:”简化赋值过程,如x(n)的 n 值,可简化为n=-3:4或 n=-3:4。(3)分号“;”表示不回显表达式的值。(4)“%”表示其后内容为注释对象。(5)符号“”是 MATLAB 命令窗口的输入提示符,此外,为便于多次调用,也可在m 文件中输入相应的命令语句。利用 MATLAB,还可对信号的波形进行描述,常采用的绘图语句有stem,plot,subplot,axis,title,xlabel,ylabel,gtext,hold on,hold off,grid 等。其中stem 绘制离散图形;plot 绘制连续图形;subplot 用于绘制子图,应在 stem 或 plot 语句前调用;axis 指定 x 和 y 轴的取值范围,用在 stem或 plot 语句后;title 标注图形名称,xlabel,ylabel 分别标注 x 轴和 y 轴名称;gtext 可将标注内容放置在鼠标点击处;hold on 和 hold off 用于控制对象绘制方式,是在原图上还是在新图上绘制;grid用于绘制网格。以上函数具体使用方法可通过在命令窗口中输入help 加函数名进行查阅,如“helpstem”语句。部分绘图语句的应用见下面语句,对应的波形图为图1-1-1。%画子图 1subplot(1,2,1);stem(n,x1);%x1为序列axis(-5,5,-2,2);%向量的前两个值为 x 轴的取值范围,后两个为y 轴的取值范围title(例 1 序列);xlabel(n);ylabel(x1(n);%画子图 2subplot(1,2,2);stem(n,x2);axis(0,20,0,10);title(例 2 序列);xlabel(n);ylabel(x2(n);图 1-1-1 序列波形图2、常用信号的表示方法(1)单位采样序列1,n n0(nn0)0,n n0在n1 n n2区间的值,MATLAB中可用下列表达式描述n=n1:n2;x=(n-n0)=0;为使用方便,也可将上式描述成MATLAB 函数,即function x,n =impseq(n0,n1,n2)n=n1:n2;x=(n-n0)=0;Stem(n,x)(2)单位阶跃序列1,n n0u(n n0)0,n n0在n1 n n2区间的值,MATLAB中可用下列表达式描述:n=n1:n2;x=(n-n0)=0;(3)实数指数序列x(n)an,n例如要实现序列x(n)(0.9),0 n 10,MATLAB中可用下列表达式描述:n=0:10;x=(0.9).n;(4)复数指数序列nx(n)e(j0)n,n(2 j3)nx(n)e,0 n 10,MATLAB中可用下列表达式描述:例如要实现序列n=0:10;x=exp(2+3j)*n);(5)正余弦序列x(n)cos(0n),n例如要实现序列x(n)3cos(0.1n/3)2sin(0.5n),0 n 10,MATLAB中对应的语句为:n=0:10;x 3cos(0.1 pin pi/3)2sin(0.5 pin)(6)随机序列在 MATLAB 中,有两种随机序列可用。rand(1,N)产生其元素在 0,1之间均匀分布的 1N 维随机序列矩阵。randn(1,N)则产生均值为 0,方差为 1 的 1N 维高斯随机序列矩阵。其他随机序列都可用这两种函数的变换得到。(7)周期序列周期为 N,长度为L(L=P*N)的周期序列x(n)可视为信号x(n),0 n N复制 P 次后产生的结果。MATLAB中可用下列两种方法表示:法 1:x x,x,.,x;法 2:x x ones(1,P);%产生 P 列 x;x 是一个行向量x x(:);%长的列向量x x;%长的行向量说明:运算符“”为向量的转置操作符,实现行向量与列向量的相互转化;函数 ones(1,P)用以产生 1 行P 列的 1 矩阵,与此对应函数 zeros(n,m)产生 n 行m 列的 0 矩阵;矩阵x的冒号运算即x(:)将矩阵所有列向量依次连接在一起,构成一列向量。3、序列运算(1)信号的加减MATLAB中可用算术运算符“+”和“-”分别实现序列的加法和减法运算,此时两序列的长度必须相等,否则需通过补零法改变信号的长度。例.序列 x1(n)、x2(n),长度分别为 n1 和 n2,其求和的 MATLAB 代码为:nmin(min(n1),min(n2):max(max(n1),max(n2);%y(n)的长度y1 zeros(1,length(n);y2 y1;%初始化(产生 1行length(n)列的零值)y1(find(nmin(n1)&(nmax(n1)1)x1;%具有y(n)的长度的 x1y2(find(nmin(n2)&(nmax(n2)1)x2;%具有y(n)的长度的 x2y y1 y2;%序列相加说明:函数 min(n)可获取向量 n 的最小值,函数 max(n)则获取向量 n 的最大值。函数 length(n)可取得向量 n 的长度。函数 find(na)&(nb)可获取向量 n 在范围 an x=1,2,3;h=2,2,3;y=conv(x,h)y=2613129对于起点和终点为任意值的序列进行线性卷积运算,可自行扩展另一个函数conv_m,具体形式为:function y,ny=conv_m(x,nx,h,nh)%y,ny=线性卷积结果%x,nx=第一个信号%h,nh=第二个信号nyb=nx(1)+nh(1);%两向量起点之和nye=nx(length(x)+nh(length(h);%两向量长度之和ny=nyb:nye;y=conv(x,h);(2)差分方程LTI离散系统也可用线性常系数差分方程描述:ak0Nky(n k)bmx(n m),nm0My(n)的解在 MATLAB中可通过调用滤波器函数filter(a,b,x)完成,其中 a=a0,a1,aN (a00),b=b0,b1,bM 分别对应差分方程中 y 和 x 的各项系数,x 为输入信号序列,即将差分方程看成一个滤波器,x 作为滤波器的输入信号,y 为滤波器的输出值。例,差分方程y(n)x(n)y(n 1)0.9y(n 2);n,计算并画出其冲激响应h(n),n=-20,100。在 MATLAB 命令窗口中,对应程序为:b=1;a=1,-1,0.9;%注意确定 a 值时,需先将 y 项移至等式左侧 n=-20:120;x=zeros(1,length(n);x(21)=0;%描述冲激序列 h=filter(b,a,x);stem(n,h);%绘制冲激响应序列axis(-20,120,-1.1,1.1);%设定坐标轴取值范围title(冲激响应);xlabel(n);ylabel(h(n);%对图形名称和 x 轴,、y 轴进行标注(3)系统稳定性LTI离散系统稳定性的判别可采用两种方法:法 1:对冲激响应序列h(n)绝对值求和,判别其是否为有限值,若有限,为稳定系统。对应语句为:sum(abs(h),其中函数 abs 是取序列 h(n)的绝对值。法 2:利用系统函数H(z)的极点分布进行判断,若极点均在单位圆内,则为稳定系统。系统函数 H(z)的极点也即为差分方程中y 项对应的各系数a0,a1,aN构成的多项式的极点,而极点可采用求根函数 roots 获取。例,系统差分方程为:y(n)x(n)y(n 1)0.9y(n 2);n,判断其稳定性。MATLAB代码为:a=1,-1,-0.9;z=roots(a);magz=abs(z)magz=0.94870.9487显然极点均在单位圆内,系统稳定。因为 MATLAB 语言是一种解释性语言,所以有时 MATLAB 程序的执行速度不是很理想。因此尽量避免使用循环,用向量化的运算来代替循环操作。五、实验总结