Один из возможных подходов состоит в том, чтобы взять ваш апериодический сигнал и преобразовать его в периодический сигнал.
Один из способов сделать это — сначала нормализовать ваш сигнал, а затем добавить к нему инвертированную версию вашего сигнала (1 - normalizedSignal
). Это делает его периодическим сигналом, который затем можно относительно легко ввести в кросс-корреляционный анализ.
Вот пример, который я состряпал, используя сдвинутую во времени перевернутую сигмовидную диаграмму.
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
Модификация сигнала, которую я обсуждал, выглядит так для приведенного выше кода.
![введите здесь описание изображения](https://i.stack.imgur.com/uxirW.png)
И результат операторов fprintf
внизу:
Lag of S2: 3.00 (r = 1.00)
Lag of S3: 5.00 (r = 1.00)
И они совпадают с указанными лагами.
Недостатком этого является то, что он не будет работать для сигналов, которые уже являются периодическими. При этом периодичность относительно легко проверить (особенно для нормализованного сигнала), сравнив первое и последнее значения вашего сигнала и убедившись, что они находятся в пределах заданного допуска друг друга.
person
Suever
schedule
08.03.2016