Verfasst am: 07.03.2017, 03:37
Titel: Kreuzkorrelation und Korrelationskoeffizient
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
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 clearall closeall
%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.
% 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
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...
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)
%% 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)
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)
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.