Коэффициент взаимной корреляции - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть две формы сигнала во временной области, из которых мне нужно измерить коэффициент взаимной корреляции в 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')) )

Ответы [ 4 ]

5 голосов
/ 02 декабря 2009

Согласно уравнениям в этой статье вы можете рассчитать коэффициент взаимной корреляции следующим образом:

% 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
2 голосов
/ 04 декабря 2009

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

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

кросс-ковариационная последовательность является кросс-корреляцией среднего значения удаленного последовательности. Как упоминал Джунас, rand имеет смещение по постоянному току на 0,5 и даст вам «неверные» результаты.

0 голосов
/ 03 декабря 2009

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

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

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

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

0 голосов
/ 02 декабря 2009

Я пробовал max (abs (xcorr (m, n, 'coeff'))), но, похоже, он не работает должным образом.

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

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

...