实验三 信号卷积的MATLAB实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三信号卷积的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.1 p=1.5的sint近似波形
图3.2 p=0.01的sint近似波形
2.符号运算表示法
如果信号可以用一个符号表达式来表示它,则我们可用ezplot命令绘制出信号的波形。

例如对于连续信号f(t)=/2t e ,我们可以用符号表达式表示为:syms t
f=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),若有常数t0>0,延时信号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,当a>1时,信号f(at)以原点为基准,沿横轴压缩到原来的1/a;当0<a<1时,就展宽至原来的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.5 conv( )函数流程图
由于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=0 1 3 6 5 3
由这个例子可以看出,函数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)
%the function of compute f=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的卷积和f
k0=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=[1 2 -1 -3 -2 4 ];
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和k2(注意,此时时间序号向量k1和k2的元素不再是整数,而是取样时间间隔Δ的整数倍的时间间隔点);
3.调用conv( )函数计算卷积积分f(t)的近似向量f(nΔ);
4.构造f(nΔ)对应的时间向量k。

根据以上步骤我们自己可以比较容易写出求连续信号卷积的函数程序sconv( ),该函数实现的功能为:在计算连续信号的卷积的同时绘出信号及卷积结果的波形,程序如下:
function [f,k]=sconv(f1,f2,k1,k2,p)
%计算连续信号卷积积分f(t)=f1(t)*f2(t)
%f: 卷积积分f(t)对应的非零样值向量
%k: f(t)的对应时间向量
%f1: f1(t)的非零样值向量
%f2: f2(t)的非零样值向量
%k1: f1(t)的对应时间向量
%k2: f2(t)的对应时间向量
%p: 取样时间间隔
f=conv(f1,f2); %计算需要序列f1与f2的卷积和f
f=f*p; %将f进行采样
k0=k1(1)+k2(1); %计算序列f非零样值的起点位置
k3=length(f1)+length(f2)-2; %计算卷积和f的非零样值的宽度
k=k0:p:k3*p; %确定卷积和f非零样值的时间向量
subplot(2,2,1)
plot(k1,f1) %在子图1绘f1(t)时域波形图
title('f1(t)')
xlabel('t')
ylabel('f1(t)')
subplot(2,2,2)
plot(k2,f2) %在子图2绘f2(t)时域波形图
title('f2(t)')
xlabel('t')
ylabel('f2(t)')
subplot(2,2,3)
plot(k,f) %画卷积f(t)的时域波形
title('f(t)=f1(t)*f2(t)')
xlabel('t')
ylabel('f(t)')
给定下面两个连续信号,我们调用sconv( )函数来求两连续信号的卷积。

f1(t)=2[U(t)-U(t-4)] f2(t)=U(t)-U(t-2)
MATLAB命令如下:
p=0.01;
k1=0:p:4; f1=2*ones(1,length(k1))
k2=0:p:2; f2=ones(1,length(k2)) %f1,f2两个信号的向量表示[f,k]=sconv(f1,f2,k1,k2,p) %子函数调用
运行程序,绘制卷积结果波形如图3.7所示。

图3.7 连续时间信号的卷积
为了能比较熟练的运用MATLAB计算卷积,我们可以将我们比较熟悉的信号都带入到上面的程序中去,当然也可以自己描述一些信号来求其卷积。

四、实验设备:
计算机MATLAB软件
五、实验的预习:
1、认真阅读教科书中有关卷积的这部分内容,了解其原理和计算方法。

2、了解MATLAB的相关知识,包括它的功能,简单的函数用法等等。

六、实验内容及具体步骤:
1.在老师提示和引导下用MATLAB 来表示常见信号
打开电脑,双击桌面上的matlab6.5的快捷方式,进入到MATLAB界面,然后进入编辑界面【file】-【new】,或者直接点击新建空白页按钮,可以看到出现一个命名为untitled的编辑窗口,这就是我们的程序输入窗口。

我们先做准备工作,敲入一些简单的信号并输出,了解一下它的功能。

常见连续信号的表示:阶跃信号门信号正弦信号指数信号等等
常见离散序列的表示:随机离散序列单位阶跃序列正弦序列离散时间指数序列
将描述各个信号的函数键入以后,保存到MATLAB根目录下的work文件
夹中,并按照各个信号的性质进行命名。

然后对各个函数运行一下,看是否和实际的函数一致。

编译程序【debug】-【run】,或者直接按F5就可以进行。

程序不大,编译很快就会完成,成功的编译会出现名为figure的窗口,可以看到信号的波形。

2.针对一些信号做一下时域变换
时域变换主要是在时域范围内对信号进行信号的平移、反折、倒相以及信号的尺度变换。

1)、移位
y=subs(f,t,t-t0);
ezplot(y)
2)、反折
y=subs(f,t,-t);
ezplot(y)
3)、尺度变换
y=subs(f,t,a*t)
ezplot(y)
4)、倒相
y=-f
ezplot(y)
给定一个信号,对此信号做以上这些时域变换操作,将写好的程序保存到根目录work文件夹中,然后对程序进行编译运行,编译成功后,观察图形窗口中显示的波形与原来信号的波形之间的关系。

对信号做时域的变换可以增加学生对MATLAB的认识,也可以巩固对信号的表示。

同时我们也可以用这些变换来表示一些复杂的信号。

3.利用MATLAB计算两个信号的卷积
在MATLAB中我们采用它自带的函数conv( )来对信号进行卷积
1)、求离散序列的卷积
打开一个空白编辑窗口,先将要卷积的两个信号表示出来,然后将两个信号带入到conv( )函数中,键入画图命令stem( )函数。

把写好的程序存入到MATLAB 根目录下的work文件夹中,按F5进行编译运行。

观察输出序列并记录下来。

改变输入序列重做上面的实验,保存,编译,观察和记录输出序列。

同样观察波形在幅度和时域范围的变化。

需要注意的是,调用conv( )函数计算序列卷积和时,该函数将向量f 1和f 2以外的序列样值均视为零,因此,当序列f 1(k )或f 2(k )为无限长序列时调用conv( )函数就可能会产生误差。

所以我们必须对诬无限长序列进行截断到(1~n ),再调用conv( )函数。

而conv( )函数会将0~n 以外均视为零,conv( )计算出的卷积和样值点只有部分是真是的。

这里为了方便求解,把求卷积和过程和绘图命令写在同一个函数dconv 中,在计算离散卷积时只要调用函数就可以了。

2)、求连续信号的卷积
打开一个空白编辑窗口,先将要卷积的两个信号表示出来,然后将两个信号带入到conv( )函数中,再敲入画图命令plot( )函数。

把写好的程序存入MATLAB 根目录下的work 文件夹中,按F5进行编译运行,编译成功后可以观察波形窗口的输出波形,记录下来。

为了能更加深大家的印象,可以换不同的信号来做卷积运算。

只需要把信号表示部分做更改就可以了。

做上面一样的操作,观察记录波形。

同样,我们可以把计算卷积和画图的操作写成一个函数sconv ,而使用时只需表示信号,再调用此函数就可以了。

波形要观察和记录的内容:
1、波形在幅度上的变化;
2、波形在时域范围内的变化;
4.验证信号卷积特性:
卷积的特性有:交换律、结合律、分配律。

这里主要验证它的结合律和分配律。

1)、验证结合律1212[()*()]*()()*[()*()]x n h n h n x n h n h n
要验证结合律,我们要把其中两个信号先进行卷积,再与第三个信号相卷积。

将写好的程序保存,编译运行,将得到的信号保存下来。

将刚刚用过的三个信号调换位置,重复上面的操作。

将程序保存,编译运行。

可以看到所得信号与上面保存的信号是一样的。

说明卷积满足结合律。

2)、验证分配律1212()*[()()]()*()()()x n h n h n x n h n x n h n +=+
要验证分配律,我们先把两个信号相加,表示出来,然后与第三个信号相卷积。

写好程序,保存,编译运行。

再把这两个信号分别与第三个信号进行卷积,然后再把两个信号叠加。

保存程序,编译运行。

观察比较前后两个程序的输出。

输出一致,说明卷积满足分配律。

建议:将实验中的程序保存,而且把输出波形都以图片.jpg 的格式保存下来,我们可以方便的比较实验的结果 (如在验证卷积特性时,等式左右两边的波形图应该是一样的),在实验报告中也会用到。

七、思考题
1、某系统的冲激响应为()()t h t e U t -=,系统的激励为()2*sin
()2t x t U t π=,
试编程求出该系统的零状态响应,并绘出响应波形。

2、实验中没有用连续信号来验证卷积的性质,试仿照离散序列的程序写出用连续信号验证卷积结合律特性的程序,并用简单信号来证明程序正确性。

八、实验报告要求:
(1)简述实验目的记实验原理。

(2)按照实验步骤上的实验过程,把重要的程序和实验结果都记录下来。

(3)总结实验中的主要结论。

(4)回答思考题。

(5)实验心得体会。

相关文档
最新文档