前言
线性卷积在信号处理的过程中,面对的基本是离散,有限的序列。所以,我们只讨论这个过程。以下讨论基于序列x[n]=[1,2,3,4] h[m]=[1,2,3],其中x[n]是输入序列,h[n]是卷积核.
1 卷积过程
卷积行为
1 2 3 逆转 为 3 2 1
第一步:
3 2 1
1 2 3 4
第二步:
3 2 1
1 2 3 4
第三步:
3 2 1
1 2 3 4
第四步:
3 2 1
1 2 3 4
第五步:
3 2 1
1 2 3 4
第六步:
3 2 1
1 2 3 4
每次计算重合部分,对应位置相乘,然后相加的总数.结果如下:
1 4 10 16 17 12
同时根据上面可以推算出结果长度为:n+m-1
2 计算过程
可以采取直接计算的方案,我这里就不再叙述,还有另外一种效率不错的方案
[时域卷积等于频域相乘]
import numpy as np
import scipy.signal as sig
from scipy.fftpack import fft, ifft
hx = [1, 2, 3]
x = [1, 2, 3, 4]
res = sig.convolve(hx, x)
print(res)
res2 = sig.fftconvolve(hx, x)
print(res2)
res3 = ifft(fft(hx, len(x)+len(hx)-1) * fft(x, len(x)+len(hx)-1))
print(res3)
result:
[ 1 4 10 16 17 12]
[ 1. 4. 10. 16. 17. 12.]
[ 1.+0.00000000e+00j 4.+1.33226763e-15j 10.+0.00000000e+00j
16.-1.17892386e-15j 17.+0.00000000e+00j 12.-1.53343765e-16j]
3 其他
因为我这里需要用到互相关的情况,需要去获取如下的计算
hx: 1 2 3
x: 1 2 3 4
hx: 1 2 3
x :1 2 3 4
对应位置相乘相加: 14 26
这个可以使用上面的计算方式来做,即计算 x 与hx反转后的卷积,同时将前后hx-1去除即可,再优化一下
将hx反转,然后补零跟x长度一致,然后进行卷积,最后得到结果长度为len(x),此时将前len(hx)-1去除即可