对两个数组进行卷积和反卷积
我正在尝试弄明白如何让卷积和反卷积正常工作。以下是我的代码:
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()
当我在一个点上对“a”进行卷积(比如 b = [2])时,它可以正常工作,结果也没问题。但当我尝试在多个点或者数组上进行卷积时,就出错了。我收到了这样的错误:
"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 个回答
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()
这里有一些不同之处:
- 卷积(convolution)会在结果的两端多出一些样本,所以你需要用
aconvolved[1:-1]
来处理这个问题。如果你不想这样做,可以在调用convolve
时加上mode='same'
这个参数,这样得到的结果长度就和输入的一样,但这样会导致反卷积(deconvolution)输出的长度出现问题。 - 反卷积会返回一个元组(tuple),其中实际的结果在第一个位置,所以你需要用
signal.deconvolve(aconvolved, b)[0]
来获取这个结果。