我正在尝试理解 scipy.signal.deconvolve
函数。
从数学角度来看,卷积只是傅里叶空间中的乘法,因此我期望对于两个函数 f
和 g
:
Deconvolve(Convolve(f,g) , g) == f
但在 numpy/scipy 中,要么不是这种情况,要么我忽略了重要的一点。虽然 Stack Overflow 上有一些与 deconvolve 相关的问题(如这里和这里),但它们并没有解决这个问题,其他一些问题则不清楚(这里)或者无人回答(这里)。信号处理 SE 上也有两个问题(这里和这里),但它们的答案并不能帮助理解 scipy 的 deconvolve 函数是如何工作的。
问题是:
- 如果你知道卷积函数 g,如何从经过卷积后的信号中重建原始信号 f?
- 换句话说:这个伪代码
Deconvolve(Convolve(f,g) , g) == f
在 numpy/scipy 中如何实现?
编辑:请注意,本问题不针对防止数值误差(尽管这也是一个开放问题),而是针对理解在 scipy 中如何结合使用 convolve/deconvolve。
以下代码使用 Heaviside 函数和高斯滤波器来尝试解决这个问题。正如图像中所示,卷积的反卷积结果与原始的 Heaviside 函数完全不同。如果有人能够澄清这个问题,我将不胜感激。
import numpy as np
import scipy.signal
import matplotlib.pyplot as plt
# Define heaviside function
H = lambda x: 0.5 * (np.sign(x) + 1.)
#define gaussian
gauss = lambda x, sig: np.exp(-( x/float(sig))**2 )
X = np.linspace(-5, 30, num=3501)
X2 = np.linspace(-5,5, num=1001)
# convolute a heaviside with a gaussian
H_c = np.convolve( H(X), gauss(X2, 1), mode="same" )
# deconvolute a the result
H_dc, er = scipy.signal.deconvolve(H_c, gauss(X2, 1) )
#### Plot ####
fig , ax = plt.subplots(nrows=4, figsize=(6,7))
ax[0].plot( H(X), color="#907700", label="Heaviside", lw=3 )
ax[1].plot( gauss(X2, 1), color="#907700", label="Gauss filter", lw=3 )
ax[2].plot( H_c/H_c.max(), color="#325cab", label="convoluted" , lw=3 )
ax[3].plot( H_dc, color="#ab4232", label="deconvoluted", lw=3 )
for i in range(len(ax)):
ax[i].set_xlim([0, len(X)])
ax[i].set_ylim([-0.07, 1.2])
ax[i].legend(loc=4)
plt.show()
编辑:请注意,这里有一个matlab示例,展示如何使用信号卷积/解卷积一个矩形信号。
yc=conv(y,c,'full')./sum(c);
ydc=deconv(yc,c).*sum(c);
为了回答这个问题,如果有人能够将这个例子翻译成Python,那也会很有帮助。
In the spirit of this question it would also help if someone was able to translate this example into python.
mode=full
运行它会得到一个相当不错的结果(直到大约索引1000,然后可能会出现边界效应);不幸的是,我对这个理论了解得不够。 - Clebmode="full"
运行它会将卷积信号向右移动,使得边缘在这种情况下位于1000而不是500。你有什么想法吗?如何解释卷积数组的结果与原始数组相比? - ImportanceOfBeingErnestnp.convolve(f,g)
可能是(a)不可逆的,或者(b)它的反演可能在数值上不稳定,这取决于g
。deconvolve
只能成功找到“良好行为”函数g
的有限类别中的f
。您的问题更适合于信号处理SE。 - SteliosDeconvolve(Convolve(f,g) , g) == f
成立。我只是指出后者通常不成立。 - Stelios