Q格式運算講解學習_第1頁
Q格式運算講解學習_第2頁
Q格式運算講解學習_第3頁
Q格式運算講解學習_第4頁
Q格式運算講解學習_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Q格式運算講解學習 37 第3章 DSP 芯片的定點運算 3.1 數(shù) 的 定 標 在定點 DSP芯片中,采用定點數(shù)進行數(shù)值運算,其操作數(shù)一般采用整型數(shù)來表示。一 個整型數(shù)的最大表示范圍取決于 DSP芯片所給定的字長,一般為 16位或 24位。顯然,字長越長,所能表示的數(shù)的范圍越大,精度也越高。如無特別說明,本書均以 16位字長為例。 DSP芯片的數(shù)以 2的補碼形式表示。每個 16位數(shù)用一個符號位來表示數(shù)的正負, 0表示數(shù)值為正, 1則表示數(shù)值為負。其余 15位表示數(shù)值的大小。因此 二進制數(shù) 0010000000000011b 8195 二進制數(shù) 1111111111111100b - 4 對

2、DSP 芯片而言,參與數(shù)值運算的數(shù)就是 16 位的整型數(shù)。但在許多情況下,數(shù)學運算 過程中的數(shù)不一定都是整數(shù)。那么, DSP芯片是如何處理小數(shù)的呢?應該說, DSP芯片本身無能為力。那么是不是說 DSP芯片就不能處理各種小數(shù)呢?當然不是。這其中的關鍵就 是由程序員來確定一個數(shù)的小數(shù)點處于 16位中的哪一位。這就是數(shù)的定標。 通過設定小數(shù)點在 16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小數(shù)了。 數(shù)的定標有 Q表示法和 S表示法兩種。表 3.1列出了一個 16 位數(shù)的 16種Q表示、 S表示及它們所能表示的十進制數(shù)值范圍。 從表 3.1可以看出,同樣一個 16位數(shù),若小數(shù)點設定的位置不同

3、,它所表示的數(shù)也就不 同。例如: 16進制數(shù) 2000H 8192,用 Q0表示 16進制數(shù) 2000H 0.25,用 Q15表示 但對于 DSP芯片來說,處理方法是完全相同的。 從表 3.1還可以看出,不同的 Q所表示的數(shù)不僅范圍不同,而且精度也不相同。 Q越大,數(shù)值范圍越小,但精度越高;相反, Q越小,數(shù)值范圍越大,但精度就越低。例如, Q0的數(shù)值范圍是 - 32768到+32767 ,其精度為 1,而 Q15 的數(shù)值范圍為 - 1 到0.9999695,精度為 1/32768 = 0.00003051 。因此,對定點數(shù)而言,數(shù)值范圍與精度是一對矛盾,一個變量 要想能夠表示比較大的數(shù)值范圍

4、,必須以犧牲精度為代價;而想提高精度,則數(shù)的表示范圍就相應地減小。在實際的定點算法中,為了達到最佳的性能,必須充分考慮到這一點。 38 16384/32768=0.5 。 16384 ,式中 16384 2- 15 浮點數(shù)與定點數(shù)的轉換關系可表示為: 浮點數(shù) (x) 轉換為定點數(shù) ( x ): x (int) x q q 2Q 定點數(shù) ( x q )轉換為浮點數(shù) (x) : x ( float )x q 2 Q 例如,浮 點數(shù) x=0.5 , 定 標 Q 15 , 則定 點數(shù) Q 15 表示的定點數(shù) x q 0.5 32768 表示下取整。反之,一個用 16384 ,其浮點數(shù)為 39 表3.1

5、 Q表示、 S表示及數(shù)值范圍 Q表示 S表示 十進制數(shù)表示范圍 Q15 S0.15 - 1 X 0.9999695 Q14 S1.14 - 2 X 1.9999390 Q13 S2.13 - 4 X 3.9998779 Q12 S3.12 - 8 X 7.9997559 Q11 S4.11 - 16 X 15.9995117 Q10 S5.10 - 32 X 31.9990234 Q9 S6.9 - 64 X 63.9980469 Q8 S7.8 - 128 X 127.9960938 Q7 S8.7 - 256 X 255.9921875 Q6 S9.6 - 512 X 511.980437

6、5 Q5 S10.5 - 1024 X 1023.96875 Q4 S11.4 - 2048X 2047.9375 Q3 S12.3 - 4096 X 4095.875 Q2 S13.2 - 8192 X 8191.75 Q1 S14.1 - 16384 X 16383.5 Q0 S15.0 - 32768 X 32767 3.2 高級語言:從浮點到定點 在編寫 DSP模擬算法時,為了方便,一般都是采用高級語言 (如 C語言 )來編寫模擬程序。程序中所用的變量一般既有整型數(shù),又有浮點數(shù)。如例 3.1程序中的變量 i是整型數(shù), 而pi是浮點數(shù), hamwindow 則是浮點數(shù)組。 例 3.1 2

7、56點漢明窗計算int i; float pi=3.14159; float hamwindow256; for(i=0;i 40 的定點實現(xiàn)方法。 3.2.1 加法/減法運算的 C語言定點模擬 設浮點加法運算的表達式為: float x,y,z; 41 q q z=x+y; 將浮點加法 /減法轉化為定點加法 /減法時 最重要的一點就是必須保證兩個操作數(shù)的定標值一 樣。 若兩者不一樣,則在做加法 /減法運算前先進行小數(shù)點的調整。為保證運算精 度, 需使 Q 值小的數(shù)調整為與另一個數(shù)的 Q 值一樣大 。此外,在做加法 /減法運算時,必須 注意結果可能會超過 16位表示。 如果加法 /減法的結果超

8、出 16位的表示范圍,則必須保留 32 位結果,以保證運算的精度 。 1. 結果不超過 16位表示范圍 設 x的Q值為Qx, y的 Q值為 Qy,且QxQy ,加法 / 減法結果 z的定標值為 Qz,則 z x+y z q 2 Q z x q 2 Q x Q y q 2 = x q 2 Q x y 2(Q x Q y ) 2 Q x = x q y q 2(Q x Q y ) 2 Q x z q xq y 2(Q x Q y ) 2( Qz Q x ) 所以定點加法可以描述為: int x,y,z; long temp; /* 臨時變量 */ temp y(Qx Qz), 若Qx Qz z (

9、int)(temp x 16384; y25395; temp 253952) 29491; 因為 z的Q值為 13,所以定點值 z 29491即為浮點值 z 29491/8192 3.6。 例 3.3 定點減法 設x 3.0, y3.1,則浮點運算結果為 z x- y 3.0- 3.1 - 0.1; Qx 13, Qy13, Qz 15,則定點減法為: x 24576; y25295; temp 25395; temp x- temp 24576- 25395 - 819; 因為 QxQy ,加法結果 z的定標值為 Qz,則定點加法為: int x , y; long temp, z; te

10、mp y(Qx - Qz),若Qx Qz z temp (Qx+Qy - Qz); 例 3.5 定點乘法 設x = 18.4 , y = 36.8 ,則浮點運算值為 z =18.4 36.8 = 677.12; 根據(jù)上節(jié),得 Qx = 10 , Qy = 9 , Qz = 5 ,所以 45 Q Q x = 18841 ; y = 18841 ; temp = 18841L; z = (18841L*18841)(10+9 - 5) = 354983281L14 = 21666; 因為 z的定標值為 5,故定點 z = 21666 即為浮點的 z = 21666/32 = 677.08 。 3.

11、2.3 除法運算的 C語言定點模擬 設浮點除法運算的表達式為: float x,y,z; z = x/y; 假設經(jīng)過統(tǒng)計后被除數(shù) x的定標值為 Qx,除數(shù) y的定標值為 Qy,商 z的定標值為 Qz,則 z = x/y z q 2 z = x q 2 x Q y y q 2 x q 2 z q (Q z Q x y q Q y ) 所以定點表示的除法為: int x,y,z; long temp; temp = (long)x; z = (temp15; for(i=0;i 3.3 DSP定點算術運算 定點 DSP芯片的數(shù)值表示是基于 2的補碼表示形式。每個 16位數(shù)用 1個符號位、 i個整數(shù)

12、 位和 15- i 個小數(shù)位來表示。因此數(shù) 00000010.10100000 表示的值為 2 1 2 1 2 3 =2.625 , 這 個數(shù)可用 Q8格式 (個小數(shù)位 )來表示,它表示的數(shù)值范圍為 - 128+127.996 ,一個 Q8 定點數(shù)的小數(shù)精度為 1/256=0.004 。 52 雖然特殊情況 ( 如動態(tài)范圍和精度要求 )必須使用混合表示法,但是,更通常的是全部以Q15格式表示的小數(shù)或以 Q0格式表示的整數(shù)來工作。這一點對于主要是乘法和累加的信號處理算法特別現(xiàn)實,小數(shù)乘以小數(shù)得小數(shù),整數(shù)乘以整數(shù)得整數(shù)。當然,乘積累加時可 能會出現(xiàn)溢出現(xiàn)象,在這種情況下,程序員應當了解數(shù)學里面的物

13、理過程以注意可能的溢 出情況。下面討論乘法、加法和除法的 DSP定點運算,匯編程序以 TMS320C25 為例。 3.3.1 定點乘法 2個定點數(shù)相乘時可以分為下列 3種情況: 1. 小數(shù)乘小數(shù) Q0表示,則最接 例 3.11 1.5 0.75 = 1.125 01.10000000000000 = 1.5 00.11000000000000 = 0.75 ; Q14 ; Q14 0001.0010000000000000000000000000 = 1.125;Q28 Q14的最大值不大于 2,因此, 2個Q14數(shù)相乘得到的乘積不大于 4。 一般的,若一個數(shù)的整數(shù)位為 i位,小數(shù)位為 j 位

14、,另一個數(shù)的整數(shù)位為 m 位,小數(shù)位為 n 位,則這兩個數(shù)的乘積為 ( i + m ) 位整數(shù)位和 (j + n) 位小數(shù)位。這個乘積的最高16位可能的精度為 ( i + m ) 整數(shù)位和 (15 - i - m) 小數(shù)位。 54 但是,若事先了解數(shù)的動態(tài)范圍,就可以增加數(shù)的精度。例如,程序員了解到上述乘 積不會大于 1.8 ,就可以用 Q14 數(shù)表示乘積,而不是理論上的最佳情況 Q13 。例 3.11的TMS320C25 程序如下: 55 LT OP1 MPY OP2 PAC ADD ONE, 14 (上舍入 ) SACH ANS ,1 上述程序說明,不管 ANS 為正或負,所產(chǎn)生的誤差是

15、1/2 LSB ,其中存儲單元 ONE 的值為 1。 3.3.2 定點加法 乘的過程中,程序員可不考慮溢出而只需調整運算中的小數(shù)點。而加法則是一個更加 復雜的過程。首先,加法運算必須用相同的 Q點表示;其次,程序員或者允許其結果有足 夠的高位以適應位的增長,或者必須準備解決溢出問題。如果操作數(shù)僅為 16位長,其結果可用雙精度數(shù)表示。下面舉例說明 16位數(shù)相加的兩種途徑。 1保留 32位結果 LAC OP1 ;(Q15) ADD OP2 ;(Q15) SACH ANSHI ;(高16位結果 ) SACL 2調整小數(shù)點保留 ANSLO 16位結果 ;(低16位結果 ) LAC OP1,15 ;(Q

16、14 數(shù)用 ACCH 表示 ) ADD OP2,15 ;(Q14 數(shù)用 ACCH 表示 ) SACH ANS ;(Q14) 加法運算最可能出現(xiàn)的問題是運算結果溢出。 TMS320 提供了檢查溢出的專用指令 BV ,此外,使用溢出保護功能可使累加結果溢出時累加器飽和為最大的整數(shù)或負數(shù)。當然,即使如此,運算精度還是大大降低。因此,最好的方法是完全理解基本的物理過程并注意選擇數(shù)的表達方式。 3.3.3 定點除法 在通用 DSP芯片中,一般不提供單周期的除法指令,為此必須采用除法子程序來實現(xiàn)。二進制除法是乘法的逆運算。乘法包括一系列的移位和加法,而除法可分解為一系列的減法和移位。下面來說明除法的實現(xiàn)過

17、程。 設累加器為 8位,且除法運算為 10除以 3。除的過程就是除數(shù)逐步移位并與被除數(shù)比較 的過程,在每一步進行減法運算,如果能減則將位插入商中。 (1) 除數(shù)的最低有效位對齊被除數(shù)的最高有效位。 56 00001010 00011000 11110010 (2) 由于減法結果為負,放棄減法結果,將被除數(shù)左移一位再減。 57 00010100 00011000 11111000 (3) 結果仍為負,放棄減法結果,被除數(shù)左移一位再減。 00101000 00011000 00010000 (4) 結果為正,將減法結果左移一位后加,作最后一次減。 00100001 00011000 0000100

18、1 (5) 結果為正,將結果左移一位加 1得最后結果。高位代表余數(shù),低 4位表示商。00010011 即商為 0011=3 ,余數(shù)為 0001=1。 TMS320 沒有專門的除法指令,但使用條件減指令 SUBC 可以完成有效靈活的除法功能。使用這一指令的唯一限制是兩個操作數(shù)必須為正。程序員必須事先了解其可能的運算 數(shù)的特性,如其商是否可以用小數(shù)表示及商的精度是否可被計算出來。這里每一種考慮可 影響如何使用 SUBC 指令的問題。下面給出兩種不同情況下的 TMS320C25 除法程序。 (1) 分子小于分母 DIV_A: LT NUMERA MPY DENOM PAC SACH TEMSGN ;

19、取商的符號 LAC DENOM ABS SACL DENOM ;使分母為正 ZALH ABS NUMERA ;使分子為正 RPTK 14 SUBC DENOM ;除循環(huán) 15次 SACL QUOT LAC TEMSGN 58 BGEZ ZAC A1 ;若符號為正 ,則完成 SUB QUOT SACL QUOT ;若為負 ,則商為負 A1: RET 59 這個程序中,分子在 NUMERA 中,分母在 DENOM 中,商存在 QUOT 中 , TEMSGN 為暫存單元。 (2) 規(guī)定商的精度 DIV_B: LT NUMERA MPY DENOM PAC SACH TEMSGN ;取商的符號 LAC

20、 DENOM ABS SACL DENOM ;使分母為正 LACK 15 ADD FRAC SACL FRAC ;計算循環(huán)計數(shù)器 LAC NUMERA ABS RPT FRAC ;使分子為正 SUBC DENOM ;除循環(huán) 16+FRAC 次 SACL QUOT LAC TEMSGN BGEZ B1 ;若符號為正 ,則完成 ZAC SUB QUOT SACL QUOT ;若為負 ,則商為負 B1: RET 與 DIV_A 相同,這個程序中,分子在 NUMERA 中,分母在 DENOM 中,商存在 QUOT 中, TEMSGN 為暫存單元。 FRAC 中規(guī)定商的精度,如商的精度為 Q13 ,則調

21、用程序前FRAC 單元中的值應為 13。 3.4 非線性運算的定點快速實現(xiàn) 在數(shù)值運算中,除基本的加減乘除運算外,還有其他許多非線性運算,如對數(shù)運算、 開方運算、指數(shù)運算、三角函數(shù)運算等,實現(xiàn)這些非線性運算的方法一般有: (1) 調用 DSP 60 編譯系統(tǒng)的庫函數(shù); (2) 查表法; (3) 混合法。下面分別介紹這三種方法。1調用 DSP編譯系統(tǒng)的庫函數(shù) TMS320C2X/C5X 的C編譯器提供了比較豐富的運行支持庫函數(shù)。在這些庫函數(shù)中, 包含了諸如對數(shù)、開方、三角函數(shù)、指數(shù)等常用的非線性函數(shù)。在 C程序中 (也可在匯編程序中 )只要采用與庫函數(shù)相同的變量定義,就可以直接調用。例如,在庫函

22、數(shù)中,定義了以 10為底的常用對數(shù) log10( ) : 61 include double log10(double x); 在 C程序中按如下方式調用: float x,y; x = 10.0; y = log10(x); 從上例可以看出,庫函數(shù)中的常用對數(shù) log10( )要求的輸入值為浮點數(shù),返回值也為浮點數(shù),運算的精度完全可以保證。直接調用庫函數(shù)非常方便,但由于運算量大,很難在實 時DSP中得到應用。2查表法 在實時 DSP應用中實現(xiàn)非線性運算,一般都采取適當降低運算精度來提高程序的運算 速度。查表法是快速實現(xiàn)非線性運算最常用的方法。采用這種方法必須根據(jù)自變量的范圍和精度要求制作一張

23、表格。顯然輸入的范圍越大,精度要求越高,則所需的表格就越大, 即存儲量也越大。查表法求值所需的計算就是根據(jù)輸入值確定表的地址,根據(jù)地址就可得到相應的值,因而運算量較小。查表法比較適合于非線性函數(shù)是周期函數(shù)或已知非線性函數(shù)輸入值范圍這兩種情況,例 3.12和例 3.13分別說明這兩種情況。 例 3.12 已知正弦函數(shù) y=cos(x) ,制作一個 512點表格,并說明查表方法。由于正弦函數(shù)是周期函數(shù),函數(shù)值在 1至 1之間,用查表法比較合適。 由于 Q15的表示范圍為 1至32767/32768 之間,原則上講 1至 1的范圍必須用 Q14表示。但一般從方便和總體精度考慮,類似情況仍用 Q15表

24、示,此時 1用32767來表示。 (1) 產(chǎn)生 512點值的 C語言程序如下所示 : #define N 512 #define pi 3.14159 int sin_tab512; void main( ) int i; for(i=0;i 62 的地址為: index = (int)(512*x/2 ),則 y = sin(x) = sin_tabindex 。 如果 x用 Q12 定點數(shù)表示,將 512/2 用 Q8表示為 20861,則計算正弦表的地址的公式 為: index = (x*20861L)20 。 例 3.13 用查表法求以 2為底的對數(shù),已知自變量取值范圍為 0.51,要

25、求將自變量范圍均勻劃分為 10等分。試制作這個表格并說明查表方法。 (1) 做表: y = log2(x) ,由于 x在0.5到1之間,因此 y在- 1到0之間, x和y均可用 Q15 表示。由于對 x 均勻劃分為 10段,因此, 10段對應于輸入 x的范圍如表 3.2所示。若每一段的對數(shù)值都取第 1 63 點的對數(shù)值,則表中第 1段的對數(shù)值為 y0(Q15) = (int)(log2(0.5) 32768),第 2段的對數(shù)值為 y1(Q15) = (int)(log2(0.55) 32768) ,依次類推。 表3.2 logtab0 10 點對數(shù)表 (輸入0.51) 地址 輸入值 對數(shù)值 (

26、Q15) 0 0.500.55 - 32768 1 0.550.60 - 28262 2 0.600.65 - 24149 3 0.650.70 - 20365 4 0.700.75 - 16862 5 0.750.80 - 13600 6 0.800.85 - 10549 7 0.850.90 - 7683 8 0.900.95 - 4981 9 0.951.00 - 2425 (2) 查表 : 查表時,先根據(jù)輸入值計算表的地址,計算方法為: index=(x - 16384) 20)15 。式中, index 就是查表用的地址。例如,已知輸入 x= 26869 ,則 index=6 ,因此

27、 y=- 10549。 3混合法 (1) 提高查表法的精度 上述方法查表所得結果的精度隨表的大小而變化,表越大,則精度越高,但存儲量也越大。當系統(tǒng)的存儲量有限而精度要求也較高時,查表法就不太適合。那么能否在適當增加運算量的情況下提高非線性運算的精度呢?下面介紹一種查表結合少量運算來計算非線性函數(shù)的混合法,這種方法適用于在輸入變量的范圍內函數(shù)呈單調變化的情形。 混合法是在查表的基礎上采用計算的方法以提高當輸入值處于表格兩點之間時的精度。提高精度的一個簡便方法是采用折線近似法,如圖 3.1所示。 仍以求以 2為底的對數(shù)為例 (例3.13) 。設輸入值為 x,則精確的對數(shù)值為 y,在表格值的兩點之間

28、作一直線,用 y作為 y的近似值,則有: y y 0 y y y y 0 y x y 0 x 0 x 0 x 圖3.1 提高精度的折線近似法 64 其中 y 0 由查表求得。現(xiàn)在只需在查表求得 y 0 的基礎上增加 y即可。 y的計算方法如下: y=( x/ x 0 ) y= x( y 0 / x 0 ) 式中 y 0 / x 0 對每一段來說是一個恒定值,可作一個表格直接查得。此外計算 x時需用到每段橫坐標的起始值,這個值也可作一個表格。這樣共有 三個大小均為 10 的表格,分別為存儲每段起點對 數(shù) 值 的 表 logtab0 、 存 儲 每 段 y 0 / x 0 值 的 表 logtab

29、1 和存儲每段輸入起始值 x 0 的表 logtab2 ,表 logtab1 和表 logtab2可用下列兩個數(shù)組表示: 65 int logtab110=22529,20567,18920,17517,16308, 15255,14330,13511,12780,12124; /* y 0 / x 0 : Q13*/ int logtab210=16384,18022,19660,21299,22938, 24576,26214,27853,29491,31130; /* x 0 : Q15*/ 綜上所述,采用混合法計算對數(shù)值的方法可歸納為: 根據(jù)輸入值,計算查表地址: index=(x -

30、 16384) 20)15; 查表得 y 0 =logtab0index; 計算 x=x - logtab2index; 計算 y ( x logtab1index)13; 計算得結果 y=y 0 + y。 例 3.14 已知 x=0.54 ,求 log2(x) 。 0.54的精確對數(shù)值為y=log2(0.54)= - 0.889 ?;旌戏ㄇ髮?shù)值的過程為: 定標 Q15,定標值 x=0.54*32768=17694 ; 表地址 index=(x - 16384) 20)15=0; 查表得 y 0 =logtab00= - 32768; 計算 x=x - logtab20=17694 - 16

31、384=1310; 計算 y ( xlogtab10)13=(1310*22529L)13=3602; 計算結果 y=y 0 + y=- 32768+3602= - 29166。 結果 y為Q15定標,折算成浮點數(shù)為 - 29166/32768= - 0.89,可見精度較高。 (2) 擴大自變量范圍 如上所述,查表法比較適用于周期函數(shù)或自變量的動態(tài)范圍不是太大的情形。對于像對數(shù)這樣的非線性函數(shù),輸入值和函數(shù)值的變化范圍都很大。如果輸入值的變化范圍很 大,則作表就比較困難。那么能否比較好地解決這個問題,既不使表格太大,又能得到比較高的精度呢?下面討論一種切實可行的方法。 設 x是一個大于 0.5的數(shù),則 x可以表示為下列形式: x = m 2 e 式中, 0.5 m 1.0,e為整數(shù)。則求 x 的對數(shù)可以表示為: log2(x) = log2( m 2 e ) = log2(m) + log2( 2 e ) = e + log2(m) 66 也就是說,求 x的對數(shù)實際上只要求 m的對數(shù)就可以了,而由于 m的數(shù)值在 0.51.0 之間, 用上面介紹的方法是完全可以實現(xiàn)的。例如: log2(10000) = log2(0.61035 214 ) = log2(0.61035) + 14 = 13.2877 可見,如果一個數(shù)可以用比較簡便的方法表示為上

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論