我有长度= 5的参考信号(s1)和长度= 25个样本的另一个信号(s2)(包含相同5个样本信号s1的移位版本)。
我想找到两个信号之间的归一化互相关,以计算信号s1和s2之间的采样距离(延迟/滞后)。
我用零填充s1(因此它与xcorr' coeff'选项所需的s2长度相同):
s1(numel(s2)) = 0;
然后执行:
[R lags]=xcorr(s2,s1,'coeff');
[vm im]=max(R); %max. correlation and index
s1_lag=lags(im);
找到-24到24个样本滞后的归一化互相关。
由于s2包含s1的移位版本,我期望获得最大相关值1,但在19个样本的滞后时最大相关性为0.4776。我不明白这个?
如果我让s1 = s2并重复xcorr(现在s1和s2相同),我会在0样本滞后时获得1.0的最大相关值。
答案 0 :(得分:3)
延迟对应于最大峰值(但不一定是1(1将是相同矢量之间的xcorr值 - 第0行的自相关) 两个相反的信号的值为-1)。
xcorr提供规范化方案。语法 xcorr(X,Y,'系数_&#39)
将输出除以norm(x)* norm(y),这样,对于自相关,零滞后的样本为1。
http://matlab.izmiran.ru/help/toolbox/signal/spectra3.html
以下代码将两个信号的xcorr计算为OP,延迟为5:
% s1) of length = 5 and another signal (s2) of length = 25
s1=[1 2 3 4 5]
s2=[0 0 0 0 0 s1 1 1 2 3 1 5 2 3 2 4 1 ]
s1(numel(s2)) = 0;
s1
[R lags]=xcorr(s2,s1,'coeff');
[vm im]=max(R) %max. correlation and index
s1_lag=lags(im)
% review the plot
figure
plot(lags,R), hold on,plot(s1_lag,vm,'ro'),ylabel('Amplitude'),xlabel('lag[n]');
title('cross-correlation');
% result
%vm = 0.5756
%im = 31
%s1_lag = 5
结果是:
Max = 0.5756 (need not to be 1, but it is the peak value)
delay = 5 ( match the actual delay between the two signal which is 5)
<强>更新强>
对于长度不等的信号和用零填充的短信号,xcorr中的归一化没有意义。
您可以使用xcorr(s1,s2,&#39;无&#39;)或xcorr(s1,s2),xcor内部用零填充较短的信号,等长。
获得峰值位置,表示两个信号最相似的时间偏移。
在我们的例子中,使用xcorr(s1,s2,&#39; none&#39;),结果是:
vm = 55.0000
s1_lag = 5
在Matlab中有一个名为的函数: alignignals 可以与xcorr一起使用,如下面的代码所示:
% method 2: align signals and xcorr for the new aligned signals .
%in that case you get max of xcor = 1, delay =0
[Xa,Ya] = alignsignals(s2,s1)
% after aligning signals, take the part of signal Xa with equal lentht of Ya
[R2 lags2]=xcorr(Xa(1:length(Ya)),Ya,'coeff');
[vm2 im2]=max(R2) %max. correlation and index
s1_lag2=lags2(im2)
figure
plot(lags2,R2), hold on,plot(s1_lag2,vm2,'ro'),ylabel('Amplitude'),xlabel('lag[n]');
title('cross-correlation2');
所有信号
Xa = 0 0 0 0 0 1 2 3 4 5 1 1 2 3 1 5 2 3 2 4 1
Ya = 0 0 0 0 0 1 2 3 4 5