如何在Matlab中找到两组数据之间的延迟?

时间:2017-11-30 11:27:03

标签: matlab math data-analysis cross-correlation

我有两组数据来自实验,它们看起来非常相似,除了它们之间有一个水平偏移,我相信这是由于仪器设置中的一些错误。假设它们具有y1=f(x1)y2=f(x2)= f(x1+c)形式,确定c的最佳方法是什么,以便我可以考虑将两个数据集叠加成一个数据集的偏移量?

编辑: 假设我的数据集(索引1和2)具有以下形式:

x1 = 0:0.2:10;
y1 = sin(x1)
x2 = 0:0.3:10;
y2 = sin(x2+0.5)

当然,真实数据会有一些噪音,但是说最合适的功能有上述形式。如何找到偏移c=0.5?我已经研究过互相关,但我不确定它们是否可以处理具有不同数据量(和不同步长)的两个数据集。如果偏移值实际落在两个数据点之间怎么办?如果我理解正确的话,互相关只返回数组中数据的索引,而不是介于两者之间。

2 个答案:

答案 0 :(得分:1)

这个 Matlab 脚本计算两个正弦波之间从-pi / 2到+ pi / 2的随机偏移量:

clear;
C= pi*(rand-0.5); % should be between -pi/2 and +pi/2
N=200; % should be large enough for acceptable sampling rate
N1=20; % fraction for Ts1
N2=30; % fraction for Ts2
Ts1=abs(C*N1/N); % fraction of C for accuracy
Ts2=abs(C*N2/N); % fraction of C for accuracy
Ts=min(Ts1,Ts2); % select highest sampling rate (smaller period)
fs=1/Ts;
P=4; % number of periods should be large enough for well defined correlation plot

x1 = 0:Ts:P*2*pi;
y1 = sin(x1);
x2 = 0:Ts:P*2*pi;
y2 = sin(x2+C);

subplot(3,1,1)
plot(x1,y1);
subplot(3,1,2);
plot(x2,y2);

[cor,lag]=xcorr(y1,y2);
subplot(3,1,3);
plot(lag,cor);

[~,I] = max(abs(cor));
lagdiff = lag(I);
timediff=lagdiff/fs;

在下面的特定情况下,C = timediff = 0.5615

enter image description here

enter image description here

答案 1 :(得分:1)

编写一个函数,该函数将时移作为输入,并计算两个数据集的重叠部分之间的rms。然后使用优化(fminbnd)

找到此函数的最小值