2016-07-11 2 views
1

いくつかのカスタムオーディオ処理アプリケーションにRelatekオーディオコーデックALC5621を使用しています。コーデックとsoc(cc1110)間の通信を制御するためにi2cビットを使用します。イコライザの部分を理解しているうちに、私は問題に遭遇しました。 ---次のように記述されています---> 3.13形式で---> "2"の補数のバイナリ入力を受け入れる16ビットレジスタ(範囲は - 4〜3.99) "レジスタサイズ16ビット(15,0)、どうすればこのレジスタにデータを与えることができますか?-4、-1など?3.13形式の2の補数です(範囲は-4〜3.99です)。それはどういう意味ですか?

+0

私はあなたの問題を理解していません。もっと分かりやすい例でもっと正確に表現できますか? – ckruczek

+0

-4.3、+ 3.99、-2、+ 1.99のような値をコーデックの16ビットレジスタに適用する必要があります。これは3.13形式の2の補数で値を受け入れますが、どうすれば適用できますか? –

答えて

1

3.13 "Q"数値形式と呼ばれるバイナリ固定小数点算術表記で表される形式。
を参照してください。Fixed-point arithmetic
3.13は、3ビットの整数と16ビットの2の補数の整数(Wikipediaを引用)として格納された13の小数ビットを持つ数値を表します。
Q3.13で与えられた値の固定小数点値を "物理的"浮動小数点値に変換するには、整数値を2^13で割ることで行います。
16ビットの整数は、shortという変数で表すことができます。short q;
「物理的」(つまり電圧)値は、doubleという変数で表すことができます。double v; Vへ

short q; //Q3.13 integer format. 
double v; //"physical" value (assuming voltage). 

変換Q:

v = (double)q/(double)(1<<13); 

がQにVの変換:

q = (short)floor(v*(double)(1<<13) + 0.5); //Add 0.5 for rounding - round(x) = floor(x+0.5) 

例:

q = -32768; //Minimum short range 
//v = -32768/8192 = -4.0 

q = 32767; //Maximum short range 
//v = 32767/8192 = 3.9998779 

v = -4.0; 
//q = floor(-4.0*8192.0 + 0.5) = -32768 

v = -1.0; 
//q = floor(-1.0*8192.0 + 0.5) = -8192 
+0

本当に助けてくれました。ありがとう@ロテム、本当に素晴らしいです –

関連する問題