標籤:

Q15格式說明

天看Pic的逆變器程序,看到採集後的ADBUF數據全部都是《5,這就搞不明白了,為什麼要左移5呀?然後看到上面說是兼容Q15,在QQ群里也問了高手,說是用於DSP小數運算,於是在網上找了下Q15的定義,下面把Q15整理下。

許多DSP都是定點DSP,處理定點數據會相當快,但是處理浮點數據就會非常慢。可以利用Q格式進行浮點數據到定點的轉化,節約CPU時間。實際應用中,浮點運算大都時候都是既有整數部分,也有小數部分的。所以要選擇一個適當的定標格式才能更好的處理運算。

  Q格式表示為:Qm.n,表示數據用m比特表示整數部分,n比特表示小數部分,共需要m+n+1位來表示這個數據,多餘的一位用作符合位。假設小數點在n位的左邊(從右向左數),從而確定小數的精度

  例如Q15表示小數部分有15位,一個short型數據,佔2個位元組,最高位是符號位,後面15位是小數位,就假設小數點在第15位左邊,表示的範圍是:-1<X<0.9999695 。

  浮點數據轉化為Q15,將數據乘以2^15;Q15數據轉化為浮點數據,將數據除以2^15。

  例如:假設數據存儲空間為2個位元組,0.333×2^15=10911=0x2A9F,0.333的所有運算就可以用0x2A9F表示,同理10911×2^(-15)=0.332977294921875,可以看出浮點數據通過Q格式轉化後是有誤差的。

  例:兩個小數相乘,0.333*0.414=0.137862

  0.333*2^15=10911=0x2A9F,0.414*2^15=13565=0x34FD

  short a = 0x2A9F;

  short b = 0x34FD;

  short c = a * b >> 15;  // 兩個Q15格式的數據相乘後為Q30格式數據,因此為了得到Q15的數據結果需要右移15位

  這樣c的結果是0x11A4=0001000110100100,這個數據同樣是Q15格式的,它的小數點假設在第15位左邊,即為0.001000110100100=0.1378173828125...和實際結果0.137862差距不大。或者0x11A4 / 2^15 = 0.1378173828125

Q格式的運算

  1> 定點加減法:須轉換成相同的Q格式才能加減

  2> 定點乘法:不同Q格式的數據相乘,相當於Q值相加,即Q15數據乘以Q10數據後的結果是Q25格式的數據

  3> 定點除法:不同Q格式的數據相除,相當於Q值相減

  4> 定點左移:左移相當於Q值增加

  5> 定點右移:右移相當於Q減少

Q格式的應用格式

  實際應用中,浮點運算大都時候都是既有整數部分,也有小數部分的。所以要選擇一個適當的定標格式才能更好的處理運算。一般用如下兩種方法:

  1> 使用時使用適中的定標,既可以表示一定的整數複位也可以表示小數複位,如對於2812的32位系統,使用Q15格式,可表示-65536.0~65535.999969482區間內的數據。

  2> 全部採用小數,這樣因為小數之間相乘永遠是小數,永遠不會溢出。取一個極限最大值(最好使用2的n次冪),轉換成x/Max的小數(如果Max是取的2的 n次冪,就可以使用移位代替除法)。


推薦閱讀:

如何把qlv格式轉換成mp4格式
中醫住院病歷與中醫門診病曆書寫規範格式以及範例
書法章法格式明鏡4
【20171208】- 你真的會使用條件格式嗎?
墓碑的格式及碑文書寫

TAG:格式 | 說明 |