Python: XCORR的解释
1 个回答
mode
参数决定了在边界附近会发生什么。如果你有两个输入向量,长度分别为 x 和 y(x > y):
valid
/ 0: 你只会得到两个信号重叠部分的卷积结果(x-y+1 个点)same
/ 1: 输出向量的长度和较长的输入向量长度相同(x 个点)full
/ 2: 包含所有数据,只要信号之间有一个样本重叠(x+y-1 个点)
这些模式的数字定义并不太公开,但可以在 numpy
的源代码中找到。无论如何,xcorr
使用的是 full
模式。(实际上,在给 convolve
或 correlate
指定模式时,只需要模式名称的首字母。)
关于这些函数的实际作用,有些混淆。numpy.correlate
根据 numpy
的版本有两种不同的行为。在内部,这两种行为被称为 multiarray.correlate
(旧版)和 multiarray.correlate2
(新版)。numpy.convolve
会反转第二个输入向量,然后使用 multiarray.correlate
(即被弃用的用于相关性计算的那个)。
所以,如果你想确认一下,最好是测试一下实际效果。基本功能是两个向量之间的乘积,向量每次移动一个位置。为了更清楚,我会用两个向量的数字例子来说明。
a <= [1,2,3,4,5]
b <= [10,20]
我们先来看一下卷积:
numpy.convolve(a,b,mode='full') => [ 10, 40, 70, 100, 230, 100]
这是因为:
1 2 3 4 5 => 1 x 10 = 10
20 10
1 2 3 4 5 => 1 x 20 + 2 x 10 = 40
20 10
...
1 2 3 4 5 => 5 x 20 = 100
20 10
不同的模式返回相同的数据,但在每个端点处被截断。
对于相关性:
numpy.correlate(a,b,mode='full') => [ 20, 50, 80, 110, 140, 50]
1 2 3 4 5 => 1 x 20 = 20
10 20
1 2 3 4 5 => 1 x 10 + 2 x 20 = 50
10 20
...
1 2 3 4 5 => 5 x 10 = 100
10 20
所以,基本上唯一的区别是其中一个向量是镜像的。这会带来一些后果,比如卷积在 a
和 b
交换时结果相同,而相关性在这种情况下结果会反转。对于复数,correlate
在进行上述计算之前会对第二个向量进行共轭处理。
回到 matplotlib
的 xcorr
图表。它接收两个长度相等的向量 x
和 y
,并计算这两个向量在不同滞后下的互相关。
它首先计算 x
和 y
之间的完整卷积,使用 numpy.correlate
,如上所示。然后,它从完整输出向量中在位置 -maxlags
到 maxlags
之间绘制相关性结果。规则是第二个输入向量会被移动。在最左边的图表位置,第二个向量 y
处于最左边的位置(即相对于 x
向左移动)。
检查这一点的最简单方法可能是:
xcorr([1.,2.,3.,4.,5.], [0,0,0,0,1.], normed=False, maxlags=4)