1、Matlab专题训练

更新时间:2024-05-22 15:14: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,

%则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]); %绘制波形,并且设置坐标轴显示范围

运行结果如下:

图1-3

⑶ 常见信号的MATLAB表示

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

符号数学函数:δ(t)=dirac(t) 数值函数:t=t0:te; δ=(t==0) 单位阶跃信号

单位阶跃信号的定义为:?(t)???1?0t?0 ,单位阶跃信号是信号分析的基本信号之t?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范围之间的波形

运行结果如下:

方法二:数值计算法

t=ti:te;ut=(t>=0);

在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) %绘制门函数的波形

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

运行结果如下:

符号函数

?1符号函数的定义为:sgn(t)????1t?0 t?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]) %定义坐标轴显示范围

② 求零状态响应的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)??2?f(t) , r(t)=[0 1]X(t) 。

?2?3????若系统初始状态为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]'; %定义系统初始状态 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),如下图所示。

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

y(k)?h(k)?f(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必须为整数)的离散时间范围内单位函数响应的时域波形。 ? 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 图a. ①运行结果 图b. ②运行结果

三、 实验内容

1. 已知描述系统的微分方程和激励信号e(t) 分别如下,试用解析方法求系统的单位冲激响

应h(t)和零状态响应r(t),并用MATLAB绘出系统单位冲激响应和系统零状态响应的波形,验证结果是否相同。

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

②y''(t)?2y'(t)?26y(t)?f'(t);f(t)??(t)

?2t③y''(t)?4y'(t)?3y(t)?f(t);f(t)?e?(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)?14?(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值)

四、 预习要求

1.熟悉系统响应的求解方法

2.了解MATLAB语言中关于系统分析的各个函数如:impulse、step、lsim、impz、filter等函数的调用方法:

五、实验报告要求

1.理论上计算出系统的单位冲激响应/单位函数响应、阶跃响应、零状态响应、全响应的表达式,并写出解题过程。

2.记录仿真结果(包括数据和波形)。 3.写出程序清单。 4.实验总结(收获及体会)

实验四 连续时间信号的频域分析

一、 实验目的

1.熟悉傅里叶变换的性质 2.熟悉常见信号的傅里叶变换

3.了解傅里叶变换的MATLAB实现方法

二、 实验原理

傅里叶变换是信号分析 的最重要的内容之一。从已知信号f(t)求出相应的频谱函数

F(j?)的数学表示为:

F(j?)?????f(t)e?j?tdt

f(t)的傅里叶变换存在的充分条件是f(t)在无限区间内绝对可积,即f(t)满足下式:

????f(t)dt??

但上式并非傅里叶变换存在的必要条件。在引入广义函数概念之后,使一些不满足绝对可积条件的函数也能进行傅里叶变换。 傅里叶反变换的定义为:f(t)?12?????F(j?)ej?td?。

在这一部分的学习中,大家都体会到了这种数学运算的麻烦。在MATLAB语言中有专门对信号进行正反傅里叶变换的语句,使得傅里叶变换很容易在MATLAB中实现。在MATLAB中实现傅里叶变换的方法有两种,一种是利用MATLAB中的Symbolic Math Toolbox提供的专用函数直接求解函数的傅里叶变换和傅里叶反变换,另一种是傅里叶变换的数值计算实现法。下面分别介绍这两种实现方法的原理。 1.直接调用专用函数法(符号数学法求解) ①在MATLAB中实现傅里叶变换的函数为: ? F=fourier( f ) 对f(t)进行傅里叶变换,其结果为F(w) ? F=fourier(f,v) 对f(t)进行傅里叶变换,其结果为F(v) ? F=fourier( f,u,v ) 对f(u)进行傅里叶变换,其结果为F(v) ②傅里叶反变换 ? f=ifourier( F ) 对F(w)进行傅里叶反变换,其结果为f(x) ? f=ifourier(F,U) 对F(w)进行傅里叶反变换,其结果为f(u) ? f=ifourier( F,v,u ) 对F(v)进行傅里叶反变换,其结果为f(u) 由于MATLAB中函数类型非常丰富,要想了解函数的意义和用法,可以用mhelp命令。如在命令窗口键入:mhelp fourier回车,则会得到fourier的意义和用法。 注意:

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

Top