私は理解しようとしていますscipy.signal.deconvolve
。
数学的な観点からは、畳み込みはフーリエ空間での乗算にすぎないため、2 つの関数f
とについては次のようになりg
ます。
Deconvolve(Convolve(f,g) , g) == f
numpy/scipy では、これは当てはまらないか、重要な点が抜けています。SO のデコンボリューションに関連するいくつかの質問がありますが (ここやここのように)、この点に対処していません。他の質問は不明 (これ) または未回答 (ここ) のままです。また、SignalProcessing SE に関する 2 つの質問 ( thisおよびthis ) に対する回答は、scipy の deconvolve 関数がどのように機能するかを理解するのに役立ちません。
問題は次のとおりです。
- 畳み込み関数 g を知っていると仮定して、畳み込み信号から元の信号をどのように再構築
f
しますか? - 言い換えれば、この疑似コードはどのよう
Deconvolve(Convolve(f,g) , g) == f
に numpy / scipy に変換されるのでしょうか?
編集:この質問は、数値の不正確さを防ぐことを目的としているのではなく(これも未解決の質問です)、scipyで畳み込み/デコンボリューションがどのように連携するかを理解することを目的としていることに注意してください。
次のコードは、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 に翻訳できればそれも役に立ちます。