我在时域中有两个波形,我需要在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')) )
答案 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 ,这就是您想要的。