2016-07-11 35 views
1

我正在使用Relatek音頻編解碼器ALC5621來處理某些自定義音頻處理應用。我使用i2c bit binging來控制編解碼器和soc(cc1110)之間的通信。在找出均衡器部分時,我遇到了一個問題 ,它的內容如下--->一個接受二進制輸入的16位寄存器,其格式爲「>」3.13格式的補碼(範圍從 - 4〜3.99)「寄存器大小爲16位(15,0),如何將數據送入此寄存器,例如:-4,-1等?3.13格式的補碼(範圍從-4〜3.99)是什麼意思?

+0

我不明白你的問題。你能用一個更容易理解的例子更精確嗎? – ckruczek

+0

我需要將-4,+ 3.99,-2,+ 1.99這樣的值應用於編解碼器中的16位寄存器,該寄存器接受3.13格式的2的補碼值,我該如何申請?我現在清楚了嗎? –

回答

1

3.13格式用二進制定點算術表示法稱爲「Q」數字格式。
參考:Fixed-point arithmetic
3.13描述了一個數字,3個整數位和13個小數位存儲爲16位2的補碼整數(引用維基百科)。
通過將整數值除以2^13來完成將Q3.13中給出的值固定點值轉換爲「物理」浮點值。
16位整數可以表示爲 C變量:短q;
「物理」(即電壓)的值可被表示爲 C變量:雙V;

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

把q到v:

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

轉換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

真的有幫助。感謝@ Rotem,你真的很棒 –

相關問題