信号与系统课程设计--离散卷积和循环卷积的计算机计算

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

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

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

资源描述

1信号与系统课程设计报告电气与电子工程学院0711班赵志伟二OO九年七月2离散卷积和循环卷积的计算机计算课题介绍:卷积是信号与线性系统中重要的一部分,在生活中的应用也极其广泛。设有两离散序列][nx和][nv,则两序列的离散卷积和循环卷积分别为:][][][][][invixnvnxnyi]mod,[][][][][Ninvixnvnxnyi任务:画出计算程序流程图;完成C语言编程与计算;验证计算结果;提交课程设计报告。3目录一.设计简介........................................4二.设计要求........................................5三.设计路线........................................5四.设计内容........................................64.1原理学习...................................64.1.1离散卷积.........................................64.1.2循环卷积.........................................64.2利用C语言编程进行计算.......................94.2.1程序分析.........................................94.2.2程序..................................................104.3试验结果及结论.........................................................................16五.结果分析及感想.................................18六.参考文献.......................................194离散卷积和循环卷积的计算机计算一、设计简介主题:1)分析离散卷积与循环卷积的特点与不同2)画出计算程序流程图3)用C语言编程并计算4)用所学知识验证该计算结果方法:1)通过学习课本及参阅相关书籍从理论上分析离散卷积与循环卷积的特点2)用C语言编程进行计算,并验证计算结果结果:1)复习了原来所学的有关离散卷积和循环卷积的特点加深了对课本内容的理解2)将所学的c语言应用于实际的课题设计中,是对汇编语言的一个复习。5二、设计要求1)实验要求用计算机来计算离散卷积和循环卷积,这两种计算方法有相同之处也有不同之处,试画出计算程序流程图并完成C语言编程与计算。2)验证计算机的计算结果,3)提交课程设计报告。三、设计路线1)参考并复习了信号课本,对离散卷积以及循环卷机有了一个初步的认识;2)去图书馆查阅更多有关离散卷积和循环卷积介绍的书籍,在理论知识上进一步丰富和扩展;3)阅读书籍,复习有关汇编语言的应用;4)画出计算程序流程图并用C语言编程,并完成计算;5)验证计算结果。6四、设计内容离散卷积和循环卷积的计算机计算4.1原理学习卷积作为一种运算在信号与系统中有着举足轻重的地位,很多计算中均要涉及卷积运算,这里只介绍线性离散卷积以及循环卷积。4.1.1离散卷积在信号与线性系统中,定义x[n],v[n],其卷积为][][][][][invixnvnxnyi计算卷积时,首先将x[n],v[n]中的离散时间序号n改为i,得到信号x[i],v[i],下一步确定v[n-i]和乘积x[i]v[n-i]。信号v[n-i]是信号v[i]的反折和平移,通过对x[i]v[n-i]中的i求和即可计算出来,式中i取一定范围的的整数。4.1.2循环卷积实际问题的大多数是求解线性卷积,如信号x(n)通过系统h(n),其输出就是线性卷积y(n)=x(n)*h(n)。而循环卷积比起线性卷积,在运算速度上有很大的优越性,它可以采用快速傅里叶变换(FFT)技术,若能利用循环卷积求线性卷积,会带来很大的方便。现在我们来讨论上述x(n)与h(n)的线性卷积,如果x(n)、h(n)为有限长序列,则在什么条件下能用循环卷积代替而不产生失真。有限长序列的线性卷积:假定x(n)为有限长序列,长度为N,y(n)为有限长序列,长度为M,7它们的线性卷积f(n)=x(n)*y(n)也应是有限长序列。因x(m)的非零区间:0≤m≤N-1,y(n-m)的非零区间:0≤n-m≤M-1,这两个不等式相加,得:0≤n≤N+M-2,在这区间以外不是x(m)=0,就是y(n-m)=0,因而f(n)=0。因此,f(n)是一个长度为N+M-1的有限长序列。重新构造两个有限长序列x(n)、y(n),长度均为Lmax{N,M},序列x(n)只有前N个是非零值,后L-N个为补充的零值;序列y(n)只有前M个是非零值,后L-M个为补充的零值。为了分析x(n)与y(n)的循环卷积,先看x(n),y(n)的周期延拓:rqrLnynyqLnxnx)()(~)()(~它们的周期卷积序列为:1010)(~)()(~)(~)(~LmLmlmnymxmnymxnfMmnymxnynxnf)()()(*)()(8rrLmLmrrLnfmrLnymxmrLnymx)()()()()(1010其中f(n)就是线性卷积,也就是说,x(n)、y(n)周期延拓后的周期卷积,是x(n)、y(n)线性卷积的周期延拓,周期为L。根据前面的分析,f(n)具有N+M-1个非零序列值,因此,如果周期卷积的周期LN+M-1,那么f(n)周期延拓后,必然有一部分非零序列值要重叠,出现混淆现象。只有L≥N+M-1时,才不会产生交叠,这时f(n)的周期延拓)(~nfl中每一个周期L内,前N+M-1个序列值是f(n)的全部非零序列值,而剩下的L—(N+M-1)点的序列则是补充的零值。循环卷积正是周期卷积取主值序列:)()(~)()()(nRnfnynxnfLll)()(nRrLnfLr所以使圆周卷积等于线性卷积而不产生混淆的必要条件是:L≥N+M-194.2利用C语言编程进行计算4.2.1程序分析由公式我们可得到计算离散卷积时需要用户输入x[m]和v[n]的值,这样便可以得到所要求的离散卷积的值,但是对于循环卷积来说,不仅要知道这两组数而且要确定N值。这样就有两种方式来获得N,一种就是由计算机直接得到一种就是由用户输入来确定,这样一来我们就得到两种方案方案一:序列长度(m与n)由用户保证,计算所有离散卷积,并给出长度;用户给出N值,并保证N≥max{m,n},当N<max{m,n}时程序提示“错误”,并要求其重新输入,计算出N值时的循环卷积:用户输入两正序列x[n],v[n]的序列长度m与n(序列长度小于300),并输入x[n]与v[n]的值和N的值,程序给出结果。方案二:序列长度(m与n)由用户保证,计算所有离散卷积,并给出长度;对所有max{m,n}≤Nm+n的N进行循环卷积计算,并说明当N>m+n-1时循环卷积的值等于线卷积的值:用户输入两正序列x[n],v[n]的序列长度m与n(序列长度小于300),并输入x[n]与v[n]的值,程序给出结果。104.2.2程序计算程序流程图方案一:方案二:与方案一类似11程序:方案一:(由用户决定N的取值)#includestdio.hmain(){staticfloatx[300],v[300],y[600],z[600];*静态定义数组,自动全部清零*/intm,n,L,i,j,k,s,N;/*可计算含非整数值的序列的卷积*/printf(inputthex[n]'slengthm(m300):\n);scanf(%d,&m);printf(inputthev[n]'slengthn(n300):\n);scanf(%d,&n);L=m+n-1;printf(inputthex[n]\n);for(i=0;i=m-1;i++)scanf(%f,&x[i]);for(i=0;i=m-1;i++)printf(x[%d]=%f\n,i,x[i]);printf(inputthev[n]\n);12/*linearconvolution*/for(j=0;j=n-1;j++)scanf(%f,&v[j]);for(j=0;j=n-1;j++)printf(v[%d]=%f\n,j,v[j]);printf(theresultoflinearconvolution:\n);for(i=0;i=L-1;i++){s=0;for(j=0;j=i;j++){k=i-j;s+=x[j]*v[k];y[i]=s;}printf(y[%d]=%f\n,i,y[i]);}printf(y[n]=0forothern\n);printf(andthelengthofy[n]isl=%d\n,L);/*circularconvolution*/Z:printf(inputtheN(N=%d)\n,m=n?m:n);scanf(%d,&N);13if(N(m=n?m:n)){printf(error!);gotoZ;}/*当N不满足条件时报错并要求用户重新输入N值*/printf(theresultofcircularconvolutionforN=%d:\n,N);for(i=0;i=N-1;i++){s=0;for(j=0;j=N-1;j++){k=i-j;if(k0)k=k+N;s+=x[j]*v[k];z[i]=s;}printf(z[%d]=%f\n,i,z[i]);}}方案二:(所有适当的N都计算其循环卷积)#includestdio.hmain(){staticfloatx[300],v[300],y[600],z[600];/*静态定义数组,自动全部清零*/14intm,n,L,i,j,k,s,N;printf(inputthex[n]'slengthm(m600):\n);scanf(%d,&m);printf(inputthev[n]'slengthn(n300):\n);scanf(%d,&n);L=m+n-1;printf(inputthex[n]\n);for(i=0;i=m-1;i++)scanf(%f,&x[i]);for(i=0;i=m-1;i++)printf(x[%d]=%f\n,i,x[i]);printf(inputthev[n]\n);for(j=0;j=n-1;j++)scanf(%f,&v[j]);for(j=0;j=n-1;j++)printf(v[%d]=%f\n,j,v[j]);/*linearconvolution*/printf(theresultoflinearconvolution:\n);for(i=0;i=L-1;i++){s=0;15for(j=0;j=i;j++){k=i-j;s+=x[j]*v[k];y[i]=s;}printf(y[%d]=%f\n,i,y[i]);}printf(y[n]=0forothern\n);printf(andthelengthofy[n]isL=%d\n,L);/*circularconvolution*/printf(theresultofcircularconvolution:\n);/*计算循环卷积时能自动判断N的最小取值,并在N>m+n-1后给出循环卷积离散卷积结果相同*/N=m=n?m:n;while(N=m+n){printf(whenN=%d\n,N);for(i=0;i=N-1;i++){s=0;for(j=0;j=N-

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

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

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

×
保存成功