我遇到了scipy.signal.deconvolve()的问题 我尝试了Understanding scipy deconvolve的答案但是没有用。 这是我的代码:
n = 3
s = 240
p = np.linspace(-s*n, s*n, s*n*2)
g = mlab.normpdf(p, 0, s)
f1 = g/max(g)
s = 1920
p = np.linspace(-s*n, s*n, s*n*2)
g = mlab.normpdf(p, 0, s)
g1 = g/max(g)
让信号像盒子一样
signal = g1
并使用高斯滤波器
滤波器应短于信号
过滤器应该比任何地方都大得多
gauss = f1
print gauss.min() # = 0.013 >> 0
计算卷积(np.convolve和scipy.signal.convolve相同)
keywordargument mode =“same”确保卷积跨越相同的
形状作为输入数组。
filtered = scipy.signal.convolve(signal,gauss,mode ='same')
filtered = np.convolve(signal, gauss, mode='same')
deconv, _ = deconvolve( filtered, gauss )
deconvolution有n = len(信号) - len(高斯)+ 1分
n = len(signal)-len(gauss)+1
所以我们需要通过
扩展它s = (len(signal)-n)/2
双方都是。
deconv_res = np.zeros(len(signal))
deconv_res[s:len(signal)-s-1] = deconv
deconv = deconv_res
现在deconv包含deconvolution
扩展到原始形状(用零填充)
#### Plot ####
fig , ax = plt.subplots(nrows=4, figsize=(6,7))
ax[0].plot(signal, color="#907700", label="original")
ax[1].plot(gauss, color="#68934e", label="gauss filter")
我们需要除以滤波器窗口的总和,以使卷积归一化为1
ax[2].plot(filtered/np.sum(gauss), color="#325cab", label="convoluted")
ax[3].plot(deconv, color="#ab4232", label="deconvoluted")
# ax[3].set_yscale('log')
for i in range(len(ax)):
ax[i].set_xlim([0, len(signal)])
ax[i].legend(loc=1, fontsize=11)
if i != len(ax)-1 :
ax[i].set_xticklabels([])
plt.show()
解卷积曲线假设与原始高斯曲线相同。