我有一个加速度计生成的带有时间戳的十六进制文件,它包含来自三个轴的加速度数据。数据如下所示:
C1 EB C1 F9 C1 C6
12:57:39.046:
41 F0 81 FA 41 C6
12:57:39.062:
01 F7 C1 FA 81 C6
12:57:39.078:
我需要像这样将其分离出来:
C1EB C1F9 C1C6
41F0 81FA 41C6
01F7 C1FA 81C6
最后,我需要在 Matlab 中将其转换为十进制才能查看加速度。有人能帮我吗?
答案1
如果名为“measurement.txt”的文件的每一行看起来类似于
C1 EB C1 F9 C1 C6 12:57:39.046:
可以使用正则表达式提取十六进制数(每个数由 4 位数字组成),删除空格,然后使用 MATLAB 将数字转换为十进制,代码如下:
data = importdata('measurement.txt',' ');
data_hex = [];
for m = 1 : size(data,1)
[start_idx, end_idx, extents, matches, tokens, names, splits] = regexp(data{m,1},'([A-F0-9]{2} [A-F0-9]{2}) ([A-F0-9]{2} [A-F0-9]{2}) ([A-F0-9]{2} [A-F0-9]{2}).*');
for n = 1 : size(tokens{1,1},2)
data_hex{m,n} = strrep(tokens{1,1}(1,n),' ','');
data_dec(m,n) = hex2dec(data_hex{m,n});
end
end
答案2
假设数据收集的逻辑格式如下:
12:57:18.281: C1 F3 81 F6 81 C5
12:57:18.296: 01 F0 41 F7 01 C6
12:57:18.296: 41 ED C1 F7 01 C6
12:57:18.312: C1 E8 01 F8 01 C6
这个 perl 程序:
#!/usr/bin/perl
$time=0;$data='';
while(<>){
if(s/^(\d+):(\d+):(\d+)\.(\d+):\s*//) {
$time=3600*$1+60*$2+$3+$4/1000;
}
if(s/(..)\s+(..)\s*/(hex($1)<<8|hex($2))."\t"/eg) {
s/\t$//;
$data=$_;
}
print "$time\t$data\n";
}
使用以下命令行:
perl accelerometer-parse.pl < data.in > data.out
将其转换为任何东西都可以使用的通用制表符分隔格式:
46638.281 49651 33270 33221
46638.296 496 16887 454
46638.296 16877 49655 454
46638.312 49640 504 454
要使数据有意义,您还需要时间轴。要从 t=0 开始,只需从所有后续数据点中减去第一个时间条目。