【问题标题】:Cross-correlation coefficient互相关系数
【发布时间】:2009-12-02 11:52:04
【问题描述】:

我在时域中有两个波形,我需要在 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')) )

【问题讨论】:

  • 我们需要比“它似乎无法正常工作”更多的细节。你得到了什么,你期望得到什么?

标签: matlab signal-processing correlation


【解决方案1】:

根据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 以上。我正在寻找一个代表相似性的值。还有其他可能有帮助的建议吗?
  • 我认为 Scott 足够聪明,可以自己动手 ;) OK -> Edit
【解决方案2】:

尝试改用交叉协方差

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

cross-covariance 序列是均值去除后的互相关 序列。就像 Joonas 提到的那样,rand 的 DC 偏移量为 0.5,会给你一个“不正确”的结果。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 嗯,我希望值介于 0 和 1 之间,从视觉上看,信号非常相似,只是略有滞后。但是我上面输入的代码给出的值是 0.77,这很好,但是如果我在 Matlab 中创建的两个随机信号上使用该代码,它会给出大约 0.83 的更高相关系数,这表明它们非常相似。
    • 请发布代码(通过编辑上面的问题)。很难相信两个随机信号之间的相关系数几乎为零 - 除非它们 1) 非常短,或 2) 具有 DC 偏差。
    【解决方案4】:

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

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

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

    因此,请尝试改用 randn:它返回随机数,其元素正态分布,均值为 0,这正是您想要的。

    【讨论】:

    • 甚至用类似的东西去除直流偏置:x = rand(1,14400) - 0.5; y = 兰德(1,14400) - 0.5; r = max( abs(xcorr(x,y,'coeff')) ) 将解决这个“问题”。但是,使用 randn 的建议很好;近似正态/高斯噪声在实际信号中非常常见(主要归功于中心极限定理),而均匀噪声则不然。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2011-09-11
    • 2020-04-18
    • 2015-09-02
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多