Одним из возможных подходов является взять апериодический сигнал и принуждать его в периодический сигнал.
Один из способов сделать это - сначала нормализовать ваш сигнал, а затем добавить инвертированную версию вашего сигнала (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
Модификация сигнала, о котором я говорил, выглядит так, как указано выше.
И результат fprintf
заявления на дне:
Lag of S2: 3.00 (r = 1.00)
Lag of S3: 5.00 (r = 1.00)
И они совпадают с указанными лагами.
Недостатком этого является то, что он не будет работать для сигналов, которые уже являются периодическими. При этом периодичность относительно легко проверить (в частности, для нормализованного сигнала) путем сравнения первого и последнего значений вашего сигнала и обеспечения того, чтобы они находились в пределах определенного допуска друг к другу.
Я думал о подходе, но я не уверен, будет ли он работать, потому что мои сигналы могут иметь разную длину. В моем примере я измерил сигнал все время, но фактическое событие (уменьшение) произошло в разные моменты времени. В вашем примере вы просто сдвинули ось времени. Следовательно, когда я сделаю то же самое с моим сигналом, это приведет к разной ширине центрального сигмовидного элемента. – DarkCell
@ DarkCell Разве вы не можете просто взять «кусок» времени и выполнить анализ? По мере необходимости вы могли заполнять сигналы нулями. Может быть полезно показать пример того, о чем вы говорите. – Suever
Хорошо, как бы я выбрал свой кусок времени? См. Мой пример: каждый сигнал измеряется за одно и то же окно времени, но «событие» (уменьшение на определенное количество времени) происходит в разные моменты времени. Я бы не знал, как выбрать кусок времени, поэтому при зеркальном отражении сигнал будет иметь одинаковые длины. Только так, как я знал, работает, если я знаю, когда происходит «событие», но затем я смогу выровнять их уже с этими знаниями. – DarkCell