MATLAB中不同长度信号的互相关

MATLAB中不同长度信号的互相关,matlab,signal-processing,cross-correlation,Matlab,Signal Processing,Cross Correlation,我有两个不同长度的信号,其中较短的信号与较长的n个样本相同。我想找出这两个信号之间的最大归一化互相关。因为它是标准化的,所以应该为1。xcorr函数滞后从-441到441个样本不等 这将用于稍后稍有不同的信号,但现在我尝试使用相同的信号 零填充(正如我在图像中所做的)给了我一个错误的相关性,因为零成为相关性计算的一部分 有没有办法做到这一点?如果你想删除向量的第一个和最后一个零,你可以在这里使用它 A = A(find(A~=0, 1, 'first'):find(A~=0, 1, 'last

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

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

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


有没有办法做到这一点?

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

A = A(find(A~=0, 1, 'first'):find(A~=0, 1, 'last'));
要在相关性中直接使用它,请尝试在此处使用它(其中
A
是红线,
B
是蓝线)


假设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

hmmm,我认为零填充不应该给出错误的解决方案,你使用matlab xcorr吗?这不是超级复制正确的,但是:假设你有信号A和B,两个大小都是(B是图片中的蓝色),你可以只
xcorr(A(A~=0),B(A~=0))
“xcorr”启用“coef”选项后,相关性(在本特定情况下)为0.52而不是1,我假设这是因为零填充不“允许”最大相关性为1@Roberts Tettler,那么基本上你只是在相关性计算中不包括零值?是的,这就是为什么我说“不超级复制正确”,如果很清楚,前n个和最后m个条目总是零,那么你可以使用
查找(…,'first')
翻转(…)
如果您必须使用此解决方案来计算多个(在我的特定情况下大约1000个)最大相关性,该解决方案是否会变得相当慢?@Rekeal 1000对于当前的CPU来说并不重。你可以自己测试。我曾经计算过超过4e6的长度。
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);