您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于Matlab实现线性卷积等
线性卷积与循环卷积一、作品目的通过matlab的强大功能展示线性卷积和循环卷积过程中方方面面的计算和变化,让大家对这两种卷积有一个更加完美的认识。二、概念简介卷积是一种典型的乘累加运算。1.线性卷积线性卷积是对线性移不变(LSI)系统的输入输出关系的描述,体现系统的特性。线性卷积的表达式为一般情况,现实的系统为因果系统,有k0时,恒有h(k)=0,则若x(n)是一个N点序列,h(n)是一个m点序列,则卷积的结果y(n)将是L=N+M-1点的序列。2.循环卷积设x1(n)和x2(n)是两个长度为L、M的有限长序列,它们的N点循环卷积x3(n)定义为:注意:其中N=Max{L,M}如果其中一个序列(或者两个序列)的长度没有所求N点循环卷积的长度长,那在该序列后面补零,直到长度达到N。三、设计思路及程序1.线性卷积:(1)以输入序列x(n)=[5,4,3,2,1],脉冲响应h(n)=[1,1,1,1]为列进行演示。(2)计算输入序列和脉冲响应的长度。(3)画出补零后的输入序列和脉冲响应(4)设计一个循环,在循环中实现反转、位移和计算。并画出反转后的图像变化和卷积图像,将每一次移位结果保存为fig图。(5)最后将上一步所生成的所有fig图合起来生成一张gif图程序展示:clear;clc;closeall;(1)(2)xn=[5,4,3,2,1];M=length(xn);%输入任意序列并计算长度Mhn=[1,1,1,1];N=length(hn);%输入任意脉冲响应并计算长度Nm=[-(M-1):M+N-2];%设置代换变量的范围以便x(m)翻转和移位(3)xm=[zeros(1,M-1),xn,zeros(1,N-1)];%补零以便与m对应绘图subplot(2,2,1);stem(m,xm,'r.');%%绘输入序列x(m)ylabel('x(m)');gridon;title('(a)输入序列x(m)');hm=[zeros(1,M-1),hn,zeros(1,M-1)];%补零以便与m对应绘图subplot(2,2,2);stem(m,hm,'r.');%绘脉冲响应ylabel('h(m)'),grid,title('(b)脉冲响应h(m)');%%加标签网格和标题yn=zeros(1,2*M+N-2);%卷积输出初始化(4)forn=0:M+N-2;%逐个计算卷积输出ifn==0;xmfy=[fliplr(xn),zeros(1,M+N-2)];%实现翻转elsefork=M:-1:1;xmfy(k+n)=xmfy(k+n-1);endxmfy(n)=0;xmfy;%实现翻转后移位并显示endsubplot(2,2,3);stem(m,xmfy,'b.');%%绘制翻转移位序列ylabel('x(n-m)'),grid,title('(c)x(n-m)');%%加标签网格和标题yn(M+n)=sum(xmfy.*hm);%计算第n位输出并与m位置对应subplot(2,2,4);stem(m,yn,'r.');%%绘制卷积输出序列axis([min(m),max(m),min([0,conv(xn,hn)]),max([0,conv(xn,hn)])]);%%控制绘图坐标ylabel('y(n)');gridon;title('(d)卷积输出y(n)');%%加标签网格和标题pause(.5);drawnow,picname=[num2str(n)'.fig'];%保存的文件名:如i=1时,picname=1.figholdon%写后面的字时,不把前面的字冲掉saveas(gcf,picname)endyn;stepall=M+N-2;(5)fori=1:stepallpicname=[num2str(i)'.fig'];open(picname)set(gcf,'outerposition',get(0,'screensize'));%matlab窗口最大化frame=getframe(gcf);im=frame2im(frame);%制作gif文件,图像必须是index索引图像[I,map]=rgb2ind(im,20);ifi==1imwrite(I,map,'xianxingjuanji.gif','gif','Loopcount',inf,'DelayTime',0.5);elseifi==stepallimwrite(I,map,'xianxingjuanji.gif','gif','WriteMode','append','DelayTime',0.5);elseimwrite(I,map,'xianxingjuanji.gif','gif','WriteMode','append','DelayTime',0.5);end;closeallend实验结果展示:2.循环卷积(1)以输入序列x(n)=[5,4,3,2,1],脉冲响应h(n)=[1,1,1,1]为列进行演示。(2)计算输入序列和脉冲响应的长度。(3)画出补零后的输入序列和脉冲响应(4)设计一个循环,在循环中实现反转、循环、位移和计算。并画出循环反转后的图像变化和卷积图像程序展示:clc;closeall;clear;(1)(2)xn=[5,4,3,2];M=length(xn);%输入任意序列并计算长度Mhn=[1,1,1,1];N=length(hn);%输入任意脉冲响应并计算长度NL=8;ifLmax(M,N);L=max(M,N);end;%输入循环卷积的长度m=0:L-1;%设置代换变量并与两圆周上的编号对应(3)xm=[xn,zeros(1,L-M)];%按圆周编号方向排列不足补零subplot(2,2,1);stem(m,xm,'r.');%%绘输入序列x(m)ylabel('x(m)');grid,title('(a)输入序列x(m)');%%加标签网格和标题hm=[hn,zeros(1,L-N)];%按圆周编号方向排列不足补零subplot(2,2,2);stem(m,hm,'r.');%%绘脉冲响应h(m)ylabel('h(m)');grid,title('(b)脉冲响应h(m)');%%加标签网格和标题ycn=zeros(1,L);%循环卷积输出初始化(4)forn=0:L-1%逐个计算循环卷积num=mod(n-m,L)+1;xn_m=xm(num);%按圆周编号方向反排后正转n位subplot(2,2,3);stem(m,xn_m,'b.');%%绘反排正转序列ylabel('x(n)');grid,title('(c)(x(n-m))L');%%加标签网格和标题ycn(n+1)=sum(xn_m.*hm);%计算第n位循环卷积输出subplot(2,2,4);stem(m,ycn,'r.');%%绘循环卷积输出序列axis([min(m),max(m),min([0,conv(xn,hn)]),max([0,conv(xn,hn)])])%%控制绘图坐标ylabel('yc(n)');grid,title('(d)循环卷积yc(n)');%%加标签网格和标题pause(.5);drawnow,picname=[num2str(n)'.fig'];%保存的文件名:如i=1时,picname=1.figholdon%写后面的字时,不把前面的字冲掉saveas(gcf,picname)endycn;%显示循环卷积结果stepall=M+N-2;(5)fori=1:stepallpicname=[num2str(i)'.fig'];open(picname)set(gcf,'outerposition',get(0,'screensize'));%matlab窗口最大化frame=getframe(gcf);im=frame2im(frame);%制作gif文件,图像必须是index索引图像[I,map]=rgb2ind(im,20);ifi==1imwrite(I,map,'xunhuanjuanji','gif','Loopcount',inf,'DelayTime',0.5);elseifi==stepallimwrite(I,map,'xunhuanjuanji.gif','gif','WriteMode','append','DelayTime',0.5);elseimwrite(I,map,'xunhuanjuanji.gif','gif','WriteMode','append','DelayTime',0.5);end;closeallend结果展示:
本文标题:基于Matlab实现线性卷积等
链接地址:https://www.777doc.com/doc-2534336 .html