对两个数组进行卷积和反卷积

2 投票
1 回答
2711 浏览
提问于 2025-04-18 12:41

我正在尝试弄明白如何让卷积和反卷积正常工作。以下是我的代码:

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] 来获取这个结果。

撰写回答