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

标签 matlab signal-processing convolution cross-correlation

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

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 ;或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

在数值精度误差方面是相同的。

关于matlab - 在Matlab中使用卷积对两个不同长度的序列进行互相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58474714/

相关文章:

matlab - 绘制勒让德多项式——用自己的方法得到不同的结果

mysql - dll MATLAB,dll DBMS,blob?

linux - 不能在 Linux 的 Matlab 中包含 OpenCV 函数

c - 数组上的就地位反转随机播放

audio - 使用dB测量可接受的音量

python - 在 tensorflow 中实现 3D 卷积的最佳方式是什么?

python - numpy.convolve 中的形状不匹配

regex - MATLAB 中的动态正则表达式

audio - 为什么stft(istft(x))≠x?

python - 在 Tensorflow 中使用 3d 转置卷积进行上采样