@zellusは正しいと思います。これは2の褒め言葉のバリエーションです。14ビットの「バイト」サイズを使用し、整数(インデックスと呼びます)に変換した後、2/8192のスケーリング係数で乗算します。これにより、8192のインデックス値が2gにマップされます。@Amroのように、このメソッドには小さな丸め誤差がありますが、何が起こっているかが少し良くなることを願っています(計算が速くなる可能性があります。MATLABライセンスがないため、テストできません)。
手順は次のとおりです
- 着信番号に番兵1がある場合、その番号は負です。そうでなければ、それはポジティブです。関係なく番兵番号をドロップします。
- 2進数を整数に変換します
- 整数が負の場合は、1を引きます
- 整数に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にする必要もあります。