以下、角速度、加速度、地磁気をセンシング可能なセンサが3種類あります。
・ジャイロセンサー(3軸) 検出範囲:±1000 dps、
・加速度センサー (3軸) 検出範囲:±6G、
・地磁気センサー (3軸) 検出範囲:0.6 mT、感度:0.3 uT/LSB
今、センサからそれぞれ、1サンプルあたり16バイトの諧調値を表す
データがサンプリング周波数毎に送られてきます。
私が実装したのはセンサデータをサンプリング毎に
以下の配列dataに格納するところまでです。
この配列dataに -?~+?のデータが格納されます。
//X軸だけの例
PBYTE data[6];
data[0]→加速度センサX軸の上位バイト
data[1]→加速度センサX軸の下位バイト
data[2]→角速度センサX軸の上位バイト
data[3]→角速度センサX軸の下位バイト
data[4]→地磁気センサX軸の上位バイト
data[5]→地磁気センサX軸の下位バイト
//ここで、質問になります。
この諧調値が入っている配列dataをdouble型配列
に変換したいのです。言語はC言語になります。
固定長から変換するので当然誤差が入って構いません。
おそらく、最上位ビットは符号ビットと思われます。
センサの静止状態で取得してみたデータ例があります。
//取得データ例(すべてX軸)
data[0]→128'・'
data[1]→162'l'
data[2]→0
data[3]→28''
data[4]→255'・'
data[5]→190'セ'
私のポンコツ頭では難しいです。
どうか助けてください。よろしくお願いします。
No.4ベストアンサー
- 回答日時:
おそらく、その関数のマニュアルに
getData( PBYTE data,...)
みたいな感じで書いてあるのでしょうね。
> //取得データ例(すべてX軸)
> data[0]→128'・'
とあるので、実際にはBYTE data[6]等と宣言できているように思えます。
> data[0]→加速度センサX軸の上位バイト
> data[1]→加速度センサX軸の下位バイト
から16bitの整数にする部分は、上位を8ビットシフトして、ビット毎のorを取る
int a ;
double d;
a = (data[0] << 8 ) | data[1] ;
となります。(intは17bit以上と仮定)
今ある情報で言えるのはここまでです。
問題は、この数値の意味です。
ここから先は、そのセンサの仕様書を見ないと、何が正しいかわかりません。
整数の正負表現は一つではありません。それによって、double(や、C言語で普通に使う整数)に変換する方法が違います。(各用語について詳しくは検索でもしてください)
・2の補数
Cの内部表現と同じなので、符号あり16bit整数にキャストするだけ
d=(double)((short)a); /* shortが16bitと仮定 */
・最上位に負号+15bitの絶対値
最上位が1だっら、絶対値に-1を掛けます
d=(double)(a & 0x7fff) ;
if ( (a & 0x8000) != 0 ) { d *= -1.0 ; }
・下駄履き
本来の値に「下駄」を足したもの。本来の値にするには、逆に「下駄」を引く。
計測器だと、この表現も多いです。
d=(double)a - (double)0x8000 ; /* a=本来の値+0x8000 */
・その他、1の補数等。まったくの独自形式の場合もあり
さらに、その数値が何を表すのかは、そのセンサ次第です。
加速度300 だとして、それが300/100=3Gなのか、300/1000=0.3Gなのか 300/256=1.17Gなのか、もっと複雑な計算がいるのか、そのセンサの仕様書で調べなければわかりません。
No.3
- 回答日時:
AD変換した値をビッグエンディアンで格納しているようですね。
PBYTEに関してはANo.2さんの疑問が解決しないとちょっとおかしなことになるようですが、dataに説明のデータが入っているとすると、下記でできませんか(試してはありません)。
short x= (unsigned char)data[1]|((short)(unsigned char)data[0]<<8);
double y = x;
加速度/角速度/地磁気に合わせて計数を掛けるなりn次曲線に近似するなりの後処理が必要だとは思いますが。
No.2
- 回答日時:
いくつかあやしい部分があります。
> PBYTE data[6];
本当にdataがこのように宣言されているのであれば、data[0]~data[6]の内容はBYTEへのポインタのはずです。「上位/下位バイト」という説明と整合しませんし、その後のdata[0]→128'・'などの例からも、data[0] の型はPBYTEではなくBYTEであると考えたほうが正しそうです。
それとも、data[0]~data[6]には本当にポインタが入っていて、例示されている128とか162とかの値はポイントされている先の内容なのでしょうか。
> 1サンプルあたり16バイト
「上位/下位バイト」という説明と合わせて考えると、これはきっと「16ビット (2バイト)」の書き間違いですよね。
それで、その16ビットのデータはどんなフォーマットなのでしょうか? 符号付き16ビット整数? それとも固定小数点数または浮動小数点数? たとえば例に挙がっている
data[0]→128'・'
data[1]→162'l'
は-6G~+6Gの間のどんな値を表しているのですか? 普通の符号付き16ビット整数として考えれば-32606という値になりますが。
センサーのマニュアルにデータフォーマットについて書かれていないでしょうか。その情報がないと、誰にもDOUBLE型への変換はできません。
No.1
- 回答日時:
「上位バイト」とか「下位バイト」とか分かっているならそれにしたがって (符号はとりあえず後回しで) 数値を組み立てればいいはず. たとえば, 10進数で「上位桁が 2, 下位桁が 4」とわかっているときにここから 24 という数値を組み立てるにはどのような式を使えばいいか考えてください.
なお, 符号についてはここにある情報だけでは処理できません. 「最上位ビットは符号ビット」としても, 符号付きの整数がセンサからどのような形式で送られるのかが分からないです.
余談だけど, 「諧調値」はおそらく「階調値」ですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) 格納したデータを配列のように扱う方法はありますか? 8 2023/06/05 08:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
POSTで配列のデータを渡す方法は?
-
pythonでDBのカラム名で取得し...
-
C言語 構造体の名前欄?を小文...
-
平滑化フィルタ
-
パイソン、データーサイエンス...
-
matlabでのRRI検出
-
テキストファイルの結合について
-
基本クラスのポインタから、特...
-
ループ変数の変更
-
printfの%eで指数部分の桁数を...
-
花の名前を教えて下さい。
-
10Mバイトて文字数に すると何...
-
Excel VBA メール作成について ...
-
ビットスワップとバイトスワッ...
-
number 改行が追加できない
-
UTF-8で5~6バイトになる文字コ...
-
Rstudioによるテキストマイニン...
-
char str[256]の256の意味は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
C言語の構造体にてバブルソート...
おすすめ情報