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

 

der_tukan

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2008, 10:28     Titel: Kreuzkorrelation
  Antworten mit Zitat      
Hallo!
Ich möchte zwei Signale (Vektoren mit 1 Spalte und 36000 Zeilen) miteinander kreuzkorrelieren. Ich habe bisher Folgendes:
Code:
xcorr(data0(:,1),data1(:,1),'coeff');
Das Problem besteht darin, dass MatLab beide Signale "nebeneinander packt" und ich zu viele Daten bekomme, nämlich 71999 statt 36000. Ich hätte gerne die Kreuzkorrelation über der ursprünglichen Zeit, damit ich sehen kann, wo der Peak ist und ich einen Laufzeitunterschied zur Geschwindigkeitsermittlung bestimmen kann.
Zudem ist der Ergebnisplot irgendwie spitz zulaufend und ich kann mir nicht erklären wieso (siehe angehängte Grafik).

Danke für Eure Hilfe!

xcorr.jpg
 Beschreibung:

Download
 Dateiname:  xcorr.jpg
 Dateigröße:  15.95 KB
 Heruntergeladen:  2186 mal


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 30.10.2008, 13:00     Titel:
  Antworten mit Zitat      
Also ich hab mir die Autokorrelation damals selbst gebaut, damit ich sie besser verstehe, hier der Code:

Code:


%%% ac self

%data()
sdata=size(data,1);
c= ceil(sdata/2);
out=0;
result=0;
result(1:c+1)=0;

for ks = 0:c
    coeff1 =data(1+ks:sdata);
    coeff1 = (coeff1-mean(coeff1))./std(coeff1);
    coeff2 =data(1:sdata-ks);
    coeff2 = (coeff2-mean(coeff2))./std(coeff2);
out=sum(coeff1.*coeff2);
out=out./(sdata-ks-1);
result(ks+1)=out;
end;

 


Dort müsstest du nur noch die Wertzuweisung ändern. Ich glaube ich hatte auch die Funktion xcorr garnicht, weil die in der Statistik toolbox ist.

Müsste auch so gehen:

Code:


%%% Auto Korrelation Spearman
result=[];
[a,b]=size(data);

c= ceil(a/2);

for ii=0:c
    coeff1 =data(1+ii:a);
    coeff2 =data(1:a-ii);
    result(ii+1) = corr(coeff1,coeff2);
end;

 


Auch hier müsstest du wieder die Werte so ändern, dass es keine Auto sondern eine Kreuzkorrelation ist. Ausserdem, habe ich den Wertebereich halbiert, weil ja irgendwann die Werte, die miteinader verglichen werden zu wenig sind.

Ich glaube die Funktion xcorr setzt abgeschnittene Werte wieder vorne dran und vergleicht dann. Je nach Anwendungsfall möchte man das aber nicht.

Viel Erfolg und melde dich wann es klappt oder auch wenn nicht,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
der_tukan

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2008, 15:08     Titel:
  Antworten mit Zitat      
Vielen Dank Oli,
aber da steige ich leider nicht durch!

Kann mir nicht erstmal jemand verraten, warum ich im plot von "xcorr" 71999 Werte habe, wenn ich vorher je Signal 36000 hatte!?

Mein Ziel: Auftragen der Kreuzkorrelation der beiden SIgnale über die 36000 Werte (Samples bzw. Zeit).

Danke!
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 30.10.2008, 15:53     Titel:
  Antworten mit Zitat      
Sorry,

also die xcorr funktion in matlab erstellt anscheinend die Korrelation von -maxlag bis +maxlag, dass heißt, ein lag von 0 ist genau in der Mitte von deinem Ergebnis. Deswegen der Peak dort. Anscheinend sind sich deine beiden Signale am ähnlichsten, wenn sie nicht zeitverschoben sind. Das heißt du könntest nur den Signalausschnitt 3600:7199 auswerten. Wenn du nur positive lags haben möchtest. Normalerweise müssten die Sachen ja gespiegelt sein, ich denke mal das liegt an coeff, damit werden die Daten ja normiert. Bin mir da aber nicht so sicher kannste ja mal weglassen und gucken ob der Graph dann gespiegelt ist.

hoffe das konnte dir helfen versuchs mal.

Die Länge ist richtig (2*3600-1).

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
der_tukan

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2008, 16:11     Titel:
  Antworten mit Zitat      
Yo, danke noch mal!
Bin schon weitergekommen! Schneide nun einfach den rechten Teil aus, wie du gesagt hast 36000:71999 bzw. nur 36000:39000. weil mich nur die ersten 0,1 Sekunden interessieren.

Nun habe ich nur noch folgendes Problem:
Die Y-Achse scheint irgendwie verschoben zu sein bei ca. 0,15 (normiert).
Keine Ahnung was zu bedeuten hat. Wenn ich den gesamten Bereich nehme sieht der plot dadurch echt sch... aus bzw. so kann es auch nicht richtig sein! Zudem benötige ich auch die Amplituden.
Wenn ich nur die ersten 0,1 Sekunden nehme sieht man nicht den fallenden Verlauf, aber die Amplituden sind auch verfälscht!
Hast Du ne Idee was das sein könnte? Die Zeit habe ich nicht mit drin als irgendeinen Vektor!

36000-71999.jpg
 Beschreibung:

Download
 Dateiname:  36000-71999.jpg
 Dateigröße:  16.72 KB
 Heruntergeladen:  2090 mal
0.1 sekunden.jpg
 Beschreibung:

Download
 Dateiname:  0.1 sekunden.jpg
 Dateigröße:  24.16 KB
 Heruntergeladen:  2044 mal
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 30.10.2008, 16:18     Titel:
  Antworten mit Zitat      
Ja das ist die normierung. Da musst du mal mit den optionen

'coeff', 'biased' und 'unbiased' rumspielen und 'none'

Ich glaube unbiased ist die, die in der Biologie und Populationskunde genutzt wird.

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
der_tukan

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2008, 16:32     Titel:
  Antworten mit Zitat      
Ich denke nicht, dass das mit der Normierung zu tun hat, zumindest verstehe ich es dann nicht! Egal welche "option" (biased, unbiased, coeff) ich benutze, die werte sind nach oben verschoben. Je weiter man nach rechts kommt, desto weniger sind die Werte verschoben und ganz rechts sind sie Null (siehe Bild von meinem letzten post: 36000-71999).
Grundsätzlich sollte eine Korrelationsfunktion doch aber Null sein bzw. die AMplituden um Null herum "schwingen", oder nicht?
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 30.10.2008, 17:22     Titel:
  Antworten mit Zitat      
probier mal xcov statt xcorr, matlab unterscheidet anscheinend zwischen covariance und correlation, wobei so wie die es gelöst haben scheint mir das garnicht so korrekt zu sein. Aber bei xcov wird noch jedesmal der mean abgezogen, was für mich eigentlich eine normierte correlation ist.

Das ist halt einer der Gründe warum ich es selbst machen wollte, aber mit xcov und der richtigen option sollte es denke mal so aussehen wie du dir das wünschst.

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
der_tukan

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2008, 17:33     Titel:
  Antworten mit Zitat      
Hey!
Habe es jetzt hinbekommen! Und zwar habe ich von den Signalen zuerst den jeweiligen MEAN abgezogen und bin dann mit den Daten in die Kreuzkorrelation gegangen.

Ah, sagtest Du ja grad von wegen xcov!

Tja, das scheint ja dann die Lösung gewesen zu sein!

Danke Dir vielmals!
 
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.