我写了一些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))
在比较不同比例类型的值与MATLAB实现时,我得到了相同的值,因此这似乎是正确的。
我想要添加的另一件事是能够规范化交叉相关值,使峰值不超过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没有这个功能,谷歌也没有找到任何关于偏斜/非偏斜交叉相关估计规范化的结果。