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