Understanding scipy deconvolve

8

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:

  • Wie rekonstruieren Sie das ursprüngliche Signal f aus einem verschachtelten Signal, vorausgesetzt, Sie kennen die Faltungsfunktion g.?
  • Oder mit anderen Worten: Wie übersetzt sich dieser Pseudocode 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.

    
ImportanceOfBeingErnest 15.11.2016, 16:32
quelle

2 Antworten

3

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:

  • Der Filter sollte kürzer sein als das Signal
  • Der Filter sollte überall viel größer als Null sein (hier ist & gt; 0.013 gut genug)
  • Wenn das Schlüsselwort argument mode = 'same' für die Faltung verwendet wird, wird sichergestellt, dass es in der gleichen Array-Form wie das Signal lebt.
  • Die Dekonvolution hat 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.

    
ImportanceOfBeingErnest 17.11.2016, 13:32
quelle
1

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%     
Cleb 17.11.2016 13:36
quelle