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

unterschiedliche Abtastfrequenzen, Korreltation, Drehmatrix

 

funky_Phil
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 05.01.2017, 19:32     Titel: unterschiedliche Abtastfrequenzen, Korreltation, Drehmatrix
  Antworten mit Zitat      
Vielen Dank für die Aufnahme!
Hi ich bin Phil und ich schreibe gerade meine Diplomarbeit in Bio-Physik über die Analyse von Atemkurven.

Ich habe gerade 3 Probleme auf einmal und lese mir hier immer viel durch aber finde nichts passende und daher frag ich jetzt mal. Vielleicht hat ja jemand instant eine Lösung...

Ich benutze 2 verschiedenen Geräte um ein Atemsignal zu messen. Diese gemessen Kurven haben dadurch auch jeweils unterschiedliche Abtastfrequenzen. (siehe Bild imAnhang 2kurven: blau=200Hz / rot=256 Hz). Die Datensätze habe ich auch mal angehängt als Bsp.mat

Code:
% so hab ich die Werte auf eine gemeinsame Zeitachse gebracht:
x1=Werte_1;
fs1 = 200;
T1 = 1/fs1;
N1 = length(x1); % Länge des Signals
t1 = [0:N1-1]*T1; % Zeitvektor

x2=Werte_2;
fs2 = 256;
T2 = 1/fs2;
N2 = length(x2);
t2 = [0:N2-1]*T2;

 



1. Problem.
Kann ich die Abtastfrequenzen durch matlab anpassen?
Ich habe gelesen, dass es zum Beispiel in matlab "downsamling" gibt. --> das macht aber kein Sinn, da jeder 3. oder 4. Wert weg gelassen wird. (Damit könnte ich 1/3 oder 1/4 der ursptünglichen Freuqnz weg rechnen).

"Upsampling" macht auch kein Sinn --> da ich nur zusätzliche nullen rein bekomme.

Kann ich vielleicht die niedrigere Frequenz auf die höhere Frequenz hoch interpolieren?
Oder gibt es da vielleicht noch einen viel viel besseren Trick wo ich noch überhaupt nicht drauf komme?

Ich will beide Frequenzen angelichen, da ich sonst ein Problem mit der Korrelation bekomme. Oder sehe ich das komplett falsch???

2. Problem
Ich möchte eine Ähnlichkeit beider Kurven fest stellen. Dafür hab ich mir schon einiges über Korrelation durchgelesen.

Aber wie programiere ich das am besten? Bzw. Beide Kurven sind ja leicht verschoben. Wie kann ich Sie so verschieben, dass Sie perfekt übereinander liegen? Bzw. dass ein Vektro verschoben wird zu der Stelle wo die beste Übereinstimmung ist.

Eine andere Frage ist: Was kann ich über die Qualtität der Ähnlichkeit aussagen?

3. Problem:
wie man an der blauen Kurve erkennen kann, so fällt der "offset" mit der Zeit immer tiefer. Ich weiß leider nicht wie das zustande kommt. --> ist ja soweit auch nicht wild und eher ein technisches Problem.
Ich überlege trotzdem gerade wie ich das anpassen kann, dass die Kurve immer um die selbe Nulllage herum pendelt.

Meine erste Überlegung wäre eine Orts-Kurve durch die Maxima zu programieren und dadurch einen dynamischen offset zu bekommen. Dann könnte ich 0 Minus den-jeweiligen-Wert-der-Ortskurve machen und dann habe ich zu jedem Punkt das jeweilige Korrekturstück,- dass ich dann addiere.
Ich habe aber sehr vielen Messdaten,- wird dass dann nicht Ewig und drei Tage dauern?

Meine andere Überlegung wäre eine Drehmatrix zu programieren. Die mir meinen kompletten Datenvektor dreht, so dass er gerade ist. Dazu habe ich aber praktisch noch gar keine Idee wie man so etwas programieren kann.

Hat mir bitte jemand von euch eine Idee oder eine Lösung zur Hand?
Vielen Lieben Dank schon mal, wenn ihr bis hier hin gelesen habt Smile
Phil

Bsp.mat
 Beschreibung:
die 2 Datensätze

Download
 Dateiname:  Bsp.mat
 Dateigröße:  165.74 KB
 Heruntergeladen:  289 mal
2kurven.jpg
 Beschreibung:
veranschaulichung der Messdaten

Download
 Dateiname:  2kurven.jpg
 Dateigröße:  76.09 KB
 Heruntergeladen:  329 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2017, 20:27     Titel: Re: unterschiedliche Abtastfrequenzen, Korreltation, Drehmat
  Antworten mit Zitat      
Hallo funky_Phil,

Zu 1. Problem:
Du kannst entweder das Signal mit der höheren Frequenz downsamplen oder das mit der niedrigere Frequenz upsamples. Dazu eigenen sich weder downsample noch upsample , aber interp1 ist geeignet.

Zitat:
2. Problem
Ich möchte eine Ähnlichkeit beider Kurven fest stellen. Dafür hab ich mir schon einiges über Korrelation durchgelesen. Aber wie programiere ich das am besten?

Bitte erkläre, was Du genau implementieren möchtest. Bisher wissen wir nur, dass Du "einiges" dazu gelesen hast.

Es ist unwahrscheinlich, dass beide Kurven "perfekt" übereinander liegen werden. Bei üblichen Korrelations-Problemen kommt es auch noch darauf an, ob man die Kurven skalieren und den Nullwert verschieben darf bzw. muss.

Zitat:
Eine andere Frage ist: Was kann ich über die Qualtität der Ähnlichkeit aussagen?

Dazu gibt es verschiedene Wege. Dies zu entscheiden ist aber eher etwas für eine Diskussion mit Deinem Betreuer, denn das Matlab-Forum kümmert sich eher darum, wie man das geschickt in Code umsetzt.

Zitat:
Meine erste Überlegung wäre eine Orts-Kurve durch die Maxima zu programieren und dadurch einen dynamischen offset zu bekommen. Dann könnte ich 0 Minus den-jeweiligen-Wert-der-Ortskurve machen und dann habe ich zu jedem Punkt das jeweilige Korrekturstück,- dass ich dann addiere.
Ich habe aber sehr vielen Messdaten,- wird dass dann nicht Ewig und drei Tage dauern?

Was bedeutet "sehr viele" und wie lange ist "ewig und 3 Tage"? Du könntest z.B. ein Polynom 4. Ordnung durch die lokalen Maxima legen und vom Signal abziehen. Wenn Du weniger als ein Milliarden Signale hast, sollte das in ein paar Sekunden Rechenzeit zu machen sein.

Zitat:
Meine andere Überlegung wäre eine Drehmatrix zu programieren. Die mir meinen kompletten Datenvektor dreht, so dass er gerade ist. Dazu habe ich aber praktisch noch gar keine Idee wie man so etwas programieren kann.

Was bedeutet "gerade" bei einem Signal, das keine Linie ist?
Eine Drehmatrix, hm. Aus physikalischer Sicht ist das nicht sinnvoll. So ein Signal kann ja auch ein paar Stunden lang sein. Dies um irgend einen Punkt zu drehen wird kaum eine Drift sinnvoll ausgleichen.
Es wäre besser, die physikalische Natur dieser Drift zu untersuchen, z.B. mit einer Messung ohne anliegendem Signal. Dann hättest Du ein Argument für die gewählte Art der Korrektur. Alles andere ist nur ein Aufhübschen der Daten und keine wissenschaftliche Herangehensweise mehr.

Gruß, Jan

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 05.01.2017, 22:17     Titel:
  Antworten mit Zitat      
Hi Jan,

zu 1. Prob.
Interpl1 hab ich mir auch gedacht.

Das hab ich jetzt programmiert und das sieht eigentlich ganz gut aus.

Code:
% Interpolation
% alter Datenvektor = x1
% alte Frquenz fs1= 200Hz
% altes Zeitfenster: T1 = 1/fs1
% Länge des Datenvektors: N1 = length(x1);
% alter Zeitvektor: t1 = [0:N1-1]*T1;


% neue Frequenz = 256Hz
fsneu= 256;

% neuer Zeitabschnitt
Tneu= 1/fsneu;

%neuer Zeitvektor
tneu= [0:N1-1]*Tneu
%neuer Datenvektor
xneu = interp1(t1,x1,tneu, 'spline');

plot(t1,x1,'o',tneu,xneu,'xr');
 


Was meinst du? Ich würde damit sagen Problem 1 ist gelöst.

zum Problem 2:
werde ich mal folgendes Beispiel mit der Kreuzkorrelation xcorr ein bisschen umprogramieren:
https://de.mathworks.com/help/signal/ref/xcorr.html
Mal kucken was raus kommt. Vielleicht passt das dann auch schon.

Beim 3. Problem:
Eine Ortskurve mit einem Polynom 4. Ordnung durch die lokalen Maxima legen und vom Signal abziehen.

Ich würde eher ein Polynom 4. Ordnung durch die lokalen Maxima legen -> Orstkurve. Dann berechne ich die Höhendifferenz ausgehend von meinem ersten Signal zum ersten Peak. Damit müsste ich eine Kurve bekommen, die am Anfang Null ist und dann immer größer wird. Diese Werte würde ich dann auf meine Messwerte dazu addieren. Der Nachteil wäre, dass dann alle Werte die Höhe des ersten Peaks haben. Aber anders kann ich es mir gerade auch nicht vorstellen.

Oder wie meinst du das?

Die Idee mit der Drehmatrix gefällt mir auch nicht soooo. Meine Messungen dauern zwar maximal 10 Minuten. Aber die Vorgehensweise ist trotzdem kompliziert. Vorallem setzt es auch voraus, dass das abfallen der Kurve linear ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.01.2017, 15:36     Titel:
  Antworten mit Zitat      
Hallo funky_Phil,

Woher stammt die Drift in Deinem Signal? Ist sie linear? Dann wäre ein Polynom 4. Grades überflüssig und eine Gerade besser. Ein Polynom 4. Grades hat aber den Vorteil, dass man daran auch die Linearität prüfen kann: Wenn die Terme für die 2., 3. und 4. Potenz klein sind, ist die Annäherung mit einer Geraden realistisch.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 09.01.2017, 17:18     Titel:
  Antworten mit Zitat      
Woher der Drift in meinem Signal her kommt weiß ich nicht.
Ich weiß auch nicht, ob es linear ist oder nicht. --> Probieren geht über studieren.

Ein Kollege hat mich aber darauf gebracht einen Shelving Filter zu benutzen.

https://de.mathworks.com/matlabcent.....filter/content/shelving.m

da bin ich mir aber noch unsicher wie ich diesen auf meinen Datensatz anwende.

Ich werde mich jetzt mal an Problem 2 machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.01.2017, 18:15     Titel:
  Antworten mit Zitat      
Hallo funky_Phil

Zitat:
Woher der Drift in meinem Signal her kommt weiß ich nicht.

Das Filtern von Daten ohne eine Idee, woher die Störung stammt, ist eine Art "photoshoppen". Man dreht sich die Signale dabei so hin, wie man sie braucht.
Das würde ich Dir, wenn ich Dein Betreuer wäre, um die Ohren hauen. Um es freundlich auszudrücken ;-)

Nur so als Hinweis, auch wenn er wegen des mangelnden Matlab-Bezuges off-topic ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 19.01.2017, 23:24     Titel:
  Antworten mit Zitat      
Also ich habe rausgefunden woher der Drift kommt.

Das ist die ausführliche Erklärung.
Die Spirometrie ist über eine Pneumotachymetrie implementiert. D. h. es wird die Volumenstromstärke gemessen. Daraus errechnet die Software dann mittels Integration das Volumen. Der Meßkopf führt eine Differentialdruckmessung aus. Über eine interne Kalibrierung wird aus dem Druckabfall dann die Stromstärke bestimmt (im Prinzip Ohm'sches Gesetz). Da der Strömungswiderstand des Meßkopfes sehr klein sein muss, um die Atmung möglichst wenig zu behindern, ist die gemessene Druckdifferenz sehr klein und die Drucksensoren müssen sehr empfindlich sein. Entsprechend ergibt sich immer ein gewisser Offset im Flußsignal, das sich als (linearer) Drift im Volumensignal niederschlägt. Um das zu verhindern, sollte vor Beginn der Messung ein Nullabgleich durchgeführt werden. Da der Offset normalerweise sehr klein ist, kann man alternativ auch eine offsetsubtraktion im Flußsignal oder ein lineares "Detrending" im Volumensignal im Rahmen des Postprocessings durchführen.

ich probiers mal mit: Detrending
https://de.mathworks.com/help/matla.....ysis/detrending-data.html
damit sollte es klappten.
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 19.01.2017, 23:41     Titel:
  Antworten mit Zitat      
und Problem 3 wäre auch gelöst!

Hier der code ein Bild lade ich auch hoch....

Code:
clc
clear all
close all



sdata=Datenvektor; %Messdaten

Fs = 200; % Abtastfrequenz


t = (0:length(sdata)-1)/Fs; % Zeitvektor


mean(sdata)

figure
plot(t,sdata);
legend('Original Data','Location','northwest');


detrend_sdata = detrend(sdata);
trend = sdata - detrend_sdata;

mean(detrend_sdata)

hold on
plot(t,trend,':r')
plot(t,detrend_sdata,'m')
plot(t,zeros(size(t)),':k')
legend('Original Data','Trend','Detrended Data',...
       'Mean of Detrended Data','Location','northwest')
%xlabel('Time (days)');
%ylabel('Stock Price (dollars)');


Bild Erg.jpg
 Beschreibung:

Download
 Dateiname:  Bild Erg.jpg
 Dateigröße:  31.21 KB
 Heruntergeladen:  271 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 20.01.2017, 00:37     Titel:
  Antworten mit Zitat      


die_2_Datenvektoren.jpg
 Beschreibung:

Download
 Dateiname:  die_2_Datenvektoren.jpg
 Dateigröße:  38.4 KB
 Heruntergeladen:  286 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 13.02.2017, 21:12     Titel:
  Antworten mit Zitat      
um das Thema mal zu schliessen...

1. Problem.
Kann ich die Abtastfrequenzen durch matlab anpassen?


Code:
% Interpolation
% alter Datenvektor des Spirometers = s3
% alte Frquenz des Spirometers 200Hz
Fs2= 200
% altes Zeitfenster:
T2 = 1/Fs2
% Länge des Datenvektors:
N1 = length(s3);


% alter Zeitvektor:
t2 = [0:N1-1]*T2;

% neue Frequenz = 256Hz
fsneu= 256;

% neuer Zeitabschnitt
Tneu= 1/fsneu;

% Verhältnis um das der neue Zeitvektor länger sein muss
V=256/200;

%neuer Zeitvektor
tneu= [0:V*N1-1]*Tneu
%neuer Datenvektor
sneu = interp1(t2,s3,tneu, 'spline');
figure(7)
plot(t2,s3,'o',tneu,sneu,'xr');
 




2. Problem
Ich möchte eine Ähnlichkeit beider Kurven fest stellen. Dafür hab ich mir schon einiges über Korrelation durchgelesen.

Aber wie programiere ich das am besten? Bzw. Beide Kurven sind ja leicht verschoben. Wie kann ich Sie so verschieben, dass Sie perfekt übereinander liegen? Bzw. dass ein Vektro verschoben wird zu der Stelle wo die beste Übereinstimmung ist.

Eine andere Frage ist: Was kann ich über die Qualtität der Ähnlichkeit aussagen?


Code:



sig2=y1normiert;


sig1=y3normiert;



Fs = 256;

t1 = (0:length(sig1)-1)/Fs;
t2 = (0:length(sig2)-1)/Fs;



Fs=256;


figure(8)
plot(t1,sig1 ,'r',t2,sig2,'b')

figure(9)
subplot(2,1,1)
plot(t1,sig1)
title('s_1')

subplot(2,1,2)
plot(t2,sig2)
title('s_2')
xlabel('Time (s)')


[acor,lag] = xcorr(sig2,sig1);

[~,I] = max(acor);
lagDiff = lag(I)
timeDiff = lagDiff/Fs

figure (10)
plot(lag,acor)
%a3 = gca;
%a3.XTick = sort([min(lag):1:max(lag) lagDiff]);

%%%%%%%%% nochmal Drucken mit ausgleich



%if lagDiff >0;
%s1al = sig1(lagDiff+1:end);
%t1al = (0:length(s1al)-1)/Fs;

%figure(11)
%subplot(2,1,1)
%plot(t1al,s1al)
%title('s_1, aligned')

%subplot(2,1,2)
%plot(t2,sig2)
%title('s_2')
%xlabel('Time (s)')



%figure(12)
%plot(t1al,s1al ,'r',t2,sig2,'b')


if lagDiff >0;

s2al = sig2(lagDiff:end);
t2al = (0:length(s2al)-1)/Fs;

figure(11)
subplot(2,1,1)
plot(t2al,s2al)
title('s_1, aligned')

subplot(2,1,2)
plot(t1,s1)
title('s_2')
xlabel('Time (s)')

figure(12)
plot(t2al,s2al ,'r',t1,sig1,'b')


s1al=s2al;

else

s1al = sig1(-lagDiff+1:end);
t1al = (0:length(s1al)-1)/Fs;

figure(11)
subplot(2,1,1)
plot(t1al,s1al)
title('s_1, aligned')

subplot(2,1,2)
plot(t2,sig2)
title('s_2')
xlabel('Time (s)')



figure(12)
plot(t1al,s1al ,'r',t2,sig2,'b')
end
%% Korrealationskoeffizient


x=s1al;
y=sig2;

a=length(x);
b=length(y);


if a>b
    c=[x(1:b)];
   
    A = [c; y];
 r3= corrcoef(y, c)

else
    c=[y(1:a)];
   
     A = [x; c];
         
     r2= corrcoef(x, c)
   
end

 B=A';
R = corrcoef(B)
 


3. Problem:
wie man an der blauen Kurve erkennen kann, so fällt der "offset" mit der Zeit immer tiefer. Ich weiß leider nicht wie das zustande kommt. --> ist ja soweit auch nicht wild und eher ein technisches Problem.
Ich überlege trotzdem gerade wie ich das anpassen kann, dass die Kurve immer um die selbe Nulllage herum pendelt.

Code:
%% 4.5. Detrending des Atmungssignals
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% Benutze Atmunngssignal sneu
% Benutze Zeitsignal tneu




mean(sneu)

figure (15)
plot(tneu,sneu);
legend('Original Data','Location','northwest');
%xlabel('Time (days)');
%ylabel('Stock Price (dollars)');

detrend_sdata = detrend(sneu);
trend = sneu - detrend_sdata;

mean(detrend_sdata)

hold on
plot(tneu,trend,':r')
plot(tneu,detrend_sdata,'m')
plot(tneu,zeros(size(tneu)),':k')
legend('Original Data','Trend','Detrended Data',...
       'Mean of Detrended Data','Location','northwest')
%xlabel('Time (days)');
%ylabel('Stock Price (dollars)');


sneu2=detrend_sdata;
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.