y[n]?k????x[k]h[n?k] 1.11(b)
?这个表达式就是LTI系统的卷积模型,它是根据系统的线性性和时不变性以及信号可以分解成单位冲激函数经推理得到的。这个表达式实际上告诉了我们一个重要的结论,那就是,任意LTI系统可以完全由它的单位冲激响应h(t)/h[n]来确定。由于系统的单位冲激响应是零状态响应,故按照式1.11求得的系统响应也是零状态响应。式1.11中的积分运算叫做卷积积分,求和运算叫做卷积和,是描述连续时间系统输入输出关系的一个重要表达式。
3.3卷积的计算
卷积的计算通常可按下面的五个步骤进行(以卷积积分为例):
1. 该换两个信号波形图中的横坐标,由t改为τ,τ变成函数的自变量; 2. 把其中一个信号反褶,如把h(τ)变成h(-τ);
3. 把反褶后的信号做移位,移位量是t,这样t是一个参变量。在τ坐标系中,t > 0时图形右移, t < 0时图形左移。
4. 计算两个信号重叠部分的乘积x(τ)h(t-τ); 5. 完成相乘后图形的积分。
对于两个时限信号(Time-limited signal),按照上述的五个步骤,作卷积积分运算时,关键是正确确定不同情况下的积分限。只要正确地确定了积分限都能得到正确定积分结果。尽管如此,在时域中计算卷积积分,总体上来说是一项比较困难的工作。
程序convlution_demo用来演示上述作卷积积分运算的五个步骤。本程序较为复杂,不建议读者读懂该程序,只需执行这个程序,观看程序执行过程中有关卷积积分的运算过程,以便于理解这五个步骤。
借助MATLAB的内部函数conv()可以很容易地完成两个信号的卷积积分运算。其语法为:y = conv(x,h)。其中x和h分别是两个作卷积运算的信号,y为卷积结果。
为了正确地运用这个函数计算卷积,这里有必要对conv(x,h)做一个详细说明。conv(x,h)函数实际上是完成两个多项式的乘法运算。例如,两个多项式p1和p2分别为:
p1?s3?2s2?3s?4 和 p2?4s3?3s2?2s?1
这两个多项式在MATLAB中是用它们的系数构成一个行向量来表示的,如果用x来表示多项式p1,h表示多项式p2,则x和h分别为 x = [1 2 3 4] h = [4 3 2 1] 在MATLAB命令窗口依次键入
>> x = [1 2 3 4]; >> h = [4 3 2 1]; >> y=conv(x,h)
在屏幕上得到显示结果:
y = 4 11 20 30 20 11 4 这表明,多项式p1和p2的乘积为:
p3?4s6?11s5?20s4?30s3?20s2?11s?4
11
正如前所述,用MATLAB处理连续时间信号时,独立时间变量t的变化步长应该是很小的,假定用符号dt表示时间变化步长,那么,用函数conv()作两个信号的卷积积分时,应该在这个函数之前乘以时间步长方能得到正确的结果。也就是说,正确的语句形式应为:y = dt*conv(x,h)。
对于定义在不同时间段的两个时限信号x(t),t0 ≤ t ≤ t1,和h(t),t2 ≤ t ≤ t3。 如果用y(t)来表示它们的卷积结果,则y(t)的持续时间范围要比x(t)或h(t)要长,其时间范围为t0+t2 ≤ t ≤ t1+t3。这个特点很重要,利用这个特点,在处理信号在时间上的位置时,可以很容易地将信号的函数值与时间轴的位置和长度关系保持一致性。
根据给定的两个连续时间信号x(t) = t[u(t)-u(t-1)]和h(t) = u(t)-u(t-1),编写程序,完成这两个信号的卷积运算,并绘制它们的波形图。范例程序如下:
% Program1_6
% This program computes the convolution of two continuou-time signals clear;close all;
t0 = -2; t1 = 4; dt = 0.01; t = t0:dt:t1; x = u(t)-u(t-1); h = t.*(u(t)-u(t-1));
y = dt*conv(x,h); % Compute the convolution of x(t) and h(t) subplot(221)
plot(t,x), grid on, title('Signal x(t)'), axis([t0,t1,-0.2,1.2]) subplot(222)
plot(t,h), grid on, title('Signal h(t)'), axis([t0,t1,-0.2,1.2]) subplot(212)
t = 2*t0:dt:2*t1; % Again specify the time range to be suitable to the % convolution of x and h.
plot(t,y), grid on, title('The convolution of x(t) and h(t)'), axis([2*t0,2*t1,-0.1,0.6]), xlabel('Time t sec')
在有些时候,做卷积和运算的两个序列中,可能有一个序列或者两个序列都非常长,甚至是无限长,MATLAB处理这样的序列时,总是把它看作是一个有限长序列,具体长度由编程者确定。实际上,在信号与系统分析中所遇到的无限长序列,通常都是满足绝对可和或绝对可积条件的信号。因此,对信号采取这种截短处理尽管存在误差,但是通过选择合理的信号长度,这种误差是能够减小到可以接受的程度的。若这样的一个无限长序列可以用一个数学表达式表示的话,那么,它的长度可以由编程者通过指定时间变量n的范围来确定。
例如,对于一个单边实指数序列x[n] = 0.5nu[n],通过指定n的范围为0 ≤n ≤ 100,则对应的x[n]的长度为101点,虽然指定更宽的n的范围,x[n]将与实际情况更相符合,但是,注意到,当n大于某一数时,x[n]之值已经非常接近于0了。对于序列x[n] = 0.5nu[n],当n = 7时,x[7] = 0.0078,这已经是非常小了。所以,对于这个单边实指数序列,指定更长的n的范围是没有必要的。当然,不同的无限长序列具有不同的特殊性,在指定n的范围时,只要能够反映序列的主要特征就可以了。
3.4 用线性常系数微分方程描述LTI系统
线性常系数微分方程或差分方程是描述LTI系统的另一个时域模型。一个连续时间LTI系统,它的输入信号x(t)输出信号y(t)关系可以用下面的微分方程来表达
12
dky(t)Mdkx(t) ?ak 1.12 ??bkkkdtdtk?0k?0N式1.12中,max (N, M)定义为系统的阶。式1.12描述了LTI系统输入信号和输出信号的一种隐
性关系(Implicit relationship)。为了求得系统响应信号的显式表达式(Explicit expression),必须对微分方程和差分方程求解。
在MATLAB中,一个LTI系统也可以用系统微分方程的系数来描述,例如,一个LTI连续时间系统的微分方程为
d2y(t)dy(t)?3?2y(t)?x(t) 2dtdtMATLAB则用两个系数向量num = [1]和den = [1 3 2]来描述该系统,其中num和den分别
表示系统微分方程右边和左边的系数,按照微分运算的降阶排列。
MATLAB的内部函数impulse(),step(),initial(),lsim() 可以用来计算并绘制连续时间LTI系统的单位冲激响应,单位阶跃响应,零输入响应和任意信号作用于系统的零状态响应。这些函数的用法描述如下:
h= impulse(num, den, T) 和 impulse(num, den, T) s = step(num, den, T) 和 step(num, den, T)
y = lmis(num, den, x, t) 和 lmis(num, den, x, t)
函数impulse(),step()用来计算由num和den表示的LTI系统的单位冲激响应和单位阶跃响应,响应的时间范围为0~T,其中den和num分别为系统微分方程左右两边的系数向量,T为指定的响应的终点时间。h和s的点数默认值为101点。由此可以计算时间步长为dt = T/(101-1)。不带返回值的函数如impulse(num, den, T)和step(num, den, T)将直接在屏幕上绘制系统的单位冲激响和单位阶跃响应曲线。带返回值的函数如y = lmis(num, den, x, t)和y = lmis(num, den, x, t),用来计算由num和den表示的LTI系统在输入信号x作用下的零状态响应。其中t为指定的时间变化范围,x为输入信号,它们的长度应该是相同的。如带返回参数y,则将计算的响应信号保存在y中,若不带返回参数y,则直接在屏幕上绘制输入信号x和响应信号y的波形图。
例如,编写程序,计算并绘制由下面的微分方程表示的系统的单位冲激响应h(t),单位阶跃响应s(t)。
d2y(t)dy(t)?3?2y(t)?8x(t)
dtdt2MATLAB范例程序如下:
% Program1_7
% This program is used to compute the impulse response h(t) and the step response s(t) of a
13
% continuous-time LTI system clear, close all;
num = input('Type in the right coefficient vector of differential equation:'); den = input('Type in the left coefficient vector of differential equation:'); t = 0:0.01:8;
x = input('Type in the expression of the input signal x(t):'); subplot(221), impulse(num,den,8); subplot(222), step(num,den,8)
三、实验内容及步骤
实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。
实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。
Q1-1:修改程序Program1_1,将dt改为0.2,再执行该程序,保存图形,看看所得图形的效
果如何?
dt = 0.01时的信号波形 dt = 0.2时的信号波形
这两幅图形有什么区别,哪一幅图形看起来与实际信号波形更像? 答:
Q1-2:修改程序Program1_1,并以Q1_2为文件名存盘,产生实指数信号x(t)=e-2t。 要求在
图形中加上网格线,并使用函数axis()控制图形的时间范围在0~2秒之间。然后执行该程序,保存所的图形。
14
修改Program1_1后得到的程序Q1_2如下:
% Program1_2
% This program is used to generate a sinusoidal signal and draw its plot clear, % Clear all variables
close all, % Close all figure windows
dt = 0.2; % Specify the step of time variable t = -2:dt:2; % Specify the interval of time x = exp(-2*t); % Generate the signal
plot(t,x) % Open a figure window and draw the plot of x(t) axis([0 2 0 1]) grid on;
title('Sinusoidal signal x(t)')
xlabel('Time t (sec)')
信号x(t)=e-0.5t的波形图
Q1-3:修改程序Program1_1,并以Q1_3为文件名存盘,使之能够仿真从键盘上任意输入的
一个连续时间信号,并利用该程序仿真信号x(t)=e-2t。
修改Program1_1后得到的程序Q1_3如下: 信号x(t)=e-2t的波形图
% Program1_3 clc
clear, % Clear all variables
close all, % Close all figure windows
dt = 0.01; % Specify the step of time variable t = -2:dt:2; % Specify the interval of time
x = input('please input a signal,I will draw its plot for you Singnal x='); %Input the signal
15