在 Matlab 中使用卷积对两个不同长度的序列进行互相关

Cross Correlation of two sequences with different length using convolution in Matlab

假设我们有两个不同长度的简单序列:

x = rand(3,1);
y = rand(2,1);

我计算了它们之间的互相关并将其绘制如下:

r_1 = xcorr(x,(y));

tx = 1:length(x);
ty = 1:length(y);
tr = ceil(-(length(x)+length(y)-1)/2) :  floor((length(x)+length(y)-1)/2);

subplot(2,2,1); stem(tr,r_1); title('XC');

我想使用卷积计算互相关,并表明它的结果等于使用 xcorr() 时的结果。但是当我这样实现时:

r_2 = conv(x,fliplr(y));

tx = 1:length(x);
ty = 1:length(y);
tr = ceil(-(length(x)+length(y)-1)/2) :  floor((length(x)+length(y)-1)/2);

subplot(2,2,1); stem(tr,r_2); title('XC');

r_1和r_2的长度不同 我得到这个 错误:

Error using stem (line 43) X must be same length as Y.

感谢您的帮助。

您的代码中存在三个问题:

  1. 您正在将 fliplr 应用于 y,但是 y 是一个列向量,因此 您并没有真正翻转它。如果您希望它适用于一般的任何矢量,您应该应用 flipud; or flip

  2. 来自xcorr的文档:

    C = xcorr(A,B) [...] > If Aand B are of different length, the shortest one is zero-padded.

    因此,要使 conv 的结果等于 xcorr 的结果,您需要 零填充 较短的向量。

    在一般情况下,对于列向量 xy 您可以使用 [x; zeros(numel(y)-numel(x),1)] 代替 x[y; zeros(numel(x)-numel(y),1)] 代替 y.这将扩展较短的向量并保持另一个不变。请注意,这是有效的,因为根据 zeros

    的文档

    zeros(M,N,P,...) [...] The size inputs M, N, and P... should be nonnegative integers. Negative integers are treated as 0.

  3. 相关性将 复共轭应用于第二个输入 。你应该对卷积做同样的事情。在您的示例中,这无关紧要,因为输入是真实的,但通常应该这样做。

综合以上三项:

r_1 = xcorr(x, y);
r_2 = conv([x; zeros(numel(y)-numel(x),1)], conj(flip([y; zeros(numel(x)-numel(y),1)])));

应该给出相同的结果。

示例:

x = [3.1; -4.3; 5.6];
y = [2.6; -8.4];

给予

r_1 =
   0.000000000000004
 -26.040000000000006
  44.180000000000000
 -58.219999999999999
  14.559999999999999
r_2 =
                   0
 -26.040000000000003
  44.180000000000000
 -58.219999999999999
  14.559999999999999

数值精度误差相同。