0

我在时域中有两个波形,我需要在 MATLAB中测量其中的互相关系数。我已经尝试过max(abs(xcorr(m,n,'coeff'))),但它似乎无法正常工作。

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

我知道有很多问题要问,但我是 MATLAB 新手,发现这项任务令人生畏!
您可以就这个问题的任何部分给我的任何帮助将不胜感激。


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

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

4 回答 4

5

根据本文中的方程式,您可以这样计算互相关系数:

% 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
于 2009-12-02T12:16:57.153 回答
2

尝试改用交叉协方差

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

互协方差序列是均值去除序列的互相关。就像 Joonas 提到rand的,DC 偏移为 0.5,会给你一个“不正确”的结果。

于 2009-12-03T22:58:31.817 回答
0

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

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

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

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

于 2009-12-03T08:05:16.697 回答
0

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

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

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

于 2009-12-02T12:14:18.000 回答