一维离散线性卷积的计算公式如下:
( a ∗ v ) [ n ] = ∑ m = − ∞ ∞ a [ m ] v [ n − m ] (a * v)[n] = \sum_{m=-\infty}^{\infty}a[m]v[n-m] (a∗v)[n]=m=−∞∑∞a[m]v[n−m]
其中:
a , v a, v a,v——数字序列;
n n n——移位的位数。
numpy.convolve(a, v, mode="full")
假定序列 a a a长度为 N N N,序列 v v v长度为 M M M,则有
注意: 在实际计算时,需要序列 a a a大于 v v v,否则 n u m p y numpy numpy内部会自动交换顺序
def convolve(a, v):
r = []
a = dict(enumerate(a))
v = dict(enumerate(v))
for i in range(len(a) + len(v) - 1):
s = 0
for j in range(len(a)):
s += a[j] * v.get(i - j, 0)
r.append(s)
return r
if __name__ == "__main__":
nums1 = [10, 13, 16, 19, 22, 25, 28]
nums2 = [20, 22, 24]
print(np.convolve(nums1, nums2, mode="full").tolist())
print(convolve(nums1, nums2))
最终得到结果为:
[200, 480, 846, 1044, 1242, 1440, 1638, 1216, 672]
[200, 480, 846, 1044, 1242, 1440, 1638, 1216, 672]
( a ∗ v ) [ n ] = ∑ m = − ∞ ∞ a ∗ [ m ] v [ n + m ] (a * v)[n] = \sum_{m=-\infty}^{\infty}a^{*}[m]v[n+m] (a∗v)[n]=m=−∞∑∞a∗[m]v[n+m]
其中,
a , v a, v a,v——数字序列;
n n n——移位位数;
a ∗ a^{*} a∗—— a a a序列值的复数共轭,即实部不变,虚部取反。
根据互相关的公式,我们可以得到在实数范围内, a ∗ = a a^{*} = a a∗=a。
此时,通过比较两个公式可以得到:序列 a a a与序列 v v v反转后的序列 的 卷积 == 序列 a a a 与 序列 v v v的互相关
numpy.correlate(a, v, mode)
m o d e = ‘ v a l i d ’ mode = ‘valid’ mode=‘valid’:只返回有效的那一部分相关数据,共 M − N + 1 M-N+1 M−N+1个;
m o d e = ‘ s a m e ’ mode = ‘same’ mode=‘same’:只返回与 等长的那一部分相关数据,共 N N N个;
m o d e = ‘ f u l l ’ mode = ‘full’ mode=‘full’:返回全部相关数据,共 M + N − 1 M+N-1 M+N−1个。
根据公式中的结论,在实数范围内,
序列 a a a与序列 v v v反转后的序列 的 卷积 == 序列 a a a 与 序列 v v v的互相关
import numpy as np
def convolve(a, v):
r = []
a = dict(enumerate(a))
v = dict(enumerate(v))
for i in range(len(a) + len(v) - 1):
s = 0
for j in range(len(a)):
s += a[j] * v.get(i - j, 0)
r.append(s)
return r
if __name__ == "__main__":
nums1 = [10, 13, 16, 19, 22, 25, 28]
nums2 = [20, 22, 24]
print(np.correlate(nums1, nums2, mode="full").tolist())
print(convolve(nums1, nums2[::-1]))
得到结果为:
[240, 532, 870, 1068, 1266, 1464, 1662, 1116, 560]
[240, 532, 870, 1068, 1266, 1464, 1662, 1116, 560]