文章目录
基本原理
卷积是一种积分变换方法,可理解为滑动平均的推广,在连续函数和数列上的定义分别为
f ( t ) ∗ g ( t ) = ∫ f ( τ ) g ( t − τ ) d τ x ( n ) ∗ h ( n ) = ∑ x ( i ) h ( n − i ) f(t)*g(t) = \int f(\tau)g(t-\tau)\text d\tau\\ x(n)*h(n) = \sum x(i)h(n-i) f(t)∗g(t)=∫f(τ)g(t−τ)dτx(n)∗h(n)=∑x(i)h(n−i)
convolve函数
numpy提供了convolve函数,用于卷积计算,其输入参数如下
numpy.convolve(a, v, mode='full')
其中,mode
用以调节卷积后的边缘特性,共有三种选择,如果输入的两个卷积对象的维度分别是
N
N
N和
M
M
M,则这三种模式的输出结果为
full
: 输出维度 N + M − 1 N+M-1 N+M−1,其最后一点的信号完全不交叠,故而边缘效应明显。same
:输出维度 max ( M , N ) \max(M,N) max(M,N),边缘效应仍然可见valid
:输出维度 ∣ M − N ∣ |M-N| ∣M−N∣,只返回完全交叠的区域,相当于把存在边缘效应的点都率除掉了
实战
下面实战演示一下三者的区别
import numpy as np
n = np.arange(20)/2
x = np.sin(n)
plt.plot(x)
h = [-2, -1, 0, 1, 2]
for m in ['full', 'same', 'valid']:
y = np.convolve(x, h, mode=m)
plt.plot(y, label=m)
plt.legend()
plt.show()
得到图像