关于使用 Python scipy 对信号进行反卷积的问题

A question about deconvolution of a signal using Python scipy

我正在尝试学习一些信号处理,特别是使用 Python。这是我写的示例代码。

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

a = np.linspace(-1,1,50)
b = np.linspace(-1,1,50)**2
c = np.convolve(a,b,mode='same')
quotient,remainder = deconvolve(c,b);
plt.plot(a/max(a),"g")
plt.plot(b/max(b),"r")
plt.plot(c/max(c),"b")
plt.plot(remainder/max(remainder),"k")
#plt.plot(quotient/max(quotient),"k")

plt.legend(['a_original','b_original','convolution_a_b','deconvolution_a_b'])

在我的理解中,卷积数组的反卷积应该 return 完全相同的数组 'a' 因为我使用 'b' 作为过滤器。从下图中可以明显看出情况并非如此。

我不太确定我对反卷积的数学理解是错误的还是代码有问题。非常感谢任何帮助!

您正在使用 mode='same',这似乎与 scipy 反卷积不兼容。尝试使用 mode='full',它应该会更好。

这里是更正后的代码:

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

a = np.linspace(-1,1,50)
b = np.linspace(-1,1,50)**2
c = np.convolve(a,b,mode='full')
quotient,remainder = deconvolve(c,b)
plt.plot(a,"g")
plt.plot(b,"r")
plt.plot(c,"b")
plt.plot(quotient,"k")
plt.xlim(0,50)
plt.ylim(-6,2)

plt.legend(['a_original','b_original','convolution_a_b','deconvolution_c_b'])