天看Pic的逆變器程序,,看到采集后的ADBUF數(shù)據(jù)全部都是《5,,這就搞不明白了,為什么要左移5呀,?然后看到上面說是兼容Q15,,在QQ群里也問了高手,說是用于DSP小數(shù)運(yùn)算,,于是在網(wǎng)上找了下Q15的定義,,下面把Q15整理下,。 許多DSP都是定點(diǎn)DSP,,處理定點(diǎn)數(shù)據(jù)會(huì)相當(dāng)快,但是處理浮點(diǎn)數(shù)據(jù)就會(huì)非常慢,??梢岳肣格式進(jìn)行浮點(diǎn)數(shù)據(jù)到定點(diǎn)的轉(zhuǎn)化,節(jié)約CPU時(shí)間,。實(shí)際應(yīng)用中,,浮點(diǎn)運(yùn)算大都時(shí)候都是既有整數(shù)部分,也有小數(shù)部分的。所以要選擇一個(gè)適當(dāng)?shù)亩?biāo)格式才能更好的處理運(yùn)算,。 Q格式表示為:Qm.n,,表示數(shù)據(jù)用m比特表示整數(shù)部分,n比特表示小數(shù)部分,,共需要m+n+1位來表示這個(gè)數(shù)據(jù),,多余的一位用作符合位。假設(shè)小數(shù)點(diǎn)在n位的左邊(從右向左數(shù)),,從而確定小數(shù)的精度 例如Q15表示小數(shù)部分有15位,,一個(gè)short型數(shù)據(jù),占2個(gè)字節(jié),,最高位是符號(hào)位,,后面15位是小數(shù)位,就假設(shè)小數(shù)點(diǎn)在第15位左邊,,表示的范圍是:-1<X<0.9999695 ,。 浮點(diǎn)數(shù)據(jù)轉(zhuǎn)化為Q15,將數(shù)據(jù)乘以2^15,;Q15數(shù)據(jù)轉(zhuǎn)化為浮點(diǎn)數(shù)據(jù),,將數(shù)據(jù)除以2^15。 例如:假設(shè)數(shù)據(jù)存儲(chǔ)空間為2個(gè)字節(jié),,0.333×2^15=10911=0x2A9F,,0.333的所有運(yùn)算就可以用0x2A9F表示,同理10911×2^(-15)=0.332977294921875,,可以看出浮點(diǎn)數(shù)據(jù)通過Q格式轉(zhuǎn)化后是有誤差的,。 例:兩個(gè)小數(shù)相乘,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; // 兩個(gè)Q15格式的數(shù)據(jù)相乘后為Q30格式數(shù)據(jù),,因此為了得到Q15的數(shù)據(jù)結(jié)果需要右移15位 這樣c的結(jié)果是0x11A4=0001000110100100,這個(gè)數(shù)據(jù)同樣是Q15格式的,,它的小數(shù)點(diǎn)假設(shè)在第15位左邊,,即為0.001000110100100=0.1378173828125...和實(shí)際結(jié)果0.137862差距不大?;蛘?x11A4 / 2^15 = 0.1378173828125
Q格式的運(yùn)算1> 定點(diǎn)加減法:須轉(zhuǎn)換成相同的Q格式才能加減 2> 定點(diǎn)乘法:不同Q格式的數(shù)據(jù)相乘,,相當(dāng)于Q值相加,即Q15數(shù)據(jù)乘以Q10數(shù)據(jù)后的結(jié)果是Q25格式的數(shù)據(jù) 3> 定點(diǎn)除法:不同Q格式的數(shù)據(jù)相除,,相當(dāng)于Q值相減 4> 定點(diǎn)左移:左移相當(dāng)于Q值增加 5> 定點(diǎn)右移:右移相當(dāng)于Q減少
Q格式的應(yīng)用格式實(shí)際應(yīng)用中,,浮點(diǎn)運(yùn)算大都時(shí)候都是既有整數(shù)部分,也有小數(shù)部分的,。所以要選擇一個(gè)適當(dāng)?shù)亩?biāo)格式才能更好的處理運(yùn)算,。一般用如下兩種方法: 1> 使用時(shí)使用適中的定標(biāo),既可以表示一定的整數(shù)復(fù)位也可以表示小數(shù)復(fù)位,如對(duì)于2812的32位系統(tǒng),,使用Q15格式,,可表示-65536.0~65535.999969482區(qū)間內(nèi)的數(shù)據(jù)。 2> 全部采用小數(shù),,這樣因?yàn)樾?shù)之間相乘永遠(yuǎn)是小數(shù),,永遠(yuǎn)不會(huì)溢出。取一個(gè)極限最大值(最好使用2的n次冪),,轉(zhuǎn)換成x/Max的小數(shù)(如果Max是取的2的 n次冪,,就可以使用移位代替除法)。 |
|