如何在MatLab中同步时间数据?

时间:2013-06-17 18:18:12

标签: matlab time

我有来自不同长度的不同来源的多个数据集。一个txt文件有几秒钟的时间,另一个有10hz的时间(有时变化)所以我的数据很乱。 我试图比较这些类型的数据集,但我需要一种智能的方法来首先同步时间序列以及相邻的数据列。 任何帮助将不胜感激。

以下是两个示例数据集:

数据集1

Time              data 1         data 2      data 3
12:19:00 PM       0.06875        0.1625      0
12:19:01 PM       0.06875        0.1625      0
12:19:02 PM       0.06875        0.1625      0
12:19:05 PM       0.06875        0.1625      0
12:20:06 PM       0.06875        0.15625     0
12:20:00 PM       0.06875        0.1625      0.02300251

数据大小为600,10

数据集2

数据集2看起来类似于更多列和不同频率的开始和结束时间,因此数据2的大小为[1000, 40]

Time            data 4    data 5    data 6      data 7     ...
12:00:00 PM     0.45875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:20:00 PM     0.06875   0.15625   0
12:20:00 PM     0.06875   0.1625    0.02300251
...
1.00.20 PM      ...       ...       ...

对不起,如果我的问题不明确。

我希望根据较短的时间轴生成第三个时间轴。 所以对于这种情况,我必须将第二个文件平均为2秒间隔(考虑到丢失的数据) 目的是在同一时间戳上比较来自数据集1和数据集2的数据1和数据2

file1的大小不等于文件2的大小

2 个答案:

答案 0 :(得分:1)

比较两组数据的最佳方法是对其进行时间同步。

  

X1 = dlmread( 'C:\文件夹\ yourfile1.txt');

     
    

X2 = dlmread( 'C:\文件夹\ yourfile2.txt');

         

t1 = x1(:,1);

         

TSR1 =时间序列(X1,T1);

         

t2 = x2(:,1);

         

TSR2 =时间序列(X2,T2);

  

%同步1和2

  
    

[new_ts12_1 new_ts12_2] =同步(tsr1,tsr2,'统一','间隔',1)

  

您可以决定如何插入数据,默认为线性

答案 1 :(得分:0)

你需要插值;您可以使用interp1作为案例。 像这样使用:

new_data = interp1(times, [data1 data2 data3 ...], new_times)

您的times无需排序。 new_times是您想要值的(等间隔)时间。

这导致线性插值。你可以做到

new_data = interp1(times, [data1 data2 data3 ...], new_times, 'cubic')

使用立方插值。有关详细信息,请参阅help interp1

请注意new_datasize(new_times) x size([data1 data2 data3 ...])

编辑

因此,对于您的情况,这就是您使用它的方式:

% Your data sets
dataset_1 = {...
    '12:19:00 PM       0.06875        0.1625      0'
    '12:19:01 PM       0.06875        0.1625      0'
    '12:19:02 PM       0.06875        0.1625      0'
    '12:19:05 PM       0.06875        0.1625      0'
    '12:20:06 PM       0.06875        0.15625     0'
    '12:20:00 PM       0.06875        0.1625      0.02300251'
    };

dataset_2 = {...
    '12:00:00 PM     0.45875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:20:00 PM     0.06875   0.15625   0'
    '12:20:00 PM     0.06875   0.1625    0.02300251'
    };

% (This step is probably not needed (or should be changed) if you're
% reading from file)
dataset_1 = cellfun(@(x) textscan(x, '%s%s%f%f%f'), dataset_1, 'UniformOutput', false);
dataset_2 = cellfun(@(x) textscan(x, '%s%s%f%f%f'), dataset_2, 'UniformOutput', false);

% Extract & convert times
times_1 = cellfun(@(x) datenum( [x{1}{1} x{2}{1}] ), dataset_1);
times_2 = cellfun(@(x) datenum( [x{1}{1} x{2}{1}] ), dataset_2);

% Prepare the data for interpolation 
dataset_1 = cellfun(@(x) [x{3:end}], dataset_1, 'UniformOutput', false);
dataset_1 = cell2mat(dataset_1);

dataset_2 = cellfun(@(x) [x{3:end}], dataset_2, 'UniformOutput', false);
dataset_2 = cell2mat(dataset_2);

[times_12, inds] = unique([times_1; times_2]); % (must use distrinct times)
dataset_12 = [dataset_1; dataset_2];
dataset_12 = dataset_12(inds,:);               % (and corresponding data) 

% Create a new times vector, that increases in regular steps
% (100 for this example)
times_3 = linspace(min(times_12), max(times_12), 100); 

% Now interpolate
dataset_3 = interp1(times_12, dataset_12, times_3)