在 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.
感谢您的帮助。
您的代码中存在三个问题:
您正在将 fliplr
应用于 y
,但是 y
是一个列向量,因此 您并没有真正翻转它。如果您希望它适用于一般的任何矢量,您应该应用 flipud
; or flip
。
来自xcorr
的文档:
C = xcorr(A,B)
[...] > If A
and B
are of different length, the shortest one is zero-padded.
因此,要使 conv
的结果等于 xcorr
的结果,您需要 零填充 较短的向量。
在一般情况下,对于列向量 x
和 y
您可以使用 [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
.
相关性将 复共轭应用于第二个输入 。你应该对卷积做同样的事情。在您的示例中,这无关紧要,因为输入是真实的,但通常应该这样做。
综合以上三项:
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
数值精度误差相同。
假设我们有两个不同长度的简单序列:
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.
感谢您的帮助。
您的代码中存在三个问题:
您正在将
fliplr
应用于y
,但是y
是一个列向量,因此 您并没有真正翻转它。如果您希望它适用于一般的任何矢量,您应该应用flipud
; orflip
。来自
xcorr
的文档:C = xcorr(A,B)
[...] > IfA
andB
are of different length, the shortest one is zero-padded.因此,要使
conv
的结果等于xcorr
的结果,您需要 零填充 较短的向量。在一般情况下,对于列向量
的文档x
和y
您可以使用[x; zeros(numel(y)-numel(x),1)]
代替x
和[y; zeros(numel(x)-numel(y),1)]
代替y
.这将扩展较短的向量并保持另一个不变。请注意,这是有效的,因为根据zeros
、zeros(M,N,P,...)
[...] The size inputsM
,N
, andP
... should be nonnegative integers. Negative integers are treated as0
.相关性将 复共轭应用于第二个输入 。你应该对卷积做同样的事情。在您的示例中,这无关紧要,因为输入是真实的,但通常应该这样做。
综合以上三项:
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
数值精度误差相同。