互相关系数

时间:2009-12-02 11:52:04

标签: matlab signal-processing correlation

我在时域中有两个波形,我需要在MATLAB中测量cross-correlation系数。我试过max(abs(xcorr(m,n,'coeff'))),但似乎没有正常工作。

另外,我需要测量波形不同部分的互相关系数,例如:以1分钟的间隔测量互相关系数。如果可能的话,将这些值输出到矩阵或其他东西。

我知道这有很多要问,但我是一名MATLAB新手并且发现这项任务令人生畏! 我将非常感激地收到您对此问题任何部分给予的任何帮助。


修改 这是我用来测试相关代码的代码:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

尝试使用 Cross-Covariance 代替

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

交叉协方差序列是均值去除的互相关 序列。与Joonas提到的一样,rand的DC偏移为0.5,会给你一个“错误”的结果。

答案 2 :(得分:0)

  

我试过max(abs(xcorr(m,n,'coeff')))但它似乎没有正常工作。

你是什么意思?它的输出是什么,你期望什么?

互相关中可能存在的一个问题是波形中的直流偏置会破坏结果。据我所知,没有通用的方法可以做任何事情。您必须以某种方式确保波形不包含任何直流偏置。

答案 3 :(得分:0)

  

这是我用来测试相关代码的代码:

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

问题是rand会返回在区间(0,1)中均匀分布的数字。换句话说,您的DC偏差(平均值)为0.5!这就是为什么你得到看似随机信号的高相关系数的原因:它们不是很随机,因为每个信号都有一个相似的常数分量,显示在相关系数中。

所以,请尝试使用randn:它返回其元素正常分布的随机数,均值为0 ,这就是您想要的。