2009-12-02 6 views
0

У меня есть две формы сигнала во временной области, из которых мне необходимо измерить коэффициент cross-correlation в MATLAB. Я пробовал max(abs(xcorr(m,n,'coeff'))), но, похоже, он работает неправильно.Коэффициент кросс-корреляции

Также мне необходимо измерить коэффициент взаимной корреляции для разных участков формы волны, например. измерьте коэффициент взаимной корреляции с интервалом в 1 минуту. И если возможно, выведите эти значения в матрицу или что-то в этом роде.

Я знаю, что это много, чтобы спросить, но я новичок MATLAB и считаю эту задачу сложной!
Любая помощь, которую вы могли бы дать мне по любому разделу этого вопроса, была бы с благодарностью принята.


EDIT: Это код, который я использовал для проверки кода корреляции:

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 
+0

Нам нужна более подробная информация, чем «кажется, что она работает неправильно». Что * * вы получили, и что вы ожидали *, чтобы получить? – gnovice

ответ

0

Я пытался макс (абс (xcorr (т, п, 'коэфф'))), но он, похоже, не работает должным образом.

Что вы подразумеваете под этим? Что он выводит, и чего вы ожидаете?

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

+0

Ну, я надеюсь на значение от 0 до 1, визуально сигналы очень похожи, с небольшим отставанием. но код, который я набрал выше, дает значение 0,77, что хорошо, однако, если я использую этот код для двух случайных сигналов, которые я создаю в Matlab, он дает более высокий коэффициент корреляции около 0,83, что говорит о том, что они очень похожи. – Scott

+0

Пожалуйста, разместите код (отредактировав свой вопрос выше). Трудно поверить, что коэффициент корреляции между двумя случайными сигналами был почти ничего, кроме примерно нуля - если они 1) не очень короткие или 2) имеют смещение постоянного тока. –

5

Согласно уравнениям в this article вы можете рассчитывать коэффициент кросс-корреляции в этом случае:

% Assuming: m and n are your signals organized as row vectors 
r = cov([m;n])/(std(m)*std(n)); 

, если вы хотите, чтобы вычислить коэффициент только для некоторой части сигналов, просто используйте:

r = cov([m(1:100);n(1:100)])/(std(m(1:100))*std(n(1:100))); 

вы также пытались функцию corrcoef?

Редактировать Хорошо, я проверил corrcoef функцию и, кажется, работает нормально, посмотрите:

>> x = 100*randn(1000,1); 
>> y=34*randn(1000,1); 
>> corrcoef(x,y) 

ans = 

    1.0000 -0.0543 
    -0.0543 1.0000 

Таким образом, коэффициент корреляции равен -0,0543 - небольшое сходство (как и ожидалось) ,
Чтобы проверить это, давайте вычислить коэффициент для идентичных сигналов:

>> y=x; 
>> corrcoef(x,y) 

ans = 

    1  1 
    1  1 

Как и следовало ожидать, он равен 1.

Редактировать. Как вы можете видеть, результат corrcoef представляет собой матрицу из всех возможных коэффициентов корреляции между этими двумя сигналами:

 x  y 
x 1.0000 -0.0543 
y -0.0543 1.0000 

Таким образом, для кросс-корреляции, Вы должны выбрать один из элементов вне главной диагонали (есть а коэффициенты самокорреляции в этом случае всегда равны 1).
Нет никакой разницы, если вы выберете ans (2,1) или ans (1,2) - нет разницы, если вы вычислите корреляцию x и y или корреляцию y и x.

Таким образом, окончательный код должен выглядеть примерно так:

R = corrcoef(x,y); % Correlation matrix 
r = R(2,1); % this is your Cross-Correlation coefficient 
+0

Привет, спасибо, но это возвращает много чисел, большинство из которых выше одного. Я ищу одно значение, которое представляет сходство. Любые другие предложения, которые могут помочь? – Scott

+0

вам нужны as (1,2) –

+0

Я предположил, что Скотт достаточно умен, чтобы сделать это сам;) OK -> Редактировать – Gacek

0

Это код, который я использовал для проверки кода корреляции:

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 

Проблема заключается в том, что rand возвращается числа, которые равны , равномерно распределенные в интервале (0,1). Другими словами, у вас есть смещение постоянного тока (среднее) 0,5! Вот почему вы получаете высокий коэффициент корреляции для кажущихся случайными сигналов: они не совсем случайны, так как каждый из них имеет аналогичную постоянную составляющую, которая появляется в коэффициенте корреляции.

Итак, попробуйте вместо этого использовать randn: он возвращает случайные числа, элементы которых обычно распределяются со средним значением 0, что и нужно здесь.

+0

Даже удаляя смещение постоянного тока с чем-то вроде: x = rand (1,14400) - 0,5; y = rand (1,14400) - 0,5; r = max (abs (xcorr (x, y, 'coeff'))) исправит эту «проблему». Однако предложение использовать randn хорошо; примерно нормальный/гауссовский шум очень распространен в реальных сигналах (во многом благодаря Центральной предельной теореме), в то время как равномерный шум отсутствует. – musicinmybrain

1

Попробуйте использовать кросс-ковариационной вместо

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcov(x,y,'coeff'))) 

кросс-ковариационная последовательность является кросс-корреляции средних-удалены последовательностей. Как упоминалось в Joonas, rand имеет смещение по постоянному току в 0.5 и даст вам «неправильные» результаты.