第一部分 MATLAB基础.doc
第一部分 MATLAB基础一.运算符矩阵运算:+ - * / 一般运算:.+ ._ .* ./二.矩阵1 2 3 4 5 ;1 2 3 4 5;1 2 3 4 5; 1 2 3 4 5;第一个数:间隔:最后一个数;1:1:5->1 2 3 4 5Zeros(n,n)Ones()Eyes()三.画图连续:Plot(x,y);离散:Stem(x,y);stairsXlabelYlabelTitle()Axis()Figure()Subplot四.函数Sin,cos,tanExp,real,imag,abs,length连续信号:Sign(符号信号),sinc(抽样信号),rectpuls(矩形脉冲信号),tripuls(三角波脉冲信号),square(周期性矩形脉冲),sawtooth(周期性三角波信号)五.离散时间信号1正弦序列离散正弦序列的MATLAB表示与连续信号类似,只不过是用stem函数而不是用plot函数来画出序列的波形。下面就是正弦序列的MATLAB源程序。程序运行结果如图1.19所示。%正弦序列实现程序k=0:39;fk=sin(pi/6*k);stem(k,fk)图1.19 正弦序列波形2指数序列离散指数序列的一般形式为,可用MATLAB中的数组幂运算(即点幂运算)c*来实现。下面为用MATLAB编写绘制离散时间实指数序列波形的函数。function dszsu(c,a,k1,k2)%c:指数序列的幅度%a:指数序列的底数%k1:绘制序列的起始序号%k2:绘制序列的终止序号k=k1:k2;x=c*(a.k);stem(k,x,'filled')hold onplot(k1,k2,0,0)hold off利用上述函数,实现实指数波形MATLAB程序如下(其中值分别为)。%离散时间实指数序列实现程序subplot 221;dszsu(1,5/4,0,20);xlabel('k');title('f1k');subplot 222dszsu(1,3/4,0,20);xlabel('k');title('f2k');subplot 223;dszsu(1,-5/4,0,20);xlabel('k');title('f3k');subplot 224;dszsu(1,-3/4,0,20);xlabel('k');title('f4k');程序运行结果如图1.20所示。如图可知,对于离散时间实指数序列,当的绝对值大于1时,序列为随时间发散的序列,当的绝对值小于1时,序列为随时间收敛的序列。同时可见,当的值小于零时,其波形在增长或衰减的同时,还交替地改变序列值的符号。图1.20 不同底数的实指数序列对于离散时间虚指数序列,可用通过调用下列绘制虚指数序列时域波形的MATLAB函数。function=dxzsu(n1,n2,w)%n1:绘制波形的虚指数序列的起始时间序号%n2:绘制波形的虚指数序列的终止时间序号%w:虚指数序列的角频率k=n1:n2;f=exp(i*w*k);Xr=real(f)Xi=imag(f)Xa=abs(f)Xn=angle(f)subplot(2,2,1), stem(k,Xr,'filled'),title('实部');subplot(2,2,3), stem(k,Xi,'filled'),title('虚部');subplot(2,2,2), stem(k,Xa,'filled'),title('模');subplot(2,2,4), stem(k,Xn,'filled'),title('相角');利用上述函数,实现虚指数波形MATLAB程序如下(其中虚指数分别为)%离散时间虚指数实现程序figure(1);dxzsu(0,20,pi/4);figure(2);dxzsu(0,20,2);程序运行结果如图1.21(a)、(b)所示。由图可见,只有当虚指数序列的角频率满足为有理数时,信号的实部和虚部和相角都为周期序列,否则为非周期序列。 (a)波形 (b) 波形图1.21 虚指数序列波形对于复指数序列,其一般形式为可以通过调用下面绘制复指数序列时域波形的MATLAB函数。function dfzsu(n1,n2,r,w)%n1:绘制波形的虚指数序列的起始时间序号%n2:绘制波形的虚指数序列的终止时间序号%w:虚指数序列的角频率%r: 指数序列的底数k=n1:n2;f=(r*exp(i*w).k;Xr=real(f);Xi=imag(f);Xa=abs(f);Xn=angle(f);subplot(2,2,1), stem(k,Xr,'filled'),title('实部');subplot(2,2,3), stem(k,Xi,'filled'),title('虚部');subplot(2,2,2), stem(k,Xa,'filled'),title('模');subplot(2,2,4), stem(k,Xn,'filled'),title('相角');利用上述函数,实现复指数序列波形MATLAB程序如下。%复指数序列实现程序(r>1)figure(1);dfzsu(0,20,1.2,pi/4);%复指数序列实现程序(0<r<1)figure(2);dfzsu(0,20,0.8,pi/4);%复指数序列实现程序(r=1)figure(3);dfzsu(0,20,1,pi/4);其运行结果如图1.22(a)、(b)、(c)所示。如图可见,当r>1时,复指数序列的实部和虚部分别为幅度按指数增长的正弦序列;当0<r<1时,复指数序列的实部和虚部分别为幅度按指数衰减的正弦序列;当r=1时,复指数序列的实部和虚部分别为等幅正弦序列。3单位抽样序列可以通过借助MATLAB中的零矩阵函数zeros表示。全零矩阵zeros(1,N)产生一个由N个零组成的列向量,对于有限区间的可以通过以下MATLAB程序表示% 单位抽样序列实现程序k=-30:30;delta=zeros(1,30),1,zeros(1,30);stem(k,delta)程序运行结果如图1.23所示。 (a) r>1 (b) 0<r<1(c) r=1图1.22 复指数序列波形 图1.23 单位抽样序列波形 图1.24 单位阶跃序列波形4单位阶跃序列可以通过借助MATLAB中的单位矩阵函数ones表示。单位矩阵ones(1,N)产生一个由N个1组成的列向量,对于有限区间的可以通过以下MATLAB程序表示% 单位阶跃序列实现程序k=-30:30;uk=zeros(1,30),ones(1,31);stem(k,uk)程序运行结果如图1.24所示。例1.7 编写程序来产生下列基本脉冲序列。(1)单位抽样序列,起点ns=0,终点nf=10,在n0=3处有一单位脉冲。(2)单位阶跃序列,起点ns=0,终点nf=10,在n0=3前为0,在ns=3后为1。(3)复指数序列,=-0.2,0=0.5。解:程序清单如下。clear,n0=3; ns=0;nf=10;n1=ns:nf; x1=zeros(1,n0-ns), 1, zeros(1,nf-n0); %单位抽样序列的产生n2=ns:nf; x2=zeros(1,n0-ns), ones(1,nf-n0+1); %单位阶跃序列的产生n3=ns:nf; x3=exp(-0.2+0.5j)*n3); %复指数序列的产生subplot(2,2,1),stem(n1,x1);title('单位脉冲序列(n-3)'); %画图表示单位抽样序列subplot(2,2,2),stem(n2,x2);title('单位阶跃序列u(n-3)'); %画图表示单位阶跃序列subplot(2,2,3),stem(n3, real(x3); line(0, 10,0, 0)title('复指数序列');ylabel('实部'); %画图表示复指数序列的实部subplot(2,2,4),stem(n3, imag(x3); line(0, 10,0, 0)title('复指数序列');ylabel('虚部'); 程序运行结果如图1.25所示。图1.25 几种基本脉冲序列在数字信号处理的基本理论和MATLAB信号处理工具箱函数的基础上,可以自己编写一些子程序以便调用。(1)单位抽样序列的生成函数impseq.mfunction x,n=impseq(n0,ns,nf)n=ns:nf;x=(n-n0)=0; %序列的起点为ns,终点为nf,在n=n0点处生成一个单位脉冲。(2) 单位阶跃序列的生成函数stepseq.mfunction x,n=stepseq(n0,ns,nf)n=ns:nf;x=(n-n0)>=0; %序列的起点为ns,终点为nf,在n=n0点处生成单位阶跃。(3)两个信号相加的生成函数sigadd.mfunction 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;(4)两个信号相乘的生成函数sigmult.mfunction y,n=sigmult(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;(5)序列移位的生成函数sigshift.mfunction y,n=sigshift(x,m,n0)n=m+n0;y=x(6)序列翻折的生成函数sigfold.mfunction y,n=sigfold(x,n)y=fliplr(x);n=-fliplr(n)(7)奇偶综合函数evenodd.m此函数可以将任一给定的序列x(n)分解为xe(n) 和xo(n)两部分。function xe,xo,m=evenodd(x,n)if (imag(x)=0) error(x is not a real sequence); endm=-fliplr(n);m1=min(m,n);m2=max(m,n);m=m1:m2;nm=n(1)-m(1);n1=1:length(n);x1=zeros(1,length(m);x1(n1+nm)=x;x=x1;xe=0.5*(x+fliplr(x); xo=0.5*(x-fliplr(x);(8)求卷积和求卷积和直接采用MATLAB中的函数conv,即y=conv(x,h);它默认序列从n=0开始。但是如果序列是从一负值开始,即其中nx1<0或nh1<0,或两者同时为负,这样就不能直接采用conv函数。其卷积结果序列为,这样就可构成一个新的卷积函数conv_m,求出带下标的序列卷积。function y,ny=conv_m(x,nx,h,nh)ny1=nx(1)+nh(1);ny2=nx(length(x)+nh(length(h);ny=ny1:ny2;y=conv(x,h)1.6.2 离散序列的基本运算与波形变换的MATLAB实现1加法对于离散序列来说,序列相加是将信号对应时间序号的值逐项相加,在这里不能象连续时间信号那样用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的相加需表示成两个向量的相加,因而参加运算的两序列向量必须具有相同的维数。实现离散序列相加的MATLAB实用子程序如下function f,k=lsxj(f1,f2,k1,k2)%实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向量,f和k为返回的和序列及其对应的时间序列向量k=min(min(k1),min(k2):max(max(k1),max(k2);%构造和序列长度s1=zeros(1,length(k);s2=s1; %初始化新向量s1(find(k>=min(k1)&(k<=max(k1)=1)=f1;%将f1中在和序列范围内但又无定义的点赋值为零s2(find(k>=min(k2)&(k<=max(k2)=1)=f2;%将f2中在和序列范围内但又无定义的点赋值为零f=s1+s2; %两长度相等序列求和stem(k,f,'filled')axis(min(min(k1),min(k2)-1),(max(max(k1),max(k2)+1),(min(f)-0.5),(max(f)+0.5)%坐标轴显示范围图1.27 离散序列相加波形图例1.9 已知两离散序列分别为试用MATLAB绘出它们的波形及的波形。解:MATLAB的程序如下%求两离散序列之和实现程序f1=-2:2;k1=-2:2;f2=1 1 1;k2=-1:1;subplot 221;stem(k1,f1),axis(-3 3 -2.5 2.5);title('f1k');subplot 222;stem(k2,f2),axis(-3 3 -2.5 2.5);title('f2k');subplot 223;f,k=sigadd(f1,k1,f2,k2);stem(k,f),axis(-3 3 -2.5 2.5);title('fk=f1k+f2(k)');程序运行的结果如图1.27所示。2乘法与离散序列加法相似,这里参加运算的两序列向量必须具有相同的维数。实现离散时间信号相乘的MATLAB实用子程序如下function f,k=lsxc(f1,f2,k1,k2)%实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向量,f和k为返回的和序列及其对应的时间序列向量k=min(min(k1),min(k2):max(max(k1),max(k2);%构造和序列长度s1=zeros(1,length(k);s2=s1; %初始化新向量s1(find(k>=min(k1)&(k<=max(k1)=1)=f1;%将f1中在和序列范围内但又无定义的点赋值为零s2(find(k>=min(k2)&(k<=max(k2)=1)=f2;%将f2中在和序列范围内但又无定义的点赋值为零f=s1.*s2; %两长度相等序列求和stem(k,f,'filled')axis(min(min(k1),min(k2)-1),(max(max(k1),max(k2)+1),(min(f)-0.5),(max(f)+0.5)%坐标轴显示范围图1.28 离散序列相乘波形图例1.10 试用MATLAB绘出例1.9中两离散序列乘法的波形。解:MATLAB的程序如下%求两离散序列之积实现程序f1=-2:2;k1=-2:2;f2=1 1 1;k2=-1:1;subplot 221;stem(k1,f1),axis(-3 3 -2.5 2.5);title('f1k');subplot 222;stem(k2,f2),axis(-3 3 -2.5 2.5);title('f2k');subplot 223;f,k=sigmult(f1,k1,f2,k2);stem(k,f),axis(-3 3 -2.5 2.5);title('fk=f1k*f2(k)');程序运行的结果如图1.28所示。3离散序列的时移、反折、尺度变换离散序列的时移、反折、尺度变换与连续时间信号相似,在此举一例来说明其MATLAB实现过程。其MATLAB源程序如下%离散序列图形变换实现程序clear;k=-12:12;k1=2.*k+4;f=-stepfun(k,-3)-stepfun(k,-1)+. 4.*stepfun(k,-1)-stepfun(k,0)+. 0.5*k.*stepfun(k,0)-stepfun(k,11);f1=-stepfun(k1,-3)-stepfun(k1,-1)+. 4.*stepfun(k1,-1)-stepfun(k1,0)+. 0.5*k1.*stepfun(k1,0)-stepfun(k1,11);subplot 221;stem(k,f);axis(-12 12 -1 6);grid on;text(-8,3,'fk')subplot 222;stem(k+1,f);axis(-12 12 -1 6);grid on;text(-9.5,3,'fk-1')subplot 223;stem(k,f1);axis(-12 12 -1 6);grid on;text(-8,3,'f2k+4')subplot 224;stem(2-k,f);axis(-12 12 -1 6);grid on;text(5.5,3,'f2-k')程序运行结果如图1.29所示。图1.29 离散序列的波形变换图形1.6.3 离散序列的奇偶分解MATLAB实现图1.30 离散序列分解为偶分量与奇分量波形图可以利用MATLAB编写的函数sigevenodd()将序列分解成偶序列和奇序列两部分,源程序为%离散序列分解为偶分量和奇分量的程序clfn0=0;n1=-10;n2=10;n=n1:n2;x=(n-n0)>=0;subplot 221stem(n,x)xlabel('n');ylabel('x(n)');title('Step Sequence');grid on;%Decomposition of the Sequencexeven,xodd,m=evenodd(x,n);subplot 223stem(m,xeven);xlabel('m');ylabel('x even(n)');title('Even Part');grid on;subplot 224stem(m,xodd);xlabel('m');ylabel('x odd(n)');title('Odd Part');grid on;程序运行结果如图1.30所示。