Matlab中卷积法实现两个不同长度序列的互相关

Matlab中卷积法实现两个不同长度序列的互相关,matlab,signal-processing,convolution,cross-correlation,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'); 我想使

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

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的长度不同且 我得到了这个错误:

使用阀杆时出错(第43行) X的长度必须与Y的长度相同


感谢您的帮助。

代码中有三个问题:

  • 您正在将
    fliplr
    应用于
    y
    ,但
    y
    是一个列向量,因此您并不是在真正翻转它。你应该申请;或者如果你想让它适用于任何向量

  • 根据以下文件:

    C=xcorr(A,B)
    […]>如果
    A
    B
    的长度不同,则最短的长度为零填充

    因此,要使
    conv
    的结果与
    xcorr
    的结果相等,您需要zero pad较短的向量

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

    零(M,N,p,…)
    […]大小输入
    M
    N
    ,和
    p
    。。。应该是非负整数。负整数被视为
    0

  • 相关性将复共轭应用于第二个输入。对卷积也应该这样做。在您的示例中,这并不重要,因为输入是真实的,但通常应该这样做

  • 结合以上三项:

    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