信号与系统MATLAB实验.docx
《信号与系统MATLAB实验.docx》由会员分享,可在线阅读,更多相关《信号与系统MATLAB实验.docx(45页珍藏版)》请在冰豆网上搜索。
信号与系统MATLAB实验
2016-2017学年第一学期
信号与系统实验报告
班级:
姓名:
学号:
成绩:
指导教师:
实验一常见信号的MATLAB表示及运算
一.实验目的
1.熟悉常见信号的意义、特性及波形
2.学会使用MATLAB表示信号的方法并绘制信号波形
3.掌握使用MATLAB进行信号基本运算的指令
4.熟悉用MATLAB实现卷积积分的方法
二.实验原理
信号一般是随时间而变化的某些物理量。
按照自变量的取值是否连续,信号分为连续时间信号和离散时间信号,一般用
和
来表示。
若对信号进行时域分析,就需要绘制其波形,如果信号比较复杂,则手工绘制波形就变得很困难,且难以精确。
MATLAB强大的图形处理功能及符号运算功能,为实现信号的可视化及其时域分析提供了强有力的工具。
根据MATLAB的数值计算功能和符号运算功能,在MATLAB中,信号有两种表示方法,一种是用向量来表示,另一种则是用符号运算的方法。
在采用适当的MATLAB语句表示出信号后,就可以利用MATLAB中的绘图命令绘制出直观的信号波形了。
下面分别介绍连续时间信号和离散时间信号的MATLAB表示及其波形绘制方法。
1.连续时间信号
所谓连续时间信号,是指其自变量的取值是连续的,并且除了若干不连续的点外,对于一切自变量的取值,信号都有确定的值与之对应。
从严格意义上讲,MATLAB并不能处理连续信号。
在MATLAB中,是用连续信号在等时间间隔点上的样值来近似表示的,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号。
在MATLAB中连续信号可用向量或符号运算功能来表示。
⑴向量表示法
对于连续时间信号
,可以用两个行向量f和t来表示,其中向量t是用形如
的命令定义的时间范围向量,其中,
为信号起始时间,
为终止时间,p为时间间隔。
向量f为连续信号
在向量t所定义的时间点上的样值。
说明:
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()等函数来绘出信号的波形。
⑶常见信号的MATLAB表示
对于普通的信号,应用以上介绍的两种方法即可完成计算函数值或绘制波形,但是对于一些比较特殊的信号,比如单位阶跃信号(t)、符号函数sgn(t)等,在MATLAB中这些信号都有专门的表示方法。
单位阶跃信号
单位阶跃信号的定义为:
,单位阶跃信号是信号分析的基本信号之一,在信号与系统分析中有着非常重要的作用,通常,我们用它来表示信号的定义域,简化信号的时域表示形式。
例如:
可以用两个不同延时的单位阶跃信号来表示一个矩形门信号,即:
在MATLAB中,可通过多种方法得到单位阶跃信号,下面分别介绍。
方法一:
调用Heaviside(t)函数
在MATLAB的SymbolicMathToolbox中,有专门用于表示单位阶跃信号的函数,即Heaviside(t)函数,用它即可方便地表示出单位阶跃信号以及延时的单位阶跃信号,并且可以方便地参加有关的各种运算过程。
首先定义函数Heaviside(t)的m函数文件,该文件名应与函数名同名即Heaviside.m。
%定义函数文件,函数名为Heaviside,输入变量为x,输出变量为y
functiony=Heaviside(t)
y=(t>0);%定义函数体,即函数所执行指令
%此处定义t>0时y=1,t<=0时y=0,注意与实际阶跃信号定义的区别。
方法二:
数值计算法
在MATLAB中,有一个专门用于表示单位阶跃信号的函数,即stepfun()函数,它是用数值计算法表示的单位阶跃函数
。
其调用格式为:
stepfun(t,t0)
其中,t是以向量形式表示的变量,t0表示信号发生突变的时刻,在t0以前,函数值小于零,t0以后函数值大于零。
有趣的是它同时还可以表示单位阶跃序列
,这只要将自变量以及取样间隔设定为整数即可。
有关单位阶跃序列
的表示方法,我们后面有专门论述,下面通过一个例子来说明如何调用stepfun()函数来表示单位阶跃函数。
符号函数
符号函数的定义为:
在MATLAB中有专门用于表示符号函数的函数sign(),由于单位阶跃信号(t)和符号函数两者之间存在以下关系:
,因此,利用这个函数就可以很容易地生成单位阶跃信号。
下面举个例子来说明如何利用sign()函数生成单位阶跃信号,并同时绘制其波形。
2.离散时间信号
离散时间信号又叫离散时间序列,一般用
表示,其中变量k为整数,代表离散的采样时间点(采样次数)。
三.实验内容
1.分别用MATLAB的向量表示法和符号运算功能,表示并绘出下列连续时间信号的波形:
(2)
symst;
f=sym('cos(t)*pi*t/2*[heaviside(t)-heaviside(t-4)]');
ezplot(f,[-2,8]);
(4)
symst;
f=sym('2/3*t*heaviside(t+2)');
ezplot(f,[-4,8]);
2.分别用MATLAB表示并绘出下列离散时间信号的波形:
(2)
t=0:
8;
t1=-10:
15;
f=[zeros(1,10),t,zeros(1,7)];
stem(t1,f)
axis([-10,15,0,10])
(4)
t=-20:
10;
f=[ones(1,23),zeros(1,8)];
stem(t,f)
stem(t,f)
3.已知信号f(t)的波形如下图所示,试用MATLAB绘出满足下列要求的信号波形。
(2)
t=-1:
0.01:
4;
t0=0;
t1=1;
t2=2;
ut=2*stepfun(t,t0)-2*stepfun(t,t1)+stepfun(t,t1)-stepfun(t,t2);
plot(t-2,ut)
axis([-3,2,0,3])
(4)
t=-1:
0.01:
4;
t0=0;t1=1;t2=2;
ut=2*stepfun(t,t0)-2*stepfun(t,t1)+stepfun(t,t1)-stepfun(t,t2);
plot(0.5*t+1,ut)
axis([-1,2,0,4])
4.已知两信号
,
,求卷积积分
,并与例题比较。
程序清单:
t1=-1:
0.01:
0;
t2=0:
0.01:
1;
t3=3:
0.01:
5;
f1=ones(size(t1));
f2=ones(size(t2));
g=conv(f1,f2);
plot(t3,g)
信号波形:
5.已知两信号
,
,求卷积积分
。
程序代码:
t1=0:
0.01:
5;t2=-5:
0.01:
5;
t3=-5:
0.01:
10;
f1=t1;
f2=exp(t2).*(t2<0)+t2.*exp(-t2).*(t2>=0);
g=conv(f1,f2);
plot(t3,g);
运行结果截图:
6.已知
,求两序列的卷积和。
程序清单:
f1=[1,1,1,2,0];
f2=[1,2,3,4,5];
f=conv(f1,f2);
x=0:
8;
stem(x,f,'filled')
信号波形:
实验二 LTI系统的响应
一、实验目的
1. 熟悉连续时间系统的单位冲激响应、阶跃响应的意义及求解方法
2. 熟悉连续(离散)时间系统在任意信号激励下响应的求解方法
3. 熟悉应用MATLAB实现求解系统响应的方法
二、实验原理
1.连续时间系统
对于连续的LTI系统,当系统输入为f(t),输出为y(t),则输入与输出之间满足如下的线性常系数微分方程:
,当系统输入为单位冲激信号δ(t)时产生的零状态响应称为系统的单位冲激响应,用h(t)表示。
若输入为单位阶跃信号ε(t)时,系统产生的零状态响应则称为系统的单位阶跃响应,记为g(t),如下图所示。
系统的单位冲激响应h(t)包含了系统的固有特性,它是由系统本身的结构及参数所决定的,与系统的输入无关。
我们只要知道了系统的冲激响应,即可求得系统在不同激励下产生的响应。
因此,求解系统的冲激响应h(t)对我们进行连续系统的分析具有非常重要的意义。
在MATLAB中有专门用于求解连续系统冲激响应和阶跃响应,并绘制其时域波形的函数impulse()和step()。
如果系统输入为f(t),冲激响应为h(t),系统的零状态响应为y(t),则有:
。
若已知系统的输入信号及初始状态,我们便可以用微分方程的经典时域求解方法,求出系统的响应。
但是对于高阶系统,手工计算这一问题的过程非常困难和繁琐。
在MATLAB中,应用lsim()函数很容易就能对上述微分方程所描述的系统的响应进行仿真,求出系统在任意激励信号作用下的响应。
lsim()函数不仅能够求出连续系统在指定的任意时间范围内系统响应的数值解,而且还能同时绘制出系统响应的时域波形图。
2.离散时间系统
LTI离散系统中,其输入和输出的关系由差分方程描述:
(前向差分方程)
(后向差分方程)
当系统的输入为单位序列δ(k)时产生的零状态响应称为系统的单位函数响应,用h(k)表示。
当输入为ε(k)时产生的零状态响应称为系统的单位阶跃应,记为:
g(k),如下图所示。
如果系统输入为e(k),冲激响应为h(k),系统的零状态响应为y(k),则有:
。
与连续系统的单位冲激响应h(t)相类似,离散系统的单位函数响应h(k)也包含了系统的固有特性,与输入序列无关。
我们只要知道了系统的单位函数响应,即可求得系统在不同激励信号作用下产生的响应。
因此,求解系统的单位函数响应h(k)对我们进行离散系统的分析也同样具有非常重要的意义。
MATLAB中为用户提供了专门用于求解离散系统单位函数响应,并绘制其时域波形的函数impz()。
同样也提供了求离散系统响应的专用函数filter(),该函数能求出由差分方程所描述的离散系统在指定时间范围内的输入序列作用时,产生的响应序列的数值解。
当系统初值不为零时,可以使用dlsim()函数求出离散系统的全响应,其调用方法与前面连续系统的lsim()函数相似。
另外,求解离散系统阶跃响应可以通过如下两种方法实现:
一种是直接调用专用函数dstep(),其调用方法与求解连续系统阶跃响应的专用函数step()的调用方法相似;另一种方法是利用求解离散系统零状态响应的专用函数filter(),只要将其中的激励信号看成是单位阶跃信号ε(k)即可。
三、实验内容
1.已知描述系统的微分方程和激励信号e(t)分别如下,试用解析方法求系统的单位冲激响应h(t)和零状态响应r(t),并用MATLAB绘出系统单位冲激响应和系统零状态响应的波形,验证结果是否相同。
①
;
程序清单:
a=[144];b=[13];
impulse(b,a,10)
p=0.01;
t=0:
p:
10;
x=exp(-1*t);
y=filter(b,a,x)
subplot(2,1,1),impulse(b,a,10)
subplot(2,1,2),lsim(b,a,x,t)
②
;
单位冲激响应程序代码:
a=[1226];b=[1];
subplot(2,1,1),impulse(b,a,4)
subplot(2,1,2),step(b,a,4)
运行结果截图:
零状态响应程序代码:
a=[1226];b=[1];
p1=0.1;
t1=0:
p1:
10;
x1=t1;
lsim(b,a,x1,t1)
运行结果截图:
③
;
a=[143];b=[1];
p=0.01;
t=0:
p:
10;
x=exp(-2*t)
y=filter(b,a,x)
subplot(2,1,1),impulse(b,a,10)
subplot(2,1,2),lsim(b,a,x,t)
④如下图所示的电路中,已知
,
,且两电感上初始电流分别为
,如果以电阻
上电压
作为系统输出,请求出系统在激励
(v)作用下的全响应。
程序清单:
A=[-84;4-8];
B=[1;0];
C=[-44];D=[0];
x0=[2;0];
t=0:
0.01:
10;
E=[12.*ones(size(t))];
[r,x]=lsim(A,B,C,D,E,t,x0);
plot(t,r)
信号波形:
阶跃响应程序代码:
a=[1,-5/6,1/6];b=[1,0,-1];
k=0:
20;
x=heaviside(k);
y=filter(b,a,x)
subplot(2,1,1),stem(k,x)
title('输入序列')
subplot(2,1,2),stem(k,y)
title('输出序列')
运行结果截图:
④一带通滤波器可由下列差分方程描述:
,其中
为系统输入,
为系统输出。
请求出当激励
(选取适当的n值)时滤波器的稳态输出。
a=[1,0,81/100];
b=[1,0,-1];
k=0:
20;
x=(10+10.*cos(1/2.*k)+10.*cos(k));
y=filter(b,a,x)
subplot(3,1,1),impz(b,a,0:
20),
subplot(3,1,2),dstep(b,a,0:
20),
subplot(3,1,3),stem(k,y)
实验三 连续时间信号的频域分析
一、实验目的
1.熟悉傅里叶变换的性质
2.熟悉常见信号的傅里叶变换
3.了解傅里叶变换的MATLAB实现方法
二、实验原理
傅里叶变换是信号分析的最重要的内容之一。
从已知信号
求出相应的频谱函数
的数学表示为:
的傅里叶变换存在的充分条件是
在无限区间内绝对可积,即
满足下式:
但上式并非傅里叶变换存在的必要条件。
在引入广义函数概念之后,使一些不满足绝对可积条件的函数也能进行傅里叶变换。
傅里叶反变换的定义为:
。
在这一部分的学习中,大家都体会到了这种数学运算的麻烦。
在MATLAB语言中有专门对信号进行正反傅里叶变换的语句,使得傅里叶变换很容易在MATLAB中实现。
在MATLAB中实现傅里叶变换的方法有两种,一种是利用MATLAB中的SymbolicMathToolbox提供的专用函数直接求解函数的傅里叶变换和傅里叶反变换,另一种是傅里叶变换的数值计算实现法。
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命令。
如在命令窗口键入:
mhelpfourier回车,则会得到fourier的意义和用法。
注意:
(1)在调用函数fourier()及ifourier()之前,要用syms命令对所有需要用到的变量(如t,u,v,w)等进行说明,即要将这些变量说明成符号变量。
对fourier()中的f及ifourier()中的F也要用符号定义符sym将其说明为符号表达式。
(2)采用fourier()及fourier()得到的返回函数,仍然为符号表达式。
在对其作图时要用ezplot()函数,而不能用plot()函数。
(3)fourier()及fourier()函数的应用有很多局限性,如果在返回函数中含有δ(ω)等函数,则ezplot()函数也无法作出图来。
另外,在用fourier()函数对某些信号进行变换时,其返回函数如果包含一些不能直接表达的式子,则此时当然也就无法作图了。
这是fourier()函数的一个局限。
另一个局限是在很多场合,尽管原时间信号f(t)是连续的,但却不能表示成符号表达式,此时只能应用下面介绍的数值计算法来进行傅氏变换了,当然,大多数情况下,用数值计算法所求的频谱函数只是一种近似值。
三、实验内容
1.编程实现求下列信号的幅度频谱
(1)求出
的频谱函数F1(jω),请将它与上面门宽为2的门函数
的频谱进行比较,观察两者的特点,说明两者的关系。
f1(t)函数程序代码:
symstw;
Gt=sym('Heaviside(2*t+1)-Heaviside(2*t-1)');
Fw=fourier(Gt,t,w);
FFw=maple('convert',Fw,'piecewise');
FFP=abs(FFw);
ezplot(FFP,[-10*pi10*pi]);grid;
axis([-10*pi10*pi02.2]);
f1(t)函数图像:
门函数程序代码:
symstw;
Gt=sym('Heaviside(t+1)-Heaviside(t-1)');
Fw=fourier(Gt,t,w);
FFw=maple('convert',Fw,'piecewise');
FFP=abs(FFw);
ezplot(FFP,[-10*pi10*pi]);grid;
axis([-10*pi10*pi02.2]);
门函数图像:
(2)三角脉冲
程序清单:
f2(t)函数程序代码:
symstw
Gt=sym('(1+t)*(Heaviside(t+1)-Heaviside(t))+(1-t)*(Heaviside(t)-Heaviside(t-1))');
Fw=fourier(Gt,t,w);
FFw=maple('convert',Fw,'piecewise');
FFP=abs(FFw);
ezplot(FFP,[-10*pi10*pi]);grid;
axis([-10*pi10*pi02.2]);
f2(t)函数图像:
(3)单边指数信号
程序清单:
symstw
Gt=sym('exp(-1*t)*heaviside(t)');
Fw=fourier(Gt,t,w);
FFw=maple('convert',Fw,'piecewise');
FFP=abs(FFw);ezplot(FFP,[-7*pi7*pi]);grid;
axis([-7*pi7*pi01.2])
信号波形:
(4)高斯信号
程序清单:
symstw;Gt=exp(-t.^2);
Fw=fourier(Gt,t,w)
FFP=abs(Fw)
ezplot(Fw,[-3030]);grid;axis([-303002])
信号波形:
2.利用ifourier()函数求下列频谱函数的傅氏反变换
(1)
程序清单:
symstw
Fw=sym('(-j*2*w)/(16+w^2)');
ft=ifourier(Fw)
ft=ifourier(Fw,w,t);
运行结果:
ft=-j*exp(-4*abs(x))*sign(x)*1i
(2)
symstw
Fw=sym('((j*w)^2+5*j*w-8)/((j*w)^2+6*j*w+5)');
ft=ifourier(Fw)
ft=ifourier(Fw,w,t);
运行结果:
ft=(2*pi*dirac(x)+(pi*exp(-(x*1i)/j)*sign(imag(1/j))*3i)/j-(pi*exp(-(x*5i)/j)*sign(imag(1/j))*2i)/j-(pi*exp(-(x*1i)/j)*sign(x)*3i)/j+(pi*exp(-(x*5i)/j)*sign(x)*2i)/j)/(2*pi)
实验四 离散信号与系统的时域分析
一、实验目的
1.学会用MATLAB表示常用离散信号的方法;
2.学会用MATLAB实现离散信号卷积的方法;
3.学会用MATLAB求解离散系统的单位响应;
4.学会用MATLAB求解离散系统的零状态响应;
二、实验原理
1.离散信号的MATLAB表示
表示离散时间信号f(k)需要两个行向量,一个是表示序号k=[],一个是表示相应函数值f=[],画图命令是stem。
2.离散信号的卷积和
两个有限长序列f1,f2卷积可调用MATLAB函数conv,调用格式是f=conv(f1,f2),f是卷积结果,但不显示时间序号,可自编一个函数dconv给出f和k,并画图。
3.离散系统的单位响应
MATLAB提供画系统单位响应函数impz,调用格式是
impz(b,a)式中b和a是表示离散系统的行向量;
impz(b,a,n)式中b和a是表示离散系统的行向量,时间范围是0~n;
impz(b,a,n1,n2)时间范围是n1~n2;y=impz(b,a,n1,n2)由y给出数值序列;
4.离散系统的零状态响应
MATLAB提供求离散系统零状态响应数值解函数filter,调用格式为filter(b,a,x),式中b和a是表示离散系统的向量,x是输入序列非零样值点行向量,输出向量序号同x一样。
三、上机实验内容
1.验证实验原理中程序
离散信号的MATLAB表示
例2-1正弦序列信号正弦序列信号可直接调用MATLAB函数cos,例
,当
是整数或分数时,才是周期信号。
画
,
波形程序是:
k=0:
40;
subplot(2,1,1)
stem(k,cos(k*pi/8),'filled')
title('cos(k*pi/8)')
subplot(2,1,2)
stem(k,cos(2*k),'filled')
title('cos(2*k)')
2.已知
,画单位响应波形。
a=[2,-2,1];
b=[1,3,2];
impz(b,a)
impz(b,a,60)
impz(b,a,-10:
40)
3.已知
,输入
,画输出波形,范围