1、离散卷积和循环卷积的计算机计算 信号与系统课程设计信号与系统课程设计报告离散卷积和循环卷积的计算机计算学 号 姓 名 专 业 班 级 指 导 教 师 院(系、所) 电气与电子工程学院 华中科技大学教务处制独创性声明本人声明所呈交的课程设计是我个人在信号与系统结课后自行完成的成果。尽我所知,除文中已经标明引用的内容外,本课程设计不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。课程设计作者签名: 日期: 年 月 日摘 要信号与系统这门课程的重要性对于电气工程及其自动化这个专业来说可谓是举足轻重
2、的。尤其是在对理解自动化控制、电气信号处理等方面都有着不可忽视的指导作用。所以,信号与系统这门课程的学习关系到今后的工程学习。卷积,顾名思义,将信号卷起来再作乘积。这个知识是我在复变函数里面第一次接触的,而我对它的第一印象也只是那个特别不好计算的积分公式。不过相对于计算而言,更难的是对卷积计算的一种理解,特别是对实际模型运用的理解。所以在做卷积的课程设计时,知道很多同学都在做卷积的设计,但我相信我的课程设计的亮点将体现在我多样化的设计思路以及对卷积本身的意义。 首先,是卷积计算机语言实现的多种设计思路。由于卷积的算法除了套用公式外还可以通过规律递推或者现有函数算法去实现,所以在分析这些设计思路
3、的时候,应该着重把握设计的需求目的以及程序实现的可行性,这样的路线才是最佳的。这种设计选择体现了工程上的设计多样性。然后,是卷积算法的计算机实现过程。实现卷积的时候,主要用到数组和循环的运算,通过不算地设计、实现、修改,我不但可以回忆起之前学过的C+知识,而且可以让我更加熟练地运用这些知识,更加充分地理解这些概念。最后,是卷积对于处理信号实际意义的理解。卷积这种算法并不是为信号与系统这门课程所霸占,所以我理解卷积的时候首先从现实生活中的实际模型入手,然后将其抽象为信号层面的含义,进一步理解卷积对于信号与系统的重要性。本文将卷积这样一个抽象的数学概念,首先通过计算机处理去理解其表层含义,进而转变
4、为一个可以理解的实际物理概念。将信号与系统中处理问题的方法扩展到现实生活问题的处理办法,进而统一了工程概念上和现实意义上的信号与体统。关键词:信号与系统;卷积;设计多样性;C+;卷积的实际意义1 任务和要求1 课程设计概述1.1 题目离散卷积和循环卷积的计算机计算1.2 内容简介设有两离散序列和,则两序列的离散卷积和循环卷积分别为: (1) (2)画出计算此两卷积的程序框图,并用C+语言编写计算程序,计算出结果。1.3 课设方式(软件或硬件方面的内容和条件):学生用C+语言编程,分析计算结果。1.4 课程设计要求画出计算程序流程图;完成C+语言编程与计算;验证计算结果;提交课程设计报告。2 工
5、作原理2.1 C+输入输出2.1.1 C+输入的定义cin 为C+编程语言互换流中的标准输入流,需要iostream.h支持。其用法为:cin 表达式1 表达式2. 表达式n;2.1.2 C+输出的定义cout为C+编程语言互换流中的标准输出流,需要iostream.h支持。其用法为:cout 表达式1 表达式2. 表达式n;2.1.3 使用范例:#include int main()int a;cout请输入一个数字,按回车结束 a;coutaendl;return 0;2.2 C+数组应用2.2.1 定义 数组:同类型变量或对象的集合称为数组。2.2 2.2.1 2.2.2 一维数组的格式
6、定义:类型 数组名下标表达式如:int array5;定义了一个名叫array的一维整型数组,其数组元素分别为:array0,array1,array2,array3,array4。2.2.3 一维数值型数组的赋值输入:数组名是数组首元素的内存地址, 是一个常量,不能被赋值。 一维数值型数组: 要对各数组元素操作,不能直接用数组名操作。 输入数组各数组元素的值: int j,a5; for(j=0;jaj;2.2.4 一维数值型数组的输出: int a5=1,2,3,4,5; couta; /输出内容错,输出是一地址 int a5=1,2,3,4,5; for(j=0;j5;j+) couta
7、jendl;2.3 循环卷积一般教材给出如下定义:设有两个长度分别为M,L的序列x(n),h(n),(一般情况M,LN)那么两序列的N点循环卷积定义为: 。 (3)从定义中很难找到两个序列x(n)、h(n)作N点的循环卷积的方法,原因在于定义式中的h(n-m )NRN(n) 的含义不明白。因此在做循环卷积之前必须先说明循环移位( 有的教材称为圆周移位)。x(n) 为有限长序列,长度为M,序列以N 为周期的循环移位定义为:y(n)=x(n+m) NRN (n) (4)循环移位可以用下列三个操作来完成。首先将x(n) 以N 为周期作周期延拓得到周期序列了X(n)-x(n) N;然后将周期序列X(n
8、) 左移m 位,得X(n) =x(n+ m) N;最后取主值x(n+m) NRN (n)。经过上述三个操作就完成公式(4)循环移位。当表达式为y(n)=x(n+m) NRN (n),在第二步将周期序列X(n) 右移m 位,同理经过三个步骤可以求得循环右移序列。12.4 离散卷积给定两个离散时间信号x(n)和v(n),x(n)和v(n)的卷积定义为: (5)式(5)右边的和是叫做卷积和。对于所有整数n0,如果x(n)和v(n)均为0,则当所有整数 i0 时,x(i)=0,n-i0(或ni)时,v(n-i)=0.这样在式(5)中,i=0 到i=n取值,卷积运算如下:0 n = -1,-2, n =
9、 0,1,2,如果信号x(n)和v(n)以简单数学表达式给定,则只要将x(n)和v(n)带入式(6),就可由解析式计算卷积x(n)*v(n). 23 设计路线与方案3.1 设计路线3.1.1 循环卷积的设计路线 路线一 利用序列延拓的方法计算循环卷积 利用延拓计算循环卷积的方法中最重要的是理解计算式中循环的特点,用序列循环截取的例子说明设计思路:例:设有如图1(a)序列x(n),序列长为4,求y(n)=x(n+3)6R6(n)根基定义第一步,将序列x(n)以6为周期作周期延拓,得到图1(b)。接着按照第二步将图1(b)的周期序列左移三位,得到图1(c)。最后取一个周期的主值,也就是用序列R6(
10、n)与图1(c)的序列相乘,图1(d)虚框所包围的便是要求的序列。3在例子中序列先延拓后平移再截取的计算方法,是在信号与系统学习时理解卷积计算的最佳方法,在用计算机语言去实现的时候需要用到动态数组,具体的步骤如下:1 输入x v两序列;2 将v序列以原点对称翻折到负半轴;3 将v序列以N为周期延拓;4 将x序列与v序列对应项相乘后求和5 得到的结果为y序列的第一项6 将v序列接着向正半轴平移一个单位,重复步骤,得到的是y序列之前得到结果的后一项;7 重复步骤,直到平移的次数为选定的循环周期N;8 得到y序列中的N个项即为循环卷积所得结果;路线优点:设计思路易于理解,能够体现出循环卷积计算的本质
11、。路线缺点:由于序列须要延拓,一是占用了更多的计算机存储空间,二是要计算出最短延拓长度以减少计算机计算量和存储空间,这样使算法复杂。路线二 利用序列非延拓的方法计算循环卷积通过例子分析出,卷积的计算规律。例:两个长度为三的序列x ,v按照周期N=3做卷积,运算参与的项为x0, x1, x2, v0, v1, v2,将其代入到循环卷积计算式 (7)中得,y0=x0v0+x1v2+x2v1y1=x0v1+x1v0+x2v2y2=x0v2+x1v1+x2v0通过例子,可以发现规律:以x序列作为排列顺序,和式由两部分组成,第一部分是x的编号小于等于y的编号时,v的编号是y的编号减去x的编号;另外一部分
12、是x的编号大于y的编号时,v的编号是在y的编号减去x的编号基础上,再加上周期N这个规律适用于所有以0为赋值起点序列的循环卷积计算。路线优点:这种方案在计算机算法中应该是最好的一种,因为这种方案不需要序列延拓,而是通过计算的项之间的规律完成算法。这样就节省了很大的存储空间,同时也确定了序列的长度,这样可以在计算机中精确的把握计算的规格。路线缺点:规律递推的方法不便于去便理解循环卷积的计算,同时算法不易理解。路线对比:路线一从原理方面入手,路线二从算法方面入手,由于在计算机的编写中,一个函数是可以封装的,人们只能看见其功能和外部接口,而不需要考虑其内部结构,所以原理不用体现在算法的设计中,只需要计
13、算次数最少,所占存储空间最少,算法规格可以明确的路线即可。所以最终选择路线二。3 3.1 3.1.1 3.1.2 离散卷积的设计方案路线一 通过离散卷积内部规律计算首先举出一个长度为三和一个长度为四的序列作离散卷积的例子:设x序列的内容为x0, x1, x2,v序列的内容为v0, v1, v2, v3,则通过离散卷积公式 (8)所得结果为,y0=x0v0y1=x0v1+ x1v0y2=x0v2+ x1v1 + x2v0y3=x0v3+ x1v2 + x2v1y4=x1v3 +x2v2y5=x2v3 通过这个例子可以看出对于y序列中的一项编号是和式中每一项两个序列编号之和。路线优点:这个规律非常
14、明显,而且非常易于实施,只要限定好x和v两个序列的编号上下限,然后利用计算机语言中for循环就可以解决。路线缺点:规律性的结论需要原始公式去证明,不但增加了工程难度,同时若规律出现了错误,亦加大了实际设计的工程量。方案二 利用FFT计算离散卷积利用FFT 技术,也就是用循环卷积来替代离散卷积。由于循环卷积是对有限项求和,特别适合于计算机运算,在速度上比直接计算离散卷积要快得多,所以通过循环卷积来计算离散卷积具有较大的优越性。由定义可知,循环卷积是离散卷积的周期延拓序列的主值序列。因此,为了避免混叠,其必要条件是将序列都补零点,补到序列长度至少为离散卷积结果的长度,然后计算循环卷积,这时循环卷积
15、就能代表离散卷积的结果。由上分析可知,要求两个长度为的序列的离散卷积时,可先将这2 个序列补N - 1 个零点使其变为两个长度均为2N - 1 的序列,然后分别求出它们的离散付里叶变换(简称DFT) ,再相乘起来,最后再求其离散付里叶反变换,从而获得长度为2N - 1的两个序列的循环卷积,它就是原来两个长度为的序列的离散卷积。由于循环卷积可使用DFT 的快速算法FFT 来计算,则当序列x ( n) 和h ( n) 的长度分别为N 和M 时,离散卷积y (n) 的计算可按以下步骤进行:(1) 将x (n) 和h (n) 都补零至L 点,L = N + M -1 ;(2) 计算x ( n) 的L
16、点FFT ,即x ( k) = FFT x(n) ;(3) 计算h ( n) 的L 点FFT ,即H( k) = FFT h(n) ;(4) 计算Y(k) = X(k) H(k) ;(5) 计算Y(k) 的反变换,即y (n) = IFFT X(k)(1) 将x (n) 和h (n) 都补零至L 点,L = N + M -1 ;(2) 计算x ( n) 的L 点FFT ,即x ( k) = FFT x(n) ;(3) 计算h ( n) 的L 点FFT ,即H( k) = FFT h(n) ;(4) 计算Y(k) = X(k) H(k) ;(5) 计算Y(k) 的反变换,即y (n) = IFF
17、T X(k)H(k) 。路线优点:图1 为实现快速卷积的运算过程,可见实现这一快速卷积的过程共需两次FFT 和一次IFFT ,相当于三次FFT 运算;而对于一般的离散系统,由于其特征已知,则由h (n) 计算H(k) 这一步骤可提前进行,并将数据存储起来,而不必每次实时计算,故该FFT 算法过程仅需一次FFT 和一次IFFT ,相当于两次FFT 运算,从根本上减少了复数乘法运算次数,提高了信号处理的实时性。依据FFT 的运算公式,则需2(log2L) 次复数乘法运算。另外第(4) 步还需要次复数乘法运算,故整个运算过程中复数乘法运算次数为: 4L(1+log2L) . 显然,随着N 值得增大,
18、其运算量与直接进行时域运算相比,要快很多。而且当N 越大,L 值就越大,用循环卷积计算的优越性就越明显。4路线缺点:显然通过C+语言去实现FFT算法的难度已经远远超过了离散卷积本身的难度。如果采用MATLAB语言编写则可直接运用其FFT算法来计算,那么这条路线便是最优方案。路线对比:路线一是从简单算法方面入手,路线二则是从高级算法入手,可以说在高级计算机语言的设计中,若存在两者的函数,两者都是最佳方案。但是由于采用C+语言进行编写,其不包含FFT算法,若再采用路线二则加大了工程量,增加了计算难度,所以最终采用易于实现的路线一。3.2 设计方案3.2.1 设计步骤1 分析设计任务及要求;2 安装
19、设计所需的语言软件;3 分析离散卷积和循环卷积的计算方法及二者的区别;4 将离散卷积和循环卷积转变为满足计算机逻辑的计算方法;5 用流程图的方式体现该逻辑方法;6 按照流程图的顺序编写计算机语言;7 编写结束进行调试;8 如调试失败则通过断点分析存储数据的情况,修改原语句;如调试成功,则路线;9 将初步完成的程序交付用户使用,并继续修改至便于用户实用的界面;10 完成设计报告,并写出自己的收获与心得3.2 3.2.1 3.2.2 设计流程图(附录一)1 2 3 3.1 3.2 3.2.1 3.2.2 计算机语言代码#include /引用IO定义文件#include /引用必要的头文件tusi
20、ng namespace std; /声明域名空间int main() /主程序定义 int CircleConvolution(); /声明套用的循环卷积y函数y int DiscreteConvolution(); /声明套用的离散卷积y函数y char select; /定义用于不同功|能选择的字符 coutWelcome to the Caclulator of Convolution!nendl; /输出字符,为开始界面 cout Enter the Circle Convolution mode, please press C or c. nEnter the Discrete C
21、ovolution mode, please press D or d. nIf you want to exit, you can press any key. select; /输入选择模式的字符 if(select = C | select =c) CircleConvolution(); if(select = D | select =d) DiscreteConvolution(); else exit(0); /直接退出程序 return 0;int DiscreteConvolution() /定义离散卷积函数y float x100=0,v100=0,y200=0; /定义参与
22、运算的序列并对其初始化 int h,i,j,k; /定义运算所用到的参数y,其中Dh&k用于循-环,i&j定义序列长度 char select; /定义用于不同功|能选择的字符 int main(); /声明用到的函数名 coutnnWelcome to the Calculator of Discrete Convolution!n; couti; coutnPlease input the content of sequence x.n; /开始对x序列进行赋值 for(h=0;h=i-1;h+) coutxhxh; ; coutj; coutnPlease input the conte
23、nt of sequence v.n; /开始对v序列进行赋值 for(h=0;h=j-1;h+) coutvhvh; ; for(k=0;k=j+i-2;k+) /对序列x和序列v进行离散卷积运算,得到序列y for(h=0;h=h) yk+=xh*vk-h; coutnThe result of the calculation is:n; /显示结果 for(h=0;h=i+j-2;h+) coutyh=yhendl; coutnnIf you need another service, please press S or s. nIf you want to exit, you can
24、press any key. select; if(select = S | select =s) main(); /回到主程序 else exit(0); /直接退出程序 return 0;int CircleConvolution() float x100=0,v100=0,y100=0; /定义参与运算的序列并对其初始化 int h,i,j,k,n; /定义运算所用到的参数y,其中h&k用于循-环,i&j定义序列长度,n定义循-环周期 char select; /定义用于不同功能选择的字符 int main(); /声明用到的函数 coutnnWelcome to the Calcula
25、tor of Circle Convolution!n; coutn; couti; for (;in;) /限制序列x的长度小于周期n couti; coutnPlease input the content of sequence x.n; for(h=0;h=i-1;h+) /对序列x进行D赋3值 coutxhxh; ; coutj; for (;jn;) /限制序列v的长度小于周期n coutj; coutnPlease input the content of sequence v.n; /对序列v进行赋值 for(h=0;h=j-1;h+) coutvhvh; ;for(h=0;h=n-1;h+) /对序列x和序列v进行循环卷积运算,得到序列y for(k=0;k=n-1;k+) if(h=k) yk+=xh*vk-h; else yk+=xh*vk-h+n; coutnThe result of the calculation is:n; /显示结果 for(h=0;h=n-1;h+) coutyh=yhendl; coutnIf you need another service, please press S or s. nIf you want to exit, you can press any key. endl; /选择其他模式
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1