【问题标题】:determine lag between two vector确定两个向量之间的滞后
【发布时间】:2017-12-19 05:24:17
【问题描述】:

我想找到两个向量之间的最小滞后量,我的意思是基于另一个向量在向量中重复的最小距离 例如对于

x=[0 0 1 2 2 2 0 0 0 0]
y=[1 2 2 2 0 0 1 2 2 2]

我想从 x 到 y 获得 4,从 y 到 x 获得 2。

我发现了一个 finddelay(x,y) 函数,该函数仅适用于 x 到 y(它为 y 到 x 提供 -4)。

是否有任何函数只能基于正确的向量方向给我延迟?如果你介意帮助我得到这个结果,我将非常感激

【问题讨论】:

  • 我真的不明白你的例子你如何得到2比较yx之间的延迟...?如果对y 的每个索引执行+2,则不会得到x
  • 不,不是...如果您考虑向量 x,它在第三位有 1.. 我想要一个函数,考虑 x 向量中的每一个(在实际信号中我有更多)和计算 y 中 1 之后发生的第一个 1 的距离(例如,这里它将在 4 步后发生,在 y 中排在第七位),那么对于大信号,我们应该有不同的这些距离,我想要它们的最小值

标签: matlab function signal-processing delay lag


【解决方案1】:

我认为这可能是finddelay 中的一个潜在错误。请注意此文档摘录(重点是我的):

XY 不必是彼此的精确延迟副本,因为 finddelay(X,Y) 通过互相关返回延迟的估计值。然而,这个估计的延迟只有在XY 的延迟版本之间存在足够的相关性时才有意义。 另外,如果可能有多个延迟,如周期信号,则返回绝对值最小的延迟。 如果具有相同绝对值的正延迟和负延迟都是可能,返回正延迟。

这似乎暗示finddelay(y, x) 应该返回2,而实际上它返回-4

编辑:

这似乎是与xcorr 引入的floating-point errors 相关的问题,正如我所描述的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

【讨论】:

  • 非常感谢您的回复。似乎 finddelay([0 y], [0 x]) 会给我一个正确的 y 到 x 的结果,但是如果我再次使用它作为 finddelay([0 x], [0 y]) 它会给我 - 2(但我想要 4)
  • 我应该怎么做,因为我使用大量这些向量,我无法单独检查它们
  • x=[0 0 1 2 2 2 0 0 0 0 1 2 2 2 0 0 1 2 2 2 0 0 0 0 1 2 2 2]; y=[1 2 2 2 0 0 1 2 2 2 0 0 0 1 2 2 2 0 0 0 0 0 0 1 2 2 2 0];为此,从 x 到 y 我想要 3,从 y 到 x 1
  • @FaribaJangjoo:我不确定最好的方法是什么。我想可能是基于conv 的东西,但这并不适用于所有测试用例。你可以看看finddelaytype finddelay 的实际作用。也许这会有所帮助。
  • 我不确定这是一个错误。我认为这是因为向量末尾的xy 不一致。如果将y 延迟 2,则最后两个元素为 [1 2],而在 x 中为 [0 0]。所以 Matlab 给出了 -4 的延迟,这样在延迟之后向量将相等。试试:x = [0 0 1 2 2 2 0 0 1 2]; finddelay(y, x),你会得到 4
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 2021-12-22
  • 2012-10-25
  • 2022-11-23
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多