加速度計の読み値を16進数から10進数に変換する


2

タイムスタンプ付きの加速度計で生成された16進数ファイルがあり、3つの軸からの加速度データがあります。データは次のようになります。

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でそれを10進数に変換する必要があります。誰かがこれを手伝ってくれる?


何語??
kenny

1
1行おきに削除し、残りの行の1、3、5番目のスペースを削除しますか?それはsed、awk、cut、またはあなたの好きなスクリプト言語の仕事であり、電気設計者のための質問ではありません。あなたがその情報を生成するためにあなたのデバイスのファームウェアを修正したいのであれば話題になるかもしれませんが、それはおそらくsnprintf()ステートメントのフォーマットを単に修正することを含みます。
Kevin Vermeer

@kenny:この形式の値を持つ単なるファイルです。申し訳ありませんが、言語が何であるかわかりません。

@reemrevnivek:sed、awk、cut?あなたはそれをどのようにしてこのhexファイルから加速度を読むかを私に教えてください。

@Dilip、あなたはあなたが望むどんな言語でも、おそらくMatlabでもそれをすることができる。 @reemrevnivekで示唆されているように、どの言語をシェルロールに使いたいのかわからない場合。
kenny

回答:


2

'measurement.txt'という名前のファイルの各行が次のようになるとします。

C1 EB C1 F9 C1 C6 12:57:39.046:

次のコードを使用して、正規表現を使用して16進数(4つの数字からそれぞれ1つずつ)の抽出、スペースの削除、およびその数値の10進数への変換を実行できます。

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

@ピーター:可能であれば私はあなたにファイルを送ることができます。問題は、ファイルが4000行に近いので、手動ではできないことです。

各行の後に空白行があるかどうかはわかりません。もしそうなら、私のコードは少し調整する必要があります。現在では、 ':'文字を含まないすべての行を検索します。

@ピーター:おかげでそれは素晴らしい作品だが私の問題は私がファイルC1 EB C1 F9 C1 C6 12:57:39.046にこのようなものを変換する必要があるということです49643 49657 49606へ。

@Dilip:ファイルの正確なフォーマットについて詳しく説明してください。それで、スペースは2つの16進数を分けるのですか?最初の投稿を編集してファイルの内容をインデントしてください。それはコードとして表示されます。

@Peter:これは最初の数行が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

0

データ収集のためにこの論理フォーマットを仮定します。

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から開始するには、後続のすべてのデータポイントから最初のエントリを差し引くだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.