您的当前位置:首页正文

第一部分 MATLAB基础

2023-04-08 来源:个人技术集锦
第一部分 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 5] Zeros(n,n) Ones() Eyes()

三.画图

连续:Plot(x,y); 离散:Stem(x,y); stairs Xlabel Ylabel Title() Axis() Figure() Subplot

四.函数 Sin,cos,tan…

Exp,real,imag,abs,length

连续信号:Sign(符号信号),sinc(抽样信号),rectpuls(矩形脉冲信号),tripuls(三角波脉冲信号),square(周期性矩形脉冲),sawtooth(周期性三角波信号)

五.离散时间信号 1.正弦序列

离散正弦序列的MATLAB表示与连续信号类似,只不过是用stem函数而不是用plot函数来画出序列的波形。下面就是正弦序列sin所示。

%正弦序列实现程序 k=0:39;

fk=sin(pi/6*k); stem(k,fk)

k的MATLAB源程序。程序运行结果如图1.196

图1.19 正弦序列波形

2.指数序列

离散指数序列的一般形式为ca,可用MATLAB中的数组幂运算(即点幂运算)c*a.^k来实现。下面为用MATLAB编写绘制离散时间实指数序列波形的函数。 function dszsu(c,a,k1,k2) %c:指数序列的幅度 %a:指数序列的底数

%k1:绘制序列的起始序号 %k2:绘制序列的终止序号 k=k1:k2; x=c*(a.^k);

stem(k,x,'filled') hold on

plot([k1,k2],[0,0]) hold off

利用上述函数,实现实指数波形MATLAB程序如下(其中a值分别为,,,%离散时间实指数序列实现程序 subplot 221;

dszsu(1,5/4,0,20); xlabel('k'); title('f1[k]'); subplot 222

dszsu(1,3/4,0,20); xlabel('k'); title('f2[k]'); subplot 223;

dszsu(1,-5/4,0,20); xlabel('k'); title('f3[k]'); subplot 224;

dszsu(1,-3/4,0,20); xlabel('k'); title('f4[k]');

k5344543)。 4程序运行结果如图1.20所示。如图可知,对于离散时间实指数序列ca,当a的绝对值大于1时,序列为随时间发散的序列,当a的绝对值小于1时,序列为随时间收敛的序列。同时可见,当a的值小于零时,其波形在增长或衰减的同时,还交替地改变序列值的符号。

k

图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程序如下(其中虚指数分别为e%离散时间虚指数实现程序 figure(1);

dxzsu(0,20,pi/4); figure(2); dxzsu(0,20,2);

程序运行结果如图1.21(a)、(b)所示。由图可见,只有当虚指数序列的角频率满足2为有理数时,信号的实部和虚部和相角都为周期序列,否则为非周期序列。

jk4,ej2k)

(a)ejk4波形 (b) e图1.21 虚指数序列波形

j2k波形

对于复指数序列,其一般形式为

fkrkejk

可以通过调用下面绘制复指数序列时域波形的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);

%复指数序列实现程序(0dfzsu(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时,复指数序列的实部和虚部分别为等幅正弦序列。

3.单位抽样序列

可以通过借助MATLAB中的零矩阵函数zeros表示。全零矩阵zeros(1,N)产生一个由N个零组成的列向量,对于有限区间的k可以通过以下MATLAB程序表示

% 单位抽样序列实现程序 k=-30:30;

delta=[zeros(1,30),1,zeros(1,30)]; stem(k,delta)

程序运行结果如图1.23所示。

(a) r>1 (b) 0(c) r=1

图1.22 复指数序列波形

图1.23 单位抽样序列波形 图1.24 单位阶跃序列波形

4.单位阶跃序列

可以通过借助MATLAB中的单位矩阵函数ones表示。单位矩阵ones(1,N)产生一个由N个1组成的列向量,对于有限区间的uk可以通过以下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)单位抽样序列(nn0)的生成函数impseq.m

function [x,n]=impseq(n0,ns,nf)

n=[ns:nf];x=[(n-n0)==0]; %序列的起点为ns,终点为nf,在n=n0点处生成一个单位

脉冲。

(2) 单位阶跃序列u(nn0)的生成函数stepseq.m function [x,n]=stepseq(n0,ns,nf)

n=[ns:nf];x=[(n-n0)>=0]; %序列的起点为ns,终点为nf,在n=n0点处生成单位阶

跃。

(3)两个信号相加的生成函数sigadd.m 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;

(4)两个信号相乘的生成函数sigmult.m function [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)序列移位y(n)x(nn0)的生成函数sigshift.m function [y,n]=sigshift(x,m,n0) n=m+n0;y=x

(6)序列翻折y(n)x(n)的生成函数sigfold.m function [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’); end

m=-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开始。但是如果序列是从一负值开始,即

x(n):nx1nnx2 h(n):nh1nnh2其中nx1<0或nh1<0,或两者同时为负,这样就不能直接采用conv函数。其卷积结果序列为y(n):nx1nh1nnx2nh2,这样就可构成一个新的卷积函数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 已知两离散序列分别为

f1k2,1,0,1,2f2k1,1,1

试用MATLAB绘出它们的波形及f1kf2k的波形。 解: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('f1[k]');

subplot 222;

stem(k2,f2),axis([-3 3 -2.5 2.5]); title('f2[k]'); subplot 223;

[f,k]=sigadd(f1,k1,f2,k2);

stem(k,f),axis([-3 3 -2.5 2.5]); title('f[k]=f1[k]+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中两离散序列乘法f1kf2k的波形。 解: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('f1[k]'); subplot 222;

stem(k2,f2),axis([-3 3 -2.5 2.5]); title('f2[k]'); subplot 223;

[f,k]=sigmult(f1,k1,f2,k2);

stem(k,f),axis([-3 3 -2.5 2.5]); title('f[k]=f1[k]*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,'f[k]') subplot 222; stem(k+1,f);

axis([-12 12 -1 6]); grid on;

text(-9.5,3,'f[k-1]') subplot 223; stem(k,f1);

axis([-12 12 -1 6]); grid on;

text(-8,3,'f[2k+4]') subplot 224; stem(2-k,f);

axis([-12 12 -1 6]); grid on;

text(5.5,3,'f[2-k]')

程序运行结果如图1.29所示。

图1.29 离散序列的波形变换图形

1.6.3 离散序列的奇偶分解MATLAB实现

图1.30 离散序列分解为偶分量与奇分量波形图

可以利用MATLAB编写的函数sigevenodd()将序列分解成偶序列和奇序列两部分,源程序为

%离散序列分解为偶分量和奇分量的程序 clf

n0=0;n1=-10;n2=10; n=n1:n2;

x=[(n-n0)>=0]; subplot 221 stem(n,x)

xlabel('n');ylabel('x(n)');title('Step Sequence'); grid on;

%Decomposition of the Sequence [xeven,xodd,m]=evenodd(x,n); subplot 223 stem(m,xeven);

xlabel('m');ylabel('x even(n)');title('Even Part'); grid on; subplot 224 stem(m,xodd);

xlabel('m');ylabel('x odd(n)');title('Odd Part'); grid on;

程序运行结果如图1.30所示。

因篇幅问题不能全部显示,请点此查看更多更全内容