Python 反卷积给出了意想不到的结果
Python deconvolution giving unexpected result
下面我绘制了信号(寿命衰减),我试图从脉冲响应函数中解卷积,即除法器 (IRF)。所以我应该让衰减更尖锐一点。
这是我查看的主题示例,它提供了我需要的内容:
请注意我的代码,我只使用分频器 (IRF) 的峰值,而不是图像上显示的整个阵列序列。
我正在使用以下代码来执行此操作:
IRF = IRF * (max(decay)/max(IRF))
# replace 0s to avoid error message
IRF = np.where(IRF == 0, 0.1, IRF)
decay = np.where(decay == 0, 0.1, decay)
# take only the quotient part of the result
deconv = scipy.signal.deconvolve(decay, IRF)[0]
# "padding" the deconvolved signal so it has the same size as the original signal
s = int((len(decay)-(len(deconv)))/2) ## difference on each side
deconv_res = np.zeros(len(decay))
end = int(len(decay)-s-1) # final index
deconv_res[s:end] = deconv
deconv = deconv_res
# convolved normalized to decay height for plotting
deconv_n = deconv * (max(decay)/max(deconv))
IRF为float64数组,signal为uint16数组
我承认我对反卷积的数学不太熟悉,所以我正在盲目地尝试不同的东西,比如尝试不同的除法函数,但没有任何结果接近预期。
我得到的最后结果看起来像这样(见原始信号图和它试图反卷积的信号……)
任何人都可以告诉我一些想法,如果它是 scipy.deconvolve 中的东西我不明白,这种奇怪行为的原因是什么,或者甚至是一些高级阅读 material 可能帮帮我?
或者,如果您认为这个问题更像是物理问题而不是与编码相关的问题,那么问这个问题的地方更好吗?
问题在于反卷积是一种多项式除法,它将输出信号分解为 $conv(h, x) + r$,如果你的信号有噪声,它可能会给出奇怪的结果。此外,如果脉冲响应中的第一个样本很小,它往往会产生指数增长的输出。
这道题我会做的是FFT的除法
N = 2**(ceil(log2(len(IRF) + len(decay)))
filtered = ifft(fft(decay, N) / fft(IRF, N))
下面我绘制了信号(寿命衰减),我试图从脉冲响应函数中解卷积,即除法器 (IRF)。所以我应该让衰减更尖锐一点。 这是我查看的主题示例,它提供了我需要的内容:
请注意我的代码,我只使用分频器 (IRF) 的峰值,而不是图像上显示的整个阵列序列。
我正在使用以下代码来执行此操作:
IRF = IRF * (max(decay)/max(IRF))
# replace 0s to avoid error message
IRF = np.where(IRF == 0, 0.1, IRF)
decay = np.where(decay == 0, 0.1, decay)
# take only the quotient part of the result
deconv = scipy.signal.deconvolve(decay, IRF)[0]
# "padding" the deconvolved signal so it has the same size as the original signal
s = int((len(decay)-(len(deconv)))/2) ## difference on each side
deconv_res = np.zeros(len(decay))
end = int(len(decay)-s-1) # final index
deconv_res[s:end] = deconv
deconv = deconv_res
# convolved normalized to decay height for plotting
deconv_n = deconv * (max(decay)/max(deconv))
IRF为float64数组,signal为uint16数组
我承认我对反卷积的数学不太熟悉,所以我正在盲目地尝试不同的东西,比如尝试不同的除法函数,但没有任何结果接近预期。 我得到的最后结果看起来像这样(见原始信号图和它试图反卷积的信号……)
任何人都可以告诉我一些想法,如果它是 scipy.deconvolve 中的东西我不明白,这种奇怪行为的原因是什么,或者甚至是一些高级阅读 material 可能帮帮我? 或者,如果您认为这个问题更像是物理问题而不是与编码相关的问题,那么问这个问题的地方更好吗?
问题在于反卷积是一种多项式除法,它将输出信号分解为 $conv(h, x) + r$,如果你的信号有噪声,它可能会给出奇怪的结果。此外,如果脉冲响应中的第一个样本很小,它往往会产生指数增长的输出。
这道题我会做的是FFT的除法
N = 2**(ceil(log2(len(IRF) + len(decay)))
filtered = ifft(fft(decay, N) / fft(IRF, N))