版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、DSP芯片的定點(diǎn)運(yùn)算數(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ù) 0010000000000011b= 8195 二進(jìn)制數(shù) 1111111111111100 寧-4對(duì)DSP芯片而言,參與數(shù)值運(yùn)算的數(shù)就是16位的整型數(shù)。但在許多情況下,數(shù)學(xué)_
2、運(yùn)算過(guò) 程中的數(shù)不一定都是整數(shù)。那么,DSP芯片是如何處理小數(shù)的呢?應(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,
3、用Q15表示但對(duì)于DSP芯片來(lái)說(shuō),處理方法是完全相同的。從表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)換
4、關(guān)系可表示為:浮點(diǎn)數(shù)(x)轉(zhuǎn)換為定點(diǎn)數(shù)():定點(diǎn)數(shù)()轉(zhuǎn)換為浮點(diǎn)數(shù)(x):例如,浮點(diǎn)數(shù)x=0.5,定標(biāo)Q=15,則定點(diǎn)數(shù)=,式中表示下取整。反之,一個(gè)用Q = 15表 示的定點(diǎn)數(shù)16384,其浮點(diǎn)數(shù)為16384x2-15 = 16384/32768=0.5。表3.1 Q表示、S表示及數(shù)值范圍Q表示S表示十進(jìn)制數(shù)表示范圍Q15 S0.15 -1X0.9999695Q14 S1.14 -2X1.9999390Q13 S2.13 -4X3.9998779Q12 S3.12 -8X7.9997559Q11 S4.11 -16X15.9995117Q10 S5.10 -32X31.9990234Q9 S
5、6.9 -64X63.9980469Q8 S7.8 -128X127.9960938Q7 S8.7 -256X255.9921875Q6 S9.6 -512X511.9804375Q5 S10.5 -1024X1023.96875Q4 S11.4 -2048X2047.9375Q3 S12.3 -4096X4095.875Q2 S13.2 -8192X8191.75Q1 S14.1 -16384X16383.5Q0 S15.0 -32768X32767高級(jí)語(yǔ)言:從浮點(diǎn)到定點(diǎn)在編寫(xiě)DSP模擬算法時(shí),為了方便,一般都是采用高級(jí)語(yǔ)言(如C語(yǔ)言)來(lái)編寫(xiě)模擬程序。 程序中所用的變量一般既有整型數(shù),又有浮
6、點(diǎn)數(shù)。如例3.1程序中的變量i是整型數(shù),而pi 是浮點(diǎn)數(shù),hamwindow則是浮點(diǎn)數(shù)組。例3.1 256點(diǎn)漢明窗計(jì)算int i;float pi=3.14159;float hamwindow 【256】;for(i=0;iQy,加法/減法結(jié)果z的定標(biāo)值為Qz,則 z=x+y ?所以定點(diǎn)加法可以描述為:int x,y,z;long temp; /大臨時(shí)變量*/temp=y(QxQz),若 QxQzz = (int)(temp(QzQx),若 QxQz例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,則定
7、點(diǎn)加法為:x= 16384; y=25395;temp=253952)=29491;因?yàn)閦的Q值為13,所以定點(diǎn)值z(mì)=29491即為浮點(diǎn)值z(mì)=29491/8192=3.6。例3.3定點(diǎn)減法設(shè) x=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)?。乂。2,故z=(int)(-819Qy,加法結(jié)果z的定標(biāo)值為Qz,則定點(diǎn)加法為: int x, y;long temp, z;temp=y(Qx-Qz),
8、若 QxQzz=temp(Qz-Qx),若 Qx32767,因此Qx=1, Qy=0, Qz=0,則定點(diǎn)加法為:x=30000;y =20000;temp=200001 = 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ù)拇胧?,則數(shù)據(jù)溢出會(huì)導(dǎo)致運(yùn)算精度的嚴(yán)重 惡化。一般的定點(diǎn)DSP芯片都設(shè)有溢出保護(hù)功能,當(dāng)溢出保護(hù)功能有效時(shí),一旦出現(xiàn)溢出, 則累加
9、器ACC的結(jié)果為最大的飽和值(上溢為7FFFH,下溢為8001H),從而達(dá)到防止溢出 引起精度嚴(yán)重惡化的目的。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 ?=?所以定點(diǎn)表示的乘法為:int x,y,z;long temp;temp = (long)x;z = (tempxy) (Qx+Qy-Qz);例3.5定點(diǎn)乘法設(shè) x = 18.4, y = 36.8,則浮點(diǎn)運(yùn)算值為 z =18.4x36.8 = 677.12;根據(jù)上節(jié),得Qx = 10, Qy = 9
10、, Qz = 5,所以x = 18841; y = 18841;temp = 18841L;z = (18841L*18841)(10+9-5) = 354983281L14 = 21666;因?yàn)閦的定標(biāo)值為5,故定點(diǎn)z = 21666即為浮點(diǎn)的z = 21666/32 = 677.08。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 ?=?所以定點(diǎn)表示的除法為:int x,y,z;long temp;temp = (long)x;z = (tem
11、p(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 = (long)18841;z = (18841L(15-10+9)/18841 = 308690944L/18841 = 16384;因?yàn)樯蘻的定標(biāo)值為15,所以定點(diǎn)z = 16384即為浮點(diǎn)z = 16384/215= 0.5。2.4程序變量的Q值確定在前面幾節(jié)介紹的例子中,由于x、y、z的值都是已知的,因此從浮點(diǎn)變?yōu)槎c(diǎn)
12、時(shí)Q值很 好確定。在實(shí)際的DSP應(yīng)用中,程序中參與運(yùn)算的都是變量,那么如何確定浮點(diǎn)程序中變 量的Q值呢?從前面的分析可以知道,確定變量的Q值實(shí)際上就是確定變量的動(dòng)態(tài)范圍,動(dòng)態(tài)范圍確定 了,則Q值也就確定了。設(shè)變量的絕對(duì)值的最大值為,注意必須小于或等于32767。取一個(gè)整數(shù)n,使它滿足則有Q = 15-n例如,某變量的值在-1至+ 1之間,即1,因此n = 0,Q=15-n = 15。確定了變量的就可以確定其Q值,那么變量的又是如何確定的呢? 一般來(lái)說(shuō),確定變量 的有兩種方法:一種是理論分析法,另一種是統(tǒng)計(jì)分析法。理論分析法有些變量的動(dòng)態(tài)范圍通過(guò)理論分析是可以確定的。例如:三角函數(shù),y = si
13、n(x)或y = cos(x),由三角函數(shù)知識(shí)可知,|y|1;(2)漢明窗,y(n) = 0.54-0.46cos【2?n/(N-1)】,0nN-1。因?yàn)?1cos【2?n/(N-1)】1,所 以 0.08y(n)1.0;FIR卷積。y(n)=,設(shè),且x(n)是模擬信號(hào)12位量化值,即有211,則211;(4)理論已經(jīng)證明,在自相關(guān)線性預(yù)測(cè)編碼(LPC)的程序設(shè)計(jì)中,反射系數(shù)滿足下列不等式:,i= 1,2,.,p, p 為 LPC 的階數(shù)。統(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)范圍,這里輸
14、入信號(hào)一方面要有 一定的數(shù)量,另一方面必須盡可能地涉及各種情況。例如,在語(yǔ)音信號(hào)分析中,統(tǒng)計(jì)分析時(shí) 就必須采集足夠多的語(yǔ)音信號(hào)樣值,并且在所采集的語(yǔ)音樣值中,應(yīng)盡可能地包含各種情況, 如音量的大小、聲音的種類(lèi)(男聲、女聲)等。只有這樣,統(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)行低通濾波的
15、C語(yǔ)言程序,低通濾波的截止頻率為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 const int length = 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 h 【19】=0.01218354,-0.009012882,-
16、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 x1 【length+20】;/大低通濾波浮點(diǎn)子程序*/void filter(int xin【】,int xout【】,int n,float h【】)int i,j;float sum;f
17、or(i=0;ilength;i+) x1【n+i-1】 =xin;for (i=0;ilength;i+)sum=0.0;for(j=0;jn;j+) sum+=h【j】*x1【i-j+n-1】;xout=(int)sum;for(i=0;i(n-1);i+) x1【n-i-2】 =xin【length-1-i】;/大主程序*/void main( )FILE *fp1,*fp2;int ,indata length ,outdata length;fp1=fopen(insp.dat,rb); / 大輸入語(yǔ)音文件*/fp2=fopen(outsp.dat,wb); / 大濾波后語(yǔ)音文件*/
18、=0;while(feof(fp1)=0)+;printf(=%dn”,);for(i=0;ilength;i+) indata=getw(fp1); / 大取一幀語(yǔ)音數(shù)據(jù)*/filter(indata,outdata,19,h); / 大調(diào)用低通濾波子程序*/for(i=0;ilength;i+) putw(outdata,fp2); / 大將濾波后的樣值寫(xiě)入文件*/ fcloseall( ); /大關(guān)閉文件*/return(0);例3.8語(yǔ)音信號(hào)800Hz 19點(diǎn)FIR低通濾波C語(yǔ)言定點(diǎn)程序# i nclude const int length=180;void filter(int xi
19、n【】,int xout【】,int n,int h );static int h 19 =399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,7503,5061,2112,-285,-1503,-1555,-945,-296,399; / 大Q15*/static int x1 【length+20】;/大低通濾波定點(diǎn)子程序*/void filter(int xin【】,int xout【】,int n,int h )int i,j;long sum;for(i=0;ilength;i+) x1 n+i-1 =xin;for (i=0;ile
20、ngth;i+)sum=0;for(j=0;j15;for(i=0;i(n-1);i+) x1【n-i-2】 =xin【length-i-1】;主程序與浮點(diǎn)的完全一樣。3.3 DSP定點(diǎn)算術(shù)運(yùn)算定點(diǎn)DSP芯片的數(shù)值表示是基于2的補(bǔ)碼表示形式。每個(gè)16位數(shù)用1個(gè)符號(hào)位、i個(gè)整數(shù) 位和15-i個(gè)小數(shù)位來(lái)表示。因此數(shù)00000010.10100000表示的值為=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 格
21、式表示的小數(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ò)程以注意可能的溢出情況。下 面討論乘法、加法和除法的DSP定點(diǎn)運(yùn)算,匯編程序以TMS320C25為例。3.3.1定點(diǎn)乘法2個(gè)定點(diǎn)數(shù)相乘時(shí)可以分為下列3種情況:小數(shù)乘小數(shù)Q15xQ15=Q30例 3.9 0.5*0.5 = 0.250.100000000000000 ; Q15x 0.100000000000000 ; Q1500.01000000000000000000000000
22、0000=0.25 ; Q302個(gè)Q15的小數(shù)相乘后得到1個(gè)Q30的小數(shù),即有2個(gè)符號(hào)位。一般情況下相乘后得到的 滿精度數(shù)不必全部保留,而只需保留16位單精度數(shù)。由于相乘后得到的高16位不滿15位 的小數(shù)精度,為了達(dá)到15位精度,可將乘積左移1位,下面是上述乘法的TMS320C25程 序:LT OP1 ; OP1=4000H(0.5/Q15)MPY OP2 ; OP2=4000H(0.5/Q15)PACSACH ANS,1 ; ANS=2000H(0.25/Q15)整數(shù)乘整數(shù)Q0 xQ0 = Q0例 3.10 17x(-5)=-850000000000010001=17x 1111111111
23、111011=-511111111111111111111111110101011=-85混合表示法許多情況下,運(yùn)算過(guò)程中為了既滿足數(shù)值的動(dòng)態(tài)范圍又保證一定的精度,就必須采用Q0與 Q15之間的表示法。比如,數(shù)值1.2345,顯然Q15無(wú)法表示,而若用Q0表示,則最接近的 數(shù)是1,精度無(wú)法保證。因此,數(shù)1.2345最佳的表示法是Q14。例 3.11 1.5x0.75 = 1.12501.10000000000000 = 1.5 ; Q14x 00.11000000000000 = 0.75 ; Q140001.0010000000000000000000000000 = 1.125;Q28Q1
24、4的最大值不大于2,因此,2個(gè)Q14數(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 程序如下:LT OP1 ;OP1 = 6000H(1.5/Q14)MPY OP2 ;OP2 = 3000H(0.
25、75/Q14)PACSACH ANS,1 ;ANS=2400H(1.125/Q13)上述方法為了保證精度均對(duì)乘的結(jié)果舍位,結(jié)果所產(chǎn)生的誤差相當(dāng)于減去1個(gè)LSB(最低位)。 采用下面簡(jiǎn)單的舍入方法,可使誤差減少二分之一。LT OP1MPY OP2PACADD ONE, 14 (上舍入)SACH ANS,1上述程序說(shuō)明,不管ANS為正或負(fù),所產(chǎn)生的誤差是1/2 LSB,其中存儲(chǔ)單元ONE的值為 1。3.3.2定點(diǎn)加法乘的過(guò)程中,程序員可不考慮溢出而只需調(diào)整運(yùn)算中的小數(shù)點(diǎn)。而加法則是一個(gè)更加復(fù)雜的 過(guò)程。首先,加法運(yùn)算必須用相同的Q點(diǎn)表示;其次,程序員或者允許其結(jié)果有足夠的高 位以適應(yīng)位的增長(zhǎng),或者
26、必須準(zhǔn)備解決溢出問(wèn)題。如果操作數(shù)僅為16位長(zhǎng),其結(jié)果可用雙 精度數(shù)表示。下面舉例說(shuō)明16位數(shù)相加的兩種途徑。保留32位結(jié)果LAC OP1 ;(Q15)ADD OP2 ;(Q15)SACH ANSHI ;(高 16 位結(jié)果)SACL ANSLO ;(低 16 位結(jié)果)調(diào)整小數(shù)點(diǎn)保留16位結(jié)果LAC OP1,15 ;(Q14 數(shù)用 ACCH 表示)ADD OP2,15 ;(Q14 數(shù)用 ACCH 表示)SACH ANS ;(Q14)加法運(yùn)算最可能出現(xiàn)的問(wèn)題是運(yùn)算結(jié)果溢出。TMS320提供了檢查溢出的專(zhuān)用指令BV,此 外,使用溢出保護(hù)功能可使累加結(jié)果溢出時(shí)累加器飽和為最大的整數(shù)或負(fù)數(shù)。當(dāng)然,即使如
27、此,運(yùn)算精度還是大大降低。因此,最好的方法是完全理解基本的物理過(guò)程并注意選擇數(shù)的 表達(dá)方式。3.3.3定點(diǎn)除法在通用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)算,如果能減則將位插入商中。除數(shù)的最低有效位對(duì)齊被除數(shù)的最高有效位。000010100001100011110010由于減法結(jié)果為負(fù),放棄減法結(jié)果,將被除數(shù)左移一位再減。000101000
28、001100011111000結(jié)果仍為負(fù),放棄減法結(jié)果,被除數(shù)左移一位再減。001010000001100000010000結(jié)果為正,將減法結(jié)果左移一位后加1,作最后一次減。001000010001100000001001(5)結(jié)果為正,將結(jié)果左移一位加1得最后結(jié)果。高4位代表余數(shù),低4位表示商。00010011即商為0011=3,余數(shù)為0001=1。TMS320沒(méi)有專(zhuān)門(mén)的除法指令,但使用條件減指令SUBC可以完成有效靈活的除法功能。使 用這一指令的唯一限制是兩個(gè)操作數(shù)必須為正。程序員必須事先了解其可能的運(yùn)算數(shù)的特 性,如其商是否可以用小數(shù)表示及商的精度是否可被計(jì)算出來(lái)。這里每一種考慮可影響如
29、何 使用SUBC指令的問(wèn)題。下面給出兩種不同情況下的TMS320C25除法程序。分子小于分母DIV_A:LT NUMERAMPY DENOMPACSACH TEMSGN ;取商的符號(hào)LAC DENOMABSSACL DENOM ;使分母為正ZALH NUMERA ;使分子為正ABSRPTK 14SUBC DENOM ;除循環(huán)15次SACL QUOTLAC TEMSGNBGEZ A1 ;若符號(hào)為正,則完成ZACSUB QUOTSACL QUOT ;若為負(fù),則商為負(fù)A1: RET這個(gè)程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN為暫 存單元。規(guī)定商的精度DIV_B
30、:LT NUMERAMPY DENOMPACSACH TEMSGN ;取商的符號(hào)LAC DENOMABSSACL DENOM ;使分母為正LACK 15ADD FRACSACL FRAC ;計(jì)算循環(huán)計(jì)數(shù)器LAC NUMERAABS ;使分子為正RPT FRACSUBC DENOM ;除循環(huán) 16+FRAC 次SACL QUOTLAC TEMSGNBGEZ B1 ;若符號(hào)為正,則完成ZACSUB QUOTSACL QUOT ;若為負(fù),則商為負(fù)B1: RET與DIV_A相同,這個(gè)程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中, TEMSGN為暫存單元。FRAC中規(guī)定商的精度,如
31、商的精度為Q13,則調(diào)用程序前FRAC 單元中的值應(yīng)為13。3.4非線性運(yùn)算的定點(diǎn)快速實(shí)現(xiàn)在數(shù)值運(yùn)算中,除基本的加減乘除運(yùn)算外,還有其他許多非線性運(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)混合法。下面分別介紹這三種方法。調(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
32、為 底的常用對(duì)數(shù)log10():# include double log10(double 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)用。查表法在實(shí)時(shí)DSP應(yīng)用中實(shí)現(xiàn)非線性運(yùn)算,一般都采取適當(dāng)降低運(yùn)算精度來(lái)提高程序的運(yùn)算速度。 查表法是快速實(shí)現(xiàn)非線性運(yùn)算最常用的方法。采用這種方法必須根據(jù)自變量的范圍和精度要 求制作一張表格。顯然輸入的范圍越大,精度要求越高,則所需
33、的表格就越大,即存儲(chǔ)量也 越大。查表法求值所需的計(jì)算就是根據(jù)輸入值確定表的地址,根據(jù)地址就可得到相應(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表 示。但一般從方便和總體精度考慮,類(lèi)似情況仍用Q15表示,此時(shí)+ 1用32767來(lái)表示。產(chǎn)生512點(diǎn)值的C語(yǔ)言程序如
34、下所示:#define N 512#define pi 3.14159int sin_tab【512】;void main()int i;for(i=0;i20。例3.13用查表法求以2為底的對(duì)數(shù),已知自變量取值范圍為0.51,要求將自變量范圍均勻劃 分為10等分。試制作這個(gè)表格并說(shuō)明查表方法。(1)做表:y = log2(x),由于x在0.5到1之間,因此y在-1到0之間,x和y均可用Q15表示。由于 對(duì)x均勻劃分為10段,因此,10段對(duì)應(yīng)于輸入乂的范圍如表3.2所示。若每一段的對(duì)數(shù)值 都取第1點(diǎn)的對(duì)數(shù)值,則表中第1段的對(duì)數(shù)值為y0(Q15) = (int)(log2(0.5)x32768)
35、,第2段的 對(duì)數(shù)值為 y1(Q15) = (int)(log2(0.55)x32768),依次類(lèi)推。表3.2 logtab0 10點(diǎn)對(duì)數(shù)表(輸入0.51)地址輸入值對(duì)數(shù)值(Q15)0 0.500.55 -327680.550.60 -282620.600.65 -241490.650.70 -203650.700.75 -168620.750.80 -136000.800.85 -105490.850.90 -76830.900.95 -49810.951.00 -2425(2)查表:查表時(shí),先根據(jù)輸入值計(jì)算表的地址,計(jì)算方法為:index=(x-16384)x20)15。式中,index 就
36、是查表用的地址。例如,已知輸入x= 26869,則index=6,因此y=-10549。3 .混合法(1)提高查表法的精度上述方法查表所得結(jié)果的精度隨表的大小而變化,表越大,則精度越高,但存儲(chǔ)量也越大。 當(dāng)系統(tǒng)的存儲(chǔ)量有限而精度要求也較高時(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)
37、。設(shè)輸入值為x,則精確的對(duì)數(shù)值為y,在表格值的兩 點(diǎn)之間作一直線,用y作為y的近似值,則有:y,=y0+ y其中y0由查表求得。現(xiàn)在只需在查表求得y0的基礎(chǔ)上增加y即可。y的計(jì)算方法如下:y=( x/ x0) y= x( y0/ 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ǔ)每段y0/ x0值的表logtab1和存儲(chǔ)每段輸入起始值x0的 表logtab2,表logtab1和表logtab2可用下列兩個(gè)數(shù)組表示:int logta
38、b1【10】 =22529,20567,18920,17517,16308,15255,14330,13511,12780,12124; / 大 y0/ x0 : Q13*/int logtab2【10】 =16384,18022,19660,21299,22938,24576,26214,27853,29491,31130; / 大 x0: Q15*/綜上所述,采用混合法計(jì)算對(duì)數(shù)值的方法可歸納為:根據(jù)輸入值,計(jì)算查表地址:index=(x-16384)x20)15;查表得y0=logtab0【index】;計(jì)算 x=x-logtab2【index】;計(jì)算 y=( xxlogtab1【inde
39、x】 )13;計(jì)算得結(jié)果y=y0+ y。例 3.14 已知 x=0.54,求 log2(x)。0.54 的精確對(duì)數(shù)值為 y=log2(0.54)=-0.889?;旌戏ㄇ髮?duì)數(shù)值的過(guò)程為:定標(biāo) Q15,定標(biāo)值 x=0.54*32768=17694;表地址 index=(x-16384)x20)15=0;查表得 y0=logtab0【0】=-32768;計(jì)算 x=x-logtab2【0】=17694-16384=1310;計(jì)算 y=( xlogtabl【0】)13=(1310*22529L)13=3602;計(jì)算結(jié)果 y=y0+ 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)范圍不是太大的情形。對(duì)于像對(duì)數(shù)這 樣的非線性函數(shù),輸入值
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 關(guān)于大學(xué)寒假實(shí)習(xí)報(bào)告匯編10篇
- 關(guān)于感恩父母演講稿范文合集五篇
- 去年的樹(shù)讀后感心得體會(huì)
- 總經(jīng)理述職報(bào)告8篇
- 除夕話題作文15篇
- 單位老員工辭職報(bào)告(合集7篇)
- 大學(xué)生認(rèn)識(shí)實(shí)習(xí)報(bào)告匯編6篇
- 社保離職證明(集錦15篇)
- 學(xué)生作業(yè)檢查記錄表
- 銷(xiāo)售業(yè)務(wù)合作協(xié)議書(shū)
- GB/T 45014-2024聚合物基復(fù)合材料層壓板緊固件拉脫阻抗試驗(yàn)方法
- 傳播學(xué)(東北林業(yè)大學(xué))知到智慧樹(shù)章節(jié)答案
- 2024年安全員之A證考試題庫(kù)及完整答案(網(wǎng)校專(zhuān)用)
- 2024-2025學(xué)年人教新版九年級(jí)上冊(cè)數(shù)學(xué)期末復(fù)習(xí)試卷(含詳解)
- Python數(shù)據(jù)科學(xué)方法與實(shí)踐(山東聯(lián)盟)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋山東師范大學(xué)
- 2024年01月11185行政領(lǐng)導(dǎo)學(xué)期末試題答案
- 績(jī)效考核辦法1
- 【MOOC】外科護(hù)理學(xué)-中山大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 北京市《配電室安全管理規(guī)范》(DB11T 527-2021)地方標(biāo)準(zhǔn)
- 2024中考語(yǔ)文《儒林外史》歷年真題專(zhuān)練(學(xué)生版+解析版)
- 中醫(yī)醫(yī)療技術(shù)手冊(cè)2013普及版
評(píng)論
0/150
提交評(píng)論