2017-06-28 27 views
-3

TDM伝送によるCODEC(ADC)からの24ビット固定小数点データを受け取ります。その後、データはintバッファ(32ビット)に格納されます。私はこれをフロートデータに変換したい。固定小数点から浮動小数点データへ

は、私が試した:

g_analog_input_chL_mean = (((float)(*rx_block_pointer[buffer_cntr] << 8)) * (1.0/2147483648.0)); 

は、この変換を行うための最善の方法は何ですか?

おかげで、 Costi

+0

'rx_block_pointer'とは何ですか? –

+0

「24ビットの固定小数点データ」は、既知の標準ではありません。誰もが望むように自由に実装することができます。したがって、コーデックのドキュメンテーションが正確に「24ビットの固定小数点データ」が***にどれくらいの意味を示すのかを正確に教えてください。 –

+0

「最善の方法」とはどういう意味ですか?最速?最も正確?ご覧のとおり、入力は24ビットの2の補数です。どのような出力が必要ですか? [-1:1]?私が見る唯一の問題は、0x7fffffの場合、1よりもわずかに少ない数を出力することです。 – geza

答えて

1

データは符号付きまたは符号なしている場合は、またあなたの固定小数点データのスケーリングに依存し。 floatを使用して32ビットの固定小数点データを表現すると、指数を格納するビットがいくつかあるので、いくつかの数字が失われます。私は本当にあなたがこの32ビット変換を行うなぜあなたは、このステップをスキップして、あなたがこの32ビット変換を主張する場合は、

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0x7FFFFFFF); 

注意を使用

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0x7FFFFF); 

そのIを書くことができているので、理解していません10進数を書くよりも入力ミスが多い16進数を常に使用します。あなたは、ADC値が符号なし形式を持っている場合は、同じ表現を使用することができるよりも最大の符号付き整数ではなく、2147483648

2147483647であることから、確かに間違っているが、符号ビットに含まれている:

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0xFFFFFF); 

または

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0xFFFFFFFF); 

最終ポイント:ADC値は1にスケーリングされない場合があります。したがって、式全体を最大浮動小数点値で乗算する必要があるかもしれません。

EDIT

私は今、32ビットへの移行の必要性を見ます。コンパイラはfloatに変換するときに正しい符号の解釈を実行できます。ありがとう、訂正のために。

+0

符号付きの数値であるため、32ビットの変換があると思います。 – geza

+0

24ビットの符号付き数値も使用できます。それは常に知らなければならない数字の形式に依存します。 ADCチップのドキュメントでは、そのフォーマットについて説明しています。通常、最上位ビットは符号ビットとして使用され、番号は負の値に「ラップされます」。従って、最高ビットセット(0x800000)を有する24ビットの「ゼロ」は、この24ビットの例では可能な最低の数-16777216を意味する。 – Loamsiada

+1

。それで '<< 8'がそこにあるのです。符号ビットを23ビットから31ビットにシフトするには、24ビットのビットが最高ビットを設定している場合は負の数で処理されます。 – geza

関連する問題