现在很多工具里都已经为我们实现好了线性卷积和圆周卷积的函数,所以在实现方面简单调用一下即可。如matlab中,
conv
用于计算线性卷积,而cconv
用来计算圆周卷积
在国内搜了很多计算圆周卷积的例子,居然鲜有人提到cconv函数,而都是人云亦云都抄袭一套自实现函数,真是有点意想不到。
下面直接上干货,简单介绍一下线性卷积和圆周卷积的计算方法
线性卷积
线性卷积的计算网上有很多,这里就不一一介绍了。我个人使用的方式也很好理解,
例如
x(n) = {1,5,7,3,2,1,6,9}
h(n) = {2,4,6,1,3}
可以通过将x(n)中的每个数字从左往右乘以h(n)
1| 2 4 6 1 3
5| 10 20 30 5 15
7| 14 28 42 7 21
..................
以此类推,如下图示,乘积后的结果再错位相加。得到的结果即为线性卷积结果。
圆周卷积
介绍圆周卷积的方法真的比较少,大多讲诉的都不易理解。我个人的计算方法是这样的,参考链接可以看这里。
首先,将h(n)根据x位数在尾部补零,即为 h(n) = {2,4,6,1,3,0,0,0}.
第二步,将h翻折,开始位移。
在位移一步时,剩下的位子,将尚未移动的部分填充。
第三步,填充后,对应的每一位相乘后再相加。
对应上面的结果就是
1*2+5*0+7*0+3*0+2*3+1*1+6*6+9*4 = 2+0+0+0+6+1+36+36=81
这个实际上就是圆周卷积的y[0]
后面重复上面的步骤,位移,填充,相乘相加,直到h位移结束
示例图如下,
数据一致性
这里可以看到,圆周卷积和线性卷积的结果不是完全一致的。相同部分我用绿色标注出来了。有一个结论,关于圆周卷积和线性卷积。大家可以记一下
一般的,如果两个有限长序列的长度为N1 和 N2,且满足 N1>=N2 ,则圆周卷积的后
N1-N2+1个点,与线性卷积的结果一致。
这里N1=8,N2=5,所以 8-5+1=4个点后的结果一致。
那么是不是必然这样吗?
如果N1>2*N2的话,这种方法的圆周卷积出来的结果是完全一致的。
下面是一个例子,
注意事项
- 上面数据一致性的讨论(特别是完全一致时)是基于我在本文中的圆周卷积实现方法的前提下说的
- matlab中的cconv函数计算出来的圆周卷积是和线性卷积一致的,并且它的结果是浮点型。效果如下,
最后我把计算线性卷积和圆周卷积的方法做成了excel,大家如果有兴趣的话可以在这里下载。https://download.csdn.net/download/mimiduck/13105696