2

毎秒正確に同時にログを記録しないロガーからの 1Hz タイムスタンプ (変数 'timestamp_1hz') を処理しています (違いは 0.984 から 1.094 まで変化しますが、ロガーがげっぷをする場合は 0.5 秒または数秒になることもあります)。1Hz データセットは、10 分間の平均データセットを構築するために使用され、10 分間隔ごとに 600 レコードが必要です。ロガーは毎秒正確に同時にログを記録するわけではないため、タイムスタンプは 1 秒のマークをゆっくりとドリフトします。タイムスタンプが 0 マークと 0.5 マークを超えると、問題が発生します。

タイムスタンプを前処理するさまざまな方法を試しました。タイムスタンプ間に約 1 秒のタイムスタンプが有効であると見なされます。いくつかの例を次に示します。

% simple
% this screws up around half second and full second values    
rawseconds = raw_1hz_new(:,6)+(raw_1hz_new(:,7)./1000);
rawsecondstest = rawseconds;
    rawsecondstest(:,1) = floor(rawseconds(:,1))+ rawseconds(1,1);

% more complicated
% this screws up if there is missing data, then the issue compounds because k+1 timestamp is dependent on k timestamp
rawseconds = raw_1hz_new(:,6)+(raw_1hz_new(:,7)./1000);
 A = diff(rawseconds);
    numcheck = rawseconds(1,1);
    integ = floor(numcheck);
    fract = numcheck-integ;
    if fract>0.5
        rawseconds(1,1) = rawseconds(1,1)-0.5;
    end
 for k=2:length(rawseconds)
        rawsecondstest(k,1) =  rawsecondstest(k-1,1)+round(A(k-1,1)); 
end

タイムスタンプを前処理してから、「交差」を使用して連続する 1Hz タイムスタンプと比較し、次のような欠落、繰り返しなどのデータを見つけたいと思います。

 % pull out the time stamp (round to 1hz and convert to serial number)
timestamp_1hz=round((datenum(raw_1hz_new(:,[1:6])))*86400)/86400;

% calculate new start time and end time to find contig time
starttime=min(timestamp_1hz);
endtime=max(timestamp_1hz);

% determine the contig time
contigtime=round([floor(mean([starttime endtime])):1/86400:ceil(mean([starttime endtime]))-1/86400]'*86400)/86400;
% find indices where logger time stamp matches real time and puts
% the indices of a and b
clear Ia Ib Ic Id
[~,Ia,Ib]=intersect(timestamp_1hz,contigtime);
% find indices where there is a value in real time that is not in
% logger time
[~,Ic] = setdiff(contigtime,timestamp_1hz);
% finds the indices that are unique
[~,Id] = unique(timestamp_1hz);

10 日間の raw_1hz_new タイムスタンプをここからダウンロードできます。どんな助けやヒントも大歓迎です!

4

1 に答える 1