将加速度计读数从十六进制转换为十进制

将加速度计读数从十六进制转换为十进制

我有一个加速度计生成的带有时间戳的十六进制文件,它包含来自三个轴的加速度数据。数据如下所示:

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 开始,只需从所有后续数据点中减去第一个时间条目。

相关内容