मैं scipy.signal.deconvolve
को समझने की कोशिश कर रहा हूं।समझना scipy deconvolve
देखने के गणितीय दृष्टि से एक घुमाव के बस फूरियर अंतरिक्ष में गुणन तो मैं उम्मीद होती है दो कार्यों f
और g
के लिए कि:
Deconvolve(Convolve(f,g) , g) == f
numpy में/SciPy यह या तो मामला नहीं या है मुझे एक महत्वपूर्ण बात याद आ रही है। हालांकि एसओ पर deconvolve से संबंधित कुछ प्रश्न हैं (जैसे here और here) वे इस बिंदु को संबोधित नहीं करते हैं, अन्य अस्पष्ट रहते हैं (this) या अनुत्तरित (here)। सिग्नलप्रोसेसिंग एसई (this और this) पर दो प्रश्न भी हैं जिनके जवाब समझने में सहायक नहीं हैं कि कैसे scipy deconvolve फ़ंक्शन काम करता है।
सवाल होगा:
- आप कैसे एक जटिल संकेत से मूल संकेत
f
फिर से संगठित है, संभालने क्या आप जानते हैं convolving समारोह छ।? - या दूसरे शब्दों में: यह छद्म कोड
Deconvolve(Convolve(f,g) , g) == f
कैसे numpy/scipy में अनुवाद करता है?
संपादित: ध्यान दें कि यह प्रश्न संख्यात्मक अशुद्धियों को रोकने में लक्षित नहीं है (हालांकि यह भी एक open question है), लेकिन scipy में एक साथ कैसे समझ convolve/deconvolve काम पर।
निम्न कोड हेवीसाइड फ़ंक्शन और एक गाऊशियन फ़िल्टर के साथ ऐसा करने का प्रयास करता है। छवि में देखा जा सकता है, संकल्प के deconvolution का परिणाम सभी मूल हेवीसाइड समारोह पर नहीं है। अगर कोई इस मुद्दे में कुछ प्रकाश डाल सकता है तो मुझे खुशी होगी।
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()
संपादित: नोट/
yc=conv(y,c,'full')./sum(c);
ydc=deconv(yc,c).*sum(c);
का उपयोग कर इसे इस सवाल की भावना में एक आयताकार संकेत deconvolve है कि वहाँ एक matlab example, कैसे convolve को दिखा अगर कोई इस उदाहरण को पाइथन में अनुवाद करने में सक्षम था तो भी मदद करेगा।
यह चल रहा है 'मोड = पूर्ण' के साथ एक उचित अच्छा परिणाम देता है (सूचकांक 1000 के आसपास तक, तब सीमा प्रभाव (?) देखा जाता है); दुर्भाग्यवश, सिद्धांत के बारे में पर्याप्त जानकारी नहीं है। – Cleb
@ क्लेब नाइस। लेकिन इसे 'मोड = "पूर्ण"' के साथ चलाना, पहले सभी को संकुचित सिग्नल को बदल देता है, जैसे कि किनारे इस मामले में 500 के बजाय 1000 पर बैठे हैं। कारण के बारे में कोई विचार? मूल की तुलना में संकलित सरणी के परिणाम को मैं कैसे व्याख्या कर सकता हूं? – ImportanceOfBeingErnest
मुझे अभी तक पता नहीं है। [प्रलेखन] में (https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.deconvolve.html) एक छोटा खिलौना उदाहरण है जहां यह पूरी तरह से काम करता है; लेकिन मुझे कोई सुराग नहीं है कि आपका परिणाम ऐसा क्यों दिखता है, दुर्भाग्यवश। – Cleb