当前位置:首页 > 信号与系统实验教程(学生版)
subplot(224); stem(n,x); title('x[n] signal'); subplot(223); stem(g,x);
title('x[(-1/2)n] signal'); 程序运行结果:
图1-5 程序运行结果图 7、周期信号
在《信号与系统》课程中,周期信号是一类非常重要的信号。给定一个信号x(t)或x[n],如果满足
x(t) = x(t+kT) 1.6
x[n] = x[n+kN] 1.7
则该信号叫做周期信号。其中,k为任意整数,T和N为常数,通常称为信号的基本周期或最小周期。
周期信号可以看作是一个时限的非周期信号经过周期延拓之后形成的。在数字信号处理中,周期延拓这一信号处理方法非常重要。
下面的程序段,就是将一个非周期信号x1(t) = e-2t[u(t)-u(t-2)]经过周期延拓之后而得到一个周期信号。
程序如下:
clear, close all; t = -4:0.001:4;
T = 2; x = 0;
y = exp(-2*t).*(u(t)-u(t-2)); for k = -2:2;
x = x+exp(-2*(t-k*T)).*(u(t-k*T)-u(t-(k+1)*T)); end; subplot(211); plot(t,y);
6
title('e-2t[u(t)-u(t-2)] signal'); subplot(212)
plot(t,x);
title('e-2t[u(t)-u(t-2)]延拓后的波形');
程序运行结果:
图1-6 程序运行结果图
仔细阅读该程序,可以发现其算法就是:
?
x(t)??xk???1(t?kT) 1.8
由于k无法计算到无穷,而是以有限值加以替代,反映到有限宽度图形窗口中得到的效果完全符合要求。
8、卷积的计算
卷积的计算通常可按下面的五个步骤进行(以卷积积分为例):
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)函
7
数实际上是完成两个多项式的乘法运算。例如,两个多项式p1和p2分别为:
3232p1?s?2s?3s?4 和 p2?4s?3s?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?4s?11s?20s?30s?20s?11s?4
65432 正如前所述,用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),编写程序,完成这两个信号的卷积运算,并绘制它们的波形图。范例程序如下:
% Program
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') 程序运行结果
8
图1-7 程序运行结果图
在有些时候,做卷积和运算的两个序列中,可能有一个序列或者两个序列都非常长,甚至是无限长,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的范围时,只要能够反映序列的主要特征就可以了。
9、关于MATLAB工具在信号处理中应用的补充
在绘制信号的波形图时,有时我们需要将若干个图形绘制在图一个图形窗口中,这就需要使用MATLAB的图形分割函数subplot(),其用法是在绘图函数stem或plot之前,使用图形分割函数subplot(n1,n2,n3),其中的参数n1,n2和n3的含义是,该函数将把一个图形窗口分割成n1xn2个子图,即将绘制的图形将绘制在第n3个子图中。
常用的图形控制函数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:’)
9
共分享92篇相关文档