编号:60431786
类型:共享资源
大小:153.87KB
格式:DOCX
上传时间:2020-03-21
上传人:简***
认证信息
个人认证
牛**(实名认证)
湖北
IP属地:湖北
12
积分
- 关 键 词:
-
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=∆t k=-∞∞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:
从外部获取两个序列
做这两个序列的时间向量
利用stem命令将这两个序列的图画出来
用conv()函数求这两个序列的卷积
对应好卷积后的时间向量,用
Stem命令将卷积后的图像画出来
框图1
程序如下所示:
function xn=dconv(x1,x2) %任意两序列卷积
x11=-5:length(x1)-6; %设定x1(n)的时间向量
x22=-5:length(x2)-6; %设定x2(n)的时间向量
subplot(131),stem(x11,x1,’fill’),grid on; %画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’),grid on; %画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’),grid on; %画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:
用conv()函数求这两个信号的卷积
再乘以抽样的间隔,就是我们所求
从外部获取两个离散化的连续信号
做这两个信号离散后的时间向量
对应好卷积后的时间向量,用
plot命令将卷积后的图像画出来
利用plot命令将这两个信号的图像画出来
框图2
程序在编的时候要注意外部获取的连续信号的抽样频率和抽取信号的长度要与自己所编的ddconv()里面的要一致,特别是横坐标要对应,不然就是错误的,因为卷积之后的区间长度发生变化,卷积完之后要拿掉增加的那一部分,才时间与信号的值是正确的对应关系。卷积完之后的值要乘以抽样频率,才是我们所求那么,程序如下:
function ft=ddconv(ft1,ft2) %任意两个连续信号卷积
x1=-3:0.001:4;
x2=-3:0.001:4;
subplot(131),plot(x1,ft1),grid on;
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),grid on;
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),grid on;
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()的一致,所以其程序如下:
function f= 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),grid on;
title(x(n)=u(n)-u(n-4)),xlabel(n),ylabel(x(n)),set(gca,xtick,k1:k2);
axis([k1 k2 min(f)-1 max(f)+1])
end
现在调用这个rectanglestem()函数让它生成先xn=un-u(n-4),在”名命令窗口输入“x1n=rectanglestem(0,4) ”其生成的图像如图1所示;
图 1 xn=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]”具体的程序如下:
function f= 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),grid on;
title(f(t)=u(t-a)-u(t_b));
xlabel(y);
xlabel(t);
set(gca,xtick,k1:1/2:k2);
axis([k1 k2 min(f)-1 max(f)+1]);
end
和
function f= 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),grid on;
title(f(t)=1/2*t*[u(t-a)-u(t_b)]);
xlabel(y);
xlabel(t);
set(gca,xtick,k1:1/2:k2);
axis([k1 k2 min(f)-1 max(f)+1]);
end
现在我们在命令窗口输入“f1t= RectangleWindow( -1/2,1)”再输入“f2t=signal(0,2)”此时生成“f1t=ut+12-ut-1”和“f2t=12t[ut-ut-2]”的图像分别如图3,图4所示:
图 3 ut+12-ut-1的图像
图 4 12t[ut-ut-2 的图像
现在“f1t=ut+12-ut-1”和“f2t=12t[ut-ut-2]”都已经生成,现在利用编制的ddconv()来求“ft=f1t*f2(t)”,我们在命令窗口输入“ft=ddconv(f1t,f2t)”则生成的图像如图5所示:
图 5
MATLAB中的dconv()函数只能计算两个有限长序列的卷积和,如果其中一个为无限长时,我们可以先将这个信号进行傅里叶变换求乘积之后再作傅里叶逆变换,就能实现无限长的信号的卷积。
参考文献
[1]郑君里,应启珩,杨为理.信号与系统引论.北京:高等教育出版社,2009.
[2]李敏,陈兴文.信号分析与处理的软硬件实现.大连:大连海事大学出版社,2009.
- 内容简介:
-
-
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。