我正在努力调整传感器的不同测量值。其中一些是周期性的,我只是使用了最大的互相关,它工作得很好。现在我有几个非周期性信号,类似于我想要对齐的ramp / sigmoids / step / hill函数,但对于这些信号,互相关失败很大(总是在滞后0处给出最大值)。
这种信号的方法是什么?
理想的方法是在没有先验知识的情况下对两种信号都有效。
这是一个例子(有噪音)
答案 0 :(得分:0)
一种可能的方法是获取非周期信号并将其强制转换为周期信号。
执行此操作的一种方法是首先对信号进行标准化,然后将信号的倒置版本(1 - normalizedSignal
)附加到信号中。这使它成为一个周期性信号,然后应该能够相对容易地进入互相关分析。
这是一个例子,我用一个倒立的sigmoid及时移动了。
function aperiodicxcorr()
% Time step at which to sample the sigmoid
dt = 0.1;
t = -10:dt:5;
% Artificial lags to apply to the second and third signals
actualLag2 = 3;
actualLag3 = 5;
% Now create signals that are negative sigmoids with delays
S1 = -sigmoid(t);
S2 = -sigmoid(t + actualLag2);
S3 = -sigmoid(t + actualLag3);
% Normalize each sigmal
S1 = normalize(S1);
S2 = normalize(S2);
S3 = normalize(S3);
% Concatenate the inverted signal with signal to make it periodic
S1 = cat(2, 1-S1, S1);
S2 = cat(2, 1-S2, S2);
S3 = cat(2, 1-S3, S3);
% Retrieve lag (in samples)
[corr2, lag2] = computeLag(S1, S2);
[corr3, lag3] = computeLag(S1, S3);
% Convert lags to time by multiplying by time step
lag2 = lag2 * dt;
lag3 = lag3 * dt;
fprintf('Lag of S2: %0.2f (r = %0.2f)\n', lag2, corr2);
fprintf('Lag of S3: %0.2f (r = %0.2f)\n', lag3, corr3);
end
function [corr, lag] = computeLag(A, B)
[corr, lags] = xcorr(A, B, 'coeff');
[corr, ind] = max(corr);
lag = lags(ind);
end
function data = normalize(data)
data = data - min(data(:));
data = data ./ max(data(:));
end
function S = sigmoid(t)
S = 1 ./ (1 + exp(-t));
end
对我所讨论的信号的修改,对于上面的代码看起来像这样。
底部fprintf
语句的结果是:
Lag of S2: 3.00 (r = 1.00)
Lag of S3: 5.00 (r = 1.00)
这些与指定的滞后相匹配。
这样做的缺点是它不能用于已经周期性的信号。话虽如此,通过比较信号的第一个和最后一个值并确保它们在彼此的指定容差范围内,周期性相对容易检查(特别是对于标准化信号)。