华科信号课程设计卷积.docx

上传人:b****5 文档编号:8072167 上传时间:2023-01-28 格式:DOCX 页数:15 大小:175.96KB
下载 相关 举报
华科信号课程设计卷积.docx_第1页
第1页 / 共15页
华科信号课程设计卷积.docx_第2页
第2页 / 共15页
华科信号课程设计卷积.docx_第3页
第3页 / 共15页
华科信号课程设计卷积.docx_第4页
第4页 / 共15页
华科信号课程设计卷积.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

华科信号课程设计卷积.docx

《华科信号课程设计卷积.docx》由会员分享,可在线阅读,更多相关《华科信号课程设计卷积.docx(15页珍藏版)》请在冰豆网上搜索。

华科信号课程设计卷积.docx

华科信号课程设计卷积

 

华中科技大学

电气与电子工程学院

信号与系统课程设计报告

 

设计题目设计卷积计算

学生专业班级电气1009班

学生姓名苏婧媛

学生学号u201012053

指导教师徐垦

完成时间2012年8月12日

 

2012年8月20日

目录

课程设计目的和任务1

分析与设计1

变量意义说明1

设计算法1

程序流程图2

系统实施3

源程序代码3

程序运行说明5

带入验证6

存在的问题9

总结与体会10

一、课程设计目的和任务

    离散卷积和循环卷积的计算机计算。

设有两离散序列和,则两序列的离散卷积和循环卷积分别为:

试画出计算此两卷积的程序框图,并用C++语言编写计算程序,计算出结果。

要求:

画出计算程序流程图;完成C语言编程与计算;验证计算结果

二、分析与设计

1.变量意义说明

设计前提:

两个数列x[n],v[n],长度范围在100以内,如有需要可以再扩大数列长度;

注:

课程设计中文字说明部分的x[n],v[n]中的n表示时间离散;程序中定义的变量n表示数列长度较大的一个;程序输出结果中的文字n是讨论卷积结果时数列在数轴上或圆周上的位移,与书上意义一致,方便使用程序的人理解。

虽然3个n不易区分,但考虑到使用者只看见程序执行时的界面,只有1个n,不会有理解困难。

1)n1:

数列x[n]的长度;n2:

数列v[n]的长度;N:

循环卷积模的大小;

n:

取n1、n2中大的值为其赋值,进行之后的计算;

2)i,j,a:

用来控制进行循环加法的变量;

3)y:

每一次离散卷积的结果;在一次对应卷积的结果输出后置零,进行下一次卷积对应的循环加法,y循环使用;

4)p[n],q[n]:

搭配使用得到需要的v[n-i],方便带入进行循环卷积;

5)z[n]:

每一次循环卷积的结果;每次不同的n对应的卷积结果存在对应的z[n]中;

2.设计算法

分类讨论得到的x[n]、v[n]:

先比较n1、n2的大小:

n1>n2时:

对v[n]补零,使之与x[n]一样长,令n=n1;

n1

对x[n]补零,使之与v[n]一样长,令n=n2;

n1=n2时:

不补零,令n=n1;

再比较n与N,进行之后的两种卷积计算。

n≥N时:

离散卷积:

利用v[i-j](程序中的写法)和循环计算等价出向右平移0—n-1个单位时v[-n](意义与书上一致,下同),算出与x[n]的离散卷积;再用v[n-1+i-j](程序中的写法)和循环计算等价出向右平移n—2n-2个单位时v[-n],算出与x[n]的离散卷积;

循环卷积:

利用p[n]得到循环卷积情况下的v[-n],在结合循环计算,用对应p[n]对q[n]赋值,得到循环卷积中0—n-1个位移的v[-n],最后计算出循环卷积并输出。

n<N时:

在得到输入的x[n]、v[n]后,先对两数列不足N长的后半部补零,之后的离散卷积、循环卷积的算法与n≥N的情况相同。

3.程序流程图:

离散卷积、循环卷积的流程图如下图一所示

 

 

n1>n2n1

n1=n2

n≥Nn<N

 

 

图一离散卷积、循环卷积程序的流程图

三、系统实施

1.源程序代码(已上机调试)

#include

usingnamespacestd;

inti,j;

intmain()

{cout<<"pleaseinputthelengthofx[n]"<

intn1;

cin>>n1;

cout<<"pleaseinputthelengthofv[n]"<

intn2;

cin>>n2;

cout<<"pleaseinputthemod";

intN;

cin>>N;

intn;

doublex[100],v[100];

 

if(n1>n2)

{n=n1;

for(i=n2;i<=n1-1;i++)v[i]=0;}//对v[n]补零

elseif(n1

{n=n2;

for(i=n1;i<=n2-1;i++)x[i]=0;}//对x[n]补零

elsen=n1;

 

cout<<"pleaseinputx[n]";//录入两个数列的值

for(i=0;i<=n1-1;i++)cin>>x[i];

cout<<"pleaseinputv[n]";

for(i=0;i<=n2-1;i++)cin>>v[i];

 

if(n>=N)

{for(i=0;i<=n-1;i++)//完成离散卷积

{doubley=0;

for(j=0;j<=i;j++)y=y+x[j]*v[i-j];

cout<<"whenn="<

for(i=1;i<=n-1;i++)

{doubley=0;

for(j=i;j<=n-1;j++)y=y+x[j]*v[n-1+i-j];

cout<<"whenn="<

doublez[100],p[100],q[100];

p[0]=v[0];

for(i=1;i<=N-1;i++)p[i]=v[N-i];//得到v[-i]

for(i=0;i<=N-1;i++)z[i]=0;//对所有循环卷积结果赋初值0

inta;

for(a=0;a<=N-1;a++)

{q[0]=v[a];

for(i=1;i<=N-1;i++)

{if(i-a>=0)q[i]=p[i-a];

elseq[i]=p[N+i-a];}//得到v[a-i]

for(i=0;i<=N-1;i++)z[a]=z[a]+x[i]*q[i];

cout<<"whenn="<

}

 

else

{for(i=n;i<=N-1;i++){x[i]=0;v[i]=0;}//对数列不足模长的项补零

for(i=0;i<=n-1;i++)

{doubley=0;

for(j=0;j<=i;j++)y=y+x[j]*v[i-j];

cout<<"whenn="<

for(i=1;i<=n-1;i++)

{doubley=0;

for(j=i;j<=n-1;j++)y=y+x[j]*v[n-1+i-j];

cout<<"whenn="<

doublez[100],p[100],q[100];

p[0]=v[0];

for(i=1;i<=N-1;i++)p[i]=v[N-i];

for(i=0;i<=N-1;i++)z[i]=0;

inta;

for(a=0;a<=N-1;a++)

{q[0]=v[a];

for(i=1;i<=N-1;i++)

{if(i-a>=0)q[i]=p[i-a];

elseq[i]=p[N+i-a];}

for(i=0;i<=N-1;i++)z[a]=z[a]+x[i]*q[i];

cout<<"whenn="<

}

return0;

}

2.程序运行说明(包括结果说明)

运行说明:

1)出现一句“pleaseinputthelengthsofx[n]”,输入数列x[n]的长度n1;

2)出现一句“pleaseinputthelengthsofv[n]”,输入数列v[n]的长度n2;

3)出现一句“pleaseinputthemod”,输入循环卷积模N;

4)出现一句“pleaseinputx[n]”,连续输入所有x[n]的值;

5)出现一句“pleaseinputv[n]”,连续输入所有v[n]的值;

6)屏幕上分n讨论(注:

此处n的意义与书上一致,方便使用者理解),输出离散卷积结果;

7)屏幕上分n讨论(注:

此处n的意义与书上一致,方便使用者理解),输出循环卷积结果;

 

3.带入验证:

(以下说明中y表示离散卷积或循环卷积的结果;

标题中的n是两个数列中较大的长度,与程序图中的n不同义)

1)x[n],v[n]数列长度相等,N≤n:

输入程序中的数据信息:

x[0]=1,x[1]=2,x[2]=3,x[3]=4

v[0]=4,v[1]=3,v[2]=2,v[3]=1

n1=n2=4,N=4

程序结果如下图二所示

图二程序运行时的截图

验证:

离散卷积:

n=0时,y=x[0]v[0]=1×4=4

n=1时,y=x[0]v[1]+x[1]v[0]=1×3+2×4=11

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]=1×2+2×3+3×4=20

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]=1×1+2×2+3×3+4×4=30

n=4时,y=x[1]v[3]+x[2]v[2]+x[3]v[1]=1×2+2×3+3×4=20

n=5时,y=x[2]v[3]+x[3]v[2]=3×1+4×2=11

n=6时,y=x[3]v[3]=1×4=4

n≥7时,y=0

循环卷积:

n=0时,y=x[0]v[0]+x[1]v[3]+x[2]v[2]+x[3]v[1]=1×4+2×1+3×2+4×3=24

n=1时,y=x[0]v[1]+x[1]v[0]+x[2]v[3]+x[3]v[2]=1×3+2×4+3×1+4×2=22

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[3]=1×2+2×3+3×4+4×1=24

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]=1×1+2×2+3×3+4×4=30

与上图一致,得证

2)x[n],v[n]数列长度相等,N>n:

输入程序中的数据信息:

x[0]=1,x[1]=2,x[2]=3,x[3]=4

v[0]=4,v[1]=3,v[2]=2,v[3]=1

n1=n2=4,N=5

程序结果如下图三所示

图三程序运行时的截图

验证:

离散卷积:

证明过程与x[n],v[n]数列长度相等,N≤n时相同

循环卷积:

先补零:

x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=0

v[0]=4,v[1]=3,v[2]=2,v[3]=1,v[4]=0

n=0时,y=x[0]v[0]+x[1]v[4]+x[2]v[3]+x[3]v[2]+x[4]v[1]=1×4+2×0+3×1+4×2+0×3=15

n=1时,y=x[0]v[1]+x[1]v[0]+x[2]v[4]+x[3]v[3]+x[4]v[2]=1×3+2×4+3×0+4×1+0×2=15

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[4]+x[4]v[3]=1×2+2×3+3×4+4×0+0×1=20

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]+x[4]v[4]=1×1+2×2+3×3+4×4+0×0=30

n=4时,y=x[0]v[4]+x[1]v[3]+x[2]v[2]+x[3]v[1]+x[4]v[0]=1×0+2×1+3×2+4×3+0×4=20

与上图一致,得证

 

3)x[n],v[n]数列长度不等,N≤n:

输入程序中的数据信息:

x[0]=1,x[1]=2,x[2]=3,x[3]=4

v[0]=3,v[1]=2,v[2]=1

n1=4,n2=,3,N=4

程序结果如下图四所示

图四程序运行时的截图

验证:

离散卷积:

先补零:

x[0]=1,x[1]=2,x[2]=3,x[3]=4

v[0]=3,v[1]=2,v[2]=1,v[3]=0

n=0时,y=x[0]v[0]=1×3=3

n=1时,y=x[0]v[1]+x[1]v[0]=1×2+2×3=8

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]=1×1+2×2+3×3=14

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]=1×0+2×1+3×2+4×3=20

n=4时,y=x[1]v[3]+x[2]v[2]+x[3]v[1]=2×0+3×1+4×2=11

n=5时,y=x[2]v[3]+x[3]v[2]=3×0+4×1=4

n=6时,y=x[3]v[3]=4×0=0

n≥7时,y=0

循环卷积:

n=0时,y=x[0]v[0]+x[1]v[3]+x[2]v[2]+x[3]v[1]=1×3+2×0+3×1+4×2=14

n=1时,y=x[0]v[1]+x[1]v[0]+x[2]v[3]+x[3]v[2]=1×2+2×3+3×0+4×1=12

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[3]=1×1+2×2+3×3+4×0=14

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]=0×0+2×1+3×2+4×3=20

与上图一致,得证

 

4)x[n],v[n]数列长度不等,N>n:

输入程序中的数据信息:

x[0]=1,x[1]=2,x[2]=3,x[3]=4

v[0]=3,v[1]=2,v[2]=1

n1=4,n2=,3,N=5

程序结果如下图五所示

图五程序运行时的截图

验证:

离散卷积:

证明过程与x[n],v[n]数列长度不等,N≤n时情况相同;

循环卷积:

先补零:

x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=0

v[0]=3,v[1]=2,v[2]=1,v[3]=0,v[4]=0

n=0时,y=x[0]v[0]+x[1]v[4]+x[2]v[3]+x[3]v[2]+x[4]v[1]=1×3+2×0+3×0+4×1+0×2=7

n=1时,y=x[0]v[1]+x[1]v[0]+x[2]v[4]+x[3]v[3]+x[4]v[2]=1×2+2×3+3×0+4×0+0×1=8

n=2时,y=x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[4]+x[4]v[3]=1×1+2×2+3×3+4×0+0×0=14

n=3时,y=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]+x[4]v[4]=1×0+2×1+3×2+4×3+0×0=20

n=4时,y=x[0]v[4]+x[1]v[3]+x[2]v[2]+x[3]v[1]+x[4]v[0]=1×0+2×0+3×1+4×2+0×3=11

与上图一致,得证

 

4.存在的问题:

    整个程序的功能还是不完善的。

数列长度的最大范围是一定的,上程序中设定为100。

如果数列长度超出,必须手动对程序进行修改。

另外,该程序只能对均从0时刻开始的两个首部对齐的数列进行卷积,对开始时刻不同的数列无法计算。

四、总结与体会

设计出一个算法要保证逻辑的严密性,考虑到各种情况。

程序中各种变量的设计,既要方便计算机进行计算,又要方便程序员自己去理解,还要方便只看得见使用界面的使用者去理解,着实不易。

我尝试着去兼顾,结果还是出现了3个不同意义的n,容易混淆。

算法设计中涉及大量循环运算,每个循环运算的上下界都要精确,不然对结果都有影响。

怎样用最简单的表达方式去等价数列的各种翻折、位移,也决定了程序的复杂程度。

用最精炼准确的方式完成一个算法,会给程序员之后的检查省去很多麻烦,当然也会出现自己突然不能理解的情况。

程序每次修改后,都必须将各种不同条件的数列带入计算,只有所有情况下都能正确计算,这次修改才算成功。

当然,设计程序最重要的还是要理解两个卷积最根本的概念。

设计之前没有仔细看书,结果在设计时反复修修改改。

仔细掌握最根本概念、条件、要求,在一举击破,才是最效率的工作方式。

课程设计成绩评定表

学生姓名

专业班级

设计题目

指导教师评语及意见:

 

指导教师评阅成绩:

指导教师签字:

年月日

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1