信号与系统课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
离散卷积和循环卷积的计算机计算
电气与电子
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
学院 0711班 赵志伟
二OO九年七月
1
离散卷积和循环卷积的计算机计算
课
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
介绍:
卷积是信号与线性系统中重要的一部分,在生活中的应用也极其
广泛。
设有两离散序列和,则两序列的离散卷积和循环卷积分别x[n]v[n]
为: ,
y[n],x[n],v[n],x[i]v[n,i] ,
i,,, ,
y[n],x[n],v[n],x[i]v[n,i,modN],
i,,,
任务:
, 画出计算程序流程图;
, 完成C语言编程与计算;
, 验证计算结果;
, 提交课程设计报告。
2
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
一(设计简介 ..................................... 4 二(设计要求 ..................................... 5 三(设计路线 ..................................... 5 四(设计内容 ..................................... 6
4.1 原理学习 ................................. 6
4.1.1 离散卷积 ......................................... 6
4.1.2 循环卷积 ......................................... 6
4.2利用C语言编程进行计算 ...................... 9
4.2.1程序分析 ......................................... 9
4.2.2程序 ................................................... 10
4.3试验结果及结论.........................................................................16
五(结果分析及感想 ............................... 18 六(参考文献 .................................... 19
3
离散卷积和循环卷积的计算机计算
一、设计简介
主题: 1)分析离散卷积与循环卷积的特点与不同
2)画出计算程序流程图
3)用C语言编程并计算
4)用所学知识验证该计算结果
方法: 1)通过学习课本及参阅相关书籍从理论上分析离散卷积
与循环卷积的特点
2)用C语言编程进行计算,并验证计算结果
结果:1) 复习了原来所学的有关离散卷积和循环卷积的特点加深
了对课本内容的理解
2)将所学的c语言应用于实际的课题设计中,是对汇编语言
的一个复习。
4
二、设计要求
1)实验要求用计算机来计算离散卷积和循环卷积,这两种计算方法有相同之处也有不同之处,试画出计算程序流程图并完成C语言编程与计算。
2)验证计算机的计算结果,
3)提交课程设计报告。
三、设计路线
1)参考并复习了信号课本,对离散卷积以及循环卷机有了一个初步的认识;
2)去图书馆查阅更多有关离散卷积和循环卷积介绍的书籍,在
理论知识上进一步丰富和扩展;
3)阅读书籍,复习有关汇编语言的应用;
4)画出计算程序流程图并用C语言编程,并完成计算;
5)验证计算结果。
5
四、设计内容
离散卷积和循环卷积的计算机计算
4.1 原理学习
卷积作为一种运算在信号与系统中有着举足轻重的地位,很多计算中均要涉及卷积运算,这里只介绍线性离散卷积以及循环卷积。
4.1.1离散卷积
在信号与线性系统中,定义x[n],v[n],其卷积为
,
y[n],x[n],v[n],x[i]v[n,i]计算卷积时,首先将x[n],v[n]中,
i,,,
的离散时间序号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,
6
它们的线性卷积f(n) = x(n) * y(n)也应是有限长序列。 因
,
f(n),x(n)*y(n),x(m)y(n,m) ,,,,M
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),长度均为
L >max{N,M} ,序列 x(n)只有前N个是非零值,后L-N个为补充的零值;序列 ()只有前个是非零值,后L-M个为补充的零值。为ynM,~
x(n),x(n,qL),了分析 x(n)与y(n)的循环卷积,先看x(n),y(n)的周期延拓: q
,,,
,~
y(n),y(n,rL),
r
,,,
它们的周期卷积序列为:
L,1L,1~~~~f(n),x(m)y(n,m),x(m)y(n,m),,l m,0m,0
7
L
,,,
,x(m)y(n,rL,m),,1mr
,,,,L
,,0
,x(m)y(n,rL,m),,1rm
,,,,
,0
,f(n,rL),
r
,,,其中f(n)就是线性卷积,也就是说,x(n)、 y(n)周期延拓后的周期卷积,是x(n) 、 y(n)线性卷积的周期延拓,周期为L。
根据前面的分析,f(n)具有 N+M-1 个非零序列值,因此,如果周期卷积的周期 L
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
方案一:
序列长度(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}?N
main()
{
static float x[300],v[300],y[600],z[600]; *静态定义数组,自动全部清零*/
int m,n,L,i,j,k,s,N; /*可计算含非整数值的序列的卷积*/
printf("input the x[n]'s length m(m<300):\n");
scanf("%d",&m);
printf("input the v[n]'s length n(n<300):\n");
scanf("%d",&n);
L=m+n-1;
printf("input the x[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("input the v[n]\n");
11
/*linear convolution*/
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("the result of linear convolution:\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]=0 for other n\n");
printf("and the length of y[n] is l=%d\n",L);
/*circular convolution*/
Z: printf("input the N(N>=%d)\n",m>=n?m:n);
scanf("%d",&N);
12
if(N<(m>=n?m:n))
{printf("error!");
goto Z;} /*当N不满足条件时报错并要求用户重新输入N值*/
printf("the result of circular convolution for N=%d:\n",N);
for(i=0;i<=N-1;i++)
{
s=0;
for(j=0;j<=N-1;j++)
{k=i-j;
if(k<0) k=k+N;
s+=x[j]*v[k];
z[i]=s;}
printf("z[%d]=%f\n",i,z[i]);
}
}
方案二:(所有适当的N都计算其循环卷积)
#include
main()
{
static float x[300],v[300],y[600],z[600]; /*静态定义数组,自动全部清零*/
13
int m,n,L,i,j,k ,s,N;
printf("input the x[n]'s length m(m<600):\n");
scanf("%d",&m);
printf("input the v[n]'s length n(n<300):\n");
scanf("%d",&n);
L=m+n-1;
printf("input the x[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("input the v[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]);
/*linear convolution*/
printf("the result of linear convolution:\n");
for (i=0;i<=L-1;i++)
{
s=0;
14
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]=0 for other n\n");
printf("and the length of y[n] is L=%d\n",L);
/*circular convolution*/
printf("the result of circular convolution:\n");
/*计算循环卷积时能自动判断N的最小取值,并在N,m+n-1后给出循环卷积离散卷积结果相同*/
N=m>=n?m:n;
while(N<=m+n)
{
printf("when N=%d\n",N);
for(i=0;i<=N-1;i++)
{
s=0;
for(j=0;j<=N-1;j++)
{k=i-j;
15
if(k<0) k=k+N;
s+=x[j]*v[k];
z[i]=s;}
printf("z[%d]=%f\n",i,z[i]);
}
N++;
}
printf("when N>%d\n",L);
printf("the result is equal to linear convolution\n");
}
4.3 试验结果及结论
[例] x[n] and v[n] are(for all other n,x[n]=0,yn[n]=0);
x[n]=sin(πn/2), n=0, 1, 2, 3;
n v[n]= , n=0 ,1 ,2 2
please calculate:
(1) x[n]*v[n];
(2) x[n]?v[n];
计算机计算如下图:
16
图一:方案一C程序运行结果 图二:方案二C程序运行结果
17
手工计算:
解:
(1)离散卷积( 线卷积):
矩阵法:
x[0]= x[1]= x[2]= x[3]= x[4]= x[5]= x[6]= x[n] 0 1 0 -1 0 0 0
v[n] v[0]= 0 1 0 -1 0 0 0 1
v[1]= 0 0 2 0 -2 0 0 2
v[2]= 0 0 0 4 0 -4 0 4
0 1 2 3 -2 -4 0 y[n] y[0] y[1] y[2] y[3] y[4] y[5] y[6]
0 , n=0
1 , n=1
2 , n=3 所以y[n]=x[n]*v[n]= 3 , n=4
-2 , n=5
-4 , n=6
0 , all other n
(2)循环卷积(圆卷积):
直接利用公式,得
x[0]v[0]+x[1]v[3]+x[2]v[2]+x[3]v[1]= -2 , n=0
z[n]=x[n]?v[n]= x[0]v[1]+x[1]v[0]+x[2]v[3]+x[3]v[2]= -3 , n=1
x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[3]= 2 , n=2
x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]= 3 , n=3
五,收获及感想
此次课设中主要用到了c语言和信号与系统的有关知识,在课设的学习与完成过程中,对书本上所学的内容进行了更为深刻的认
18
识。
课设中遇到很多困难,最困难的是有关程序的编写,因为在课堂上所学的c语言知识有限,所以在编写程序时遇到很多问题,通过上网查询,自学c程序的有关部分,最终才将程序确定下来。
课设是一个整体,要想完成课设,必须要有条有理的确定课设的整体结构,这就需要我们有一个整体的概念,从目录到结尾都应该贯穿整体,流畅。此外结构必须要清晰,这也是为我们以后写论文作报告打下了基础。对于每个部分,我们要做到有理有据,对课题进行深刻的讨论,从而得到有效的结论。
此外,通过课设我们学会了如何有效地利用图书馆、网络及各种常用软件,学会了一般研究报告的格式。
总之,在课设的完成过程中收获到了很多一般学习很难得到的东西,希望以后有更多的机会学习和完成课程设计。
六(参考书目
1.Fundamentals of Signals and Systems
Using the Web and MATLAB Edward W.Kamen Bonnie S.Heck 2.姜建国等编著,《信号与系统分析基础》,清华大学出版社2005 3.谭浩强编著《c程序设计(第三版)》
19
20