假设我们有两个不同长度的简单序列:
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
;或flip
如果您希望它适用于一般的任何向量。来自
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
在数值精度误差方面是相同的。
关于matlab - 在Matlab中使用卷积对两个不同长度的序列进行互相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58474714/