-1

私は 16 進値を送信するデバイスを使用しており、それらの値を実際の浮動小数点値に変換する必要があります。ここに変換表があります:

01 1111 1111 1111  --> 1.99975g
01 1111 1111 1110  --> 1.99950g
...
...
00 0000 0000 0001  --> 0.00025g
00 0000 0000 0000  --> 0.00000g
11 1111 1111 1111  --> -0.00025g
...
...
10 0000 0000 0001  --> -1.99975g
10 0000 0000 0000  --> -2.00000g

問題を解決するために LookUpTable を実行しましたが、MatLab でそれを行うためのより良い方法があるかどうか疑問に思っています。

ご協力いただきありがとうございます。

4

3 に答える 3

1

バイナリ表現が変数bに文字列として格納されている場合、探しているものが出力されます。

integer_part = bin2dec(b(2));
fraction_part = bin2dec(b(4:end)) * 2^-12;

value = integer_part + fraction_part;

if b(1) == '1'
    value = -2 + value;
end

disp(value)
于 2012-06-10T20:51:18.650 に答える
0

これは、使用されているバイナリ表現に関する詳細情報なしで取得できる最も近いものです。

%# values stored as strings
b = [ ...
  '01111111111111'
  '01111111111110'
  '00000000000001'
  '00000000000000'
  '11111111111111'
  '10000000000001'
  '10000000000000'
];

%# convert to numbers
val = sum(bsxfun(@times, b-'0', [-2 0.5.^(0:size(b,2)-2)]), 2);

結果:

>> fprintf('%.5f\n', val)
1.99976
1.99951
0.00024
0.00000
-0.00024
-1.99976
-2.00000
于 2012-06-10T22:45:03.967 に答える
0

@zellusは正しいと思います。これは2の褒め言葉のバリエーションです。14ビットの「バイト」サイズを使用し、整数(インデックスと呼びます)に変換した後、2/8192のスケーリング係数で乗算します。これにより、8192のインデックス値が2gにマップされます。@Amroのように、このメソッドには小さな丸め誤差がありますが、何が起こっているかが少し良くなることを願っています(計算が速くなる可能性があります。MATLABライセンスがないため、テストできません)。

手順は次のとおりです

  1. 着信番号に番兵1がある場合、その番号は負です。そうでなければ、それはポジティブです。関係なく番兵番号をドロップします。
  2. 2進数を整数に変換します
  3. 整数が負の場合は、1を引きます
  4. 整数に2/8192のスケーリング係数を掛けます。

これをデータに適用すると、

INCOMING      PROCESS SENTINEL       RAW     INDEX       SCALED
01 1111 1111 1111 --> +1 1111 1111 1111 --> +8191 -->  8191 -->  1.99976g
01 1111 1111 1110 --> +1 1111 1111 1110 --> +8190 -->  8190 -->  1.99951g
...
00 0000 0000 0001 --> +0 0000 0000 0001 -->    +1 -->     1 -->  0.00024g
00 0000 0000 0000 --> +0 0000 0000 0000 -->    +0 -->     0 -->  0.00000g
11 1111 1111 1111 --> -0 0000 0000 0000 -->    -0 -->    -1 --> -0.00024g
...
10 0000 0000 0001 --> -1 1111 1111 1110 --> -8190 --> -8191 --> -1.99976g
10 0000 0000 0000 --> -1 1111 1111 1111 --> -8191 --> -8192 --> -2.00000g

それを見るだけで、自然なスケーリング係数は0.00025だったようです。01 1111 1111 1111が2.04775gになる可能性はありますか?

2Gから-2Gのスケールのアクセラレータ(または他のデバイス)とのインターフェースを試みていると想定しています。ドキュメントに2Gから-2Gと記載されている場合、2.04775Gから-2.05Gの真の全範囲を丸めている可能性があります。

よく知らない場合は、2つの褒め言葉を調べてください。かっこいいものです。2進数は、実際にはそれに追加されます。

編集:私は私の最初のステップで大きな省略をしました。最初のビットが1の場合、各ビットをNOTにする必要もあります。

于 2012-06-11T07:01:40.573 に答える