我认为你需要阅读一些关于交叉相关函数和相关系数的统计学书籍,因为你的困惑比与MATLAB有关的更基本。除非你知道自己在处理什么,否则即使你正确编写程序也无法理解MATLAB给出的结果。
以下是在交叉相关中的步骤。考虑数据A
和B
如下:
A B
x
x | x x
| | | x |
| | x | | | x
| | | | | | |
--------------- -----------
0 1 2 3 0 1 2
然后你把B
滑到最后,使得B
的最后一个点和A
的第一个点对齐:
x
x | x
| | |
| | x |
| | | |
----x---x------------------
-2 -1 0 1 2 3
x
x |
| | x
| | |
----------------x---x---x--
-2 -1 0 1 2 3
在数据不完整的地方填充0,例如在这种情况下,B
在0之后需要填充0,而A
在0之前需要填充0。然后对它们进行逐点相乘并相加,得到 0 + 0 + 3 + 0 + 0 + 0 = 3
,这是你在交叉相关性中的第一个点。
然后将B
向右滑动一步并重复上述过程。
x
x | x
| | |
| | x |
| | | |
----x------------------
-1 0 1 2 3
x
x |
| | x
| | |
----------------x---x--
-1 0 1 2 3
将 A
沿着 B
滑动,以A
的起点为0,计算交叉相关性的第二个点是 0 + 9 + 4 + 0 + 0 = 13
。一直这样做,直到将B
滑到A
的另一端。
结果向量长度为length(A)+length(B)-1
, 减去1是因为我们从0开始有一个重叠,所以少一个点。因此,在这里您应该得到3 + 4 - 1=6
个交叉相关点,而在您的情况下,您应该得到73 + 73 -1 = 145
个点。
正如您所看到的,任何点处的交叉相关向量值都不一定在±1之间。当两个数据向量“最相似”时,交叉相关性达到最大值。峰值与零之间的“偏移”给出了两个数据集之间的“滞后”指示。
相关系数(我假设是皮尔逊相关系数)仅是一个数字,定义为
Covariance(A,B)
r = --------------------------------
________________________________
\|Covariance(A,A)*Covariance(B,B)
其中Covariance(A,A)
更为人所知的是Variance(A)
。这是一个可以在-1
到1
之间变化的量(为什么它必须在±1之间,可以查看Cauchy-Schwartz不等式)。
虽然你可以计算两个数据向量的交叉相关性,即使有不同数量的数据点,但是你不能计算它们的相关系数。协方差的概念是用来衡量两个变量/数据集如何一起变化的,对于不相等的数据集无法定义。
你读过那个函数返回的内容了吗? http://www.mathworks.com/help/toolbox/signal/xcorr.html
c = xcorr(x,y)
返回一个长度为2*N-1
的向量,其中x
和y
是长度为N
的向量(N>1)
,表示交叉相关序列。
2*73-1=145
,所以这是正确的。下面的公式也解释了原因。