}
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,容易混淆。
算法设计中涉及大量循环运算,每个循环运算的上下界都要精确,不然对结果都有影响。
怎样用最简单的表达方式去等价数列的各种翻折、位移,也决定了程序的复杂程度。
用最精炼准确的方式完成一个算法,会给程序员之后的检查省去很多麻烦,当然也会出现自己突然不能理解的情况。
程序每次修改后,都必须将各种不同条件的数列带入计算,只有所有情况下都能正确计算,这次修改才算成功。
当然,设计程序最重要的还是要理解两个卷积最根本的概念。
设计之前没有仔细看书,结果在设计时反复修修改改。
仔细掌握最根本概念、条件、要求,在一举击破,才是最效率的工作方式。
课程设计成绩评定表
学生姓名
专业班级
设计题目
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
年月日