线性卷积简洁实用版

前言

线性卷积在信号处理的过程中,面对的基本是离散,有限的序列。所以,我们只讨论这个过程。以下讨论基于序列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去除即可
发布了16 篇原创文章 · 获赞 2 · 访问量 8892

猜你喜欢

转载自blog.csdn.net/hihei_set/article/details/90634158