19. Scipy Tutorial-卷积convolve
scipy的signal包经常用于信号处理,卷积、傅里叶变换、各种滤波、差值算法等。其中卷积在深度学习、机器学习等领域应用的较多。本章研究一下scipy.signal里的卷积相关函数。
- 一维卷积。一维卷积定义公式如下: $$ y[n] = \sum_{k = -\infty}^{\infty} x[k]h[n - k] $$ scipy.signal包里的convolve函数可以计算卷积。
#coding:utf-8
import numpy as np
from scipy import fftpack,signal
import matplotlib.pyplot as plt
x = np.array([1.0, 2.0, 3.0])
h = np.array([0.0, 1.0, 0.0, 0.0, 0.0])
y = signal.convolve(x, h)
print y
结果:
[ 0. 1. 2. 3. 0. 0. 0.]
如何得到? 依据公式,可以先将$h$镜像为$h^{'}$,然后移动,$x$和$h^{'}$对应相乘求和即为一维的卷积值。
- 二维(离散)卷积。 $$ C(x,y) = \sum_{m = 0}^{M - 1} \sum_{n = 0}^{N - 1} A(m, n)B(x -m, y - n) $$ 这里有$x = (0,1,\cdots,M-1); y = (0,1,\cdots,N-1)$。
#coding:utf-8
import numpy as np
from scipy import fftpack,signal
import matplotlib.pyplot as plt
x = np.array([[1.0, 1.0, 0.0],[1.0, 1.0, 0.0], [0.0, 0.0, 0.0]])
h = np.array([[1.0, 0.0], [0.0, 1.0]])
y = signal.convolve(x, h)
print y
结果:
[[1. 1. 0. 0.]
[1. 2. 1. 0.]
[0. 1. 1. 0.]
[0. 0. 0. 0.]]
如何得到?先将$h$选择180度,由于$h$旋转180度后和$h$还是一样的。问题就简答了。下一章展示$h$旋转后不一样的问题例子。