Оценка времени задержки/запаздывания непериодических сигналов (и периодических сигналов)

Я работаю над согласованием различных измерений с датчиков. Некоторые из них являются периодическими, и я просто использовал максимальную взаимную корреляцию, и все работало нормально. Теперь у меня есть пара непериодических сигналов, похожих на функции рампы/сигмоиды/шага/холма, которые я хочу выровнять, но для них взаимная корреляция с треском терпит неудачу (всегда давая мне максимум при задержке 0).

Каков подход к такого рода сигналам?

В идеале подход будет работать для обоих сигналов без предварительного знания, с которым я сталкиваюсь.

Вот пример (с шумом)

пример данных функции рампы


person DarkCell    schedule 08.03.2016    source источник


Ответы (1)


Один из возможных подходов состоит в том, чтобы взять ваш апериодический сигнал и преобразовать его в периодический сигнал.

Один из способов сделать это — сначала нормализовать ваш сигнал, а затем добавить к нему инвертированную версию вашего сигнала (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)

И они совпадают с указанными лагами.

Недостатком этого является то, что он не будет работать для сигналов, которые уже являются периодическими. При этом периодичность относительно легко проверить (особенно для нормализованного сигнала), сравнив первое и последнее значения вашего сигнала и убедившись, что они находятся в пределах заданного допуска друг друга.

person Suever    schedule 08.03.2016
comment
Я думал о подходе, но не уверен, что он сработает, потому что мои сигналы могут иметь разную длину. В моем примере я измерял сигнал все время, но фактическое событие (снижение) произошло в разные моменты времени. В вашем примере вы просто сместили ось времени. Следовательно, когда я сделаю то же самое со своим сигналом, это приведет к разной ширине центрального сигмовидного элемента. - person DarkCell; 15.03.2016
comment
@DarkCell Разве вы не можете просто потратить немного времени и провести анализ? Вы можете заполнить сигналы нулями по мере необходимости. Может быть полезно показать пример того, о чем вы говорите. - person Suever; 15.03.2016
comment
Ну, как бы я выбрал свой кусок времени? См. мой пример: каждый сигнал измеряется в одном и том же временном окне, но событие (уменьшение за определенный промежуток времени) происходит в разные моменты времени. Я бы не знал, как выбрать отрезок времени, чтобы при отражении сигнала были шаги одинаковой длины. Единственный способ, который я знаю, работает, если я знаю, когда произойдет событие, но тогда я могу сопоставить их уже с этим знанием. - person DarkCell; 22.03.2016