实验一 连续时间信号的时域仿真
目录
一、实验目的
1、熟悉和掌握常用的用于信号与系统时域仿真分析的MATLAB函数
2、掌握连续时间信号的MATLAB产生,掌握用周期延拓的方法将一个非周期信号进行周期信号延拓形成一个周期信号的MATLAB编程
3、掌握卷积的计算方法
二、实验设备
计算机,MATLAB软件
三、实验原理
3.1连续时间信号的仿真
程序Program1_1是用MATLAB对一个正弦信号进行仿真的程序,请仔细阅读该程序,并在计算机上运行,观察所得图形。
% Program1_1
% 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.01; % Specify the step of time variable
t = -2:dt:2; % Specify the interval of time
x = sin(2*pi*t); % Generate the signal
plot(t,x) % Open a figure window and draw the plot of x(t)
title('Sinusoidal signal x(t)')
xlabel('Time t (sec)')
常用的图形控制函数
axis([xmin,xmax,ymin,ymax]):图型显示区域控制函数,其中xmin为横轴的显示起点,xmax为横轴的显示终点,ymin为纵轴的显示起点,ymax为纵轴的显示终点。
有时,为了使图形具有可读性,需要在所绘制的图形中,加上一些网格线来反映信号的幅度大小。MATLAB中的grid on/grid off可以实现在你的图形中加网格线。
grid on:在图形中加网格线。
grid off:取消图形中的网格线。
x = input(‘Type in signal x(t) in closed form:’)
在《信号与系统》课程中,单位阶跃信号u(t) 和单位冲激信号δ(t) 是二个非常有用的信号。
这里分别给出相应的简单的产生单位冲激信号和单位阶跃信号的扩展函数。产生单位冲激信号的扩展函数为:
function y = delta(t)
dt = 0.01;
y = (u(t)-u(t-dt))/dt;
产生单位阶跃信号的扩展函数为:
% Unit step function
function y = u(t)
y = (t>=0); % y = 1 for t > 0, else y = 0
请将这两个MATLAB函数分别以delta 和u为文件名保存在work文件夹中,以后,就可以像教材中的方法一样,使用单位冲激信号δ(t) 和单位阶跃信号u(t)。
3.2信号的时域变换
3.2.1 信号的时移
信号的时移可用下面的数学表达式来描述:
设一个连续时间信号为x(t),它的时移y(t) 表示为:y(t) = x(t - t0)
其中,t0为位移量。若t0为正数,则y(t)等于将x(t)右移t0秒之后的结果。反之,若t0为负数,则y(t)等于将x(t)左移t0秒之后的结果。
在MATLAB中,时移运算与数学上习惯表达方法完全相同。
程序Program1_2对给定一个连续时间信号x(t) = e-0.5tu(t),对它分别左移2秒钟和右移2秒钟得到信号x1(t) = e-0.5(t+2)u(t+2)和x2(t) = e-0.5(t-2)u(t-2)。
% Program1_2
% This program is used to implement the time-shift operation
% on a continuous-time signal and to obtain its time-shifted versions
% and to draw their plots.
clear,close all,
t = -5:0.01:5;
x = exp(-0.5*t).*u(t); % Generate the original signal x(t)
x1 = exp(-0.5*(t+2)).*u(t+2); % Shift x(t) to the left by 2 second to get x1(t)
x2 = exp(-0.5*(t-2)).*u(t-2); % Shift x(t) to the right by 2 second to get x2(t)
subplot(311)
plot(t,x) % Plot x(t)
grid on,
title ('Original signal x(t)')
subplot (312)
plot (t,x1) % Plot x1(t)
grid on,
title ('Left shifted version of x(t)')
subplot (313)
plot (t,x2) % Plot x2(t)
grid on,
title ('Right shifted version of x(t)')
xlabel ('Time t (sec)')
3.2.2 信号的时域反褶
对一个信号x[n]的反褶运算在数学上表示为:y[t] = x[-t]
这种反褶运算,用MATLAB实现起来也是非常简单的。有多种方法可以实现信号的反褶运算。
方法一:修改绘图函数plot(t,x)中的时间变量t,即用-t替代原来的t,这样绘制出来的图形,看起来就是原信号经时域反褶后的版本。
方法二:直接利用原信号与其反褶信号的数学关系式来实现。这种方法最符合信号反褶运算的实际意义。
方法三:使用MATLAB内部函数fliplr()来实现信号的反褶运算。其用法如下:
y = fliplr(x):其中x为原信号x(t),而y则为x的时域反褶。需要说明的是,函数fliplr()对信号作时域反褶,仅仅将信号中各个元素的次序作了一个反转,这种反转处理是独立于时间变量t的。因此,如果信号与其时间变量能够用一个数学函数来表达的话,那么建议将时间变量t的范围指定在一个正负对称的时间区间即可。
3.2.3 信号的时域尺度变换
信号x(t)的时域尺度变换在数学描述为:y(t) = x(at)
其中a为任意常数。根据a的不同取值,这种时域尺度变换对信号x(t)具有非常不同的影响。
- 当a = 1时,y(t) = x(t);
- 当a = -1时,y(t) = x(-t),即y(t)可以通过将x(t)反褶运算而得到;
- 当a > 1时,y(t) = x(at),y(t)是将x(t)在时间轴上的压缩而得到;
- 当0 < a < 1时,y(t) = x(at),y(t)是将x(t)在时间轴上的扩展而得到;
- 当 -1 < a < 0时,y(t) = x(at),y(t)是将x(t)在时间轴上的扩展同时翻转而得到;
- 当 a < -1时,y(t) = x(at),y(t)是将x(t)在时间轴上的压缩同时翻转而得到;
由此可见,信号的时域尺度变换,除了对信号进行时域压缩或扩展外,还可能包括对信号的时域反褶运算。实际上,MATLAB完成式y(t) = x(at)的运算,并不需要特殊的处理,按照数学上的常规方法即能完成。
3.2.4周期信号
在《信号与系统》课程中,周期信号是一类非常重要的信号。给定一个信号x(t),如果满足x(t) = x(t+kT)
则该信号叫做周期信号。其中,k为任意整数,T为常数,通常称为信号的基本周期或最小周期。
周期信号可以看作是一个时限的非周期信号经过周期延拓之后形成的。在数字信号处理中,周期延拓这一信号处理方法非常重要。
下面的程序段,就是将一个非周期信号x1(t) = e-2t[u(t)-u(t-2)]经过周期延拓之后而得到一个周期信号:
clear, close all;
t = -4:0.001:4;
T = 2; x = 0;
for k = -2:2;
x = x+exp(-2*(t-k*T)).*(u(t-k*T)-u(t-(k+1)*T));
end
仔细阅读该程序,可以发现其算法就是:
由于k无法计算到无穷,而是以有限值加以替代,反映到有限宽度图形窗口中得到的效果完全符合要求。
3.3卷积的计算
借助MATLAB的内部函数conv()可以很容易地完成两个信号的卷积积分运算。其语法为:y = conv(x,h)。其中x和h分别是两个作卷积运算的信号,y为卷积结果。
为了正确地运用这个函数计算卷积,这里有必要对conv(x,h)做一个详细说明。conv(x,h)函数实际上是完成两个多项式的乘法运算。例如,两个多项式p1和p2分别为:
这两个多项式在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的乘积为:
正如前所述,用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_3
% 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')
四、实验内容及步骤
实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。
实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。
1.修改程序Program1_1,将dt改为0.2,再执行该程序,保存图形,看看所得图形的效果如何? 这两幅图形有什么区别,哪一幅图形看起来与实际信号波形更像?
2.修改程序Program1_1,并存盘,产生实指数信号x(t)=e-2t。 要求在图形中加上网格线,并使用函数axis()控制图形的时间范围在0~2秒之间。然后执行该程序,保存所的图形。
3.将实验原理中所给的单位冲激信号和单位阶跃信号的函数文件在MATLAB文件编辑器中编写好,并分别以以文件名delta和u存入work文件夹中以便于使用。
4.根据示例程序的编程方法,编写一个MATLAB程序,并存盘,由给定信号x(t) = e-0.5tu(t),求信号y(t) = x(1.5t+3),并绘制出x(t) 和y(t)的图形。
5. 已知两信号f1和 f2如下图所示,用conv函数求二者的卷积结果,并画图。