


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 DSP芯片的定點(diǎn)運(yùn)算3.1數(shù)的定標(biāo)在定點(diǎn)DSP芯片中,采用定點(diǎn)數(shù)進(jìn)行數(shù)值運(yùn)算,其操作數(shù)一般采用整型數(shù)來(lái)表示。一 個(gè)整型數(shù)的最大表示范圍取決于DSP芯片所給定的字長(zhǎng),一般為16位或24位。顯然,字長(zhǎng)越長(zhǎng),所能表示的數(shù)的范圍越大,精度也越高。如無(wú)特別說(shuō)明,本書(shū)均以16位字長(zhǎng)為例。DSP芯片的數(shù)以2的補(bǔ)碼形式表示。每個(gè) 16位數(shù)用一個(gè)符號(hào)位來(lái)表示數(shù)的正負(fù),0表示數(shù)值為正,1則表示數(shù)值為負(fù)。其余15位表示數(shù)值的大小。因此二進(jìn)制數(shù) = 8195二進(jìn)制數(shù) = -4對(duì)DSP芯片而言,參與數(shù)值運(yùn)算的數(shù)就是16位的整型數(shù)。但在許多情況下,數(shù)學(xué)運(yùn)算過(guò)程中的數(shù)不一定都是整數(shù)。那么,DSP芯片是如何處理小數(shù)的
2、呢?應(yīng)該說(shuō),DSP芯片本身無(wú)能為力。那么是不是說(shuō)DSP芯片就不能處理各種小數(shù)呢?當(dāng)然不是。這其中的關(guān)鍵就是由程序員來(lái)確定一個(gè)數(shù)的小數(shù)點(diǎn)處于16位中的哪一位。這就是數(shù)的定標(biāo)。通過(guò)設(shè)定小數(shù)點(diǎn)在16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標(biāo)有Q表示法和S表示法兩種。表3.1列出了一個(gè)16位數(shù)的16種Q表示、S表示及它們 所能表示的十進(jìn)制數(shù)值范圍。從表3.1可以看出,同樣一個(gè)16位數(shù),若小數(shù)點(diǎn)設(shè)定的位置不同,它所表示的數(shù)也就不 同。例如:16進(jìn)制數(shù)2000H = 8192,用Q0表示16進(jìn)制數(shù)2000H = 0.25,用Q15表示但對(duì)于DSP芯片來(lái)說(shuō),處理方法是完全相同的。從表3
3、.1還可以看出,不同的Q所表示的數(shù)不僅范圍不同,而且精度也不相同。Q越大,數(shù)值范圍越小,但精度越高;相反, Q越小,數(shù)值范圍越大,但精度就越低。例如,Q0的數(shù)值范圍是-32768到+32767,其精度為1,而Q15的數(shù)值范圍為-1到0.9999695,精度 為1/32768 = 0.00003051。因此,對(duì)定點(diǎn)數(shù)而言,數(shù)值范圍與精度是一對(duì)矛盾,一個(gè)變量 要想能夠表示比較大的數(shù)值范圍,必須以犧牲精度為代價(jià);而想提高精度,則數(shù)的表示范 圍就相應(yīng)地減小。在實(shí)際的定點(diǎn)算法中,為了達(dá)到最佳的性能,必須充分考慮到這一點(diǎn)。浮點(diǎn)數(shù)與定點(diǎn)數(shù)的轉(zhuǎn)換關(guān)系可表示為:浮點(diǎn)數(shù)(x)轉(zhuǎn)換為定點(diǎn)數(shù)(Xq):馮=(int)x
4、 2Q定點(diǎn)數(shù)(Xq)轉(zhuǎn)換為浮點(diǎn)數(shù)(x): x =(float)xq " 2例如,浮 點(diǎn)數(shù) x=0.5 ,定標(biāo) Q = 15 ,則定 點(diǎn)數(shù)xq = Q.5疋32768= 16384,式中IL .表示下取整。反之,一個(gè)用Q = 15表示的定點(diǎn)數(shù)16384,其浮點(diǎn)數(shù)為 16384 X 2-15=16384/32768=0.5。表3.1 Q表示、S表示及數(shù)值范圍Q表示S表示十進(jìn)制數(shù)表示范圍Q15S0.15-1< X< 0.9999695Q14S1.14-2W X < 1.9999390Q13S2.13-4W X< 3.9998779Q12S3.12-8< X&l
5、t; 7.9997559Q11S4.11-16W X< 15.9995117Q10S5.10-32 W X < 31.9990234Q9S6.9-64W XW 63.9980469Q8S7.8-128W X W 127.9960938Q7S8.7-256W X W 255.9921875Q6S9.6-512W XW 511.9804375Q5S10.5-1024W X W 1023.96875Q4S11.4-2048 WX W 2047.9375Q3S12.3-4096 W X W 4095.875Q2S13.2-8192W XW 8191.75Q1S14.1-16384W X W
6、 16383.5Q0S15.0-32768W X W 327673.2高級(jí)語(yǔ)言:從浮點(diǎn)到定點(diǎn)在編寫DSP模擬算法時(shí),為了方便,一般都是米用咼級(jí)語(yǔ)言(如C語(yǔ)言)來(lái)編寫模擬程序。程序中所用的變量一般既有整型數(shù),又有浮點(diǎn)數(shù)。如例3.1程序中的變量i是整型數(shù),而pi是浮點(diǎn)數(shù),hamwindow則是浮點(diǎn)數(shù)組。例3.1256點(diǎn)漢明窗計(jì)算int i;floatpi=3.14159;floathamw in dow256;for(i=0;i<256;i+) hamwindowi=0.54 -0.46*cos(2.0*pi*i/255);如果要將上述程序用某種定點(diǎn)DSP芯片來(lái)實(shí)現(xiàn),則需將上述程序改寫為DS
7、P芯片的匯編語(yǔ)言程序。為了 DSP程序調(diào)試的方便及模擬定點(diǎn)DSP實(shí)現(xiàn)時(shí)的算法性能,在編寫 DSP匯編程序之前一般需將高級(jí)語(yǔ)言浮點(diǎn)算法改寫為高級(jí)語(yǔ)言定點(diǎn)算法。下面討論基本算術(shù)運(yùn)算 的定點(diǎn)實(shí)現(xiàn)方法。3.2.1 加法/減法運(yùn)算的C語(yǔ)言定點(diǎn)模擬設(shè)浮點(diǎn)加法運(yùn)算的表達(dá)式為:float x,y,z;z=x+y;將浮點(diǎn)加法/減法轉(zhuǎn)化為定點(diǎn)加法/減法時(shí)最重要的一點(diǎn)就是必須保證兩個(gè)操作數(shù)的定 標(biāo)值一樣。若兩者不一樣,則在做加法/減法運(yùn)算前先進(jìn)行小數(shù)點(diǎn)的調(diào)整。為保證運(yùn)算精度,需使Q值小的數(shù)調(diào)整為與另一個(gè)數(shù)的Q值一樣大。此外,在做加法 /減法運(yùn)算時(shí),必須注意結(jié)果可能會(huì)超過(guò)16位表示。如果加法/減法的結(jié)果超出16位的表
8、示范圍,則必須保留32位結(jié)果,以保證運(yùn)算的精度。1 結(jié)果不超過(guò)16位表示范圍設(shè)x的Q值為Qx, y的Q值為Qy,且Qx>Qy,加法/減法結(jié)果z的定標(biāo)值為Qz,則xq2_Qx yq_Q2 y小qxcQ -Qy)xq2 xyq2 x yXqyq2(QxQ 2-yq(Qx2 xQ2(Qz -Qx)2xz= x+yZq 2zZq =xq所以定點(diǎn)加法可以描述為:int x,y,z;long temp;/* 臨時(shí)變量 */temp= y<<(Qx Qy);temp= x + temp;z= (int)(temp»(Qx Qz),若 Qx > Qzz= (int)(temp
9、<<(Qz Qx),若QxQ < z例3.2 定點(diǎn)加法設(shè)x= 0.5, y = 3.1,則浮點(diǎn)運(yùn)算結(jié)果為 z= x+y = 0.5+3.1 = 3.6;Qx = 15, Qy = 13, Qz = 13,則定點(diǎn)加法為:x= 16384; y = 25395;temp= 25395<<2 = 101580;temp= x+temp = 16384+101580 = 117964;z= (in t)(117964L>>2) = 29491;因?yàn)閦的Q值為13,所以定點(diǎn)值z(mì)= 29491即為浮點(diǎn)值z(mì)= 29491/8192 = 3.6。例3.3定點(diǎn)減法設(shè)x=
10、 3.0, y = 3.1,則浮點(diǎn)運(yùn)算結(jié)果為 z= x-y = 3.0- 3.1 = - 0.1;Qx = 13, Qy = 13, Qz = 15,則定點(diǎn)減法為:x= 24576; y = 25295 ;temp= 25395;temp= x-temp = 24576-25395= - 819;因?yàn)镼x<Qz,故z= (int)(-819<<2) = -3276。由于z的Q值為15,所以定點(diǎn)值 z= -3276即為 浮點(diǎn)值 z= - 3276/32768 - 0.1。2 .結(jié)果超過(guò)16位表示范圍設(shè)x的Q值為Qx, y的Q值為Qy,且Qx>Qy,加法結(jié)果z的定標(biāo)值為Qz
11、,則定點(diǎn)加法為:int x, y;long temp, z;temp= y<<(Qx - Qy);temp= x + temp;z= temp>>(Qx -Qz),若 Qx > Qzz= temp<<(Qz - Qx),若 Qx < Qz例3.4 結(jié)果超過(guò)16位的定點(diǎn)加法設(shè)x= 15000, y= 20000,則浮點(diǎn)運(yùn)算值為 z= x+ y= 35000,顯然z>32767,因此Qx = 1, Qy = 0, Qz = 0,則定點(diǎn)加法為:x= 30000; y = 20000;temp= 20000<<1 = 40000;tem
12、p= temp+x = 40000+30000 = 70000;z= 70000L>>1 = 35000;因?yàn)閦的Q值為0,所以定點(diǎn)值z(mì)=35000就是浮點(diǎn)值,這里z是一個(gè)長(zhǎng)整型數(shù)。當(dāng)加法或加法的結(jié)果超過(guò)16位表示范圍時(shí),如果程序員事先能夠了解到這種情況,并且需要保證運(yùn)算精度時(shí),則必須保持32位結(jié)果。如果程序中是按照16位數(shù)進(jìn)行運(yùn)算的,則超過(guò)16位實(shí)際上就是出現(xiàn)了溢出。如果不采取適當(dāng)?shù)拇胧瑒t數(shù)據(jù)溢出會(huì)導(dǎo)致運(yùn)算精度的 嚴(yán)重惡化。一般的定點(diǎn) DSP芯片都設(shè)有溢出保護(hù)功能,當(dāng)溢出保護(hù)功能有效時(shí),一旦出現(xiàn) 溢出,則累加器ACC的結(jié)果為最大的飽和值(上溢為7FFFH,下溢為8001H),從
13、而達(dá)到防止 溢出引起精度嚴(yán)重惡化的目的。3.2.2 乘法運(yùn)算的C語(yǔ)言定點(diǎn)模擬設(shè)浮點(diǎn)乘法運(yùn)算的表達(dá)式為:float x,y,z;z = xy;假設(shè)經(jīng)過(guò)統(tǒng)計(jì)后x的定標(biāo)值為Qx, y的定標(biāo)值為Qy,乘積z的定標(biāo)值為Qz,則z = xy =4QX Qy)_Qzq 2 z = Xq yq 2Zq= (Xq yq)2Qz _(Qx Q y)所以定點(diǎn)表示的乘法為:int x,y,z;long temp;temp = (Ion g)x;z = (temp x y) >> (Qx+Qy -Qz);例3.5定點(diǎn)乘法設(shè)x = 18.4 , y = 36.8,則浮點(diǎn)運(yùn)算值為 z =18.4 x 36.8
14、= 677.12;根據(jù)上節(jié),得Qx = 10 , Qy = 9 , Qz = 5,所以x = 18841 ; y = 18841 ;temp = 18841L;z = (18841L*18841)>>(10+9 - 5) = 354983281L>>14 = 21666;因?yàn)閦的定標(biāo)值為5,故定點(diǎn) z = 21666即為浮點(diǎn)的 z = 21666/32 = 677.08。3.2.3 除法運(yùn)算的C語(yǔ)言定點(diǎn)模擬設(shè)浮點(diǎn)除法運(yùn)算的表達(dá)式為:float x,y,z;z = x/y;假設(shè)經(jīng)過(guò)統(tǒng)計(jì)后被除數(shù)x的定標(biāo)值為Qx,除數(shù)y的定標(biāo)值為Qy,商z的定標(biāo)值為Qz,則z = x/y z
15、q 2z =QxXq 2ZQ"yq 2 y(Qz _Qx 祖y)Xq 2Zq :-yq所以定點(diǎn)表示的除法為:int x,y, z;long temp;temp = (Ion g)x;z = (temp<<(Qz - Qx+Qy)/y;例3.6定點(diǎn)除法設(shè)x = 18.4,y = 36.8,浮點(diǎn)運(yùn)算值為 z = x/y = 18.4/36.8 = 0.5;根據(jù)上節(jié),得Qx = 10,Qy = 9,Qz = 15 ;所以有x = 18841, y = 18841;temp = (Ion g)18841;z = (18841L<<(15 - 10+9)/18841 =
16、 308690944L/18841 = 16384; 因?yàn)樯蘻的定標(biāo)值為15,所以定點(diǎn)z = 16384即為浮點(diǎn)z = 16384/215= 0.5。3.2.4 程序變量的Q值確定在前面幾節(jié)介紹的例子中,由于 x、y、z的值都是已知的,因此從浮點(diǎn)變?yōu)槎c(diǎn)時(shí) 很好確定。在實(shí)際的 DSP應(yīng)用中,程序中參與運(yùn)算的都是變量,那么如何確定浮點(diǎn)程序中 變量的Q值呢?從前面的分析可以知道,確定變量的Q值實(shí)際上就是確定變量的動(dòng)態(tài)范圍,動(dòng)態(tài)范圍確定了,則Q值也就確定了。設(shè)變量的絕對(duì)值的最大值為max, 注意|max必須小于或等于 32767。取一個(gè)整數(shù)使它滿足Tcmax <2n則有15 n=222*5)Q
17、 = 15- n例如,某變量的值在-1至+ 1之間,即 max <1,因此n = 0, Q= 15- n = 15。確定了變量的 max就可以確定其 Q值,那么變量的 max又是如何確定的呢? 一般來(lái) 說(shuō),確定變量的 max有兩種方法:一種是理論分析法,另一種是統(tǒng)計(jì)分析法。1 理論分析法有些變量的動(dòng)態(tài)范圍通過(guò)理論分析是可以確定的。例如:(1) 三角函數(shù),y = sin(x)或y = cos(x),由三角函數(shù)知識(shí)可知,|y|w 1;(2) 漢明窗,y(n) = 0.54-0.46cos 2 二n/(N-1) , 0< n< N-1。因?yàn)?1W cos 2二n/(N-1) <
18、; 1,所以 0.08W y(n)< 1.0;N丄N丄(3) FIR卷積。y(n) = h(k)x(n _k),設(shè) x h(k) =1.0,且x(n)是模擬信號(hào) 12位量化值,k £7即有 x(n) < 211,則 y(n) < 211;(4) 理論已經(jīng)證明,在自相關(guān)線性預(yù)測(cè)編碼(LPC)的程序設(shè)計(jì)中,反射系數(shù)ki滿足下列不等式:ki <1.0 , i= 1,2,p, p為 LPC 的階數(shù)。2 .統(tǒng)計(jì)分析法對(duì)于理論上無(wú)法確定范圍的變量,一般采用統(tǒng)計(jì)分析的方法來(lái)確定其動(dòng)態(tài)范圍。所謂 統(tǒng)計(jì)分析,就是用足夠多的輸入信號(hào)樣值來(lái)確定程序中變量的動(dòng)態(tài)范圍,這里輸入信號(hào)一
19、方面要有一定的數(shù)量,另一方面必須盡可能地涉及各種情況。例如,在語(yǔ)音信號(hào)分析中, 統(tǒng)計(jì)分析時(shí)就必須采集足夠多的語(yǔ)音信號(hào)樣值,并且在所采集的語(yǔ)音樣值中,應(yīng)盡可能地 包含各種情況,如音量的大小、聲音的種類(男聲、女聲)等。只有這樣,統(tǒng)計(jì)出來(lái)的結(jié)果才能具有典型性。當(dāng)然,統(tǒng)計(jì)分析畢竟不可能涉及所有可能發(fā)生的情況,因此,對(duì)統(tǒng)計(jì)得出的結(jié)果在程序設(shè)計(jì)時(shí)可采取一些保護(hù)措施,如適當(dāng)犧牲一些精度,Q值取比統(tǒng)計(jì)值稍大些,使用DSP芯片提供的溢出保護(hù)功能等。3.2.5 浮點(diǎn)至定點(diǎn)變換的C程序舉例本節(jié)通過(guò)一個(gè)例子來(lái)說(shuō)明C程序從浮點(diǎn)變換至定點(diǎn)的方法。這是一個(gè)對(duì)語(yǔ)音信號(hào)(0.3kHz3.4kHz)進(jìn)行低通濾波的C語(yǔ)言程序,低
20、通濾波的截止頻率為800Hz,濾波器采用19點(diǎn)的有限沖擊響應(yīng)FIR濾波。語(yǔ)音信號(hào)的采樣頻率為8kHz,每個(gè)語(yǔ)音樣值按16位整型數(shù)存放在insp.dat文件中。例3.7語(yǔ)音信號(hào)800Hz 19點(diǎn)FIR低通濾波C語(yǔ)言浮點(diǎn)程序#i nclude <stdio.h>con st int len gth = 180/* 語(yǔ)音幀長(zhǎng)為 180點(diǎn)=22.5ms8kHz 采樣 */void filter(int xin ,int xout ,int n,float h ); /* 濾波子程序說(shuō)明 */*19點(diǎn)濾波器系數(shù)*/static float h19=0.01218354, - 0.009012
21、882,- 0.02881839,- 0.04743239, - 0.04584568, - 0.008692503,0.06446265,0.1544655,0.2289794,0.257883, 0.2289794,0.1544655,0.06446265, - 0.008692503,- 0.04584568, - 0.04743239,- 0.02881839,- 0.009012882,0.01218354;static int x1length+20;/* 低通濾波浮點(diǎn)子程序 */void filter(int xin ,int xout ,int n,float h )int i
22、,j;float sum;for(i=0;i<length;i+) x1n+i-1=xini;for (i=0;i<length;i+)sum=0.0;for(j=0;j<n;j+) sum+=hj*x1i - j+n- 1;xouti=(int)sum;for(i=0;i<(n - 1);i+) x1n - i - 2=xinlength -1-i;/* 主程序 */ void main( )FILE *fp1,*fp2;int frame,indatalength,outdatalength;fp1=fopen(insp.dat,"rb");fp
23、2=fopen(outsp.dat,"wb");frame=0;while(feof(fp1)=0)frame+;printf("frame=%dn",frame);for(i=0;i<length;i+) indatai=getw(fp1);filter(indata,outdata,19,h);for(i=0;i<length;i+) putw(outdatai,fp2);fcloseall( );/* 輸入語(yǔ)音文件 */ /* 濾波后語(yǔ)音文件 */* 取一幀語(yǔ)音數(shù)據(jù) */* 調(diào)用低通濾波子程序 */* 將濾波后的樣值寫入文件 */* 關(guān)
24、閉文件 */return(0);例3.8 語(yǔ)音信號(hào)800Hz 19點(diǎn)FIR低通濾波C語(yǔ)言定點(diǎn)程序#i nclude <stdio.h>const int len gth=180;void filter(int xin ,int xout ,int n,int h);static int h19=399, - 296,- 945,-1555, -1503,- 285,2112,5061,7503,8450, 7503,5061,2112,- 285,- 1503,-1555,- 945,- 296,399;/*Q15*/static int x1le ngth+20;/*低通濾波定點(diǎn)
25、子程序*/void filter(int xin ,int xout ,int n,int h)int i,j;long sum;for(i=0;i<le ngth;i+) x1 n+i - 1=xi ni;for (i=0;i<le ngth;i+)sum=0;for(j=0;j<n;j+)sum+=(long)hj*x1i -j+n-1;xouti=sum>>15; for(i=0;i<(n - 1);i+) x1n - i- 2=xinlength - i-1;主程序與浮點(diǎn)的完全一樣。3.3DSP定點(diǎn)算術(shù)運(yùn)算定點(diǎn)DSP芯片的數(shù)值表示是基于 2的補(bǔ)碼表示
26、形式。每個(gè)16位數(shù)用1個(gè)符號(hào)位、i個(gè)整數(shù) 位和15-i個(gè)小數(shù)位來(lái)表示。因此數(shù) 00000010.10100000表示的值為21+2+2=2.625,這 個(gè)數(shù)可用Q8格式(8個(gè)小數(shù)位)來(lái)表示,它表示的數(shù)值范圍為-128+127.996,個(gè)Q8定點(diǎn)數(shù)的小數(shù)精度為1/256=0.004。雖然特殊情況(如動(dòng)態(tài)范圍和精度要求)必須使用混合表示法,但是,更通常的是全部以Q15格式表示的小數(shù)或以Q0格式表示的整數(shù)來(lái)工作。這一點(diǎn)對(duì)于主要是乘法和累加的信號(hào)處理算法特別現(xiàn)實(shí),小數(shù)乘以小數(shù)得小數(shù),整數(shù)乘以整數(shù)得整數(shù)。當(dāng)然,乘積累加時(shí)可 能會(huì)出現(xiàn)溢出現(xiàn)象,在這種情況下,程序員應(yīng)當(dāng)了解數(shù)學(xué)里面的物理過(guò)程以注意可能的溢
27、出情況。下面討論乘法、加法和除法的DSP定點(diǎn)運(yùn)算,匯編程序以 TMS320C25為例。3.3.1定點(diǎn)乘法2個(gè)定點(diǎn)數(shù)相乘時(shí)可以分為下列3種情況:1 .小數(shù)乘小數(shù)Q15 X Q15 = Q30例 3.90.5*0.5 = 0.25; Q15X ; Q15; Q302個(gè)Q15的小數(shù)相乘后得到1個(gè)Q30的小數(shù),即有2個(gè)符號(hào)位。一般情況下相乘后得到的 滿精度數(shù)不必全部保留,而只需保留16位單精度數(shù)。由于相乘后得到的高16位不滿15位的小數(shù)精度,為了達(dá)到15位精度,可將乘積左移1位,下面是上述乘法的 TMS320C25程序:LTOP1;0P1=4000H(0.5/Q15)MPYOP2;OP2=4000H(
28、0.5/Q15)PACSACHANS,1;ANS=2000H(0.25/Q15)2 .整數(shù)乘整數(shù)Q0X Q0 = Q0例 3.1017X (-5)=-85000000000001000仁17X-853 .混合表示法許多情況下,運(yùn)算過(guò)程中為了既滿足數(shù)值的動(dòng)態(tài)范圍又保證一定的精度,就必須采用Q0與Q15之間的表示法。比如,數(shù)值1.2345,顯然Q15無(wú)法表示,而若用 Q0表示,則最接近的數(shù)是1,精度無(wú)法保證。因此,數(shù)1.2345最佳的表示法是Q14。例 3.111.5X 0.75 = 1.125= 1.5; Q14X= 0.75; Q14= 1.125;Q28Q14的最大值不大于2,因此,2個(gè)Q1
29、4數(shù)相乘得到的乘積不大于 4。一般的,若一個(gè)數(shù)的整數(shù)位為i位,小數(shù)位為 j位,另一個(gè)數(shù)的整數(shù)位為m位,小數(shù)位為n位,則這兩個(gè)數(shù)的乘積為(i + m )位整數(shù)位和(j + n)位小數(shù)位。這個(gè)乘積的最高16位可能的精度為(i + m )整數(shù)位和(15 - i - m)小數(shù)位。但是,若事先了解數(shù)的動(dòng)態(tài)范圍,就可以增加數(shù)的精度。例如,程序員了解到上述乘 積不會(huì)大于1.8,就可以用 Q14數(shù)表示乘積,而不是理論上的最佳情況Q13。例3.11的TMS320C25程序如下:LTOP1;OP1=6000H(1.5/Q14)MPYOP2;OP2=3000H(0.75/Q14)PACSACHANS,1;ANS=2
30、400H(1.125/Q13)上述方法為了保證精度均對(duì)乘的結(jié)果舍位,結(jié)果所產(chǎn)生的誤差相當(dāng)于減去1個(gè)LSB(最低位)。采用下面簡(jiǎn)單的舍入方法,可使誤差減少二分之一。LTOP1MPY0P2PACADDONE,14(上舍入)SACHANS ,1上述程序說(shuō)明,不管 ANS為正或負(fù),所產(chǎn)生的誤差是1/2 LSB,其中存儲(chǔ)單元 ONE的值為1。332 定點(diǎn)加法個(gè)更加乘的過(guò)程中,程序員可不考慮溢出而只需調(diào)整運(yùn)算中的小數(shù)點(diǎn)。而加法則是復(fù)雜的過(guò)程。首先,加法運(yùn)算必須用相同的Q點(diǎn)表示;其次,程序員或者允許其結(jié)果有足TMS320提供了檢查溢出的專用指令夠的高位以適應(yīng)位的增長(zhǎng),或者必須準(zhǔn)備解決溢出問(wèn)題。如果操作數(shù)僅為
31、16位長(zhǎng),其結(jié)果可用雙精度數(shù)表示。下面舉例說(shuō)明16位數(shù)相加的兩種途徑。1 保留32位結(jié)果LACOP1;(Q15)ADDOP2;(Q15)SACHANSHI;(高16位結(jié)果)SACLANSLO;(低16位結(jié)果)2調(diào)整小數(shù)點(diǎn)保留16位結(jié)果LACOP1,15;(Q14數(shù)用ACCH表示)ADDOP2,15;(Q14數(shù)用ACCH表示)SACHANS;(Q14)加法運(yùn)算最可能出現(xiàn)的問(wèn)題是運(yùn)算結(jié)果溢出。BV ,此外,使用溢出保護(hù)功能可使累加結(jié)果溢出時(shí)累加器飽和為最大的整數(shù)或負(fù)數(shù)。當(dāng) 然,即使如此,運(yùn)算精度還是大大降低。因此,最好的方法是完全理解基本的物理過(guò)程并 注意選擇數(shù)的表達(dá)方式。3.3.3 定點(diǎn)除法在通
32、用DSP芯片中,一般不提供單周期的除法指令,為此必須采用除法子程序來(lái)實(shí) 現(xiàn)。二進(jìn)制除法是乘法的逆運(yùn)算。乘法包括一系列的移位和加法,而除法可分解為一系列 的減法和移位。下面來(lái)說(shuō)明除法的實(shí)現(xiàn)過(guò)程。設(shè)累加器為8位,且除法運(yùn)算為10除以3。除的過(guò)程就是除數(shù)逐步移位并與被除數(shù)比較 的過(guò)程,在每一步進(jìn)行減法運(yùn)算,如果能減則將位插入商中。(1)除數(shù)的最低有效位對(duì)齊被除數(shù)的最高有效位。00001010 0001100011110010(2)由于減法結(jié)果為負(fù),放棄減法結(jié)果,將被除數(shù)左移一位再減。0001010000011000 11111000(3) 結(jié)果仍為負(fù),放棄減法結(jié)果,被除數(shù)左移一位再減。0010100
33、0 0001100000010000(4) 結(jié)果為正,將減法結(jié)果左移一位后加1,作最后一次減。00100001 0001100000001001(5) 結(jié)果為正,將結(jié)果左移一位加1得最后結(jié)果。高4位代表余數(shù),低4位表示商。00010011即商為0011=3,余數(shù)為0001=1。TMS320沒(méi)有專門的除法指令,但使用條件減指令SUBC可以完成有效靈活的除法功能。使用這一指令的唯一限制是兩個(gè)操作數(shù)必須為正。程序員必須事先了解其可能的運(yùn)算 數(shù)的特性,如其商是否可以用小數(shù)表示及商的精度是否可被計(jì)算出來(lái)。這里每一種考慮可 影響如何使用SUBC指令的問(wèn)題。下面給出兩種不同情況下的TMS320C25除法程序
34、。(1)分子小于分母DIV_A:A1:LTNUMERAMPYDENOMPACSACHTEMSGNLACDENOMABSSACLDENOMZALHNUMERAABSRPTK14SUBCDENOMSACLQUOTLACTEMSGNBGEZA1ZACSUBQUOTSACLQUOTRET;取商的符號(hào);使分母為正;使分子為正;除循環(huán)15次;若符號(hào)為正,則完成;若為負(fù),則商為負(fù)這個(gè)程序中,分子在暫存單元。NUMERA中,分母在 DENOM中,商存在 QUOT中,TEMSGN為(2) 規(guī)定商的精度 DIV_B:B1:LTNUMERAMPYDENOMPACSACHTEMSGN;取商的符號(hào)LACDENOMABS
35、SACLDENOM;使分母為正LACK15ADDFRACSACLFRAC;計(jì)算循環(huán)計(jì)數(shù)器LACNUMERAABS;使分子為正RPTFRACSUBCDENOM;除循環(huán) 16+FRAC 次SACLQUOTLACTEMSGNBGEZB1;若符號(hào)為正 ,則完成ZACSUBQUOTSACLQUOT;若為負(fù) ,則商為負(fù)RET與DIV_A相同,這個(gè)程序中,分子在NUMERA 中,分母在 DENOM 中,商存在 QUOT中,TEMSGN為暫存單元。 FRAC中規(guī)定商的精度,如商的精度為Q13,則調(diào)用程序前FRAC單元中的值應(yīng)為13。3.4 非線性運(yùn)算的定點(diǎn)快速實(shí)現(xiàn)在數(shù)值運(yùn)算中,除基本的加減乘除運(yùn)算外,還有其他
36、許多非線性運(yùn)算,如對(duì)數(shù)運(yùn)算、開(kāi)方運(yùn)算、指數(shù)運(yùn)算、三角函數(shù)運(yùn)算等,實(shí)現(xiàn)這些非線性運(yùn)算的方法一般有:(1)調(diào)用DSP編譯系統(tǒng)的庫(kù)函數(shù); (2)查表法; (3)混合法。下面分別介紹這三種方法。1 .調(diào)用DSP編譯系統(tǒng)的庫(kù)函數(shù)TMS320C2X/C5X 的C編譯器提供了比較豐富的運(yùn)行支持庫(kù)函數(shù)。在這些庫(kù)函數(shù)中, 包含了諸如對(duì)數(shù)、開(kāi)方、三角函數(shù)、指數(shù)等常用的非線性函數(shù)。在C程序中(也可在匯編程序中 )只要采用與庫(kù)函數(shù)相同的變量定義,就可以直接調(diào)用。例如,在庫(kù)函數(shù)中,定義了以 10為底的常用對(duì)數(shù) log10( ):# in elude <math.h> double Iog10(double
37、x);在C程序中按如下方式調(diào)用:float x,y;x = 10.0; y = log10(x);從上例可以看出,庫(kù)函數(shù)中的常用對(duì)數(shù)log10()要求的輸入值為浮點(diǎn)數(shù),返回值也為浮點(diǎn)數(shù),運(yùn)算的精度完全可以保證。直接調(diào)用庫(kù)函數(shù)非常方便,但由于運(yùn)算量大,很難在實(shí) 時(shí)DSP中得到應(yīng)用。2 .查表法在實(shí)時(shí)DSP應(yīng)用中實(shí)現(xiàn)非線性運(yùn)算,一般都采取適當(dāng)降低運(yùn)算精度來(lái)提高程序的運(yùn)算 速度。查表法是快速實(shí)現(xiàn)非線性運(yùn)算最常用的方法。采用這種方法必須根據(jù)自變量的范圍 和精度要求制作一張表格。顯然輸入的范圍越大,精度要求越高,則所需的表格就越大, 即存儲(chǔ)量也越大。查表法求值所需的計(jì)算就是根據(jù)輸入值確定表的地址,根據(jù)地
38、址就可得 到相應(yīng)的值,因而運(yùn)算量較小。查表法比較適合于非線性函數(shù)是周期函數(shù)或已知非線性函 數(shù)輸入值范圍這兩種情況,例3.12和例3.13分別說(shuō)明這兩種情況。例3.12 已知正弦函數(shù)y=cos(x),制作一個(gè)512點(diǎn)表格,并說(shuō)明查表方法。由于正弦函數(shù)是周期函數(shù),函數(shù)值在一1至+ 1之間,用查表法比較合適。由于Q15的表示范圍為1至32767/32768之間,原則上講1至+ 1的范圍必須用Q14表 示。但一般從方便和總體精度考慮,類似情況仍用Q15表示,此時(shí)+ 1用32767來(lái)表示。(1) 產(chǎn)生512點(diǎn)值的C語(yǔ)言程序如下所示:#define N 512#define pi 3.14159int s
39、in_tab512;voidmai n()int i;for(i=0;i<N;i+) sin_tabi=(int)(32767*sin(2*pi*i/N);(2) 查表查表實(shí)際上就是根據(jù)輸入值確定表的地址。設(shè)輸入x在02二之間,則x對(duì)應(yīng)于512點(diǎn)表的地址為:index = (int)(512*x/2 n),貝U y = sin(x) = sin_tabindex。如果x用Q12定點(diǎn)數(shù)表示,將 512/2二用Q8表示為20861,則計(jì)算正弦表的地址的公式 為:index = (x*20861L)>>20。例3.13 用查表法求以2為底的對(duì)數(shù),已知自變量取值范圍為0.51,要求將
40、自變量范圍均勻劃分為10等分。試制作這個(gè)表格并說(shuō)明查表方法。(1)做表:y = log2(x),由于x在0.5到1之間,因此y在-1到0之間,x和y均可用Q15表示。由于對(duì)x 均勻劃分為10段,因此,10段對(duì)應(yīng)于輸入x的范圍如表3.2所示。若每一段的對(duì)數(shù)值都取第1點(diǎn)的對(duì)數(shù)值,則表中第1段的對(duì)數(shù)值為yO(Q15) = (int)(log2(0.5) x 32768),第2段的對(duì)數(shù)值為y1(Q15) = (int)(log2(0.55) x 32768),依次類推。表3.2 logtabO 10點(diǎn)對(duì)數(shù)表(輸入0.51)地址輸入值對(duì)數(shù)值(Q15)00.500.55-3276810.550.60-28
41、26220.600.65-2414930.650.70-2036540.700.75-1686250.750.80-1360060.800.85-1054970.850.90-768380.900.95-498190.951.00-2425(2)查表:查表時(shí),先根據(jù)輸入值計(jì)算表的地址,計(jì)算方法為:index=(x -16384) x 20)>>15。式中,index就是查表用的地址。例如,已知輸入x= 26869,則index=6,因此y=- 10549。3 混合法(1)提高查表法的精度上述方法查表所得結(jié)果的精度隨表的大小而變化,表越大,則精度越高,但存儲(chǔ)量也 越大。當(dāng)系統(tǒng)的存儲(chǔ)量
42、有限而精度要求也較高時(shí),查表法就不太適合。那么能否在適當(dāng)增 加運(yùn)算量的情況下提高非線性運(yùn)算的精度呢?下面介紹一種查表結(jié)合少量運(yùn)算來(lái)計(jì)算非線 性函數(shù)的混合法,這種方法適用于在輸入變量的范圍內(nèi)函數(shù)呈單調(diào)變化的情形。混合法是在查表的基礎(chǔ)上采用計(jì)算的方法以提高當(dāng)輸入值處于表格兩點(diǎn)之間時(shí)的精 度。提高精度的一個(gè)簡(jiǎn)便方法是采用折線近似法,如圖3.1所示。仍以求以2為底的對(duì)數(shù)為例(例3.13)。設(shè)輸入值為x,則精確的對(duì)數(shù)值為 y,在表格值的 兩點(diǎn)之間作一直線,用 y/作為y的近似值,則有:y/= y°+ 二 y圖3.1提高精度的折線近似法其中y°由查表求得。現(xiàn)在只需在查表求得y°
43、;的基礎(chǔ)上增加Ay即可。厶y的計(jì)算方法如下:-y=( = xJ - x°) - y= - x( - y。/- X0)式中y0/X0對(duì)每一段來(lái)說(shuō)是一個(gè)恒定值,可作一 個(gè)表格直接查得。此外計(jì)算x時(shí)需用到每段橫坐標(biāo)的起始值,這個(gè)值也可作一個(gè)表格。這樣共有 三個(gè)大小均為10的表格,分別為存儲(chǔ)每段起點(diǎn)對(duì)數(shù)值的表logtab0、存儲(chǔ)每段丄y。/厶x。值的表 logtab1和存儲(chǔ)每段輸入起始值 X0的表Iogtab2,表 logtab1和表logtab2可用下列兩個(gè)數(shù)組表示:intIogtab110=22529,20567,18920,17517,16308,15255,14330,13511,1
44、2780,12124;I* yo/xo : Q13*/intIogtab210=16384,18022,19660,21299,22938,24576,26214,27853,29491,31130;/* x 0: Q15*/綜上所述,采用混合法計(jì)算對(duì)數(shù)值的方法可歸納為: 根據(jù)輸入值,計(jì)算查表地址:index=(x-16384) x 20)>>15; 查表得 y°=logtab0index; 計(jì)算 x=x- Iogtab2i ndex; 計(jì)算.:y= (. :xx Iogtab1index)>>13; 計(jì)算得結(jié)果y=y 0+ i y。例 3.14 已知 x=0
45、.54,求 Iog2(x)。0.54 的精確對(duì)數(shù)值為 y=Iog2(0.54)= -0.889。混合法求對(duì)數(shù)值的過(guò)程為: 定標(biāo) Q15,定標(biāo)值 x=0.54*32768=17694 ; 表地址 index=(x- 16384) x 20)>>15=0; 查表得 y°=logtab00= - 32768; 計(jì)算.:x=x-Iogtab20=17694 -16384=1310; 計(jì)算:y= (:xlogtab10)»13=(1310*22529L)>>13=3602; 計(jì)算結(jié)果 y=y°+ :y=-32768+3602=-29166。結(jié)果y為Q15定標(biāo),折算成浮點(diǎn)數(shù)為-29166/32768=-0.89,可見(jiàn)精度較高。(2)擴(kuò)大自變量范圍如上所述,查表法比較適用于周期函數(shù)或自變量的動(dòng)態(tài)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒行經(jīng)營(yíng)合作協(xié)議
- 山東山東農(nóng)業(yè)工程學(xué)院招聘筆試真題2024
- 河南省豫地科技集團(tuán)有限公司招聘筆試真題2024
- 石大學(xué)前兒童保育學(xué)課件3-2小兒常見(jiàn)病
- 企業(yè)民主管理制度建設(shè)的主要挑戰(zhàn)與瓶頸
- 分?jǐn)?shù)教學(xué)設(shè)計(jì)-游麗穎
- 產(chǎn)教融合對(duì)地方經(jīng)濟(jì)發(fā)展的推動(dòng)作用
- 2025至2030年中國(guó)玻璃馬克杯行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國(guó)燃油管總成行業(yè)投資前景及策略咨詢報(bào)告
- 學(xué)前教育論文答辯三分鐘陳述
- 數(shù)字醫(yī)療論文
- 二年級(jí)下冊(cè)數(shù)學(xué)無(wú)紙化測(cè)評(píng)方案
- 大學(xué)化學(xué)期末考試卷(含答案)
- 化工行業(yè)儀表典型事故分析報(bào)告
- 項(xiàng)目二送料小車自動(dòng)往返的電氣控制課件
- 物理降溫法與熱療技術(shù)試題
- 2017年12月大學(xué)英語(yǔ)四級(jí)真題試卷及答案(三套全)
- 汽車起重機(jī)日常檢查維修保養(yǎng)記錄表
- 抖音少兒短視頻創(chuàng)作大賽策劃方案-1
- 電動(dòng)機(jī)繞組布線接線彩色圖集目錄(第五版)
- 2023年上海市普通高中學(xué)業(yè)水平合格性考試化學(xué)試題( 含答案解析 )
評(píng)論
0/150
提交評(píng)論