2016-03-08 1 views
1

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

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

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

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

example data of ramp function

ответ

0

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

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

Модификация сигнала, о котором я говорил, выглядит так, как указано выше.

enter image description here

И результат fprintf заявления на дне:

Lag of S2: 3.00 (r = 1.00) 
Lag of S3: 5.00 (r = 1.00) 

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

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

+0

Я думал о подходе, но я не уверен, будет ли он работать, потому что мои сигналы могут иметь разную длину. В моем примере я измерил сигнал все время, но фактическое событие (уменьшение) произошло в разные моменты времени. В вашем примере вы просто сдвинули ось времени. Следовательно, когда я сделаю то же самое с моим сигналом, это приведет к разной ширине центрального сигмовидного элемента. – DarkCell

+0

@ DarkCell Разве вы не можете просто взять «кусок» времени и выполнить анализ? По мере необходимости вы могли заполнять сигналы нулями. Может быть полезно показать пример того, о чем вы говорите. – Suever

+0

Хорошо, как бы я выбрал свой кусок времени? См. Мой пример: каждый сигнал измеряется за одно и то же окно времени, но «событие» (уменьшение на определенное количество времени) происходит в разные моменты времени. Я бы не знал, как выбрать кусок времени, поэтому при зеркальном отражении сигнал будет иметь одинаковые длины. Только так, как я знал, работает, если я знаю, когда происходит «событие», но затем я смогу выровнять их уже с этими знаниями. – DarkCell

Смежные вопросы