2015-08-27 47 views
7

Cierpię na znalezienie dobrego sposobu na porównanie (zmierzenie) podobieństwa między dwoma różnymi sygnałami. Nie chcę znaleźć opóźnienia jednego sygnału dla drugiego, ale chcę zobaczyć, jak są do siebie podobne. Na przykład mam następujące dwa sygnały, powiedzmy s1 ans s2. dwa sygnały wyglądają bardzo podobnie, jednak w jednym sygnale występuje nagły skok, który powoduje, że druga część sygnału (również dominująca) ma przesunięcie względem pierwszej części.zmierzyć dwa różne (wektor) podobieństwo sygnału

enter image description here

Kiedy używam krzyżowej kowariancji jak również wzajemnej korelacji, daje mi to bardzo słaby wynik, a mianowicie:

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

Jednak patrząc na dwóch sygnałów, możemy zobaczyć że są bardzo podobne. W rzeczywistości, jeśli biorąc krzyżowej kowariancji dwóch sygnałów tylko z próbki (50-> Koniec sygnału), wynik jest bardzo dobry:

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

więc myślę, że problem jest z powodu wielkiego skakania przy około próbki 25 (w czerwonym sygnale).

Moje pytania są następujące:

  • Jak przezwyciężyć powyższy problem?
  • Czy kowariancja krzyżowa (korelacja) jest dobrym sposobem pomiaru podobieństwa między dwoma sygnałami?
  • Czy jest inny sposób na zrobienie tego?

Wielkie dzięki. Naprawdę doceniam każdą pomoc od Ciebie!

+4

byłoby rozważyć pomiaru podobieństwa pomiędzy gradientem * * sygnałów? – Shai

+2

Czy możesz użyć filtru średniej ruchomej do obliczenia wartości średniej na krótkim zasięgu, a następnie odjąć ją od sygnału en, a następnie sprawdzić podobieństwa? – Adriaan

+1

Jeśli uważasz, że ten skok jest odstający, możesz wypróbować metody odstające od zewnątrz, takie jak RANSAC (tylko myśl ...) –

Odpowiedz

-1

Można obliczyć obszar między tymi dwiema krzywymi. Krzywe są podobne, jeśli obszar jest mały, nie jest tak podobny, jeśli obszar jest duży.

Edycja: Aby uporać się z przypadkami "przeskoku" krzywej i przesunięcia DC, obszar pomiędzy tymi dwiema krzywymi powinien zostać zakodowany po wyrównaniu ICP (Iterative Closest Point).

+0

Dzięki @ Hesham Eraqui. Nie sądzę, po pierwsze, skoki spowodowałyby poważną różnicę w wyniku. A także ze względu na szumy lub przesunięcia DC, obszar między dwiema krzywymi może być znacznie większy niż powinien. – bienle

+0

@bienle Odpowiednio zredagowałem swoją odpowiedź. –

3

Prawdopodobnie powinieneś również sprawdzić solidne współczynniki korelacji. Wokół jest trochę literatury i badań. Jednak gdy odtworzyłem twoje sygnały, mógłbym znaleźć dla ciebie rozwiązanie. Ponieważ sygnały są dość stabilne, z wyjątkiem jednego punktu, istnieje prosta sztuczka.

Możemy odtworzyć sygnał za pomocą s1 = [s1(1) cumsum(diff(s1))];. Stąd pomysł jest prosty. Chcemy zignorować wielki skok. Dlatego musimy ograniczyć maksymalną wartość z diff(s1). Robi to:

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

Wybrałem 1 w części arbitralnej typu min(s1,1). Możesz ustawić to na pewien współczynnik odchylenia standardowego sygnału.

Oto pełny kod użyty do analizy twojego problemu.

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

Dzięki dużo @Dennis – bienle