当a<-1时,y(t)=x(at),y(t)是将x(t)在时间轴上的压缩同时翻转而得到;
由此可见,信号的时域尺度变换,除了对信号进行时域压缩或扩展外,还可能包括对信号的时域反褶运算。
实际上,MATLAB完成式1.5的运算,并不需要特殊的处理,按照数学上的常规方法即能完成。
1.4周期信号
在《信号与系统》课程中,周期信号是一类非常重要的信号。
给定一个信号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,closeall;
t=-4:
0.001:
4;
T=2;x=0;
fork=-2:
2;
x=x+exp(-2*(t-k*T)).*(u(t-k*T)-u(t-(k+1)*T));
end
plot(t,x)
仔细阅读该程序,可以发现其算法就是:
1.8
由于k无法计算到无穷,而是以有限值加以替代,反映到有限宽度图形窗口中得到的效果完全符合要求。
2信号的时域运算
2.1相加
symsx
f1=sin(x)
f2=x^2
f=f1+f2
ezplot(f)
f1、f2是符号表达式。
2.2相乘
symsx
f1=sin(x)
f2=x^2
f=f1*f2
ezplot(f)
f1、f2是符号表达式。
2.3微分
symsx
f=sin(x^2)
h=diff(f)
ezplot(h)
2.4积分
symsx
f=sin(x)
h=int(f,x)%h=int(f,x,a,b)为定积分
ezplot(h)
3卷积的计算
卷积的计算通常可按下面的五个步骤进行(以卷积积分为例):
1.该换两个信号波形图中的横坐标,由t改为τ,τ变成函数的自变量;
2.把其中一个信号反褶,如把h(τ)变成h(-τ);
3.把反褶后的信号做移位,移位量是t,这样t是一个参变量。
在τ坐标系中,t>0时图形右移,t<0时图形左移。
4.计算两个信号重叠部分的乘积x(τ)h(t-τ);
5.完成相乘后图形的积分。
对于两个时限信号(Time-limitedsignal),按照上述的五个步骤,作卷积积分运算时,关键是正确确定不同情况下的积分限。
只要正确地确定了积分限都能得到正确定积分结果。
尽管如此,在时域中计算卷积积分,总体上来说是一项比较困难的工作。
程序convlution_demo用来演示上述作卷积积分运算的五个步骤。
本程序较为复杂,不建议读者读懂该程序,只需执行这个程序,观看程序执行过程中有关卷积积分的运算过程,以便于理解这五个步骤。
借助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=[1234]
h=[4321]
在MATLAB命令窗口依次键入
>>x=[1234];
>>h=[4321];
>>y=conv(x,h)
在屏幕上得到显示结果:
y=411203020114
这表明,多项式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_6
%Thisprogramcomputestheconvolutionoftwocontinuou-timesignals
clear;closeall;
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);%Computetheconvolutionofx(t)andh(t)
subplot(221)
plot(t,x),gridon,title('Signalx(t)'),axis([t0,t1,-0.2,1.2])
subplot(222)
plot(t,h),gridon,title('Signalh(t)'),axis([t0,t1,-0.2,1.2])
subplot(212)
t=2*t0:
dt:
2*t1;%Againspecifythetimerangetobesuitabletothe
%convolutionofxandh.
plot(t,y),gridon,title('Theconvolutionofx(t)andh(t)'),axis([2*t0,2*t1,-0.1,0.6]),
xlabel('Timetsec')
在有些时候,做卷积和运算的两个序列中,可能有一个序列或者两个序列都非常长,甚至是无限长,MATLAB处理这样的序列时,总是把它看作是一个有限长序列,具体长度由编程者确定。
实际上,在信号与系统分析中所遇到的无限长序列,通常都是满足绝对可和或绝对可积条件的信号。
因此,对信号采取这种截短处理尽管存在误差,但是通过选择合理的信号长度,这种误差是能够减小到可以接受的程度的。
若这样的一个无限长序列可以用一个数学表达式表示的话,那么,它的长度可以由编程者通过指定时间变量n的范围来确定。
例如,对于一个单边实指数序列x[n]=0.5nu[n],通过指定n的范围为0≤n≤100,则对应的x[n]的长度为101点,虽然指定更宽的n的范围,x[n]将与实际情况更相符合,但是,注意到,当n大于某一数时,x[n]之值已经非