2015-08-27 3 views
7

Я страдаю в поиске хорошего способа сравнить (измерить) сходство между двумя разными сигналами. Я не хочу находить задержку времени одного сигнала другому, но я хочу посмотреть, как они похожи друг на друга. Например, у меня есть следующие два сигнала, скажем s1 ans s2. два сигнала выглядят очень похожими, однако в одном сигнале происходит внезапный скачок, который приводит к тому, что вторая часть сигнала (также доминирующая) имеет смещение по сравнению с первой частью.Измерение двух разных (векторных) сигналов сходства

enter image description here

Когда я использую кросс-ковариации, а также кросс-корреляции, это дает мне очень плохой результат, а именно:

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

Однако, глядя на двух сигналов, мы можем видеть что они очень похожи. В самом деле, если принимать перекрестные ковариации двух сигналов только от образца (50-> конец сигнала), то результат будет очень хороший:

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

Так я думаю, что проблема связана с большими прыжками около образца 25 (в красном сигнале).

Мои вопросы:

  • Как преодолеть вышеуказанную проблему?
  • Является ли кросс-ковариация (корреляция) хорошим способом измерения сходства между двумя сигналами?
  • Есть ли другой способ сделать это?

Большое спасибо. Я очень ценю любую помощь от вас!

+4

Вы бы измерения подобия между * градиентом * сигналов? – Shai

+2

Можете ли вы использовать фильтр скользящих средних для вычисления среднего значения в течение короткого диапазона, а затем вычесть из сигнала en, а затем проверить сходство? – Adriaan

+1

Если вы считаете, что прыжок является изгоем, вы можете попробовать outlier методы удаления, такие как RANSAC (просто мысль ...) –

ответ

-1

Вы можете вычислить площадь между этими двумя кривыми. Кривые аналогичны, если область мала, не очень похожа, если площадь большая.

Редактировать: Чтобы справиться с кривыми «прыжок» и шкалы смещения постоянного тока, площадь между двумя кривыми должна быть измерена после выполнения выравнивания ICP (Iterative Closest Point).

+0

Спасибо @ Hesham Eraqui. Я так не думаю, что в первую очередь прыжки приведут к серьезной разнице в результате. А также из-за шума или смещения постоянного тока площадь между двумя кривыми может быть намного больше, чем она должна быть. – bienle

+0

@bienle Я отредактировал свой ответ соответственно. –

3

Вы, вероятно, должны также изучить надежные коэффициенты корреляции. Существует немало литературы и исследований. Однако, когда я воссоздал ваши сигналы, я мог бы найти решение для вас. Поскольку сигналы довольно стабильны, за исключением одной точки, есть простой трюк.

Мы можем воссоздать сигнал с помощью s1 = [s1(1) cumsum(diff(s1))];. Отсюда идея проста. Мы хотим игнорировать большой прыжок. Поэтому мы должны ограничить максимальное значение от diff(s1). Это делается путем:

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

Я выбрал 1 из min(s1,1) части вида произвольного. Возможно, вы захотите установить это на некоторый коэффициент стандартного отклонения сигналов.

Вот полный код, который я использовал для анализа вашей проблемы.

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

Спасибо большое @Dennis – bienle

Смежные вопросы