我已经编写了一些Python代码来模拟MATLAB xcorr
函数以实现交叉关联:
def xcorr(x, y, scale='none'):
# Pad shorter array if signals are different lengths
if x.size > y.size:
pad_amount = x.size - y.size
y = np.append(y, np.repeat(0, pad_amount))
elif y.size > x.size:
pad_amount = y.size - x.size
x = np.append(x, np.repeat(0, pad_amount))
corr = np.correlate(x, y, mode='full') # scale = 'none'
lags = np.arange(-(x.size - 1), x.size)
if scale == 'biased':
corr = corr / x.size
elif scale == 'unbiased':
corr /= (x.size - abs(lags))
elif scale == 'coeff':
corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
在比较不同比例类型的值与MATLABs实现时,我得到相同的值,所以这似乎是正确的
我想补充的另一件事是能够规范化互相关值,使峰值不超过1.0
,谷值不会低于-1.0
coeff
已经正常化,所以我并不担心。但是,其他比例类型可能超过-1/1范围。
我尝试了几件事:
corr /= max(corr)
以规范化corr
,无论选择哪个缩放选项。这样可以检查上限,但我不确定这是否正确处理下限corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
添加到我的函数末尾以获取所有选项,但这似乎将我的值远离1.0 规范化none
,biased
和unbiased
缩放选项的正确方法是什么? MATLAB没有这方面的功能,谷歌也没有提出任何有偏差/无偏差交叉相关估计标准化的结果。
答案 0 :(得分:0)
以下内容应该按照您的要求进行,但我不确定它是否在统计上有效:
corr /= max(np.abs(corr))
答案 1 :(得分:0)
我很困惑。 none
表示没有规范化,biased
和unbiased
表示适当的规范化,因此输出的样本对应于适当的估算器。因为“我应该对相关的有偏估计应用什么规范化以使其与[-1,1]有界”是没有意义的,因为那时估计不再是偏差估计,它将是别的。具有此属性的唯一估计器(在此束中)是相关系数(Pearson’s coefficient的信号处理变体),这是coeff
对应的。
这种实现很好。任何在[-1,1]区间内寻找数字的人都知道他们应该通过coeff
询问相关系数。