我想获得 Matlab 中两个数据集之间样本的偏移量(让它们及时同步),这是一个很常见的问题。因此,我使用互相关函数 xcorr 或互协方差函数 xcov(在大多数情况下,两者都为此目的提供类似的结果)。对于人工数据,它工作得很好,但我在处理“真实”数据时遇到了困难,即使它应该几乎相同。 Matlab 总是说偏移量为零。我正在使用这段简单的代码:
[crossCorr] = xcov(b, c);
[~, peakIndex] = max(crossCorr())
offset = peakIndex - length(b)
我在pastebin上发布了一个完全可运行的示例m文件,其中包含下采样数据摘录:代码与pastebin上的数据 http://pastebin.com/2JuRKhai
编辑:下采样摘录似乎并不完全适合评估效果。这是一个更大的原始频率样本,请使用这个代替 http://en.file-upload.net/download-8639254/variables.mat.html。不幸的是,它对于pastebin来说太大了。
如图所示,通过互协方差获取偏移量应该没有问题。我还尝试更好地缩放数据以避免数值问题,但这根本没有改变任何东西。
如果有人能告诉我我的错误,那就太好了。
原则上你的方法没有任何问题,我成功地使用了完全相同的方法来临时对齐同一信号的不同音频记录。
然而,对于您的时间序列来说,相关性(或协方差)似乎根本不是比较移位版本的正确度量——可能是因为它们包含与总长度相当的时间尺度的组成部分。另一种方法是使用残差方差,即移位版本之间差异的方差。这是这个想法的一个(不是特别优雅的)实现:
lags = -1000 : 1000;
v = nan(size(lags));
for i = 1 : numel(lags)
lag = lags(i);
if lag >= 0
v(i) = var(b(1 + lag : end) - c(1 : end - lag));
else
v(i) = var(b(1 : end + lag) - c(1 - lag : end));
end
end
[~, ind] = min(v);
minlag = lags(ind);
对于您的(较长)数据集,这会导致minlag = 169
。绘制滞后的残差方差可得:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)