Q格式前提
無符號數:當參與運算的數值沒有負數且運算的結果也沒有負數時,則所有字元都可以表示數值,這種沒有符號的數,稱為無符號數(如記憶體儲存位址),有符號數:數值中有某位數值代表符號,通常最高位作為符號位,0代表正,1代表負。
真值:有符號數所代表的數值,例如:110所代表的值是 -2 而非 6,有符號數隻要去除符號位就可以獲得該數的大小,在運算時,它的符號位可參與運算。但在加減運算時,必須將它分離出來,才能進行運算。有時,還要確定哪個有符號數的真值比較大,才能確定結果的符號。為了達到這些功能,電路的設計就相當複雜。所以很多電腦系統不直接使用有符號數,而使用有符號數的1’s補數或2’s補數表示法作為編碼系統
正弦脈波寬度調變(SPWM)之控制方法經Q 格式乘法器轉換成振幅與頻率可變V/F 控制,當成其單相感應馬達的輸入信號,藉由控制責任周期的大小,以達到變電壓相對改變頻率的效果。
DSPs
1.實現數位系統的第一步
在自然世界中,所有的物理量包括時間、電壓、質量、位移等等,都是類比的、連續的。可是在數位系統中,訊號是在不連續的時間點取樣,物理量或訊號的大小也不再是連續,而是被量化(Quantized)。在數位系統中,只能用有限字元長度的數字去表示數量的大小,而不能以無限精確的數值(實數)去表示。為了實現數位系統;使用了定點數與浮點數的表示法。
a)定點數(Fixed Point Number):指一個數字的表示,其小數點是在固定的位置(位元)。
b)浮點數(Floating Point Number):使用假數以及指數兩部分來表示數值。
例如:一個不含正負號的四位數十進制,包含三位整數和一位小數;
定點數所能表示的à
※
※所以小於0.1以及大於999.9的數值皆無法用此格式表示。
浮點數所能表示的à
※最大值:0.999 × 10(9)即10的9次方
※最小值:0.001 × 10(0)即10的零次方
※動態範圍:20lg10(12)≒240(dB)
PS:動態範圍:指一個數字表示法所能表示最大數值與最小數值的比值。
c)兩種表示法的比較:
※有效位數:定點有效位數有四位數,浮點格式只有三位數。
※價格:定點DSP價廉且普及(90%);浮點DSP運用在複雜運算價格昂
貴。
d)DSP 的算數運算:
※負數:採用二補數法來表示。例如;﹣46(d)可表示成1101 0010(b)。用
二補數來表示有號數的好處是:只需一個加法器,就可以具備加、減
法運算的功能。
※Q格式:小數點位於第 n 位元之右側,稱為Qn 格式。例如;
16 位元二進位無號數:0100 0010 1000 0001
à在Q0格式下其表示的是:2^14+2^9+2^7+2^0=17025(d)
à在Q8格式下其表示的是:2^6+2^1+2^-1+2^-8=66.50390~(d)
à在Q16格式下其表示的是:2^-2+2^-7+2^-9+2^-16=0.25978~(d)
進行加法或減法時,Q格式並不會影響運算法則,兩個Q8 格式的小數相
加,所得到的數值仍是Q8格式。兩個Q6格式相減,所得到的數值仍是Q6格
式。因此在定點數之加減運算並不因Q格式不同而有差異。不過可能會產生溢位(overflow),而且不同格式的數值不能直接相加減。
乘法時,Q格式便會影響運算結果。兩個16 位元數做乘法,會得到32 位元數。此時只能取16位元。
àQ0 格式:取運算結果最低的16 位元,刪除較高的16 位元。
àQ16 格式:取運算結果最高的16 位元,刪除較低的16 位元。
3
處理有數號是采Q15格式來表示定點數,因為MSB被用來表示正負號。且在乘法運算不考慮溢位的問題。
舉例:+0.5 × (-0.5) = -0.25
1.100 0000 0000 0000× 0.100 0000 0000 0000
s⊕s.11 0000 0000 0000 0000 0000 0000 0000
得到的結果MSB 為兩數的MSB 做XOR 求得,並取上面畫底線Q15 的部分
可得1.110 0000 0000 0000 (16bit)。為了使結果也是Q15 格式,由於最高兩位元
僅是表示正負號,所以DSP會自行將結果的最高位元捨棄。
CPU是定點微處理器不能直接處理小數,C語言中的自動調用運行時的函式來處理浮點數(float型),C語言中抹平了定點處理器和浮點處理器的差別,用戶的編程工作量最少,但是編譯出來的代碼很龐大。在嵌入式套用中很多情況下,float型幾乎不能去想。
整數定標本質上並不複雜,簡單地說,就是通過假定小數點位於哪一位。從而確定小數精度。
常用Q格式來表示數的定標。Q0是把小數點位定於第0位的右側,Q15是定於第15位的右側。
公式為:
浮點Xf->定點Xq:
定點Xq->浮點Xf:
浮點1.1變成Q13就為:(int)(1.1*2^13)=9011;
Q0範圍:-32768<X<32767
Q15範圍:-1<X<0.9999695
定點加減法一定要具有相同的Q格式才能進行。
定點乘除法是Q值相加減。
DSP處理器本身沒有硬體除法器,除法通過減法和移位完成的。
定點左移右移相當於Q值加減;
Q15格式範圍是個不超過1的小數,小數之間相互乘法還是小數,永遠不會溢出。這是小數的一個優勢。
如果一個數據既有整數也有小數。使用Q格式,直觀的做法就是選定一個適當的Q格式。
再不就全部化為小數,再用Q15格式表示。
DSP晶片的定點運算
數據的溢出
1> 溢出分類:
上溢(overflow), 下溢(underflow)
2>溢出的結果:
Min | Max | |
unsigned char | 0 | 255 |
signed char | -128 | 127 |
unsigned int | 0 | 65535 |
signed int | -32768 | 32767 |
上溢在圓圈上按數據逆時針移動;下溢在圓圈上順時鐘移動。
例:signed int :32767+1=-32768; 32768-1=32767
unsigned char:255+1=0; 0-1=255
3>為了避免溢出的發生,一般在DSP中可以設定溢出保護功能。當發生溢出時,自動將結果設定為最大值或最小值。
定點處理器對浮點數的處理
1> 定義變數為浮點型(float,double),用C語言抹平定點處理器和浮點處理器的區別,但是程式的代碼龐大,運算速度也慢。
2> 放大若干倍表示小數。比如要表示精度為0.01的變數,放大100倍去運算,運算完成後再轉化。但是這個做法比較僵硬,如要將上面的變數重新定義成0.001精度,又需要放大1000倍,且要重新編寫整個程式,考慮溢出等問題。
3> 定標法:Q格式:通過假定小數點位於哪一位的右側,從而確定小數的精度。
Q0:小數點在第0位的後面,即我們一般採用的方法
Q15 小數點在第15位的後面,0~14位都是小數位。
轉化公式:Q=(int)(F×pow(2,q)) F是浮點數
F=(float)(Q×pow(2,-q)) Q是定標數
Q格式的運算
1> 定點加減法:須轉換成相同的Q格式才能加減
2> 定點乘法:不同Q格式的數據相乘,相當於Q值相加
3> 定點除法:不同Q格式的數據相除,相當於Q值相減
4> 定點左移:左移相當於Q值增加
5> 定點右移:右移相當於Q減少
Q格式的套用格式
實際套用中,浮點運算大都時候都是既有整數部分,也有小數部分的。所以要選擇一個適當的定標格式才能更好的處理運算。一般用如下兩種方法:
1> 使用時使用適中的定標,既可以表示一定的整數復位也可以表示小數復位,如對於2812的32位系統,使用Q15格式,可表示-65536.0~65535.999969482區間內的數據。
2> 全部採用小數,這樣因為小數之間相乘永遠是小數,永遠不會溢出。取一個極限最大值(最好使用2的n次冪),轉換成x/Max的小數(如果Max是取的2的n次冪,就可以使用移位代替除法)。