Matlab: Aligning data by using cross covariance

后端 未结 3 1696
再見小時候
再見小時候 2021-01-26 06:07

I want to get the offset in samples between two datasets in Matlab (getting them synced in time), a quite common issue. Therefore I use the cross correlation function xcorr or t

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-26 06:51

    There's nothing wrong with your method in principle, I used exactly the same approach successfully for temporally aligning different audio recordings of the same signal.

    However, it appears that for your time series, correlation (or covariance) is simply not the right measure to compare shifted versions – possibly because they contain components of a time scale comparable to the total length. An alternative is to use residual variance, i.e. the variance of the difference between shifted versions. Here is a (not particularly elegant) implementation of this idea:

    lags = -1000 : 1000;
    v = nan(size(lags));
    for i = 1 : numel(lags)
        lag = lags(i);
        if lag >= 0
            v(i) = var(b(1 + lag : end) - c(1 : end - lag));
        else
            v(i) = var(b(1 : end + lag) - c(1 - lag : end));
        end
    end
    [~, ind] = min(v);
    minlag = lags(ind);
    

    For your (longer) data set, this results in minlag = 169. Plotting residual variance over lags gives:

    lag-vs-var

提交回复
热议问题