logo资料库

实验三信号卷积的MATLAB实现.pdf

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
实验三 信号卷积的 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)= / 2te ,我们可以用符号表达式表示为: 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
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) k0=k1(1)+k2(1); %计算序列 f1 与 f2 的卷积和 f %计算序列 f 非零样值的起点位置 k3=length(f1)+length(f2)-2; %计算卷积和 f 的非零样值的宽度 %确定卷积和 f 非零样值的序号向量 %在子图 1 绘序列 f1(k) 时域波形图 %在子图 2 绘序列 f2(k) 时波形图 k=k0:k0+k3 subplot(2,2,1) stem(k1,f1) title('f1(k)') xlabel('k') ylabel('f1(k)') subplot(2,2,2) stem(k2,f2) title('f2(k)') xlabel('k') ylabel('f2(k)') subplot(2,2,3)
分享到:
收藏