卷积和解卷积两个数组

时间:2014-07-09 20:09:43

标签: python convolution

所以我试图找出如何使卷积和解卷积正常工作。这是我的代码:

import numpy as np
from scipy import interpolate
from scipy import signal
import matplotlib.pyplot as plt

a = np.arange(0, 50, 1)
b = np.array([1,2,1])

aconvolved = signal.convolve(np.sin(a), b)
adeconvolved = signal.deconvolve(aconvolved, b)

plt.figure()
plt.plot(a, np.sin(a), 'g')
plt.plot(a, aconvolved[0], 'r')
plt.plot(a, adeconvolved[0], 'b')
plt.draw()

当我对单个点(如b = [2])进行卷积时,而不是数组,它可以正常工作。但是当我试图超过1点或数组时,它只是不起作用。我收到错误,例如:

"ValueError: x and y must have same first dimension"

如果我改为使用:

,我会收到同样的错误
a = np.arange(1, 50, 1)
b = np.array([1,2,1])

即使在这种情况下,我知道他们都是从1开始。如果我做同样的事情,但是

b = np.array([1,2,1])

我收到错误:

"ValueError: BUG: filter coefficient a[0] == 0 not supported yet"

任何人都有任何关于我做错的提示吗?

1 个答案:

答案 0 :(得分:2)

如果您认为自己得到错误,则不会收到错误消息。这有效:

import numpy as np
from scipy import interpolate
from scipy import signal
import matplotlib.pyplot as plt

a = np.arange(0, 50, 1)
b = np.array([1,2,1])

aconvolved = signal.convolve(np.sin(a), b)
adeconvolved = signal.deconvolve(aconvolved, b)[0]

plt.figure()
plt.plot(a, np.sin(a), 'g')
plt.plot(a, aconvolved[1:-1], 'r') 
plt.plot(a, adeconvolved, 'b')
plt.draw()

差异:

  • 卷积会在末尾创建一些额外的样本,因此aconvolved[1:-1](如果你不想这样做,那么使用mode='same'的关键字参数convolve来接收一个向量与输入具有相同的长度,但是这会导致解卷积输出长度出现问题。)
  • deconvolution返回一个元组,其中实际结果是第一部分,因此signal.deconvolve(aconvolved, b)[0]