在学习信号与系统的过程中,卷积这个概念几乎伴随着学习的全过程,利用定义式求解两个离散数据的卷积往往比较繁琐,人们通常采用Z变换的方式进行,但是我们可以利用计算机编程来简化这一计算过程。
首先是离散信号的卷积计算公式
根据信号的基本卷积运算,可以将跨越在正负区间的信号统一挪移到正区间,以此来方便数组的运算。由此得到如下关于离散信号的公式。
下面是编程的思路,即将公式展开,用for循环实现对循环求解。
1)首先是数组的定义和补充操作
【注释】需要对初始数组进行补零操作,因为C语言中数组的越界,数据会出现错误,需要我们提前对输入信号数组和系统响应数组进行补零操作,以防止超出原数组的限制。那为什么会超出数组的界限呢?原因是线性卷积的长度是输入的两数组长度之和减一,明显大于原始数组的长度。
int a[N1]={1,2,3};
int b[N2]={1,2,3};
int c[N3]={0};
int i=0;
int t_a[N3]={0};
int t_b[N3]={0};
for(i=0;i<N3;i++)
{
if(i<N1){
t_a[i]=a[i];
}
else{
t_a[i]=0;
}
if(i<N2){
t_b[i]=b[i];
}
else{
t_b[i]=0;
}
}
2)卷积代码的实现
【注释】这里可以采用简单的数组调用相乘,也可以采用加入指针的方式实现。
①简单的相乘
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
sum[i]+=a[j]*b[i-j];
}
printf("%d\n",sum[i]);
}
②利用指针,加上定义函数来实现
函数的定义及声明
void conv(int *p0,int *p1,int *p2)//定义卷积函数,事先声明
{
int n;
for(n=0;n<N3;n++)
{ int i;
for(i=0;i<=n;i++)
{
p0[n]+=p1[i]*p2[n-i];
}
}
}
函数的调用及结果的显示
conv(c,t_b,t_a);
for(i=0;i<N3;i++)
{
printf("%d\n",c[i]);
}
3)仿真结果展示
初始两信号为 a[3]={1,2,3},b[3]=[1,2,3];输出结果
和不进位乘法的结果相同。