实验二、信号与系统时域分析的MATLAB实现
一、实验目的
掌握利用Matlab求解LTI系统的冲激响应、阶跃响应和零状态响应,理解卷积概念。
二、实验内容
1、 卷积运算的MATLAB实现:
(1) 计算连续信号卷积用MATLAB中的函数conv,可编写连续时间信号卷积通用
函数sconv,
function [f,n]=sconv(f1,f2,n1,n2,p) f=conv(f1,f2);f=f*p; n3=n1(1)+n2(1);
L=length(n1)+length(n2)-1; n=n3:p:(n3+(L-1)*p); 例2.1 f(t)?f1(t)?f2(t)
在MATLAB编写: p=0.01;
n1=-1:p:1;f1=ones(1,length(n1)); n2=0:p:1;f2=2*n2;
[f,n]=sconv(f1,f2,n1,n2,p);
subplot(3,1,1),plot(n1,f1), axis([-1.5,1.5,0,2]),grid on subplot(3,1,2),plot(n2,f2), axis([-0.1,1.2,0,3]),grid on subplot(3,1,3),plot(n,f),axis([-1.5,5,0,2]),grid on 运算结果如图例2.1所示。
(2) 计算离散信号卷积用MATLAB中的函数conv,其调用格式为:
c?conv(a,b)
式中,a、b为待卷积两序列的向量表示。向量c的长度为a、b长度之和减1。
1,2,3,4;k?0,1,2,3?,y[k]??1,1,1,1;k?0,1,2,3?,计算例2.2 已知序列x[k]??x[k]?y[k]。
解:MATLAB的程序为:
x=[1,2,3,4];y=[1,1,1,1]; z=conv(x,y) N=length(z); stem(0:N-1,z)
运行结果:如图例2.2
z = 1 3 6 10 9 7 4
2、 连续时间系统零状态响应的求解:
LTI连续时间系统的零状态响应可通过求解初始状态为零的常系数微分方程得到。在MATLAB中控制系统工具箱中提供了一个用于求解零初始条件微分方程数值解的函数lsim。其调用方式为: y?lsim(sys,f,t)
式中,sys表示LTI系统模型,用来表示微分方程、差分方程、状态方程,t表示计算系统响应的抽样点向量,f是系统输入信号向量。在求解微分方程时,微分方程的LTI系统模型sys借助于tf函数获得,其调用方式为:
sys?tf(b,a)
式中,b和a分别为微分方程右端和左端各项的系数向量。例如:对2阶微分方程
3y''(t)?2y'(t)?5y(t)??f''(t)?2f(t)
可用a=[3 2 -5],b=[-1 0 2],sys=tf(b,a)获得LTI模型。
例2.3 系统的微分方程为y(t)?2y(t)?100y(t)?f(t),输入信号为
'''f(t)?10sin2?t,求系统的零状态响应y(t)。
解:MATLAB的程序为: sys=tf([0 0 1],[1 2 100]); t=0:0.01:5;
f=10*sin(2*pi*t); y=lsim(sys,f,t); plot(t,y)
运行结果如图例2.3所示。
3、 连续时间系统冲激响应和阶跃响应的 求解
系统的冲激响应和阶跃响应在MATLAB
中控制系统工具箱中提供函数impulse和step分别表示。其调用方式为:
y?impulse(sys,t)y?step(sys,t)
例2.4 求例2.3所示系统的冲激响应。 解:MATLAB的程序为: sys=tf([0 0 1],[1 2 100]); t=0:0.01:5;
y=impulse(sys,t); plot(t,y)
title('连续系统冲激响应') xlabel('time(sec)')
ylabel('y(t)')
运行结果如图例2.4所示。
4、 离散时间系统零状态响应的求解
LTI离散系统一般用线性常系数差分方程描述:
?ay[k?i]??bii?0j?0nmjf[k?j]
f[k]、y[k]分别表示系统的输入和输出,n是差分方程的阶数。已知差分方程的n个初始状态和输入f[k],就可以通过编程由下式迭代计算出系统的输出。
在零初始状态下,MATLAB信号处理工具中提供了一个filter函数,计算差分方程描述的系统的响应。其调用方式为:
y?filter(b,a,f)
式中,b=[b0,b1,---,bn],a=[a0,a1,---an]分别是差分方程左、右端的系数向量,f表示输入序列,y表示输出序列,它们长度要相同。 5、 离散时间系统单位脉冲响应的求解
离散系统的单位脉冲响应在MATLAB中控制系统工具箱中提供函数impz表示。其调用方式为:
h?impz(b,a,k)
k表示输出序列的取值范围,h是系统的单位脉冲响应。 例2.5 求离散时间系统
y[k]?3y[k?1]?2y[k?2]?f[k]
的单位脉冲h[k]。
解:MATLAB的程序为: k=0:10;a=[1 3 2];b=[0 0 1]; h=impz(b,a,k); stem(k,h)
title('单位脉冲响应')
响应结果如图例2.5所示。
练习:
1、 一系统满足微分方程为y(t)?5y(t)?y(t)?f(t),f(t)?2cos??t,求出系统的零状态响应。
程序:sys=tf([0 0 1],[1 5 -1]);
t=0:0.01:5; f=2*cos(pi*t); y=lsim(sys,f,t); plot(t,y)
2、 求下列各系统的单位冲激响应和单位阶跃响应。
''(1)y(t)?'''2y'(t)?y(t)?f(t)
''(2)y(t)?y(t)?y(t)?f(t)?f(t) 程序1:sys=tf([0 0 1],[1 sqrt(2) 1]);
t=0:0.01:5;
y1=impulse(sys,t); y2=step(sys,t); subplot(2,1,1); plot(t,y1)
title('系统冲激响应') xlabel('time(sec)') ylabel('y(t)') subplot(2,1,2); plot(t,y2)
title('系统阶跃响应') xlabel('time(sec)') ylabel('y(t)')
程序2:sys=tf([0 1 1],[1 1 1]);
t=0:0.01:5;
y1=impulse(sys,t); y2=step(sys,t); subplot(2,1,1); plot(t,y1)
title('系统冲激响应') xlabel('time(sec)') ylabel('y(t)') subplot(2,1,2);
''
plot(t,y2)
title('系统阶跃响应') xlabel('time(sec)') ylabel('y(t)')
3、已知f(k)如下式所示,用conv 函数计算f[k]?h[k],h[k]?f[k],并就它们的对称关系作总结。
f(k)?[3.5,?1.2,2.3,6.5,?2.8],h(k)?[1,2,3,4,5]?程序:f=[3.5,-1.2,2.3,6.5,-2.8];
h=[1,2,3,4,5]; z1=conv(f,h) ; z2=conv(h,f); subplot(2,1,1); N=length(z1) stem(0:N-1,z1) subplot(2,1,2); N=length(z2) stem(0:N-1,z2)
五、 实验总结
这次实验相对简单一点,按照例题就能完成。简单掌握了利用Matlab求解LTI系统的冲激响应、阶跃响应和零状态响应,理解卷积概念。