我想找到两个向量之间的最小滞后量,我的意思是基于另一个向量在向量中重复某事的最小距离 例如
x=[0 0 1 2 2 2 0 0 0 0]
y=[1 2 2 2 0 0 1 2 2 2]
我想获得4代表x到y,并获得2代表y到x。
我找到了一个finddelay(x,y)
函数,它只能正确处理x到y(对于x,它给出了-4)。
是否有任何函数只能根据向量的正确方向给出滞后?如果你能帮助我得到这个结果,我将非常感激
答案 0 :(得分:2)
我认为这可能是finddelay
中的潜在错误。请注意文档中的摘录(强调我的):
X
和Y
不一定是彼此的精确延迟副本,因为finddelay(X,Y)
通过互相关返回延迟估计值。但是,只有在X
和Y
的延迟版本之间存在足够的相关性时,此估计延迟才有用。 此外,如果可能存在多个延迟,如周期性信号的情况,则返回具有最小绝对值的延迟。在具有相同绝对值的正延迟和负延迟均为的情况下可能,返回正延迟。
这似乎暗示finddelay(y, x)
应该返回2
,当它实际返回-4
时。
这似乎与floating-point errors引入的xcorr
相关的问题正如我所描述的in my answer to this related question。如果您在命令窗口中输入type finddelay
,则可以看到finddelay
在内部使用xcorr
。即使xcorr
的输入是整数值,结果(您可能期望它们也是整数值)最终会出现浮点错误,导致它们略大于或小于整数值。然后,这可以改变最大值所在的指数。当您知道输入都是整数值时,解决方案是从xcorr
舍入输出。
对于整数值,finddelay
的更好实现可能是这样的,它实际上将返回具有最小绝对值的延迟:
function delay = finddelay_int(x, y)
[d, lags] = xcorr(x, y);
d = round(d);
lags = -lags(d == max(d));
[~, index] = min(abs(lags));
delay = lags(index);
end
然而,在您的问题中,您要求返回正延迟,这绝对不是绝对值中最小的。以下是finddelay
的不同实现,它对整数值正常工作,而优先考虑正延迟:
function delay = finddelay_pos(x, y)
[d, lags] = xcorr(x, y);
d = round(d);
lags = -lags(d == max(d));
index = (lags <= 0);
if all(index)
delay = lags(1);
else
delay = lags(find(index, 1)-1);
end
end
以下是您的测试用例的各种结果:
>> x = [0 0 1 2 2 2 0 0 0 0];
>> y = [1 2 2 2 0 0 1 2 2 2];
>> [finddelay(x, y) finddelay(y, x)] % The default behavior, which fails to find
% the delays with smallest absolute value
ans =
4 -4
>> [finddelay_int(x, y) finddelay_int(y, x)] % Correctly finds the delays with the
% smallest absolute value
ans =
-2 2
>> [finddelay_pos(x, y) finddelay_pos(y, x)] % Finds the smallest positive delays
ans =
4 2