WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Entfaltung Simulation / Experiment mit deconv

 

marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 28.08.2015, 10:57     Titel: Entfaltung Simulation / Experiment mit deconv
  Antworten mit Zitat      
Hallo Leute,

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:

Code:

% response function apd simuliert
figure(1)
xirf=0.064.*(0:1:7415)';
exPeak = exp(-1.*(xirf./0.1744).^2);
exPeak = (27.81+8.913)*2880.*exPeak;
xx=0.064.*(1382:1:7415)';
afPeak = 27.81*exp(-(xx-88.448)./66.93)+8.913;
yirf=exPeak; yirf(1382:7415)=afPeak;
yirf(yirf<0.01)=0;
yirf = yirf ./ max(yirf);
semilogy(xirf,yirf),ylim([1E-6 2E0]),xlim([0 500])
title('simulated SPAD response function')


% test lumi data
xx=0.064.*(0:1:7415)';z=0.064*(1969:1:7416)';
yy(1969:7416)=2E4*exp(-1.*(z-126)/15)+2E3*exp(-1.*(z-126)/60);
yy=yy+rand(1,length(yy))*10;
figure(2)
semilogy(xx,yy)
title('simulated lumi data')

figure(3)
m=max(yy);
yyn=yy./m;
c=conv(yy,yirf); semilogy(xx,c(1:length(xx)))
title('convoluted data')

figure(4)
[q,r]=deconv(c,yirf);
semilogy(xx,q)
title('deconvoluted data')
 


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.

0250nm_02_90s.txt
 Beschreibung:
experimentelle Daten

Download
 Dateiname:  0250nm_02_90s.txt
 Dateigröße:  261.56 KB
 Heruntergeladen:  663 mal
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.08.2015, 17:12     Titel:
  Antworten mit Zitat      
Hallo Marvin,

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.

Code:
y[m+n-1] = u[m] * h[n] % zyklische Faltung


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:

Code:
y[m+n-1] = u[m+n-1] * h[n+m-1] % lineare Faltung


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 Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 28.08.2015, 17:26     Titel:
  Antworten mit Zitat      
Hi DSP,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.08.2015, 17:31     Titel:
  Antworten mit Zitat      
Ja, das gilt auch für die Entfaltung:

Code:

function output = FFT_Faltung(sig1, sig2)
% Die Funktion führt eine schnelle Faltung mittels FFT aus
% Input:
% sig1 = Messsignal
% sig2 = Filter-Impulsantwort
% Output:
% output = gefiltertes Messignal
%--------------------------------------------------------------------------

% kopieren der Eingangsvektoren
sig1 = double(sig1(:));
sig2 = double(sig2(:));

% Faltungssatz sig(m) * h(n) = output(m+n-1):
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);

% Messsignal
% mit Nullen auf fftsize auffüllen
sig1 = [sig1; zeros(fftsize-length(sig1),1)];
%Berechnung des Frequenzspektrums
sig1 = fft(sig1,fftsize);

% Filter - Impulsantwort
% mit Nullen auf fftsize auffüllen
sig2 = [sig2; zeros(fftsize-length(sig2),1)];
%Berechnung des Frequenzspektrums
sig2 = fft(sig2,fftsize);
 
% Faltung durch Multiplikation der Spektren
% Rücktransformation in den Zeitbereich
conv_raw = ifft(sig1.*sig2);

% Rückgabe Ergebnis
output = transpose(conv_raw(1:outlength));
 


Code:

function output = FFT_Entfaltung(sig1, sig2)
% Die Funktion führt eine schnelle Entfaltung mittels FFT aus
% Input:
% sig1 = Ausgangssignal
% sig2 = Filter-Impulsantwort
% Output:
% output = Eingangssignal
%--------------------------------------------------------------------------

% kopieren der Eingangsvektoren
sig1 = double(sig1(:));
sig2 = double(sig2(:));

% Entfaltungssatz sig(m+n-1) * h(n+m-1) = output(m+n-1):
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);

% Ausgangssignal
% mit Nullen auf fftsize auffüllen
sig1 = [sig1; zeros(fftsize-length(sig1),1)];
%Berechnung des Frequenzspektrums
sig1 = fft(sig1,fftsize);

% Filter - Impulsantwort
% mit Nullen auf fftsize auffüllen
sig2 = [sig2; zeros(fftsize-length(sig2),1)];
%Berechnung des Frequenzspektrums
sig2 = fft(sig2,fftsize);
 
% Entfaltung durch Division der Spektren
% Rücktransformation in den Zeitbereich
conv_raw = ifft(sig1./sig2);

% Rückgabe Ergebnis
output = transpose(conv_raw(1:outlength));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 29.08.2015, 13:42     Titel:
  Antworten mit Zitat      
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".
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 29.08.2015, 17:21     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 31.08.2015, 09:06     Titel:
  Antworten mit Zitat      
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.

Die Antwortfunktion:

Code:

figure
xirf=0.008.*(0:1:59320)';
exPeak = exp(-1.*(xirf./0.1744).^2);
exPeak = (27.81+8.913)*2880.*exPeak;
xx=0.008.*(11056:1:59320)';
afPeak = 27.81*exp(-(xx-88.448)./66.93)+8.913;
yirf=exPeak; yirf(11056:59320)=afPeak;
yirf(yirf<0.01)=0;
yirf = yirf ./ max(yirf);
semilogy(xirf,yirf),ylim([1E-6 2E0]),xlim([0 500])
title('simulated SPAD response function')
 


Und die experimentellen Daten mit dem Textdokument weiter oben:
Code:

    lifetime=load(sprintf('0250nm_02_90s.txt'));
    x=0.008.*(0:1:59320)';
    y = lifetime(1:59321);                                                 % y = counts SPAD
    figure, semilogy(x,y)
 


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 31.08.2015, 20:56     Titel:
  Antworten mit Zitat      
Zitat:
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 01.09.2015, 11:06     Titel:
  Antworten mit Zitat      
Unterm Strich sieht es bei mir jetzt so aus:

Messdaten = Faltung (Lumineszenzsignal * APD)

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.

Vielen Dank für deine Hilfe DSP!
Private Nachricht senden Benutzer-Profile anzeigen
 
MrHyde
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 05.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2021, 10:08     Titel:
  Antworten mit Zitat      
Hallo DSP,

ich bin auf diesen Beitrag gestoßen, da ich einen Messdatensatz entfalten möchte.

Nun hatte mich die Vorgehensweise über die FFT interessiert und ich habe deine beiden Funktionen getestet.

Leider bin ich mit diesen gescheitert und kann mir nicht ganz erklären, weshalb mein Minimalbeispiel nicht funktioniert hat.

Könntest du dir das mal bitte anschauen und mir einen Tipp geben?

Grüße

MrHyde

Code:

clear all;

 load testdatensatz.mat

 y=y_werte./max(y_werte); %Normierung
 t=0:1:size(x_werte,1)-1;
 
 breite=36;
 g = heaviside(t);
 g(1) = 0;
 g(breite:end)=0;
 
% Testen:
 
gefiltert = FFT_Faltung(y, g); %Gefilterte Daten
 
test=gefiltert(1,18:2781)./36;

figure(300)
plot(t,test,'-r')
hold on
plot(t,y,'-k')
hold off

output = FFT_Entfaltung(gefiltert, g);

figure(301)
plot(output,'-r')

 


testdatensatz.mat
 Beschreibung:

Download
 Dateiname:  testdatensatz.mat
 Dateigröße:  25.03 KB
 Heruntergeladen:  256 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.