【发布时间】:2017-09-24 23:04:14
【问题描述】:
我编写了一些 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 没有这方面的功能,Google 也没有为有偏/无偏互相关估计的归一化提供任何结果。
【问题讨论】:
标签: python matlab signal-processing normalization correlation