2016-03-08 96 views
1

我正在调整传感器的不同测量值。其中一些是周期性的,我只是使用了最大的交叉相关性,它工作得很好。现在我有几个非周期性信号类似于我想要对齐的ramp/sigmoids/step/hill函数,但是对于这些信号来说,互相关失败了(在滞后0时总是给出最大值)。时间延迟/延迟估计非周期性信号(和周期性信号)

这些类型的信号的方法是什么?

理想的方法将适用于两个信号,而不需要事先知道哪一个我遇到。

下面是一个例子(噪声)

example data of ramp function

回答

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 

对我讨论的信号的修改,对于上面的代码看起来像这样。

enter image description here

,并在底部的fprintf语句的结果是:

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

而且这些匹配与指定的滞后。

这样做的缺点是它不适用于已经有周期性的信号。也就是说,通过比较信号的第一个值和最后一个值,并确保它们处于彼此的指定容差范围内,周期性相对容易检查(特别是对于标准化信号)。

+0

我想到了这个方法,但我不太确定它是否可行,因为我的信号可能有不同的长度。在我的例子中,我一直测量信号,但实际事件(减少)发生在不同的时间点。在你的例子中,你只需要移动时间轴。因此,当我对信号做同样的处理时,会导致中央S形元素的宽度不同。 – DarkCell

+0

@DarkCell你不能只是采取“大块”的时间,并执行分析?您可以根据需要用零填充信号。展示您正在谈论的内容可能会有所帮助。 – Suever

+0

那么我会如何选择我的时间?查看我的示例:每个信号都是在同一时间窗口内测量的,但“事件”(不同时间的减少)发生在不同的时间点。我不知道如何选择一段时间,因此信号在镜像时会产生相同的长度。只有当我知道什么时候发生“事件”时,我才知道有效,但是我可以将它们与这些知识结合起来。 – DarkCell