实验三信号卷积的MATLAB实现一、实验名称:信号卷积的MATLAB实现二、实验目的:1.增加学生对卷积的认识2.了解MATLAB这个软件的一些基础知识3.利用MATLAB计算信号卷积4.验证卷积的一些性质三、实验原理:用MATLAB实现卷积我们先必须从信号下手,先把信号用MATLAB语句描述出来,然后再将这些信号带入到我们写好的求卷积的函数当中来计算卷积。在本章中我们将信号分为连续信号和离散序列两种来实现卷积并验证卷积的一些性质。MATLAB强大的图形处理功能及符号运算功能,为我们实现信号的可视化提供了强有力的工具。在MATLAB中通常有两种方法来表示信号,一种是用向量来表示信号,另一种则是用符号运算的方法来表示信号。用适当的MATLAB语句表示出信号后,我们就可以利用MATLAB的绘图命令绘制出直观的信号波形。连续时间信号,是指自变量的取值范围是连续的,且对于一切自变量的取值,除了有若干不连续点以外,信号都有确定的值与之对应的信号。从严格意义上来讲,MATLAB并不能处理连续信号,在MATLAB中,是用连续信号在等时间间隔点的样值来近似地表示连续信号的,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号。在MATLAB中连续信号可用向量或符号运算功能来表示。1.向量表示法对于连续时间信号f(t),我们可以用两个行向量f和t来表示,其中向量t是行如t=t1:p:t2的MATLAB命令定义的时间范围向量,t1为信号起始时间,t2为中止时间,p为时间间隔。向量f为连续信号f(t)在向量t所定义的时间点上的样值。例如对于连续信号f(t)=sin(t),我们可以用如下两个向量来表示:t=-10:1.5:10;f=sin(t)用上述向量对连续信号表示后,就可以用plot命令来绘出该信号的时域波形。Plot命令可将点与点间用直线连接,当点与点间的距离很小时,绘出的图形就成了光滑的曲线。命令如下:plot(t,f)title(‘f(t)=sint’)xlabel(‘t’)axis([-10,10,-1.1,1.1])绘制的信号波形如图3.1所示,当把时间间隔p取得更小(如0.01)时,就可得到sint较好的近似波形,如图3.2所示。图3.1p=1.5的sint近似波形图3.2p=0.01的sint近似波形2.符号运算表示法如果信号可以用一个符号表达式来表示它,则我们可用ezplot命令绘制出信号的波形。例如对于连续信号f(t)=/2te,我们可以用符号表达式表示为:symstf=sym(‘exp(-t/2)’)f=exp(-t/2)然后用ezplot命令绘制其波形:ezplot(f,[-6,6])该命令绘制的信号波形如图3.3所示图3.3指数信号波形利用上面两种表达方式我们可以描述出很多种连续信号,常用的信号有:阶跃信号,门信号,斜线信号,指数信号等等。接下来我们看看离散时间信号,一般说来,离散时间信号用f(k)表示,其中变量k为整数,代表离散的采样时间点。f(k)可表示为:f(k)={...f(-2),f(-1),f(0),f(1),f(2)…}↑k=0在MATLAB中,用一个向量f即可表示一个有限长度的序列。但是,这样的向量并没有包含其对应的时间序号信息。所以,要完整地表示一个离散信号需要用两个向量。如序列:f(k)={1,2,-1,3,2,4,-1}↑k=0在MATLAB中应表示为:k=[-3,-2,-1,0,1,2,3]或是k=-3:3;f=[1,2,-1,3,2,4,-1]在用MATLAB表示离散序列并将其可视化时,我们要注意以下几点:第一,与连续时间信号不同,离散时间信号无法用符号运算来表示;第二,由于在MATLAB中,矩阵的元素个数是有限的,因此,MATLAB无法表示无限序列;第三,在绘制离散信号波形时,要使用专门绘制离散数据的stem命令,而不是plot命令。如对于上面定义的二向量f和k,可用如下stem命令绘图:stem(k,f),得到对应序列波形图,如图3.4所示。图3.4随机序列的波形同样的,单位阶跃序列,正弦序列,离散时间指数序列等的离散信号我们都可以用类似的方法描述并绘制出图形。信号的时域变换包括信号的平移、反折、倒相及信号的尺度变换。我们就分别介绍连续时间信号和离散时间信号的各种时域变换。1、连续信号的时域变换如前所述,MATLAB可以有两种方法来表示连续信号。用这两种方法均可实现连续信号的时域变换,但用符号运算的方法则较为简便。(1).移位对于连续信号f(t),若有常数t00,延时信号f(t-t0)是将原信号沿正t轴方向平移时间t0,而f(t+t0)是将原信号沿负t轴方向移动时间t0。我们可用下面的命令来实现连续信号的平移及其结果可视化,其中f是用符号表达式表示的连续时间信号,t是符号变量,subs命令则将连续信号中的时间变量t用t-t0替换:y=subs(f,t,t-t0);ezplot(y)(2).反折连续信号的反折,是指将信号以纵坐标为轴反折,即将信号f(t)中的自变量t换为-t。实现如下:y=subs(f,t,-t);ezplot(y)(3).尺度变换连续信号的尺度变换,是指将信号的横坐标进行展宽或压缩变换,即将信号f(t)中的自变量t换为at,当a1时,信号f(at)以原点为基准,沿横轴压缩到原来的1/a;当0a1时,就展宽至原来的1/a倍。实现如下:y=subs(f,t,*t);ezplot(y)(4).倒相连续信号的倒相是指将信号f(t)以横轴为对称轴对折得到-f(t)。实现如下:y=-f;ezplot(y)对于以上的命令,可在画图命令之后加入坐标轴的调整的命令(即加入axis()命令),以使画出的图形更清晰、直观。2、离散时间序列的时域变换与连续信号不同的是,在MATLAB中,离散序列的时域变换不能用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的变换需表示成两个向量的变换。1).离散序列反折离散序列的反折,即是将表示离散序列的两向量以零时刻的取值为基准点,以纵轴为对称轴反折,向量的反折可用MATLABA中的fliplr函数来实现,具体实现如下:function[f,k]=lsfz(f1,k1)f=fliplr(f1);k=-fliplr(k1);%调用此函数实现向量f1和k1的反折stem(k,f,’filled’)axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5])2).离散序列的平移离散序列的平移可看作是将离散序列的时间序号向量平移,而表示对应时间序号点的序列样值不变,当序列向左移动k0个单位时,所以时间序号向量都减小k0个单位,反之则增加k0个单位。实现如下:function[f,k]=lsyw(ff,kk,k0)k=kk+k0;f=ff;stem(k,f,’filled’)axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5])3).离散序列的倒相离散序列的倒相可看作是将表示序列样值的向量取反,而对应的时间序号向量不变,得到的离散时间序列。实现如下:function[f,k]=lsdx(ff,kk)f=-ff;k=kk;stem(k,f,’filled’)axis([min(k)-1,max(k)+1,min(f)-0.5,max(f)+0.5])这些时域变换,我们可以把我们在第一节中描述过的信号带入其中,来看看信号时域变换的结果如何。除此以外,我们通过时域变换也可以锻炼我们描述信号的能力,一些复杂信号,往往都是一些简单信号经过一系列的时域变换得到。前面的内容,其实是给以下的学习做的准备,我们在了解如何描述信号以后,接下来就只要把信号带入卷积运算中就可以了。在MATLAB中,conv()函数可以帮助我们快速求出两个离散序列的卷积和。conv函数的调用格式为:f=conv(f1,f2)其中f1为包含序列f1(k)的非零样值点的行向量,f2为包含序列f2(k)的非零样值点的行向量,向量f则返回序列f(k)=f1(k)*f2(k)的所有非零样值点行向量。在求信号卷积之前,我们先来看看在MATLAB中conv()这个程序是如何来实现的。我们可以通过看它的流程图来了解,流程图如图3.5所示:图3.5conv()函数流程图由于conv是针对离散时间序列的函数,我们先从离散的信号入手[12]。1、离散时间信号的卷积我们试举一例来看conv的功能,已知序列f1(k)和f2(k)如下所示:f1(k)=1,(0≤k≤2)f2(k)=k,(0≤k≤3)则调用conv()函数求上述两序列的卷积和的MATLAB命令为:f1=ones(1,3);f2=0:3;f=conv(f1,f2)运行结果为:f=013653由这个例子可以看出,函数conv()不需要给定序列f1(k)和f2(k)非零样值点的时间序号,也不返回序列f(k)=f1(k)*f2(k)的非零样值点的时间序号。因此,要正确地标识出函数conv()的计算结果向量f,我们还必须构造序列f1(k)、f2(k)及f(k)的对应序号向量。我们可以看出f(k)的序号向量k是由序列f1(k)和f2(k)的非零样值点的起始序号及他们的时域宽度决定的。在此,我们自己可以构造一个实用一点的函数dconv(),该函数实现的功能为:可以在计算出卷积f(k)的同时,还可以绘出序列f1(k)、f2(k)及f(k)在时域内的波形图。并返回f(k)的非零样值点的对应向量。程序如下所示:function[f,k]=dconv(f1,f2,k1,k2)%thefunctionofcomputef=f1*f2%f:卷积序列f(k)对应的非零样值向量%k:序列f(k)的对因序号向量%f1:序列f1(k)非零样值向量%f2:序列f2(k)非零样值向量%k1:序列f1(k)的对应序号向量%k2:序列f2(k)的对应序号向量f=conv(f1,f2)%计算序列f1与f2的卷积和fk0=k1(1)+k2(1);%计算序列f非零样值的起点位置k3=length(f1)+length(f2)-2;%计算卷积和f的非零样值的宽度k=k0:k0+k3%确定卷积和f非零样值的序号向量subplot(2,2,1)stem(k1,f1)%在子图1绘序列f1(k)时域波形图title('f1(k)')xlabel('k')ylabel('f1(k)')subplot(2,2,2)stem(k2,f2)%在子图2绘序列f2(k)时波形图title('f2(k)')xlabel('k')ylabel('f2(k)')subplot(2,2,3)stem(k,f);%在子图3绘序列f(k)的波形图title('f1(k)与f2(k)的卷积和f(k)')xlabel('k')ylabel('f(k)')对于下面两个离散序列,我们可以调用dconv()函数来求离散序列的卷积。MATLAB命令如下:f1=[12-1-3-24];k1=1:6;f2=ones(1,5);k2=-2:2;%f1,f2两个信号的向量表示[f,k]=dconv(f1,f2,k1,k2)%子函数调用运行程序可以绘制出波形图如图3.6所示。图3.6离散序列的卷积需要注意的是,调用conv()函数计算序列卷积时,该函数将向量f1和f2以外的序列样值均视为零,因此,当序列f1(k)或f2(k)为无限长序列时调用conv()函数就可能出现误差。如果碰到无限长序列时候,我们必须将其截断才能求带入到conv()函数中。此时,函数将把截断区域外的区间视为零,故conv()计算出的卷积只有部分是真实的。2、连续信号的卷积在第一章中我们对连续信号的卷积(卷积积分)做了分析,卷积积分运算实际上可用信号的分段求和来实现。用MATLAB实现连续信号f1(t)与f1(t)卷积的过程如下:1.将连续信号f1(t)与f1(t)以时间间隔Δ进行取样,得到离散序列f1(kΔ)与f1(kΔ);2.构造与f1(kΔ)和f1(kΔ)相对应的时间向量k1和