2009-12-02 119 views
0

我有两个时域波形,其中我需要测量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

我们需要比“它似乎没有正常工作”更多的细节。你得到了什么?你得到了什么? – gnovice 2009-12-02 15:28:47

回答

0

我试图最大(ABS(xcorr(M,N, '系数_') )),但它似乎没有正常工作。

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

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

+0

嗯,我希望0和1之间的值,在视觉上信号非常相似,有一点滞后。但是我上面输入的代码给出了0.77的值,这是很好的,但是如果我在Matlab中创建的两个随机信号上使用该代码,则其相关系数约为0.83,表明它们非常相似。 – Scott 2009-12-02 16:43:29

+0

请发布代码(通过编辑上面的问题)。很难相信两个随机信号之间的相关系数除了大约为零以外几乎都不是 - 除非它们很短,或者2)有一个直流偏置。 – 2009-12-02 18:14:09

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 
+0

嗨,谢谢,但是这会返回很多数字,其中大部分数字都在一个之上。我正在寻找代表相似性的单个值。任何其他建议可能有帮助? – Scott 2009-12-02 16:44:33

+0

你需要ans(1,2) – 2009-12-04 10:52:38

+0

我假设斯科特足够聪明,可以自己做;)确定 - >编辑 – Gacek 2009-12-04 11:12:42

0

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

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

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

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

+0

即使消除直流偏见类似的东西: x = rand(1,14400) - 0.5; y =兰特(1,14400) - 0.5; r = max(abs(xcorr(x,y,'coeff'))) 将解决这个“问题”。但是,使用randn的建议很好;近似正态/高斯噪声在实际信号中很常见(主要归功于中心极限定理),而均匀噪声则不是。 – musicinmybrain 2009-12-07 13:08:56

1

尝试使用互协方差代替

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

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