1第7章MATLAB在数字信号处理中的应用23引言数字信号处理中包含离散时间信号与系统的一部分知识。本章主要研究内容分为两部分:离散时间信号与系统时域分析离散时间信号与系统频域分析在数字信号处理中还有一个非常大的知识点:数字滤波器设计,留待下学期开设本课程时,可以学习。4一、离散时间信号与系统时域分析5包含内容信号分析典型信号表示impseq(),stepseq()7.1序列相加,相乘7.2序列合成和截取7.3序列移位和周期延拓7.6离散序列卷积系统分析7.4系统响应7.5系统线性判定67.1离散信号的产生及时域处理时域离散信号用x(n)表示(离散序列)。x和n同时使用才能完整地表示一个序列:时间变量n(表示采样位置)只能取整数;向量x(表示采样点的幅度)与n一一对应。由于n序列是按整数递增的,可简单地用其初值ns决定,因为它的终值nf取决于ns和x的长度length(x),故可写成:n=[ns:nf]或n=[ns:nslength(x)1]7典型信号表示impseq(),stepseq()8例7.1序列的相加和相乘给出两个序列x1(n)和x2(n)。x1=[0,1,2,3,4,3,2,1,0];n1=[-2:6];x2=[2,2,0,0,0,-2,-2];n2=[2:8];要求它们的和ya及乘积yp。解:编程的思路是把序列长度延拓到覆盖n1和n2的范围,这样才能把两序列的时间变量对应起来,然后进行对应元素的运算。9例程x1=[0,1,2,3,4,3,2,1,0];ns1=-2;%给定x1及ns1x2=[2,2,0,0,0,-2,-2];ns2=2;%给定x2及ns2nf1=ns1+length(x1)-1;nf2=ns2+length(x2)-1;ny=min(ns1,ns2):max(nf1,nf2);%y(n)的时间变量xa1=zeros(1,length(ny));xa2=xa1;%延拓序列初始化xa1(find((ny=ns1)&(ny=nf1)==1))=x1;%给xa1赋值x1xa2(find((ny=ns2)&(ny=nf2)==1))=x2;%给xa2赋值x2ya=xa1+xa2%序列相加yp=xa1.*xa210结果显示11例7.2序列的合成和截取用例6.13的结果编写产生矩形序列RN(n)的程序。序列起点为n0,矩形序列起点为n1,长度为N(n0,n1,N由键盘输入)。并用它截取一个复正弦序列exp(jπn/8).解:建模:矩形序列可看成两个阶跃序列之差。用MATLAB逻辑关系产生矩形序列x2(n)。而用它截取任何序列相当于元素群相乘x2.*x,也称为加窗运算。序列的合成和截取就是相加和相乘。)()()()(111NnnUnnUnRnxN12结果显示13例7.2序列的合成和截取用例6.13的结果编写产生矩形序列RN(n)的程序。序列起点为n0,矩形序列起点为n1,长度为N(n0,n1,N由键盘输入)。并用它截取一个复正弦序列exp(jπn/8).解:建模:矩形序列可看成两个阶跃序列之差。用MATLAB逻辑关系产生矩形序列x2(n)。而用它截取任何序列相当于元素群相乘x2.*x,也称为加窗运算。序列的合成和截取就是相加和相乘。)()()()(111NnnUnnUnRnxN14程序要点n=n0:n1+N+5;%生成自变量数组u=[(n-n1)=0];%产生单位阶跃序列(u(n-n1))x1=[(n-n1)=0]-[(n-n1-N)=0]%用阶跃序列之差产生矩形序列x2=[(n=n1)&(n(N+n1))];%用逻辑式产生矩形序列x3=exp(j*n*pi/8).*x2;%对复正弦序列加矩形窗(元素群乘)15程序显示结果16例7.3序列的移位和周期延拓已知,利用MATLAB生成并图示表示x(n)以8为周期的延拓)和解:方法1,利用矩阵乘法和冒号运算x=[1234];y=x'*ones(1,3);方法2,采用求余函数mod,y=x(mod(n,M)+1)可实现对x(n)以M为周期的周期延拓。加1是因为MATLAB向量下标只能从1开始,)(8.0)(8nRnxn8N8(),(),(())(),((())xnxnmxnRnxn)())((N8nRmnx17程序实现分析构造x(n)x1=(0.8).^n;x2=[(n=0)&(nM)];xn=x1.*x2;移位:fork=m+1:m+Mxm(k)=xn(k-m);end18周期化实现方法1:xc=xn(mod(n,8)+1);%产生x(n)的周期延拓xcm=xn(mod(n-m,8)+1);%产生x(n)移位后的周期延拓19周期化实现方法2x=[1234];y=x'*ones(1,3);y=111222333444y1=y(:);%12341234123420程序结果21例7.6离散序列的卷积计算给出两个序列和,计算其卷积y(n),并图示各输入输出序列。解:在例6.4中,已经给出了直接调用MATLAB的卷积函数conv的方法,也给出了自编卷积计算程序的方法,要注意的是本例时间变量的设定和移位方法。在本例中,设定n为从零开始,向量x和h的长度分别为Nx=20和Nh=10;结果向量y的长度为length(y)=Nx+Nh-1。)(9.0)(201nRnxn)()(101nRnh22程序要点x1=(0.9).^n;%x1(n)%产生x2(n)=x1(n-m)x2=zeros(1,Nx+m);fork=m+1:m+Nxx2(k)=x1(k-m);endnh=0:Nh-1;h1=ones(1,Nh);%h1(n)h2=h1;%h2(n)y1=conv(x1,h1);%y1(n)y2=conv(x2,h2);%y2(n)Ny1=length(y1);%y1(n)长度Ny2=length(y2);%y2(n)长度23程序显示结果24例7.4离散系统对信号的响应本题给定6阶低通数字滤波器的系统函数,求它在下列输入序列x(n)下的输出序列y(n)。解:本题的计算原理见例6.14,在这里用工具箱函数filter来解。如果已知系统函数H(z)=B(z)/A(z),则filter函数可求出系统对输入信号x(n)的响应y(n)。y=filter(B,A,x)由差分方程可得到H(z)的分子和分母多项式系数向量A和B,再给出输入向量x即可。系统分析25程序要点%设定系统参数A,BB=0.0003738*conv([1,1],conv([1,1],conv([1,1],conv([1,1],conv([1,1],[1,1])))))A=conv([1,-1.2686,0.7051],conv([1,-1.0106,0.3583],[1,-0.9044,0.2155]))x1=[n==0];%产生输入信号x1(n)y1=filter(B,A,x1);%对x1(n)的响应x2=[(n-m)==0];%产生输入信号x2(n)y2=filter(B,A,x2);%对x2(n)的响应x3=[n=0];%产生输入信号x3(n)y3=filter(B,A,x3);%对x3(n)的响应x4=[(n=0)&(n32)];%产生输入信号x4(n)y4=filter(B,A,x4);%对x4(n)的响应x5=exp(j*pi*n/8);%产生输入信号x5(n)y5=filter(B,A,x5);%对x5(n)的响应26显示结果27例7.5系统线性性质验证设系统差分方程为y(n)=x(n)+0.8y(n-1)要求用程序验证系统的线性性质。解:产生两种输入序列,分别乘以常数后1。分别激励系统,再求输出之和;2。先相加,再激励系统求输出;对两个结果进行比较,方法是求它们之差,按误差的绝对值是否极小进行判断。28程序要点B=1;A=[1,-0.8];x1=0.8.^n;%产生输入信号x1(n)x=[(n=0)&(n32)];x1=x1.*x;y1=filter(B,A,x1);%对x1(n)的响应y1(n)x2=[(n-m)==0];y2=filter(B,A,x2);%对x2(n)的响应y2(n)x3=5*x1+3*x2;y3=filter(B,A,x3);%对5x1(n)+3x2(n)的响应y3(n)y=5*y1+3*y2;%y(n)=5y1(n)+3y2(n)29程序显示结果30二、离散时间信号与系统频域分析31包含内容Z变换序列z变换与逆变换7.7Z反变换法求解系统响应7.8离散时间傅里叶变换7.9离散傅里叶变换7.15系统频域响应7.12,7.13320)()]([)(nnznxnxZzX(1)序列的正反Z变换其中,符号表示取z变换,z是复变量。相应地,单边z变换定义为:nnznxnxZzX)()]([)(Z变换与其逆变换33MATLAB符号数学工具箱提供了计算离散时间信号单边z变换的函数ztrans和z反变换函数iztrans,其语句格式分别为Z=ztrans(x)x=iztrans(z)上式中的x和Z分别为时域表达式和z域表达式的符号表示,可通过sym函数来定义。MATLAB实现-方法1(符号数学工具箱)34【例1】试用ztrans函数求下列函数的z变换。x=sym('a^n*cos(pi*n)');Z=ztrans(x);simplify(Z)ans=z/(z+a))()cos()(nunanxn35【例2】试用iztrans函数求下列函数的z反变换。Z=sym('(8*z-19)/(z^2-5*z+6)');x=iztrans(Z);simplify(x)ans=-19/6*charfcn[0](n)+5*3^(n-1)+3*2^(n-1)-19/6*charfcn[0](n)+5*3^(n-1)+3*2^(n-1)charfcn[0](n)是函数在MATLAB符号工具箱中的表示,反变换后的函数形式为:3||65198)(2zzzzzX)()2335()(619)(11nunnxnn36例7.14用符号运算工具箱解z变换解:无限长度时间序列的z变换和逆z变换都属于符号运算的范围。MATLAB的symbolic(符号运算)工具箱已提供了这种函数。如果读者已在计算机上安装了这个工具箱,可以键入以下程序。MATLAB程序q714.m其特点是程序的开始要指定符号自变量symsznaNw0%规定z,n,a…为符号变量37程序分析:symsznaNw0%规定z,n,a为符号变量y1=a^n;%给出y的表示式Y1=ztrans(y1)%求y的z变换X1=-3*z^-1/(2-5*z^-1+2*z^-2);%给出X的表示式x1=iztrans(X1)%求X的逆Z变换simplify(x);%可显示变换后表达式的形式38如果信号的z域表示式是有理函数,进行z反变换的另一个方法是对进行部分分式展开,然后求各简单分式的z反变换.如果X(z)的有理分式表示为:)()(1)(221122110zAzBzazazazbzbzbbzXnnmmrkkikrMkkknNMnnzzCzzAzBzX11110]1[1)(MATLAB实现-方法2(residuez函数实现反变换)39MATLAB信号处理工具箱提供了一个对进行部分分式展开的函数residuez,其语句格式为:[R,P,K]=residuez(B,A)其中,B,A分别表示X(z)的分子与分母多项式的系数向量,分子与分母多项式按照z^-1升幂排列。R为部分分式的系数向量;P为极点向量;K为多项式的系数。若X