2015-08-27 6 views
7

Ich leide daran, einen guten Weg zu finden, die Ähnlichkeit zwischen zwei verschiedenen Signalen zu vergleichen (zu messen). Ich möchte nicht die Verzögerung eines Signals zum anderen finden, aber ich möchte sehen, wie sie einander ähnlich sind. Zum Beispiel habe ich die folgenden zwei Signale, sagen wir s1 ans s2. die beiden Signale sehen sehr ähnlich aus, jedoch gibt es in einem Signal einen plötzlichen Sprung, der dazu führt, dass der zweite Teil des Signals (auch der dominante) einen Versatz gegenüber dem ersten Teil aufweist.messen zwei verschiedene (Vektor-) Signalähnlichkeit

enter image description here

Als ich die Kreuzkovarianz sowie Kreuzkorrelation verwenden, ist es mir ein sehr schlechtes Ergebnis gibt, nämlich:

xcov(s1, s2, 0, 'coeff') ----> 0.2153 

jedoch bei den beiden Signalen suchen, können wir sehen, dass sie sich sehr ähnlich sind. In der Tat, wenn die Kreuzkovarianz der beiden Signale nur von Probenentnahme (50-> das Ende des Signals), ist das Ergebnis sehr gut:

xcov(s1(50:280), s2(50:280), 0, 'coeff') ----> 0.9666 

Also ich denke, das Problem auf die großen Springen gebühren um die Probe 25 herum (im roten Signal).

Meine Fragen sind:

  • Wie das obige Problem zu überwinden?
  • Ist die Kreuzkovarianz (Korrelation) ein guter Weg, um die Ähnlichkeit zwischen zwei Signalen zu messen?
  • Gibt es einen anderen Weg, dies zu tun?

Vielen Dank. Ich schätze jede Hilfe von Ihnen!

+4

würden Sie als die Ähnlichkeit zwischen dem Gradienten * Messung * der Signale? – Shai

+2

Können Sie einen Filter mit gleitendem Durchschnitt verwenden, um einen Mittelwert über eine kurze Entfernung zu berechnen, dann subtrahieren Sie ihn vom Signal und dann nach Ähnlichkeiten? – Adriaan

+1

Wenn Sie diesen Sprung als einen Ausreißer betrachten, können Sie Ausreißer entfernen Methoden wie RANSAC versuchen (nur ein Gedanke ...) –

Antwort

-1

Sie können den Bereich zwischen diesen beiden Kurven berechnen. Die Kurven sind ähnlich, wenn die Fläche klein ist, nicht so ähnlich, wenn die Fläche groß ist.

Edit: Um die Kurven "Sprung" und DC-Offset-Fällen zu behandeln, sollte der Bereich zwischen den beiden Kurven nach Ausrichtung berechnet werden.

+0

Dank @ Hesham Eraqui vergleichen können. Ich denke nicht, zuerst würde das Springen einen ernsten Unterschied im Ergebnis verursachen. Und auch aufgrund des Rauschens oder der DC-Offsets kann der Bereich zwischen zwei Kurven viel größer sein als angenommen. – bienle

+0

@bienle Ich habe meine Antwort entsprechend bearbeitet. –

3

Sie sollten wahrscheinlich auch in robuste Korrelationskoeffizienten schauen. Es gibt ziemlich viel Literatur und Forschung. Wenn ich jedoch Ihre Signale nachgebildet habe, könnte ich eine Lösung für Sie gefunden haben. Da die Signale bis auf einen Punkt ziemlich stabil sind, gibt es einen einfachen Trick.

Wir können das Signal mit s1 = [s1(1) cumsum(diff(s1))]; neu erstellen. Von hier ist die Idee einfach. Wir wollen den großen Sprung ignorieren. Daher müssen wir den maximalen Wert von diff(s1) begrenzen. Es ist getan von:

s1_robust = [s1(1) cumsum(sign(diff(s1)).*min(abs(diff(s1)),1))];.

Ich wählte 1 im Teil Art willkürlich. Sie könnten dies auf einen Faktor der Standardabweichung des Signals einstellen.

Hier ist der vollständige Code, den ich verwendet habe, um Ihr Problem zu analysieren.

clc, clear all, close all 

signal = cos([0:0.1:20]); 
s1 = signal + rand(1,201); 
s2 = signal + rand(1,201); 
s2(50:end) = s2(50:end)-8; 

s1_robust = [s1(1) cumsum(sign(diff(s1)).*min(abs(diff(s1)),1))]; 
s2_robust = [s2(1) cumsum(sign(diff(s2)).*min(abs(diff(s2)),1))]; 
corr  = corrcoef(s1,s2) 
corr_robust = corrcoef(s1_robust,s2_robust) 

figure 
plot(s1); 
hold on; 
plot(s2); 

figure 
plot(cumsum(sign(diff(s1)).*min(abs(diff(s1)),1))); 
hold on; 
plot(cumsum(sign(diff(s2)).*min(abs(diff(s2)),1))); 
+0

Vielen Dank @Dennis – bienle

Verwandte Themen