信号与系统课设关于卷积.docx
《信号与系统课设关于卷积.docx》由会员分享,可在线阅读,更多相关《信号与系统课设关于卷积.docx(11页珍藏版)》请在冰豆网上搜索。
信号与系统课设关于卷积
信号与系统
课程设计报告
离散卷积和循环卷积的计算机计算
学院:
电气与电子工程学院
班级:
电气1106班
姓名:
朱筠
学号:
u201111942
日期:
2013.09
1内容简介……………………………………………………3
2设计原理……………………………………………………4
1、离散卷积…………………………………………………………4
2、循环卷积…………………………………………………………4
3设计流程图…………………………………………………7
1、离散卷积…………………………………………………………7
2、循环卷积…………………………………………………………7
4程序设计与执行……………………………………………9
5验证结果…………………………………………………11
1、离散卷积…………………………………………………………11
2、循环卷积…………………………………………………………11
6设计感言与收获…………………………………………12
离散卷积和循环卷积的计算机计算
一、内容简介
卷积是信号与线性系统中重要的一部分,在生活中的应用也极其广泛。
设有两离散序列
和
,则两序列的离散卷积和循环卷积分别为:
课程设计要求:
1画出计算程序流程图;
2完成C语言编程与计算;
3验证计算结果;
4提交课程设计报告。
二、设计原理
1离散卷积
在信号与系统学科中,我们定义x[n],v[n],则其卷积为
。
计算卷积时,首先将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取一定范围的的整数。
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,它们的线性卷积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,
在这区间以外f[n]=0。
因此,f[n]是一个长度为N+M-1的有限长序列。
重新构造两个有限长序列x[n]、y[n],长度均为L>max{N,M},序列x
只有前N个是非零值,后L-N个为补充的零值;序列y[n]只有前M个是非零值,后L-M个为补充的零值。
为了分析x[n]与y[n]的循环卷积,先看x[n]、y[n]的周期延拓:
它们的周期卷积序列为:
其中f[n]就是线性卷积,也就是说,x[n]、y[n]周期延拓后的周期卷积,是x[n]、y[n]线性卷积的周期延拓,周期为L。
根据前面的分析,f[n]具有N+M-1个非零序列值,因此,如果周期卷积的周期L只有L≥N+M-1时,才不会产生交叠,这时f[n]的周期延拓
中每一个周期L内,前N+M-1个序列值是f[n]的全部非零序列值,而剩下的L-(N+M-1)点的序列则是补充的零值。
所以使圆周卷积等于线性卷积而不产生混淆的必要条件是:
L≥N+M-1
三、设计流程图
1离散卷积
2循环卷积
四、程序设计与执行
将上述离散卷积与循环卷积的流程图合并在一起,转换成以下程序(循环卷积的N值由用户决定):
#include
intmain(void)
{
staticfloatx[300],v[300],y[600],z[600];
intm,n,L,i,j,k,sum,N;
printf("请输入x[n]的长度m(m<300):
\n");
scanf("%d",&m);
printf("请输入x[n]的长度n(n<300):
\n");
scanf("%d",&n);
L=m+n-1;
printf("输入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("输入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]);
printf("离散卷积的结果是:
\n");
for(i=0;i<=L-1;i++)
{sum=0;
for(j=0;j<=i;j++)
{k=i-j;
sum+=x[j]*v[k];
y[i]=sum;}
printf("y[%d]=%f\n",i,y[i]);
}
printf("y[n]=0forothern\n");
printf("y[n]的长度是L=%d\n",L);
/*以下是循环卷积*/
Z:
printf("输入N(N>=%d)\n",m>=n?
m:
n);
scanf("%d",&N);
if(N<(m>=n?
m:
n))
{printf("error!
");gotoZ;}/*当N不满足条件时报错并且重新输入N值*/
printf("循环卷积的结果是N=%d:
\n",N);
for(i=0;i<=N-1;i++)
{sum=0;
for(j=0;j<=N-1;j++)
{k=i-j;
if(k<0)k=k+N;
sum+=x[j]*v[k];
z[i]=sum;}
printf("z[%d]=%f\n",i,z[i]);}
return0;
}
用Microsoftvisualstudio运行的结果如下:
五、验证结果
1离散卷积(使用矩阵)
x[n]v[n]
x[0]=
0
x[1]=
1
x[2]=
-1
x[3]=
2
x[4]=
-2
x[5]=
0
x[6]=x[7]=
00
v[0]=
1
0
1
-1
2
-2
0
00
v[1]=
2
0
2
-2
4
-4
0
00
v[2]=
3
v[3]=
4
04-48-8000
0
3
-3
6
-6
0
00
y[n]
01133-22-8
y[0]
y[1]
y[2]
y[3]
y[4]
y[5]
y[6]y[7]
0,n=0
1,n=1
1,n=2
即,y[n]=x[n]*v[n]=3,n=3
3,n=4
-2,n=5
2,n=6
-8,forallothern
2循环卷积
如下:
Z[0]=x[0]v[0]+x[1]v[5]+x[2]v[4]+x[3]v[3]+x[4]v[2]+x[5]v[1]=2,n=0
Z[1]=x[0]v[1]+x[1]v[0]+x[2]v[5]+x[3]v[4]+x[4]v[3]+x[5]v[2]=-7,n=1
Z[2]=x[0]v[2]+x[1]v[1]+x[2]v[0]+x[3]v[5]+x[4]v[4]+x[5]v[3]=1,n=2
Z[3]=x[0]v[3]+x[1]v[2]+x[2]v[1]+x[3]v[0]+x[4]v[5]+x[5]v[4]=3,n=3
Z[4]=x[0]v[4]+x[1]v[3]+x[2]v[2]+x[3]v[1]+x[4]v[0]+x[5]v[5]=3,n=4
Z[5]=x[0]v[5]+x[1]v[4]+x[2]v[3]+x[3]v[2]+x[4]v[1]+x[5]v[0]=-2,n=5
对比知,上面程序得到了验证。
六、设计感言与收获
这一次课设考察了我们对信号与系统中两种卷积的理解,并让我们使用曾经所学习的C语言来完成,让我们在运用中加深了对学问的理解,并且学会了利用所学工具来完成一些专业学科的计算问题。
由于C语言长久未接触,且课设中涉及到比较难的模块,写C语言时查询了大量的资料,最终把程序编好。
课程设计作为对一个学科的知识性的探索还是对我们具有很大的帮助的。
比如这一次关于卷积的探索让我加深了对卷积的意义及其作用的理解,有助于今后的使用。
与此同时,我学会了如何利用网络资源查询所需信息的能力,并且对于word中的插入公式、制作表格、制作流程图、引入目录等功能有了深入的了解,使我受益匪浅。
总而言之,感谢这一次课设给我带来的好处,希望以后多多接触这一方面的任务。