matlab在信号与系统中的应用实验

更新时间:2023-10-22 06:11:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

信号与系统实验

实验一 常见信号的MATLAB表示及运算

一、实验目的

1.熟悉常见信号的意义、特性及波形

2.学会使用MATLAB表示信号的方法并绘制信号波形 3. 掌握使用MATLAB进行信号基本运算的指令 4. 熟悉用MATLAB实现卷积积分的方法 二、实验原理

信号一般是随时间而变化的某些物理量。按照自变量的取值是否连续,信号分为连续时间信号和离散时间信号,一般用f(t)和f(k)来表示。若对信号进行时域分析,就需要绘制其波形,如果信号比较复杂,则手工绘制波形就变得很困难,且难以精确。MATLAB强大的图形处理功能及符号运算功能,为实现信号的可视化及其时域分析提供了强有力的工具。

根据MATLAB的数值计算功能和符号运算功能,在MATLAB中,信号有两种表示方法,一种是用向量来表示,另一种则是用符号运算的方法。在采用适当的MATLAB语句表示出信号后,就可以利用MATLAB中的绘图命令绘制出直观的信号波形了。下面分别介绍连续时间信号和离散时间信号的MATLAB表示及其波形绘制方法。 1.连续时间信号

所谓连续时间信号,是指其自变量的取值是连续的,并且除了若干不连续的点外,对于一切自变量的取值,信号都有确定的值与之对应。从严格意义上讲,MATLAB并不能处理连续信号。在MATLAB中,是用连续信号在等时间间隔点上的样值来近似表示的,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号。在MATLAB中连续信号可用向量或符号运算功能来表示。

⑴ 向量表示法

对于连续时间信号f(t),可以用两个行向量f和t来表示,其中向量t是用形如t?t1:p:t2的命令定义的时间范围向量,其中,t1为信号起始时间,t2为终止时间,p为时间间隔。向量f为连续信号f(t)在向量t所定义的时间点上的样值。例如:对于连续信号

f(t)?Sa(t)?sin(t) ,我们可以将它表示成行向量形式,同时用绘图命令plot()函数绘制其波t形。其程序如下:

t1=-10:0.5:10; %定义时间t的取值范围:-10~10,取样间隔为0.5,

%则t1是一个维数为41的行向量

f1=sin(t1). /t1; %定义信号表达式,求出对应采样点上的样值, %同时生成与向量t1维数相同的行向量f1 figure(1); %打开图形窗口1

plot(t1,f1); %以t1为横坐标,f1为纵坐标绘制f1的波形 t2=-10:0.1:10; %定义时间t的取值范围:-10~10,取样间隔为0.1,

1

%则t2是一个维数为201的行向量

f2=sin(t2). /t2; %定义信号表达式,求出对应采样点上的样值 %同时生成与向量t2维数相同的行向量f2 figure(2); %打开图形窗口2

plot(t2,f2); %以t2为横坐标,f2为纵坐标绘制f2的波形 运行结果如下:

图1-1 图1-2

说明:

? plot是常用的绘制连续信号波形的函数。

? 严格说来,MATLAB不能表示连续信号,所以,在用plot( )命令绘制波形时,要对自变量t进行取值,MATLAB会分别计算对应点上的函数值,然后将各个数据点通过折线连接起来绘制图形,从而形成连续的曲线。因此,绘制的只是近似波形,而且,其精度取决于t的取样间隔。t的取样间隔越小,即点与点之间的距离越小,则近似程度越好,曲线越光滑。例如:图1-1是在取样间隔为p=0.5时绘制的波形,而图1-2是在取样间隔p=0.1时绘制的波形,两相对照,可以看出图1-2要比图1-1光滑得多。

? 在上面的f=sin(t). /t语句中,必须用点除符号,以表示是两个函数对应点上的值相除。 ⑵ 符号运算表示法

如果一个信号或函数可以用符号表达式来表示,那么我们就可以用前面介绍的符号函数专用绘图命令ezplot()等函数来绘出信号的波形。例如:对于连续信号f(t)?Sa(t)?sin(t),t我们也可以用符号表达式来表示它,同时用ezplot()命令绘出其波形。其MATLAB程序如下:

syms t ; %符号变量说明 f=sin(t)/t ; %定义函数表达式

ezplot(f,[-10,10]); %绘制波形,并且设置坐标轴显示范围

运行结果如下:

2

图1-3

⑶ 常见信号的MATLAB表示

对于普通的信号,应用以上介绍的两种方法即可完成计算函数值或绘制波形,但是对于一些比较特殊的信号,比如单位阶跃信号?(t)、符号函数sgn(t)等,在MATLAB中这些信号都有专门的表示方法。

? 单位阶跃信号

?1t?0单位阶跃信号的定义为:?(t)?? ,单位阶跃信号是信号分析的基本信号之一,

?0t?0在信号与系统分析中有着非常重要的作用,通常,我们用它来表示信号的定义域,简化信号的时域表示形式。例如:可以用两个不同延时的单位阶跃信号来表示一个矩形门信号,即:G2(t)??(t?1)??(t?1)

在MATLAB中,可通过多种方法得到单位阶跃信号,下面分别介绍。 方法一: 调用Heaviside(t)函数

在MATLAB的Symbolic Math Toolbox 中,有专门用于表示单位阶跃信号的函数,即Heaviside(t)函数,用它即可方便地表示出单位阶跃信号以及延时的单位阶跃信号,并且可以方便地参加有关的各种运算过程。

首先定义函数Heaviside(t) 的m函数文件,该文件名应与函数名同名即Heaviside.m。

%定义函数文件,函数名为Heaviside,输入变量为x,输出变量为y function y= Heaviside(t)

y=(t>0); %定义函数体,即函数所执行指令

%此处定义t>0时y=1,t<=0时y=0,注意与实际的阶跃信号定义的区

别。

例① 用MATLAB画出单位阶跃信号的波形,其程序如下:

ut=sym('Heaviside(t)'); %定义单位阶跃信号(要用符号函数定义法) ezplot(ut,[-2,10]) %绘制单位阶跃信号在-2~10范围之间的波形

运行结果如下:

例② 用MATLAB画出信号f(t)??(t?2)?3?(t?5)的波形 其程序如下:

f=sym('Heaviside(t+2)-3*Heaviside(t-5)'); %定义函数表达式

ezplot(f,[-4,20]) %绘制函数在-4~20范围之间的波形

3

运行结果如下:

方法二:数值计算法

在MATLAB中,有一个专门用于表示单位阶跃信号的函数,即stepfun( )函数,它是用数值计算法表示的单位阶跃函数?(t)。其调用格式为:

stepfun(t,t0)

其中,t是以向量形式表示的变量,t0表示信号发生突变的时刻,在t0以前,函数值小于零,t0以后函数值大于零。有趣的是它同时还可以表示单位阶跃序列?(k),这只要将自变量以及取样间隔设定为整数即可。有关单位阶跃序列?(k)的表示方法,我们后面有专门论述,下面通过一个例子来说明如何调用stepfun( )函数来表示单位阶跃函数。 例① 用stepfun( )函数表示单位阶跃信号,并绘出其波形 程序如下:

t=-1:0.01:4; %定义时间样本向量 t0=0; %指定信号发生突变的时刻 ut=stepfun(t,t0); %产生单位阶跃信号 plot(t,ut) %绘制波形 axis([-1,4,-0.5,1.5]) %设定坐标轴范围

运行结果如

例② 绘出门函数f(t)??(t?2)??(t?2)的波形 程序如下:

t=-4:0.01:4; %定义时间样本向量

t1=-2; %指定信号发生突变的时刻 u1=stepfun(t,t1); %产生左移位的阶跃信号?(t+2) t2=2; %指定信号发生突变的时刻 u2=stepfun(t,t2); %产生右移位的阶跃信号?(t-2) g=u1-u2; %表示门函数 plot(t,g) %绘制门函数的波形

4

下:

axis([-4,4,-0.5,1.5]) %设定坐标轴范围-4

运行结果如下:

? 符号函数

?1t?0符号函数的定义为:sgn(t)??

?1t?0?在MATLAB中有专门用于表示符号函数的函数sign() ,由于单位阶跃信号? (t)和符号函

1数两者之间存在以下关系:?(t)?1,因此,利用这个函数就可以很容易地生成单位2?2sgn(t)阶跃信号。下面举个例子来说明如何利用sign()函数生成单位阶跃信号,并同时绘制其波形。 举例:利用sign()函数生成单位阶跃信号,并分别绘出两者的波形 MATLAB程序如下:

t=-5:0.01:5; %定义自变量取值范围及间隔,生成行向量t f=sign(t); %定义符号信号表达式,生成行向量f figure(1); %打开图形窗口1 plot(t,f), %绘制符号函数的波形 axis([-5,5,-1.5,1.5]) %定义坐标轴显示范围 s=1/2+1/2*f; %生成单位阶跃信号 figure(2); %打开图形窗口2 plot(t,s),

axis([-5,5,-0.5,1.5]) %定义坐标轴显示范围

运行结果如下:

2.离散时间信号

离散时间信号又叫离散时间序列,一般用f(k) 表示,其中变量k为整数,代表离散的采样时间点(采样次数)。

在MATLAB中,离散信号的表示方法与连续信号不同,它无法用符号运算法来表示,而只能采用数值计算法表示,由于MATLAB中元素的个数是有限的,因此,MATLAB无法表

5

示无限序列;另外,在绘制离散信号时必须使用专门绘制离散数据的命令,即stem()函数,而不能用plot()函数。

下面通过一些常用离散信号来说明如何用MATLAB来实现离散信号的表示,以及可视化。 ? 单位序列? (k)

?1k?0单位序列? (k)的定义为?(k)??

?0k?0下面是用MATLAB绘制单位序列? (k) 的MATLAB程序:

k1=-5;k2=5; %定义自变量的取值范围

k=k1:k2; %定义自变量的取值范围及取样间隔(默认为1),并生成行向量 n=length(k); %取向量的维数

f=zeros(1,n); %生成与向量k的维数相同地零矩阵,给函数赋值 f(1,6)=1; %在k=0时刻,信号赋值为1 stem(k,f,'filled') %绘制波形

%'filled'定义点的形状,可通过help文件查询其它形状的描

axis([k1,k2,0,1.5]) %定义坐标轴显示范围

运行结果如下:

如果要绘制移位的单位序列? (k+k0)的波形,只要将以上程序略加修改即可,例如要绘制信号? (k+2)的图形,可将以上程序改为:

k1=-5;k2=5; %定义自变量的取值范围 k0=3; %定义平移量

k=k1:k2; %定义自变量的取值范围及取样间隔(默认为1),并生成行向量 n=length(k); %取向量的维数

f=zeros(1,n); %生成与向量k的维数相同的零矩阵,给函数赋值 f(1, -k0-k1+1)=1; %在k=k0时刻,信号赋值为1 stem(k,f,'filled') %绘制波形

axis([k1,k2,0,1.5]) %定义坐标轴显示范围

? 单位阶跃序列? (k)

?1k?0单位阶跃序列?(k)的定义为?(k)??

0k?0?下面是绘制单位阶跃序列?(k+k0) 的MATLAB程序:

k1=-3;k2=10; k0=0; %定义起止时刻和跃变时刻

6

k=k1:-k0-1; kk=-k0:k2;

n=length(k); %取k=k0点以前向量的维数

nn=length(kk); %取k=k0点以后(含k=k0点)向量的维数 u=zeros(1,n); %在k=k0以前,信号赋值为0 uu=ones(1,nn); %在k=k0以后,信号赋值为1 stem(k,u,'filled') %绘制k=k0以前信号的波形

hold on %保持图形窗口,以便在同一图形窗口绘制多个图形 stem(kk,uu,'filled') %绘制k=k0以后(含k=k0点)信号的波形 hold off %图形窗口解冻 axis([k1,k2,0,1.5]) %设置坐标轴显示范围

运行结果如下:

注意:以上介绍了几个常用的绘图命令:plot,ezplot,stairs,stem,其中,绘制连续信号得到光滑的曲线时用plot命令;显示连续信号中的不连续点时用stairs命令较好;绘制离散信号波形用stem命令;当绘制用MATLAB符号表达式表达的信号时要用ezplot命令。 3.卷积积分

信号的卷积是数学上的一种积分运算,两个信号的卷积定义为:

y(t)?f1(t)?f2(t)?????f1(?)f2(t??)d?

信号的卷积运算在系统分析中主要用于求解系统的零状态响应。一般情况,卷积积分的运算比较困难,但在MATLAB中则变得十分简单,MATLAB中是利用conv函数来实现卷积的。

功能:实现两个函数f1(t)和f2(t)的卷积。

格式:g=conv(f1,f2)

说明:f1=f1(t),f2=f2(t) 表示两个函数,g=g(t)表示两个函数的卷积结果。 例题:已知两信号f1(t)??(t?1)??(t?2), f2(t)??(t?2)??(t?3),求卷积g(t)?f1(t)?f2(t)。 MATLAB程序如下:

t1=1:0.01:2; t2=2:0.01:3;

t3=3:0.01:5; %两信号卷积结果自变量t区间应为:[两信号起始时刻之%和~两信号

终止时刻之和]请自行推导该结论

f1=ones(size(t1)); %高度为一的门函数,时间从t=1到t=2 f2=ones(size(t2)); %高度为一的门函数,时间从t=2到t=3 g=conv(f1,f2); %对f1和f2进行卷积 subplot(3,1,1),plot(t1,f1); %画f1的波形

7

subplot(3,1,2),plot(t2,f2); %画f2的波形 subplot(3,1,3),plot(t3,g); % grid on; 画g的波形

三、信号的时域变换

信号的时域变换包括信号的平移、反折、倒相及信号的尺度变换。我们就分别介绍连续时间信号和离散时间信号的各种时域变换[11]。 1、连续信号的时域变换

MATLAB可以有两种方法来表示连续信号。用这两种方法均可实现连续信号的时域变换,但用符号运算的方法则较为简便。 (1)移位

对于连续信号f(t),若有常数t0>0,延时信号f(t-t0)是将原信号沿正t轴方向平移时间t0,而f(t+t0)是将原信号沿负t轴方向移动时间t0。我们可用下面的命令来实现连续信号的平移及其结果可视化,其中f是用符号表达式表示的连续时间信号,t是符号变量,subs命令则将连续信号中的时间变量t用t-t0替换:

y=subs(f,t,t-t0); ezplot(y) (2)反折

连续信号的反折,是指将信号以纵坐标为轴反折,即将信号f(t)中的自变量t换为-t。实现如下:

y=subs(f,t,-t); ezplot(y) (3)尺度变换

连续信号的尺度变换,是指将信号的横坐标进行展宽或压缩变换,即将信号f(t)中的自变量t换为at,当a>1时,信号f(at)以原点为基准,沿横轴压缩到原来的1/a;当0

y=subs(f,t,*t); ezplot(y) (4)倒相

8

连续信号的倒相是指将信号f(t)以横轴为对称轴对折得到-f(t)。实现如下: y=-f; ezplot(y)

对于以上的命令,可在画图命令之后加入坐标轴的调整的命令(即加入axis( )命令),以使画出的图形更清晰、直观。 2、离散时间序列的时域变换

与连续信号不同的是,在MATLAB中,离散序列的时域变换不能用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的变换需表示成两个向量的变换。 (1)离散序列反折

离散序列的反折,即是将表示离散序列的两向量以零时刻的取值为基准点,以纵轴为对称轴反折,向量的反折可用MATLABA中的fliplr函数来实现,具体实现如下:

function [f,k]=lsfz(f1,k1)

f=fliplr(f1);k=-fliplr(k1); %调用此函数实现向量f1和k1的反折 stem(k,f,’filled’)

axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5]) (2)离散序列的平移

离散序列的平移可看作是将离散序列的时间序号向量平移,而表示对应时间序号点的序列样值不变,当序列向左移动k0个单位时,所以时间序号向量都减小k0个单位,反之则增加k0个单位。实现如下:

function [f,k]=lsyw(ff,kk,k0) k=kk+k0;f=ff; stem(k,f,’filled’)

axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5]) (3)离散序列的倒相

离散序列的倒相可看作是将表示序列样值的向量取反,而对应的时间序号向量不变,得到的离散时间序列。实现如下:

function [f,k]=lsdx(ff,kk)

9

f=-ff; k=kk;

stem(k,f,’filled’)

axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5])

这些时域变换,我们可以把我们在第一节中描述过的信号带入其中,来看看信号时域变换的结果如何。除此以外,我们通过时域变换也可以锻炼我们描述信号的能力,一些复杂信号,往往都是一些简单信号经过一系列的时域变换得到。

三、实验内容

1.分别用MATLAB的向量表示法和符号运算功能,表示并绘出下列连续时间信号的波形: ⑴ f(t)?(2?e?2t)?(t) ⑵ f(t)?cos(?t2)??(t)??(t?4)?

⑶ f(t)?etcos(t)?(t) ⑷ f(t)?2 3t?(t?2)2.分别用MATLAB表示并绘出下列离散时间信号的波形: ⑴ f(k)???1 f(t)?k??(k)??(k?8)? 2??(k) ⑵ ⑶ f(k)?sin(k?)?(k) ⑷ f(k)??(?k?2) 4k3.已知信号f(t)的波形如下图所示,试用MATLAB绘出满足下列要求的信号波形。

⑴ f(?t)

⑵ f(t?2)

⑶ f(at) (其中a的值分别为a=0.5和a=2)

? 1 )⑷ f(0.t5

4.已知两信号f1(t)??(t?1)??(t),f2(t)??(t)??(t?1),求卷积积分g(t)?f1(t)?f2(t),并与例题比较。

?te?t?(t)5.已知两信号f1(t)?t?(t),f2(t)??t?et?0t?0 ,求卷积积分g(t)?f1(t)?f2(t)。

6.已知f1(k)??1,1,1,2?,f2(k)??1,2,3,4,5?,求两序列的卷积和 。

10

实验二 LTI系统的响应

一、 实验目的

1. 熟悉连续时间系统的单位冲激响应、阶跃响应的意义及求解方法 2. 熟悉连续(离散)时间系统在任意信号激励下响应的求解方法 3. 熟悉应用MATLAB实现求解系统响应的方法 二、 实验原理 1.连续时间系统

对于连续的LTI系统,当系统输入为f(t),输出为y(t),则输入与输出之间满足如下的线性常系数微分方程:?aiy(t)??bjf(j)(t),当系统输入为单位冲激信号δ(t)时产生的零

(i)i?0j?0nm状态响应称为系统的单位冲激响应,用h(t)表示。若输入为单位阶跃信号ε(t)时,系统产生的零状态响应则称为系统的单位阶跃响应,记为g(t),如下图所示。

系统的单位冲激响应h(t)包含了系统的固有特性,它是由系统本身的结构及参数所决定的,与系统的输入无关。我们只要知道了系统的冲激响应,即可求得系统在不同激励下产生的响应。因此,求解系统的冲激响应h(t)对我们进行连续系统的分析具有非常重要的意义。

在MATLAB中有专门用于求解连续系统冲激响应和阶跃响应, 并绘制其时域波形的函数impulse( ) 和step( )。如果系统输入为f(t),冲激响应为h(t),系统的零状态响应为y(t),则有:y(t)?h(t)?f(t)。

若已知系统的输入信号及初始状态,我们便可以用微分方程的经典时域求解方法,求出系统的响应。但是对于高阶系统,手工计算这一问题的过程非常困难和繁琐。

在MATLAB中,应用lsim( )函数很容易就能对上述微分方程所描述的系统的响应进行仿真,求出系统在任意激励信号作用下的响应。lsim( )函数不仅能够求出连续系统在指定的任意时间范围内系统响应的数值解,而且还能同时绘制出系统响应的时域波形图。 以上各函数的调用格式如下: ⑴ impulse( ) 函数

函数impulse( )将绘制出由向量a和b所表示的连续系统在指定时间范围内的单位冲激响应h(t)的时域波形图,并能求出指定时间范围内冲激响应的数值解。

? impulse(b,a) 以默认方式绘出由向量a和b所定义的连续系统的冲激响应的时域波形。

? impulse(b,a ,t0) 绘出由向量a和b所定义的连续系统在0 ~ t0时间范围内冲激响应的时域波形。

11

? impulse(b,a,t1:p:t2) 绘出由向量a和b所定义的连续系统在t1 ~ t2时间范围内,并且以时间间隔p均匀取样的冲激响应的时域波形。

? y=impulse(b,a,t1:p:t2) 只求出由向量a和b所定义的连续系统在t1 ~ t2时间范围内,并且以时间间隔p均匀取样的冲激响应的数值解,但不绘出其相应波形。 ⑵ step( ) 函数

函数step( )将绘制出由向量a和b所表示的连续系统的阶跃响应,在指定的时间范围内的波形图,并且求出数值解。和impulse( )函数一样,step( )也有如下四种调用格式:

step( b,a) step(b,a,t0) step(b,a,t1:p:t2) y=step(b,a,t1:p:t2)

上述调用格式的功能和impulse( )函数完全相同,所不同只是所绘制(求解)的是系统的阶跃响应g(t),而不是冲激响应h(t)。 ⑶ lsim( )函数

根据系统有无初始状态,lsim( )函数有如下两种调用格式:

①系统无初态时,调用lsim( )函数可求出系统的零状态响应,其格式如下:

? lsim(b,a,x,t) 绘出由向量a和b所定义的连续系统在输入为x和t所定义的信号时,系统零状态响应的时域仿真波形,且时间范围与输入信号相同。其中x和t是表示输入信号的行向量,t为表示输入信号时间范围的向量,x则是输入信号对应于向量t所定义的时间点上的取样值。

? y=lsim(b,a,x,t) 与前面的impulse 和step函数类似,该调用格式并不绘制出系统的零状态响应曲线,而只是求出与向量t定义的时间范围相一致的系统零状态响应的数值解。 ②系统有初始状态时,调用lsim( )函数可求出系统的全响应,格式如下:

? lsim(A,B,C,D,e,t,X0) 绘出由系数矩阵A,B,C,D所定义的连续时间系统在输入为e和t所定义的信号时,系统输出函数的全响应的时域仿真波形。t为表示输入信号时间范围的向量,e则是输入信号e(t)对应于向量t所定义的时间点上的取样值,X0表示系统状态变量X=[x1,x2,…..xn]'在t=0时刻的初值。

? [Y,X]= lsim(A,B,C,D,e,t,X0) 不绘出全响应波形,而只是求出与向量t定义的时间范围相一致的系统输出向量Y的全响应以及状态变量X的数值解。

显然,函数lsim( )对系统响应进行仿真的效果取决于向量t的时间间隔的密集程度,t的取样时间间隔越小则响应曲线越光滑,仿真效果也越好。 说明:

(1)当系统有初始状态时,若使用lsim( )函数求系统的全响应,就要使用系统的状态空间描述法,即首先要根据系统给定的方式,写出描述系统的状态方程和输出方程。假如系统原来给定的是微分方程或系统函数,则可用相变量法或对角线变量等方法写出系统的状态方程和输出方程。其转换原理如前面实验四所述。

(2)显然利用lsim( )函数不仅可以分析单输入单输出系统,还可以分析复杂的多输入多输出系统。

12

例题1: 若某连续系统的输入为e(t),输出为r(t),系统的微分方程为:

y''(t)?5y'(t)?6y(t)?3f'(t)?2f(t) ①求该系统的单位冲激响应h(t)及其单位阶跃响应g(t)。 ②若f(t)?e?2t?(t) 求出系统的零状态响应y(t)

分析: ① 求冲激响应及阶跃响应的MATLAB程序:

a=[1 5 6];b=[3 2]; subplot(2,1,1), impulse(b,a,4) subplot(2,1,2), step(b,a,4) 运行结果如右:

② 求零状态响应的MATLAB程序:

a=[1 5 6];b=[3 2];

p1=0.01; %定义取样时间间隔为0.01 t1=0:p1:5; %定义时间范围 x1=exp(-2*t1); %定义输入信号

lsim(b,a,x1,t1), %对取样间隔为0.01时系统响应进行仿真 hold on; %保持图形窗口以便能在同一窗口中绘制多条曲线 p2=0.5; %定义取样间隔为0.5 t2=0:p2:5; %定义时间范围 x2=exp(-2*t2); %定义输入信号

lsim(b,a,x2,t2), hold off %对取样间隔为0.5时系统响应进行仿真并解除保持 运行结果如下:

例题2 已知一个过阻尼二阶系统的状态方程和输出方程分别为:

?01??0?x'(t)??X(t)?f(t) , r(t)=[0 1]X(t) 。 ?????2?3??2?若系统初始状态为X(0)=[4 -5]T , 求系统在f(t)?3e?4t?(t)作用下的全响应。 求全响应程序如下:

A=[0 1 ; -2 -3] ;B=[0 2]';C=[0 1];D=[0]; X0=[4 -5]'; %定义系统初始状态

13

t=0: 0.01:10;

E=[3*exp(-4*t).*ones(size(t))]'; %定义系统激励信号 [r , x]=lsim(A,B,C,D,E,t,X0); %求出系统全响应的数值解 plot(t,r) %绘制系统全响应波形 运行结果如右。 2.离散时间系统

LTI离散系统中,其输入和输出的关系由差分方程描述:

?ay(k?i)??bii?0j?0nmjf(k?j) (前向差分方程)

?ay(k?i)??bii?0j?0nmjf(k?n?j) (后向差分方程)

当系统的输入为单位序列δ(k)时产生的零状态响应称为系统的单位函数响应,用h(k)表示。当输入为 ε(k)时产生的零状态响应称为系统的单位阶跃应,记为:g(k),如下图所示。

y(k)?h(k)?f(k)。如果系统输入为e(k),冲激响应为h(k),系统的零状态响应为y(k),则有:

与连续系统的单位冲激响应h(t)相类似,离散系统的单位函数响应h(k)也包含了系统的固有特性,与输入序列无关。我们只要知道了系统的单位函数响应,即可求得系统在不同激励信号作用下产生的响应。因此,求解系统的单位函数响应h(k)对我们进行离散系统的分析也同样具有非常重要的意义。

MATLAB中为用户提供了专门用于求解离散系统单位函数响应, 并绘制其时域波形的函数impz( )。同样也提供了求离散系统响应的专用函数filter( ),该函数能求出由差分方程所描述的离散系统在指定时间范围内的输入序列作用时,产生的响应序列的数值解。当系统初值不为零时,可以使用dlsim( )函数求出离散系统的全响应,其调用方法与前面连续系统的lsim( )函数相似。另外,求解离散系统阶跃响应可以通过如下两种方法实现:一种是直接调用专用函数dstep( ),其调用方法与求解连续系统阶跃响应的专用函数step( )的调用方法相似;另一种方法是利用求解离散系统零状态响应的专用函数filter( ),只要将其中的激励信号看成是单位阶跃信号ε(k)即可。 函数的调用格式分别如下: ⑴ impz( )函数

? impz(b,a) 以默认方式绘出由向量a和b所定义的离散系统单位函数响应的时域波形。

? impz(b,a,n) 绘出由向量a和b所定义的离散系统在0 ~ n (n必须为整数)的离散时间范围内单位函数响应的时域波形。

? impz(b,a,n1:n2) 绘出由向量a和b所定义的离散系统在n1 ~ n2 (n1、n2必须为整数)的离散时间范围内单位函数响应的时域波形。

14

? y=impz(b,a,n1:n2) 求出由向量a和b所定义的离散系统在n1 ~ n2 (n1、n2必须为整数)的离散时间范围内单位函数响应的数值解,但不绘出波形。 ⑵ filter( ) 函数

? filter(b,a,x) 其中a和b与前面相同,x是包含输入序列非零样值点的的行向量。此命令将求出系统在与x的取样时间点相同的输出序列样值。

例题:已知描述离散系统的差分方程为:y(k)?0.25y(k?1)?0.5y(k?2)?f(k)?f(k?1),且

k已知系统输入序列为f(k)?(1, )2?(k)① 求出系统的单位函数响应h(k)在-3 ~10离散时间范围内响应波形。

② 求出系统零状态响应在0 ~15区间上的样值;并画出输入序列的时域波形以及系统零状态响应的波形

分析:①求系统的单位函数响应的MATLAB程序:

a=[1,-0.25,0.5]; b=[1,1,0];

impz(b,a,-3:10), title('单位响应') %绘出单位函数响应在-3 ~10区间上的波形 运行结果如图a。

②求零状态响应的MATLAB程序:

a=[1,-0.25,0.5];b=[1,1,0]

k=0:15; %定义输入序列取值范围 x=(1/2).^k; %定义输入序列表达式 y=filter(b,a,x) %求解零状态响应样值 subplot(2,1,1),stem(k,x) %绘制输入序列的波形 title('输入序列')

subplot(2,1,2),stem(k,y) %绘制零状态响应的波形 title('输出序列')

运行结果如下:

y =

Columns 1 through 10

1.0000 1.7500 0.6875 -0.3281 -0.2383 0.1982 0.2156 -0.0218 -0.1015 -0.0086 Columns 11 through 16

0.0515 0.0187 -0.0204 -0.0141 0.0069 0.0088

15

图a. ①运行结果 图b. ②运

行结果 三、 实验内容

1. 已知描述系统的微分方程和激励信号e(t) 分别如下,试用解析方法求系统的单位冲激响应h(t)和零状态响应r(t),并用MATLAB绘出系统单位冲激响应和系统零状态响应的波形,验证结果是否相同。

①y''(t)?4y'(t)?4y(t)?f'(t)?3f(t);f(t)?e?t?(t) ②y''(t)?2y'(t)?26y(t)?f'(t);f(t)??(t)

③y''(t)?4y'(t)?3y(t)?f(t);f(t)?e?2t?(t) ④如下图所示的电路中,已知R1?R2?R3?4(?),L1?L2?1(H),且两电感上初始电流分别为i1(0)?2(A),i2(0)?0(A),如果以电阻R3上电压y(t)作为系统输出,请求出系统在激励

f(t)?12?(t)(v)作用下的全响应。

2. 请用MATLAB分别求出下列差分方程所描述的离散系统,在0~20时间范围内的单位函数响应、阶跃响应和系统零状态响应的数值解,并绘出其波形。另外,请将理论值与MATLAB仿真结果在对应点上的值作比较,并说出两者的区别和产生误差的原因。 ① y(k)?2y(k?1)?y(k?2)?f(k);f(k)?1 4?(k)② y(k?2)?0.7y(k?1)?0.1y(k)?7f(k?2)?2f(k?1);f(k)??(k)

1③ y(k)?5;f(k)??(k) 6y(k?1)?6y(k?2)?f(k)?f(k?2)④一带通滤波器可由下列差分方程描述:y(k)?0.81y(k?2)?f(k)?f(k?2), 其中f(k)为系统输入, y(k)为系统输出。请求出当激励为f(k)??10?10cos(kn/2)?10cos(kn)??(k)(选取适当的n值)时滤波器的稳态输出。

16

附录一 MATLAB环境

表1.1 命令窗口中行编辑的常用操作键

键名 ↑ ↓ ← → PageUp Page Down 令行 向后调回已输入过的命End 令行 在当前行中左移光标 在当前行中右移光标 内容 向后翻阅当前窗口中的CTRL+C 内容 表1.2 MATLAB常用标点符号的功能

名称 空格 逗号 点号 分号 冒号 百分号 单引号 圆括号 方括号 花括号 下划线 续行号 , . ; : % ‘ ’ ( ) [ ] { } - ? 符号 功能 用于输入变量之间的分隔符以及数组行元素之间的分隔符。 用于要显示计算结果的命令之间的分隔符;用于输入变量之间的分隔符;用于数组行元素之间的分隔符。 用于数值中的小数点。 用于不显示计算结果命令行的结尾;用于不显示计算结果命令之间的分隔符;用于数组元素行之间的分隔符。 用于生成一维数值数组,表示一维数组的全部元素或多维数组的某一维的全部元素。 用于注释的前面,在它后面的命令不需要执行。 用于括住字符串。 用于引用数组元素;用于函数输入变量列表;用于确定算术运算的先后次序。 用于构成向量和矩阵;用于函数输出列表。 用于构成元胞数组。 用于一个变量、函数或文件名中的连字符。 用于把后面的行与该行连接以构成一个较长的命令。 中断MATLAB命令的运行 Delete 删去光标右边的字符 清除当前行的全部内容 Backspace 删去光标左边的字符 使光标移到当前行的末尾 作用 键名 作用 使光标移到当前行的开头 向前调回已输入过的命Home 向前翻阅当前窗口中的Esc 注意:以上的符号一定要在英文状态下输入,因为MATLAB不能识别中文标点符号。 ? clc:用于清空命令窗口中的显示内容。

表1.3 数据显示的Format格式

命令格式 含义 17

例子

format format short(默认) 通常保证小数点后四位有效;大314.159显示为314.1590 于1000的实数,用5位有效数字3141.59的科学计数法显示 显示为3.1416e+003 π显示为3.1416e+000 format short e 5位科学计数法表示 自动选择最佳计数方式 format long format long e 命令格式 format long g format rat format hex format + format bank format compact format loose 15位数字表示 15位科学计数法表示 含义 自动选择最佳计数方式 近似有理数表示 十六进制表示 format short g 从format short和format short e中π显示为3.1416 ππ例子 显示为3.1415926358979 π显示为355/113 π显示为400921fb54442dl8 正数、负数、零分别用+、-、π显示为+ 空格 表示(金融)元、角、分 格式 在显示结果之间有空行的稀疏格式 表1.4 特殊变量表

特殊变量 ans pi eps flops inf NaN或nan 取值 运算结果的默认变量名 圆周率π 计算机的最小数 浮点运算数 无穷大,如1/0 特殊变量 i或 j nargin nargout realmin realmax 取值 i=j=目 函数的输出变量数目 最小的可用正实数 最大的可用正实数 函数的输入变量数 π显示为3.14 在显示结果之间没有空行的压缩 显显示示为为3.14159265358979 3.141592653589793e+000 从format long和format long e中π非数,如0/0、∞/∞、0×∞ Matlab脚本文件和函数文件

M文件有两种形式:M脚本文件和M函数文件。 M函数文件的基本格式:

函数声明行

18

H1行(用%开头的注释行) 在线帮助文本(用%开头) 编写和修改记录(用%开头) 函数体

函数文件的特点:

(1) 第一行总是以“function”引导的函数声明行; 函数声明行的格式:

function [输出变量列表] = 函数名(输入变量列表)

(2) 函数文件在运行过程中产生的变量都存放在函数本身的工作空间;

(3) 当文件执行完最后一条命令或遇到“return”命令时,就结束函数文件的运行,同时函数工作空间的变量就被清除;

(4) 函数的工作空间随具体的M函数文件调用而产生,随调用结束而删除,是独立的、临时的,在MATLAB运行过程中可以产生任意多个临时的函数空间。

19

附录六 信号与系统分析常用函数 1.传递函数描述法

MATLAB中使用tf命令来建立传递函数。 语法:

G=tf(num,den)

%由传递函数分子分母得出

说明:num为分子向量,num=[b1,b2,…,bm,bm+1];den为分母向量,den=[a1,a2,…,an-1,an]。 2.零极点描述法

MATLAB中使用zpk命令可以来实现由零极点得到传递函数模型。 语法:

G=zpk(z,p,k)

%由零点、极点和增益获得

说明:z为零点列向量;p为极点列向量;k为增益。 部分分式法是将传递函数表示成部分分式或留数形式:

G(s)?r1rr?2???n?k(s) s?p1s?p2s?pn线性系统模型转换函数表

函数 调用格式 tf2ss [a,b,c,d]=tf2ss(num,den) 功能 传递函数转换为状态空间 tf2zp [z,p,k]=tf2zp(num,den) 传递函数转换为零极点描述 ss2tf [num,den]=ss2tf(a,b,c,d,iu) 状态空间转换为传递函数 ss2zp [z,p,k]=ss2zp(a,b,c,d,iu) 状态空间转换为零极点描述 zp2ss [a,b,c,d]=zp2ss(z,p,k) 零极点描述转换为状态空间 zp2tf [num,den]=zp2tf(z,p,k) 30

零极点描述转换为传

递函数

3.零输入响应分析

1. 连续系统的零输入响应

MATLAB中使用initial命令来计算和显示连续系统的零输入响应。 语法:

initial(G,x0, Ts)

%绘制系统的零输入响应曲线 %绘制系统多个系统的零输入响应曲线 %得出零输入响应、时间和状态变量响应

initial(G1,G2,…,x0, Ts) [y,t,x]=initial(G,x0, Ts)

说明:G为系统模型,必须是状态空间模型;x0是初始条件;Ts为时间点,如果是标量则为终止时间,如果是数组,则为计算的时刻,可省略;y为输出响应;t为时间向量,可省略;x为状态变量响应,可省略。

2. 离散系统的零输入响应

离散系统的零输入响应使用dinitial命令实现。 语法:

dinitial(a,b,c,d,x0)

%绘制离散系统零输入响应 %得出离散系统n点的零输入响应

y= dinitial (a,b,c,d,x0)

%得出离散系统的零输入响应

[y,x,n]= dinitial (a,b,c,d,x0)

说明:a、b、c、d为状态空间的系数矩阵;x0为初始条件;y为输出响应;t为时间向量;x为状态变量响应;n为点数。

3 连续系统的脉冲响应

连续系统的脉冲响应由impluse命令来得出。 语法:

impulse(G, Ts)

%绘制系统的脉冲响应曲线

[y,t,x]=impulse(G, Ts)

%得出脉冲响应

说明:G为系统模型,可以是传递函数、状态方程、零极点增益的形式;y为时间响应;t为时间向量;x为状态变量响应,t和x可省略;Ts为时间点可省略。

4. 离散系统的脉冲响应

离散系统的脉冲响应使用dimpulse命令实现。 语法:

dimpluse(a,b,c,d,iu)

%绘制离散系统脉冲响应曲线 %得出n点离散系统的脉冲响应

%由传递函数得出n点离散系统的脉冲响应

[y,x]=dimpluse(a,b,c,d,iu,n)

[y,x]=dimpluse(num,den,iu,n)

说明:iu为第几个输入信号;n为要计算脉冲响应的点数;y的列数与n对应;x为状态变量,可省略。

31

5. 连续阶跃响应

阶跃响应可以用step命令来实现。 语法:

step(G, Ts)

%绘制系统的阶跃响应曲线

[y,t,x]=step(G, Ts) %得出阶跃响应

说明:参数设置与impulse命令相同。 6. 离散系统的阶跃响应

离散系统阶跃响应使用dstep命令来实现,语法规则与dimpluse相同。 7. 连续系统的任意输入响应

连续系统对任意输入的响应用lsim命令来实现。 语法:

lsim(G,U,Ts)

%绘制系统的任意响应曲线

%绘制多个系统任意响应曲线 %得出任意响应

lsim(G1,G2,…U,Ts) [y,t,x]=lsim(G,U,Ts)

说明:U为输入序列,每一列对应一个输入;Ts为时间点,U的行数和Ts相对应;参数t和x可省略。

8. 离散系统的任意输入响应

离散系统的任意输入响应用dlsim命令来实现。 语法: dlsim(a,b,c,d,U)

%绘制离散系统的任意响应曲线

[y,x]=dlsim(num,den,U) [y,x]=dlsim(a,b,c,d,U)

%得出离散系统任意响应和状态变量响应 %得出离散系统响应和状态变量响应

说明:U为任意序列输入信号。 4. 极点和零点

1. pole命令计算极点 语法:

p=pole(G)

说明:当系统有重极点时,计算结果不一定准确。 (2) tzero命令计算零点和增益 语法: z=tzero(G)

%得出连续和离散系统的零点

[z,gain]=tzero(G) %获得零点和零极点增益

说明:对于单输入单输出系统, tzero命令也用来计算零极点增益。 5.系统频域特性

频域特性由下式求出:

Gw=polyval(num,j*w)./polyval(den,j*w) mag=abs(Gw)

32

%幅频特性 %相频特性

pha=angle(Gw)

说明:j为虚部变量。 1. bode图

bode图是对数幅频和对数相频特性曲线。 语法:

bode(G,w)

%绘制bode图

[mag,pha]=bode(G,w) [mag,pha,w]=bode(G)

%得出w对应的幅值和相角 %得出幅值、相角和频率

说明:G为系统模型,w为频率向量,mag为系统的幅值,pha为系统的相角。 2. nyquist曲线

nyquist曲线是幅相频率特性曲线,使用nyquist命令绘制和计算。 语法:

nyquist (G,w)

%绘制nyquist曲线

%绘制多条nyquist曲线 %由w得出对应的实部和虚部 %得出实部、虚部和频率

nyquist (G1,G2,…w) [Re,Im]= nyquist (G,w) [Re,Im,w]= nyquist (G)

说明:G为系统模型;w为频率向量,也可以用{wmin,wmax}表示频率的范围;Re为频率特性的实部,Im为频率特性的虚部。

33

本文来源:https://www.bwwdw.com/article/wv7f.html

Top