【问题标题】:Cross Correlation with signals of different length in MATLABMATLAB中不同长度信号的互相关
【发布时间】:2015-08-25 09:16:36
【问题描述】:

我有 2 个不同长度的信号,其中较短的信号与移位的较长 n 个样本相同。我想找到这两个信号之间的最大归一化互相关。由于它是标准化的,应该给出 1。xcorr 函数滞后从 -441 到 441 个样本不等。

这将在稍后用于稍微不同的信号,但现在我正在尝试使用相同的信号。

零填充(正如我在图像中所做的那样)给我一个错误的相关性,因为零成为相关性计算的一部分。

任何想法如何做到这一点?

【问题讨论】:

  • hmmm,我不认为零填充应该给你错误的解决方案,你使用matlab xcorr吗?
  • 这不是超级正确的,但是:假设你有信号 A 和 B,每个尺寸(B 是你图片中的蓝色),你可以xcorr(A(A~=0), B(A~=0))
  • "xcorr" 与 'coef' 选项打开提供 0.52 而不是 1 的相关性(在这种特定情况下),我假设这是因为 zeropadding 不“允许”最大相关性为 1。@RobertStettler,所以基本上你只是在相关性计算中不包括零值?
  • 是的,这就是为什么我说“不是超级骗子正确”,如果很清楚,前 n 和最后 m 条目总是为零,那么您可以使用 find(..., 'first') 和 @ 987654326@

标签: matlab signal-processing cross-correlation


【解决方案1】:

假设 x 和 y 是您拥有的更短和更长的信号。

nx = length(x);
ny = length(y);
cc = nan(1,ny-nx+1);
for ii = 0 : ny-nx
  id = (1:nx) + ii;
  cc(ii+1) = sum(x.*y(id))/(sqrt(sum(x.^2)*sum(y(id).^2)));
end
[ccmx,idmx] = max(cc);

现在你有了最大交叉系数的位置。

如果延迟从您给出的-441 开始(其中 x 和 y 在左侧对齐)。最大值应为lag=idmx-442

【讨论】:

  • 如果您必须使用它来计算几个(在我的特定情况下约为 1000)最大相关性,这个解决方案是否会变得相当慢?
  • @Rekeal 1000 对于当前的 CPU 来说并不重。你可以自己测试一下。我曾经计算出超过 4e6 的长度。
【解决方案2】:

如果你想删除向量的第一个和最后一个零,你可以在这里使用它

A = A(find(A~=0, 1, 'first'):find(A~=0, 1, 'last'));

要直接在您的关联中使用它,请尝试在此处使用它(其中A 是您的红线,B 是蓝线)

xcorr(A(find(A~=0, 1, 'first'):find(A~=0, 1, 'last')), B(find(A~=0, 1, 'first'):find(A~=0, 1, 'last')));

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多