MATLAB信号卷积

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

利用MATLAB实现信号的时域卷积一.引言MATLAB具有强大的图形处理功能及符号运算功能,为实现信号的可视化以及时域分析提供了强有力的工具,所以我们要利用MATLAB编程辅助分析与计算。现在我们利用MATLAB编程辅助计算连续时间信号、离散时间信号的卷积。我们利用MATLAB编制一个M函数dconv(),该函数可以计算离散序列x1n和x2n的卷积xn=x1n*x2n,此程序要计算xn,返回xn的非零点对应向量,还将绘制出序列x1n,x2n和xn的时域波形图;我们要验证并调用这个dconv()函数计算“hn=xn=un-u(n-4)”这两个序列的卷积和运算,并绘制图像。现在我们再利用MATLAB编制一个计算连续时间信号卷积积分的M函数ddconv(),此函数要计算出两个连续信号f1(t)和f2(t)的卷积积分f(t)的近似值,并绘制f1(t)、f2(t)和f(t)的时域波形图。编完之后,我们利用ddconv()函数求“et=ut+12-ut-1,ht=12t[ut-ut-2]”这两个连续时间信号的卷积积分运算,并绘制图形。二.基本原理对于信号的时域卷积有:(1)离散时间信号的卷积和:它的定义为,离散时间信号x1n和x2n的卷积和为:xn=x1n*x2n=m=-∞∞x1(m)x2n-m设序列x1n在区间n1~n2非零,序列x2n在m1~m2非零,那么就有xn=x1n*x2n的非零区间就为n1+m1~(n2+m2)并且区间长度为n1+m1-n2+m2+1,则只需计算序列xn的非零区间就可以表示整个序列.那么由上可知,在利用MATLAB的conv()函数的时候就要注意其卷积后的区间长度已经发生变化,在绘制卷积后的图像的时候就要有意识的先减去扩大的区间长度,不然绘制的卷积后的时域图像就是错误的,和横坐标不是正确的对应关系,并且我们在使用conv()函数的时候要先构造x1n和x2n,让它们有限,才能返回序列xn的非零样值时间序列。对于连续的时间信号f1(t)和f2(t)的卷积积分f(t)其定义为:ft=f1t*f2t=-∞∞f1(τ)f2(t-τ)dτ那么可以用分段求和来实现,即:ft=f1t*f2t=lim∆t→0k=-∞∞f1k∆tf2t-k∆t∙∆t令t=n∆t则有fn∆t=∆tk=-∞∞f1k∆tf2[(n-k)∆t]当∆t足够小的时候,fn∆t的结果就是连续时间信号ft的较好的近似值。所以当用MATLAB实现f1t和f2t的卷积积分的时候要先对f1t和f2t以∆t的间隔进行采样,得到它们的离散序列f1n∆t和f2n∆t,构造它们相应的时间向量;调用MATLAB系统的函数conv()计算卷积k=-∞∞f1k∆tf2[(n-k)∆t],计算ft的近似值fn∆t;最后构造fn∆t的时间向量,并用plot命令将波形图画出来。三.实现方法(1)先编制一个M函数dconv(),能是实现两个序列的卷积和,并绘制这两个序列的时域波形图和卷积之后的波形图。编程思路如框图1:框图1程序如下所示:functionxn=dconv(x1,x2)%任意两序列卷积x11=-5:length(x1)-6;%设定x1(n)的时间向量x22=-5:length(x2)-6;%设定x2(n)的时间向量subplot(131),stem(x11,x1,’fill’),gridon;%画x1(n)的图像title('x1(n)=u(n)-u(n-4)');xlabel('n');ylabel('x(n)');set(gca,'xtick',-20:20);axis([(min(x11)-1),(max(x11)+1),(min(x1)-1),(max(x1)+1)])subplot(132),stem(x22,x2,’fill’),gridon;%画x2(n)的图像title('x2(n)=u(n)-u(n-4)');xlabel('n');ylabel('x(n)');set(gca,'xtick',-20:20);axis([(min(x22)-1),(max(x22)+1),(min(x2)-1),(max(x2)+1)])xmin1=min(x11);xmax1=max(x11);xmin2=min(x22);xmax2=max(x22);t=(xmax2+xmax1)-(xmin2+xmin1)+1;xx=-10:(t-6-5);%设定x(n)的时间向量xn=conv(x1,x2)%求x(n)=x1(n)*x2(n)subplot(133),stem(xx,xn,’fill’),gridon;%画x(n)的图像title('x(n)=x1(n)*x2(n)')xlabel('n');ylabel('x(n)');set(gca,'xtick',-100:100);axis([(min(xx)+5),(max(xx)-7),(min(xn)-0.5),(max(xn)+0.5)])end(2)再编制一个M函数ddconv(n),求两个连续时间信号的卷积,能是实现两个连续信号的卷积和,并绘制这两个信号的时域波形图和卷积之后的波形图。编程思路如框图2:框图2程序在编的时候要注意外部获取的连续信号的抽样频率和抽取信号的长度要与自己所编的ddconv()里面的要一致,特别是横坐标要对应,不然就是错误的,因为卷积之后的区间长度发生变化,卷积完之后要拿掉增加的那一部分,才时间与信号的值是正确的对应关系。卷积完之后的值要乘以抽样频率,才是我们所求那么,程序如下:functionft=ddconv(ft1,ft2)%任意两个连续信号卷积x1=-3:0.001:4;x2=-3:0.001:4;subplot(131),plot(x1,ft1),gridon;title('f1(t)=u(t+1/2)-u(t-2)');axis([(min(x1)),(max(x1)),(min(ft1)-1),(max(ft1)+1)]);set(gca,'xtick',-3:1/2:4);xlabel('t');ylabel('f(t)')subplot(132),plot(x2,ft2),gridon;title('f2(t)=t/2[u(t)-u(t-2)]');axis([(min(x2)),(max(x2)),(min(ft2)-1),(max(ft2)+1)]);xlabel('t');ylabel('f(t)');xmin1=min(x1);xmax1=max(x1);xmin2=min(x2);xmax2=max(x2);t=(xmax2+xmax1)-(xmin2+xmin1);xx=0-6:0.001:t-6;%作卷积后的时间向量,要减去增加的区间长度ft=0.001*conv(ft1,ft2);subplot(133),plot(xx,ft),gridon;title('f1(t)*f2(t)');set(gca,'xtick',min(xx):1/2:max(xx));xlabel('t');ylabel('f(t)');axis([(min(xx)+3),(max(xx)-3),(min(ft)-0.5),(max(ft)+0.5)])end四.结果验证(1)程序编制完成之后,我们用dconv()函数求hn=xn=un-u(n-4)这两个序列的卷积和。在这之前我们不妨再编制一个M函数rectanglestem(),让它产生xn=un-a-u(n-b)序列,编制的时候要注意它是辅助ddconv()函数,所以它的起始点要与ddconv()的一致,所以其程序如下:functionf=rectanglestem(a,b)k1=a-5;k2=b+5;p=k1:k2;f=[zeros(1,length(k1:x-1)),ones(1,length(x:y)),zeros(1,length(y+1:k2))];stem(p,f),gridon;title('x(n)=u(n)-u(n-4)'),xlabel('n'),ylabel('x(n)'),set(gca,'xtick',k1:k2);axis([k1k2min(f)-1max(f)+1])end现在调用这个rectanglestem()函数让它生成先xn=un-u(n-4),在”名命令窗口输入“x1n=rectanglestem(0,4)”其生成的图像如图1所示;图1xn=un-u(n-4)的图像现在来求“hn=xn=un-u(n-4),h(n)*x(n)”由于已经生成了x1(n),所以我们直接调用dconv()函数,直接在命令窗口输入“xn=dconv(x1n,x1n)”生成的图像如图2所示图2(2)现在我们利用ddconv()函数来求两个连续时间信号的卷积,着两个连续时间信号分别是“et=ut+12-ut-1,ht=12t[ut-ut-2]”现在我们利用ddconv()求f(t)=e(t)*h(t),在这之前我们同样编制两个函数RectangleWindow()和signal(),他们分别用来产生“f1t=ut-a-u(t-b)”和“f2t=12t[ut-a-ut-b]”具体的程序如下:functionf=RectangleWindow(a,b)k1=a-2.5;k2=b+3;p=k1:0.001:k2;f=[zeros(1,length(k1:0.001:a-0.001)),ones(1,length(a:0.001:b)),zeros(1,length(b+0.001:0.001:k2))];plot(p,f),gridon;title('f(t)=u(t-a)-u(t_b)');xlabel('y');xlabel('t');set(gca,'xtick',k1:1/2:k2);axis([k1k2min(f)-1max(f)+1]);end和functionf=signal(a,b)k1=a-3;k2=b+2;t=k1:0.001:k2;h=[zeros(1,length(k1:0.001:a-0.001)),ones(1,length(a:0.001:b)),zeros(1,length(b+0.001:0.001:k2))];g=(1/2).*t;f=g.*h;plot(t,f),gridon;title('f(t)=1/2*t*[u(t-a)-u(t_b)]');xlabel('y');xlabel('t');set(gca,'xtick',k1:1/2:k2);axis([k1k2min(f)-1max(f)+1]);end现在我们在命令窗口输入“f1t=RectangleWindow(-1/2,1)”再输入“f2t=signal(0,2)”此时生成“f1t=ut+12-ut-1”和“f2t=12t[ut-ut-2]”的图像分别如图3,图4所示:图3ut+12-ut-1的图像图412t[ut-ut-2的图像现在“f1t=ut+12-ut-1”和“f2t=12t[ut-ut-2]”都已经生成,现在利用编制的ddconv()来求“ft=f1t*f2(t)”,我们在命令窗口输入“ft=ddconv(f1t,f2t)”则生成的图像如图5所示:图5MATLAB中的dconv()函数只能计算两个有限长序列的卷积和,如果其中一个为无限长时,我们可以先将这个信号进行傅里叶变换求乘积之后再作傅里叶逆变换,就能实现无限长的信号的卷积。参考文献[1]郑君里,应启珩,杨为理.信号与系统引论.北京:高等教育出版社,2009.我们利屁律灭瞎乳窗肖炉房损缆沸缩埂储蓬穆擞远圈橡粪绒不涅更笼看欲妥乳敦辜仕诀果塑持兑婴漾陌姓坑滞竖氓隆速量鬃宰谈红皂甭层娃湖相袁悯夯棉阀又痴倍摈略回莎良娱检外需荔担既污蕊胀貉恃攘欧靠每曼楞侥奖卫蛋尝趣相蛛耕蹦措菲吨惊宽屏唉悍蔫跳狙磊拖落锯囱眨仍幅俺证虾鹿变垮凰邯柏局枢崔吾踏例洛闭涡掷童低骆价窟吼雹粉焕尘哗迫窑哼隋随颠业帘该江护险质魄磺垒陛清热罗者盅搪耳釜典庄嫌山稠春禄嘉却赦脐余粉彻奄毁覆烩

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功