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

Kreuzkorrelation und Korrelationskoeffizient

 

funky_Phil
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 07.03.2017, 03:37     Titel: Kreuzkorrelation und Korrelationskoeffizient
  Antworten mit Zitat      
Ich möchte 2 Signale vergleichen.

Die Signale haben die gleiche sampling Frequenz
Sie sind aber nicht synchron und auch nicht gleich lang.

Es kann 4 Möglichkeiten geben:
Sig 1 kommt zuerst und ist länger
Sig 1 kommt zuerst und ist kürzer
Sig 2 kommt zuerst und ist länger
Sig 2 kommt zuerst und ist kürzer

Am Schluss sollte ein (Pearson-)Korrelationskoeffizient rauskommen.

Ich habe mir dazu folgende Überlegung gemacht.
Teilweise funktioniert es auch. Das Problem ist hauptsächlich Wenn Sig1 zuerst kommt als 2. Wenn ich Sie vertausche funktioniert es dann oft.

Ich habe das mal programiert. Gibt es vielleicht eine elegantere Möglichkeit???



Code:

%Geben:
% sig1 mit t1 und samplefrequnz Fs
% sig2 mit t2 und samplefrequnz Fs

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

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

% Wer kommt zuerst??
if lagDiff >0;

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

s1al=s2al;

else

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


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

 
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: 10.03.2017, 18:19     Titel:
  Antworten mit Zitat      
ich würde als BSP. Vektoren so vorgehen:

Code:

 sig1=[0, 0, 2, 4, 6, 8, 6, 4, 2,0,0,0,0,0,0,0,0] % erster Datenvekotr
% at=[0,1,2,3,4, usw...] % Zeitvektor,- braucht man aber gar nicht.

 sig2=[0, 0,0,0,0,0,0,0,0,0, 2, 4, 6, 8, 6, 4, 2,0,0,0,0,0,0,0,0] % zweiter Datenvekotr
% bt=[0,1,2,3,4, usw...] % Zeitvektor2  braucht man aber gar nicht.
 


man kann das ja durchwechseln...

am schluss sollte ein Korrelationskoeffizient von 1 rauskommen.
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: 10.03.2017, 18:23     Titel:
  Antworten mit Zitat      
Für die Abtastfrquenz Fs kann 1 angenommen werden.
Also:
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 10.03.2017, 19:40     Titel:
  Antworten mit Zitat      
Vllt. ist das Video hier hilfreich https://www.youtube.com/watch?v=RO8s1TrElEw.
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: 12.03.2017, 02:15     Titel:
  Antworten mit Zitat      
Ich liebe David Dorran! Wirklich die besten Videos!!!
-> hat mir aber in diesem Fall nichts gebracht. Ich bins einfach nochmal Schritt für Schritt durchgegangen und habs noch n bisl umgestellt.

---> SO LÄUFT DAS!

Es bleibt noch eine Frage offen: müssen die beiden Vektoren standartisiert (aka. z.-transformiert) sein? Es kommt jetzt als korrelationskoff 1 raus. Das passt ja auch. Aber wie ist das bei Messdaten?

Code:

clc
clear all
close all
  %Geben:
% sig1 mit t1 und samplefrequnz Fs
% sig2 mit t2 und samplefrequnz Fs

%% Zum Beispiel:
 sig1=[0, 0, 2, 4, 6, 8, 6, 4, 2,0,0,0,0,0,0,0,0] % erster Datenvekotr
% at=[0,1,2,3,4, usw...] % Zeitvektor,- braucht man aber gar nicht.
 sig2=[0, 0,0,0,0,0,0,0,0,0, 2, 4, 6, 8, 6, 4, 2,0,0,0,0,0,0,0,0,0] % zweiter Datenvekotr
% bt=[0,1,2,3,4, usw...] % Zeitvektor2  braucht man aber gar nicht.
  Fs=1;

  %% Hier gehts los! Wir machen eine Kreuzkorr mit den beiden Vektoren
[acor,lag] = xcorr(sig2,sig1);

% Wir suchen das Maximum, da wir eine überlagerung haben wollen. Ein Minimun wäre der Punkt andem beide Vektoren den maximalsten Abstand hätten.

[~,I] = max(acor);

%Wie groß ist die Differenz zum Maximum?
lagDiff = lag(I) % in Bins
timeDiff = lagDiff/Fs % in Zeit

%% Fall 1 lagDiff ist positiv, damit müssen sig 2 von Anfang an kürzen
 if  lagDiff >0;

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

% Damit fangen jetzt beide Vektoren gleichezeitig an.
%% Korrelationskoeffizienten
x=s2_kurz ;
y=sig1;
a=length(x);
b=length(y);
% Für eine Korrelation müssen beide Vektoren gleich lang sein.
%%Jetzt gibts die Fallunterscheidung wer länger ist?

if a>b
    c=[x(1:b)];
        A = [c; y];
        r1=corrcoef(y, c)
end
if a<b
    c=[y(1:a)];
         A = [x; c];
          end    
 end
%% Fall2 sig2 ist länger
 if  lagDiff <0;
%% Falls lag Diff neg. dann muss sig1 gekürtzt werden
s1_kurz = sig1(-lagDiff+1:end);
t1al = (0:length(s1_kurz)-1)/Fs;
%% das gleiche nochmal mit der Länge...
x=s1_kurz ;
y=sig2;
a=length(x);
b=length(y);
if a>b
    c=[x(1:b)];
        A = [c; y];
r3=corrcoef(y, c)
end
if a<b
    c=[y(1:a)];
         A = [x; c];
 r4= corrcoef(x, c)
 end    
 end
 
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.03.2017, 02:46     Titel:
  Antworten mit Zitat      
Ich hab zur Lösung meines Problems noch eine Funktion geschrieben.

Für andere Leute die mal an meinem Problem sitzen...
Es sollen 2 Datenvektoren miteinander verglichen werden.

Geg:
Sie sind unterschiedlich lang, sind nicht synchron, haben unterschiedlichste Einheiten, ABER Sie haben die gleiche Samplingfrequenz

Gesucht: ein Korrelationskoeffizient

Für die Lösung wird eine Kreuzkorrelation gemacht die die 4 Möglichkeiten abcheckt:
Sig 1 kommt zuerst und ist länger
Sig 1 kommt zuerst und ist kürzer
Sig 2 kommt zuerst und ist länger
Sig 2 kommt zuerst und ist kürzer

Die Funktion macht als Ausgabe:
einen Korrelationskoeffizient und einen Vektor mit gleich langen normalisierten Vektoren
function [ r, B ]

Eingabe: Korrelation_von( sig1, sig2,Fs )
man braucht signal 1 und 2 und die samplingfrequenz
Hier das ganze mal zum testen...

Test:
Code:

clc
clear all
close all
%% Lade Daten des Atemgurtes
load ('arschkacke.mat');

sig1=Glatt_TP_Atemgurt_s1;
sig2=neu_Pneumo_s1;

[r1,B1]  =Korrelation_von( sig2, sig1,256 );
 


Hier die Korrelationsfunktion:

Code:

function [ r, B ] = Korrelation_von( sig1, sig2,Fs )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here

% Führe die Kreuzkorrelation aus
%acor sind ist die Höhe der übereinstimmungen
% lag ist die Lagedifferenz ins bins
[acor,lag] = xcorr(sig2,sig1);

% suche die maximale Übereinstimmung
[~,I] = max(acor);
% nimm die zeitliche verschiebung vom der maximalen Übereinstimmung in bins
lagDiff = lag(I)
% rechne die zeitliche verschiebung vom der maximalen Übereinstimmung in eine Zeit um
timeDiff = lagDiff/Fs

%%Fallunterscheidung
%Es is möglich, dass Signal 1 oder Signal2 zuerst kommt

% Signal 1 kommt zuerst,
 if  lagDiff >0;
% also muss Signal 2 verschoben werden bzw. den Anfangsteil verkürtzt werden.
s2_kurz = sig2(lagDiff+1:end); %verkürztes Signal
t2al = (0:length(s2_kurz)-1)/Fs; %verkürztes Zeitvektor

%%1. Nun ist es möglich, dass die beiden Signale unterschiedlich lang sind
%Prüfe die Längen
x=s2_kurz ;
y=sig1;
a=length(x);
b=length(y);

% Signal 2 ist länger als Signal 1
if a>b
% Dann speicher Signal 1 auf die Länge von Signal 2 in "c" ab
    c=[x(1:b)];
        A = [c; y]; % Vekotr der gleich langen Signale
  %% Z-Trafo oder Normalisierung
        % Für Signal 1        
m1=mean(y);  
sa1=std(y);
y1normiert=(y-m1)./sa1;
% Für den Signal 2
m2=mean(c);
sa2=std(c);
y2normiert=(c-m2)./sa2;
% Speichere beide normalisierten Vektoren in Vektor B ab
B=[y2normiert;y1normiert];
% geb mir die Kreuzkorrelation
 r1= corrcoef(y1normiert, y2normiert)
 end
 %% Signal 1 ist länger als Signal 2
if a<b
c=[y(1:a)];
A = [x; c];
m1=mean(x);
sa1=std(x);
y1normiert=(x-m1)./sa1;
% Für c
m2=mean(c);
sa2=std(c);
y2normiert=(c-m2)./sa2;
B=[y2normiert;y1normiert];
      r= corrcoef(y1normiert, y2normiert)
 
 end    
 end

 
%% Signal 2 kommt zuerst,
 if  lagDiff <0;
s1_kurz = sig1(-lagDiff+1:end);
t1al = (0:length(s1_kurz)-1)/Fs;
x=s1_kurz ;
y=sig2;
a=length(x);
b=length(y);

if a>b
c=[x(1:b)];
A = [c; y];
%Für Y
m1=mean(y);
sa1=std(y);
y1normiert=(y-m1)./sa1;
% Für den c
m2=mean(c);
sa2=std(c);
y2normiert=(c-m2)./sa2;
B=[y2normiert;y1normiert];
r= corrcoef(y1normiert, y2normiert)

end

if a<b
c=[y(1:a)];
A = [x; c];
m1=mean(x);
sa1=std(x);
y1normiert=(x-m1)./sa1;
% Für c
m2=mean(c);
sa2=std(c);
y2normiert=(c-m2)./sa2;
B=[y2normiert;y1normiert];
r= corrcoef(y1normiert, y2normiert)
 
 end    
 end
end

 


einen Testvektor stell ich mal in Anhang

arschkacke.mat
 Beschreibung:

Download
 Dateiname:  arschkacke.mat
 Dateigröße:  345.46 KB
 Heruntergeladen:  473 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.