Ich versuche zu verstehen scipy.signal.deconvolve
.
Aus mathematischer Sicht ist eine Faltung nur die Multiplikation im Fourier-Raum, also würde ich erwarten
das für zwei Funktionen f
und g
:
Deconvolve(Convolve(f,g) , g) == f
In numpy / scipy ist das entweder nicht der Fall oder mir fehlt ein wichtiger Punkt. Es gibt zwar schon einige Fragen, die mit der Dekonvolvierung von SO zusammenhängen (wie hier und hier ) sie sprechen diesen Punkt nicht an, andere bleiben unklar ( dies ) oder unbeantwortet ( hier ). Es gibt auch zwei Fragen zu Signal Processing SE ( dies und this ) die Antworten, die nicht hilfreich sind zu verstehen, wie Scipy deconvolve Funktion funktioniert.
Die Frage wäre:
f
aus einem verschachtelten Signal,
vorausgesetzt, Sie kennen die Faltungsfunktion g.? Deconvolve(Convolve(f,g) , g) == f
in numpy / scipy? Bearbeiten : Beachten Sie, dass diese Frage nicht darauf abzielt, numerische Ungenauigkeiten zu vermeiden (obwohl dies auch ein
Bearbeiten : Beachten Sie, dass es ein Matlab-Beispiel , zeigt, wie man ein Rechtecksignal mit
faltet / dekonvolviert %Vor%Im Sinne dieser Frage wäre es auch hilfreich, wenn jemand dieses Beispiel in Python übersetzen könnte.
Nach einigem Ausprobieren habe ich herausgefunden, wie man die Ergebnisse von scipy.signal.deconvolve()
interpretiert, und ich gebe meine Ergebnisse als Antwort aus.
Beginnen wir mit einem funktionierenden Beispielcode
%Vor% Dieser Code erzeugt das folgende Bild und zeigt genau was wir wollen ( Deconvolve(Convolve(signal,gauss) , gauss) == signal
)
Einige wichtige Ergebnisse sind:
mode = 'same'
für die Faltung verwendet wird, wird sichergestellt, dass es in der gleichen Array-Form wie das Signal lebt. n = len(signal) - len(gauss) + 1
Punkte.
Um es also auch auf derselben ursprünglichen Array-Form zu haben, müssen wir es auf beiden Seiten um s = (len(signal)-n)/2
erweitern. Natürlich sind weitere Ergebnisse, Kommentare und Vorschläge zu dieser Frage immer noch willkommen.
Wie in den Kommentaren geschrieben, kann ich nicht mit dem Beispiel helfen, das Sie ursprünglich gepostet haben. Wie @Stelios betont hat, kann die Dekonvolution aufgrund numerischer Probleme nicht funktionieren.
Ich kann jedoch das Beispiel wiederholen, das Sie in Ihrem Edit veröffentlicht haben:
Das ist der Code, der eine direkte Übersetzung aus dem Matlab-Quellcode ist:
%Vor%Tags und Links python signals numpy scipy deconvolution