信号与系统中的卷积算法--论文

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

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

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

资源描述

1信号与系统论文卷积算法姓名:曹九一班级:电气10-9学号:29号23卷积算法摘要:卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有意义的。卷积运算是一种有别于其他运算的新型运算,是信号处理领域中一种常用的重要工具。随着信号与系统理论的研究的深入及计算机技术发展,不仅使卷积方法在很多领域得到很广泛的应用,而且卷积运算的逆运算------反卷积的问题也越来越受重视和应用。在语言识别、现代地震勘测,超声诊断,光学诊断,光学成像,系统辨识及其他诸多信号处理领域中卷积和反卷积无处不在,而且许多都是有待深入开发研究的课题。用计算机来进行信号与系统分析,了解并灵活运用卷积运算去解决问题,提高自身的理论知识水平和动手能力,才是学习卷积运算的真正目的。卷积运算的理论运算1卷积的概念及表达方式卷积是信号处理中经常用到的运算。其离散型基本的表达式为:nmmnhnxnhnxny0)()()()()(其连续型基本的表达式为:dthxthtxt)-()()()()(y换而言之,假设两个信号f1(t)和f2(t),两者做卷积运算定义为f(t)d做一变量代换不难得出:f(t)d=f1(t)*f2(t)=f2(t)*f1(t)2阶梯函数卷积所谓阶梯函数,即是可以用阶梯函数u(t)和u(t-1)的线性组合来表示的函数,可以看做是一些矩形脉冲的集合,图1-1给除了两个阶梯函数的例子41—1其中3)-u(t-2)-2u(t-1)-u(t2u(t)f(t),3)-3u(t-2)-2u(t1)-u(t-2u(t)h(t)。以图1—1中两个阶梯函数为例介绍本文提出的阶梯函数卷积算法。根据卷积的性质(又称为杜阿美尔积分),上述f(t)与h(t)的卷积等于f(t)的导数与h(t)的积分的卷积,即:tdhdttdtht)t*)(f)(*)(f(由于f(t)为阶梯函数,因此其导数也为冲击函数及其延时的线性组合,如图1—2(a)所示。51—2由于h(t)也为阶梯函数,所以其积分也能方便地求得,其值为阶梯函数图像下方的面积,记作为H(t),如图1—2(b)所示:冲击函数与其它函数的卷积有如下的关系:H(t)=H(t-T),因此f(t)*h(t)=2H(t)+2H(t-1)-H(t-2)-H(t-3).即f(t)和(t)的卷积等于H(t)及其延时的线性组合,如图1-3所示:1—3从以上分析可以看到,两个阶梯函数的卷积等于其中一个函数的积分H(t)及其延迟H(t)的线性组合,组合系数对应于各个冲击函数的系数。对于任意函数的卷积,可以先将他们的用矩形脉冲函数来逼近只要时间间隔足够小就能达到足够的逼近精度。逼近所得到的函数即为阶梯函数,然后又采用上述方法即可得到任意两个函数的卷积。3任意函数的卷积假设要计算任意函数的卷积:y(t)=x(t)*h(t)其中x(t),h(t)可谓无限长,分别如图3—4(a),(b)所示。63—4连续时间函数对上述x(t)和h(t),用宽度为的梯形脉冲函数逼近,x(t)和h(t)就转化为斜梯函数,用折现函数及其延时的线性组合表示,如图3—4(a),(b)中虚线所示。x(t)=u(t+c1)[u(t-m)-u(t-(m+1))]2—2h(t)=u(t+c1)[u(t-n)-u(t-(n+1)2—3此处c1,c2为常数,由于球x(t)和h(t)的微积分时,与此常数无关,所以此处可不必求出。对式子2—2,求微分有:x’(t)=du(t+c1)[u(t-m)-u(t-(m+1))]/dt2—4设t=k则x’(t)和h’(t)如图2—5(a),(b)所示:3—5斜梯函数的一次微分与积分0m)]/x(m-)1)[x((m(t)x'2—6)(1[210'khkhthk式2—6,2—7如下图3—6所示。73—6斜梯函数的二次额积分令H(k=h(-2)(t),2—7x(t)和h(t)的卷机过程子程序流程图8程序及硬件实现程序大意:首先定义了一个计算卷积的函数Convolveok(double*Input,double*Impulse,double*Output,Word16Length);其中输入为两个双精度的数组Input,Impulse,以及卷积的长度Length,输出为一个双精度的数组Output,这个计算过程详见程序2开始k=Length1-1Output[k]=Output[k]+x[k-i]*y[i],i++i=pp++,p=Length1-1k++Output[k]=Output[k]+x[Length1-1-i]*y[Length1-1-p+i],i++kLength1-1k=Length1-1i=pp-1p=Length1-2ENDYYYNNNN9还定义了一个中断int2,功能是:判断(intnum==Length)是否成立,若不成立则退出,若成立,则执行:将数组in_x[]中的每一个元素与平均值做差,得到一个新的数组Input[],再将Input[]复制到Impulse[]中,将Input[]和Impulse[]作为输入序列,调用Convolveok()做卷积。在main函数中:先调用cpu_init初始化配置,然后对数组Input[]和Impulse[]进行赋值:(1)将数组Input[]中的第0个到第Length/2-1个元素置为200,剩下的从第Length/2个到第Length-1个元素置为0;(2)将数组Impulse[]中的第0个到第Length/2-1个元素置为100,剩下的从第Length/2个到第Length-1个元素置为0然后调用Convolveok()做一次卷积运算开中断,进入死循环,等待中断到来,当中断发生时,则执行int2的功能。******************************************************************************/程序1**TheprogrammeoftheConvolutionAlgorithm.UsingINT2togettheinputsignal.ArrayInput,infirststep,istheinputsignalproducedprogramme,innextstep,istheinputsignalgetfromA/D,thelengthis128,32-bitfloatingpoint.ArrayImpulse,infirststep,istheinputsignalproducedprogramme,innextstep,istheinputsignalgetfromA/D,thelengthis128,32-bitfloatingpoint.ArrayOutputistheConvolutionresult,thelengthis256,32-bitfloatingpoint.*********************************************************************************/#pragmaCODE_SECTION(vect,vect)externvoidInitC5402(void);10#includestdlib.h//调用函数库stdib#includestdio.h//调用函数库stdio#includetypedef.h//调用函数库tyjpedef#includeConvolve.h//调用函数库Convolve#includemath.h//调用函数库math#definepi3.1415927//定义圆周率pi的值#defineIMR*(pmem+0x0000)#defineIFR*(pmem+0x0001)#definePMST*(pmem+0x001D)#defineSWCR*(pmem+0x002B)#defineSWWSR*(pmem+0x0028)#defineAL*(pmem+0x0008)#defineCLKMD0x0058/*clockmodereg*/#defineLength128//定义一个静态变量Length的值为128#defineLength32*Length//定义一个静态变量Length3的值为2*Lengthints,t=0;//定义变量s和赋给变量t一个值0doubleInput[Length];//定义一个双精度原始输入数据数组Input[Length]doubleImpulse[Length];//定义一个双精度冲击响应数组Impulse[Length]doubleOutput[Length3];//定义一个双精度卷积输出结果数组Output[Length]intxm;//定义一个整型变量xmunsignedint*pmem=0;//定义一个无符号指针整型变量pmem并赋予初值0ioportunsignedcharport8002;//定义一个无符号字符型变量port8002intin_x[Length];//定义一个整型数组in_x[Length]intm=0;//定义一个整型变量m,并赋予初值0intintnum=0;//定义一个整型变量intnum,并赋予初值0doublexavg;//定义一个双精度变量xavgintflag=0;//定义一个整形变量flag,并赋予初值0voidcpu_init()//编辑函数cpu_init(){*(unsignedint*)CLKMD=0x0;//switchtoDIVmodeclkout=1/2clkinwhile(((*(unsignedint*)CLKMD)&01)!=0);//个条件语句while,条件是CLKMD与01不等于0*(unsignedint*)CLKMD=0x77ff;//switchtoPLLPMST=0x3FA0;//给变量PMST赋予初地址0x3FA0SWWSR=0x7fff;//给变量SWWSR赋予初地址0x7fffSWCR=0x0000;//给变量SWCR赋予初地址0x0000IMR=0;//给变量IMR赋予初值0IFR=IFR;//将变量IFR赋给自己11}interruptvoidint2()//编辑中断函数int2{in_x[m]=port8002;//给数组in_x[m]赋予值port8002in_x[m]&=0x00FF;//将数组与0x00FF后赋给数组m++;//变量m自加1intnum=m;//将m赋给变量intnumif(intnum==Length)//判断条件:如果intnum等于Length{intnum=0;//将intnum清0xavg=0.0;//计算数组in_x[]的平均值,长度从0到Length-1for(s=0;sLength;s++){xavg=in_x[s]+xavg;}xavg=xavg/Length;//将平均值保存为xavgfor(s=0;sLength;s++)//for循环{Input[s]=1.0*(in_x[s]-xavg);//将数组in_x[]中每个元素与平均值的差值保//存为一个新数组Input[]Impulse[s]=Input[s];//将数组Input[]的元素复制到Impulse[]中}Convolveok(Input,Impulse,Output,Length);//调用函数Convolveokm=0;//m清0flag=1;//flag置1}}voidset_int(){asm(ssbxintm);IMR=IMR|0x0004;//将IMR的第2位(从低位开始数)置1asm(rsbxintm);}voidmain(void)//主函数程序从这里开始运行12{Input[0]=200;//将数组Input[]中的第0个元素写为200Impulse[0]=100;//将数组Impulse[]中的第0个元素写为100

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

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

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

×
保存成功