ich versuche aus meinen experimentellen Daten mein eigentliches Signal (Lumineszenz) zurückzurechnen mit Hilfe der Entfaltung (deconv). Im konkreten Fall geht es darum das meine Detektor einen sogenannten Afterpuls erzeugt, also ein ungewolltes zweites Signal, welches dann mit meinen Messdaten interferiert. Glücklicher Weise kann ich allerdings die Antwortfunktion meines Systems messen ohne Probe. Unterm Strich habe ich also die Antwortfunktion und das gefaltete Signal aus Lumi und Antwortfunktion. Alle Daten sind in der Form 1xN.
Um das Ganze mal als Code darzustellen, sieht das ganze simuliert so aus:
Bild 1 stellt die Antwortfunktion dar, Bild 2 die simulierten Lumidaten, Bild 3 dann die Faltung und Bild 4 die Entfaltung. Funktioniert bei mir (MatLab 2013b) alles wunderbar, Bild 2 und 4 sind nahezu identisch. Perfekt!
Mache ich das Gleiche jetzt mit meinen experimentellen Daten, kommt genau das gleiche (gefaltete) Signal wieder raus, ohne das irgendwas entfaltet worden wäre. Ich habe mal den wichtigen Teil meines Codes so umgeschrieben, dass er mit der angehängten Datei funktionieren sollte.
Code:
i=1; repRate=2.107E6;
lifetime=load(sprintf('0250nm_02_90s.txt'));binning=0.008;
noc = floor(1E9/(repRate*binning)); % total number of counts from data
x=binning.*(1:1:noc)'; % x = time axis [ns]
y = lifetime(1:noc); % y = counts SPAD
% simulated response function SPAD, data from other measurement
xirf=binning.*(0:1:noc-1)';
exPeak = exp(-1.*(xirf./0.1744).^2);
exPeak = (27.81+8.913)*2880.*exPeak;
aP = 88.448; aPV=aP/binning; % arrival time afterpulse relativ to excitation pulse [ns], data from other measurement
xx=binning.*(aPV:1:noc)';
afPeak = 27.81*exp(-(xx-aP)./66.93)+8.913;
yirf=exPeak; yirf(aPV:noc)=afPeak;
yirf(yirf<0.01)=0;
yirf = yirf ./ max(yirf);
% deconvolution signal y with response function SPAD yirf [q,r]=deconv(y,yirf);
figure,semilogy(r) title('deconvoluted data')
Weiß jemand woran das genau liegt das die simulierten Daten gefaltet und entfaltet, aber meine experimentellen Daten nicht entfaltet werden können? Stellt es ein Problem dar das "c" und "yirf" bei den simulierten Daten unterschiedlich groß sind (c=2*yirf-1), bei den experimentellen Daten "y" aber genau so lang ist wie yirf? Anhängen von Nullen oder Verkürzen von yirf hat leider nichts gebracht.
Gruß Marvin
Edit: Habe aus Zeile "y = lifetime(1:noc);" das /2 nach noc entfernt damit die ganzen Daten zu sehen sind. Das /2 war noch ein Relikt aus den vorherigen Versuchen das Problem zu analysieren.
ich habe aus mangelnder Zeit mir deinen Programmcode nicht genau ansehen können. Ich weiß ja auch nicht wie fit du in der Materie Ent-/Faltung bist. Ein paar Grundlagen findest du in diesem Skript: http://www.dspguide.com/ch9/3.htm
Wichtig bei der digitalen Ent-/Faltung ist die richtige Länge der Eingangsvektoren davor. Eine Faltung von einem Eingangssignal u mit m Messerten und der Impultantwort h der Länge n, ergibt folgende Anzahl von Messwerten für das Ausgangssignal y.
Dies führt mathematisch aber zu einer zyklischen Faltung, umgesetzt als Algorithmus. Das richtige Ergebnis erhält man aber nur durch eine lineare Faltung. Somit müssen die Eingangsvektoren folgend umgesetzt werden:
Für die Enfaltung müssen dann h und y als Messwerte vorhanden sein um das Eingangssignal u zu berechnen und zwar bereits auf die Länge m+n-1 gebracht. Hierzu werden Nullen ans Ende der Arrays gesetzt. Ich hoffe das hilft dir weiter. Falls es doch in dem Code umgesetzt ist, dann sorry für die kleine Belehrung
so wie ich das sehe füllt MatLab intern die Vektoren mit Nullen auf um eine lineare ENTFALTUNG durchführen zu können, die FALTUNG wird ohne das Auffüllen mit Nullen durchgeführt (wenn ich das richtig sehe).
Gilt deine Formel für die lineare Faltung auch für die (lineare) Entfaltung?
Zusätzlich werde ich mich mal noch in deinen Link einlesen.
Hi DSP,
also dein Code für die Entfaltung macht schon einmal etwas, das ist schon mal gut. Leider ist das Ergebnis nicht Amplitudenerhaltend, unterm Strich fehlt überall fast eine Größenordnung.
Was mich wundert ist, dass MatLab mit dem deconv Befehl meine experimentellen Daten in den Vektor R = Residuum schreibt und nicht in das eigentliche Ergebnis Q.
Code:
% [Q,R] = DECONV(B,A) deconvolves vector A out of vector B. The result % is returned in vector Q and the remainder in vector R such that % B = conv(A,Q) + R.
Hat jemand schon mal das Problem gehabt und auch lösen können?
Wie schlimm ist es, wenn, wie in meinem Fall, die simulierte Antwortfunktion nicht zu 100% der Antwortfunktion meines Experiments entspricht? So wie ich das sehe sollte ein mehr oder weniger stark verzerrtes Ergebnis bei rauskommen, aber MatLab macht mit deconv streng genommen gar nichts. Mein Ergebnis in Q ist nur eine einzige 1.
EDIT:
Der Befehl "deconvlucy" mit nur einer Iteration bringt bislang das Beste Ergebnis. Weitere Filter/Funktionen die ich verwendet habe sind "deconvwnr", "deconvblind" und "deconvreg".
Also das sich die Amplitude verändert, bezweifel ich stark. Der Faltungsalgorithmus ist 100% richtig und wird so auch in dem verlinkten Skript beschrieben. Nur eben nicht in Matlab. Du kannst gern den Vergleich mit conv() machen. Das Ergebnis ist identsich.
Wenn die Eingangsvektoren, speziell die Impulsantwort zu kurz sind, kann es zu unschönen Artefakten kommen. Ich werde versuchen dir ein Bsp. morgen zu erstellen, dass die Faltung und Entfaltung durchführt.
Hi DSP,
ich glaube dir das der Code richtig ist. Weiterhin macht ja MatLab auch die (Ent-)Faltung mit conv und deconv richtig mit meinen simulierten Daten. Ich kann sogar meine experimentellen Daten nochmal Falten und Zurückfalten lassen. Geht alles wunderbar. Nur eben meine experimentellen Daten mit der Antwortfunktion Entfalten, das will einfach nicht funktionieren.
Bevor du das Beispiel machst, sei doch bitte so gut und verwende mal meine zwei Daten mit deinem Code.
Danach sind die experimentellen Daten (y) und die Antwortfunktion (yirf) gleich lang (1x59321) und dein Code füllt das ja automatisch mit Nullen auf, richtig?
Unterm Strich habe ich also die Antwortfunktion und das gefaltete Signal aus Lumi und Antwortfunktion
Bist du dir denn wirklich sicher, dass es sich hier um eine Faltung handelt? Wie ich bereist schon erwähnt habe, besteht eine Faltung z.B. aus einem Eingangssignal und der Impulsantwort eines Systems. Messe ich z.B. Eingang und Ausgang des Systems, kann ich mit der Entfaltung die Impulsantwort bestimmen. Dafür funktioniert mein Code auch.
Mir ist eben noch nicht klar wie deine beiden gemessenen Datensätze zusammenhängen und welche 3. Größe durch die Entfaltung berechnet werden soll. Möglicherweise funktionieren die experimentellen Daten nicht, weil keine Faltung als Zusammenhang besteht sondern nur eine Addition oder Multiplikation.
Ich hätte gerne nur das Lumineszenzsignal und wollte dafür die Entfaltung anwenden:
Lumineszenzsignal = Entfaltung (Messdaten * APD)
Leider stellt sich heraus das sehr wahrscheinlich die Antwortfunktion von der APD (=Detektor) nicht hinreichend gut genug ist um die Entfaltung erfolgreich durchzuführen. Das hat somit nichts mit dem Code zu tun, sondern mit meinen aufgenommenen Daten.
Um dennoch einen Vorteil aus meinen Messungen zu erhalten, werde ich den umgekehrten Weg gehen und mein simuliertes Lumineszenzsignal mit einer Antwortfunktion falten bis die simulierten Messdaten meinen experimentellen Messdaten hinreichend genau entsprechen.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.