DSP芯片的定點運算_第1頁
DSP芯片的定點運算_第2頁
DSP芯片的定點運算_第3頁
DSP芯片的定點運算_第4頁
DSP芯片的定點運算_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第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ù)0010000000000011b8195二進制數(shù)1111111111111100b-4對DSP芯片而言,參與數(shù)值運算的數(shù)就是16位的整型數(shù)。但在許多情況下,數(shù)學運

2、算過程中的數(shù)不一定都是整數(shù)。那么,DSP芯片是如何處理小數(shù)的呢?應(yīng)該說,DSP芯片本身無能為力。那么是不是說DSP芯片就不能處理各種小數(shù)呢?當然不是。這其中的關(guān)鍵就是由程序員來確定一個數(shù)的小數(shù)點處于16位中的哪一位。這就是數(shù)的定標。通過設(shè)定小數(shù)點在16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標有Q表示法和S表示法兩種。表3.1列出了一個16位數(shù)的16種Q表示、S表示及它們所能表示的十進制數(shù)值范圍。從表3.1可以看出,同樣一個16位數(shù),若小數(shù)點設(shè)定的位置不同,它所表示的數(shù)也就不同。例如:16進制數(shù)2000H8192,用Q0表示16進制數(shù)2000H0.25,用Q15表示但對于

3、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ù)值范圍,必須以犧牲精度為代價;而想提高精度,則數(shù)的表示范圍就相應(yīng)地減小。在實際的定點算法中,為了達到最佳的性能,必須充分考慮到這一點。浮點數(shù)與定點數(shù)的轉(zhuǎn)換關(guān)系可表示為:浮點數(shù)(x)

4、轉(zhuǎn)換為定點數(shù)():定點數(shù)()轉(zhuǎn)換為浮點數(shù)(x):例如,浮點數(shù) x=0.5,定標 Q15,則定點數(shù),式中表示下取整。反之,一個用 Q15 表示的定點數(shù)16384,其浮點數(shù)為16384×2-1516384/32768=0.5。表3.1 Q表示、S表示及數(shù)值范圍Q表示S表示十進制數(shù)表示范圍Q15S0.15-1X0.9999695Q14S1.14-2X1.9999390Q13S2.13-4X3.9998779Q12S3.12-8X7.9997559Q11S4.11-16X15.9995117Q10S5.10-32X31.9990234Q9S6.9-64X63.9980469Q8S7.8-12

5、8X127.9960938Q7S8.7-256X255.9921875Q6S9.6-512X511.9804375Q5S10.5-1024X1023.96875Q4S11.4-2048X2047.9375Q3S12.3-4096X4095.875Q2S13.2-8192X8191.75Q1S14.1-16384X16383.5Q0S15.0-32768X327673.2 高級語言:從浮點到定點在編寫DSP模擬算法時,為了方便,一般都是采用高級語言(如C語言)來編寫模擬程序。程序中所用的變量一般既有整型數(shù),又有浮點數(shù)。如例3.1程序中的變量i是整型數(shù),而pi是浮點數(shù),hamwindow則是浮點數(shù)

6、組。例3.1 256點漢明窗計算inti;floatpi=3.14159;floathamwindow256;for(i=0;i<256;i+) hamwindowi=0.54-0.46*cos(2.0*pi*i/255);如果要將上述程序用某種定點DSP芯片來實現(xiàn),則需將上述程序改寫為DSP芯片的匯編語言程序。為了DSP程序調(diào)試的方便及模擬定點DSP實現(xiàn)時的算法性能,在編寫DSP匯編程序之前一般需將高級語言浮點算法改寫為高級語言定點算法。下面討論基本算術(shù)運算的定點實現(xiàn)方法。3.2.1 加法/減法運算的C語言定點模擬設(shè)浮點加法運算的表達式為:float x,y,z;z=x+y;將浮點加法

7、/減法轉(zhuǎn)化為定點加法/減法時最重要的一點就是必須保證兩個操作數(shù)的定標值一樣。若兩者不一樣,則在做加法/減法運算前先進行小數(shù)點的調(diào)整。為保證運算精度,需使Q值小的數(shù)調(diào)整為與另一個數(shù)的Q值一樣大。此外,在做加法/減法運算時,必須注意結(jié)果可能會超過16位表示。如果加法/減法的結(jié)果超出16位的表示范圍,則必須保留32位結(jié)果,以保證運算的精度。1結(jié)果不超過16位表示范圍設(shè)x的Q值為Qx,y的Q值為Qy,且Qx>Qy,加法/減法結(jié)果z的定標值為Qz,則zx+y Þ= Þ所以定點加法可以描述為:int x,y,z;long temp;/*臨時變量*/tempy<<(Qx

8、Qy);tempxtemp;z(int)(temp>>(QxQz), 若QxQzz(int)(temp<<(QzQx), 若QxQz例3.2 定點加法設(shè)x0.5,y3.1,則浮點運算結(jié)果為zx+y0.5+3.13.6;Qx15,Qy13,Qz13,則定點加法為:x16384;y25395;temp25395<<2101580;tempx+temp16384+101580117964;z(int)(117964L>>2)29491;因為z的Q值為13,所以定點值z29491即為浮點值z29491/81923.6。例3.3 定點減法設(shè)x3.0,y3.

9、1,則浮點運算結(jié)果為zx-y3.0-3.1-0.1;Qx13,Qy13,Qz15,則定點減法為:x24576;y25295;temp25395;tempx-temp24576-25395-819;因為Qx<Qz,故 z(int)(-819<<2)-3276。由于z的Q值為15,所以定點值z-3276即為浮點值z-3276/32768»-0.1。2結(jié)果超過16位表示范圍設(shè)x的Q值為Qx,y的Q值為Qy,且Qx>Qy,加法結(jié)果z的定標值為Qz,則定點加法為:int x,y;long temp,z;tempy<<(Qx-Qy);tempxtemp;zte

10、mp>>(Qx-Qz),若QxQzztemp<<(Qz-Qx),若QxQz例3.4 結(jié)果超過16位的定點加法設(shè)x15000,y20000,則浮點運算值為zxy35000,顯然z>32767,因此Qx1,Qy0,Qz0,則定點加法為:x30000;y20000;temp20000<<140000;temptemp+x40000+3000070000;z70000L>>135000;因為z的Q值為0,所以定點值z=35000就是浮點值,這里z是一個長整型數(shù)。當加法或加法的結(jié)果超過16位表示范圍時,如果程序員事先能夠了解到這種情況,并且需要保證運

11、算精度時,則必須保持32位結(jié)果。如果程序中是按照16位數(shù)進行運算的,則超過16位實際上就是出現(xiàn)了溢出。如果不采取適當?shù)拇胧?,則數(shù)據(jù)溢出會導致運算精度的嚴重惡化。一般的定點DSP芯片都設(shè)有溢出保護功能,當溢出保護功能有效時,一旦出現(xiàn)溢出,則累加器ACC的結(jié)果為最大的飽和值(上溢為7FFFH,下溢為8001H),從而達到防止溢出引起精度嚴重惡化的目的。3.2.2 乘法運算的C語言定點模擬設(shè)浮點乘法運算的表達式為:float x,y,z;z = xy;假設(shè)經(jīng)過統(tǒng)計后x的定標值為Qx,y的定標值為Qy,乘積z的定標值為Qz,則z = xy Þ= Þ =所以定點表示的乘法為:int

12、x,y,z;long temp;temp = (long)x;z = (temp×y) >> (Qx+Qy-Qz);例3.5 定點乘法設(shè)x = 18.4,y = 36.8,則浮點運算值為z =18.4×36.8 = 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;因為z的定標值為5,故定點 z = 21666即為浮點的 z = 21666/

13、32 = 677.08。3.2.3 除法運算的C語言定點模擬設(shè)浮點除法運算的表達式為:float x,y,z;z = x/y;假設(shè)經(jīng)過統(tǒng)計后被除數(shù)x的定標值為Qx,除數(shù)y的定標值為Qy,商z的定標值為Qz,則z = x/y Þ = Þ所以定點表示的除法為:int x,y,z;long temp;temp = (long)x;z = (temp<<(Qz-Qx+Qy)/y;例3.6 定點除法設(shè)x = 18.4,y = 36.8,浮點運算值為z = x/y = 18.4/36.8 = 0.5;根據(jù)上節(jié),得Qx = 10,Qy = 9,Qz = 15;所以有x = 1

14、8841, y = 18841;temp = (long)18841;z = (18841L<<(15-10+9)/18841 = 308690944L/18841 = 16384;因為商z的定標值為15,所以定點z = 16384即為浮點 z = 16384/215= 0.5。3.2.4 程序變量的Q值確定在前面幾節(jié)介紹的例子中,由于x、y、z的值都是已知的,因此從浮點變?yōu)槎c時Q值很好確定。在實際的DSP應(yīng)用中,程序中參與運算的都是變量,那么如何確定浮點程序中變量的Q值呢?從前面的分析可以知道,確定變量的Q值實際上就是確定變量的動態(tài)范圍,動態(tài)范圍確定了,則Q值也就確定了。設(shè)變量

15、的絕對值的最大值為,注意必須小于或等于32767。取一個整數(shù)n,使它滿足則有Q = 15-n例如,某變量的值在-1至1之間,即<1,因此n = 0,Q15-n = 15。確定了變量的就可以確定其Q值,那么變量的又是如何確定的呢?一般來說,確定變量的有兩種方法:一種是理論分析法,另一種是統(tǒng)計分析法。1理論分析法有些變量的動態(tài)范圍通過理論分析是可以確定的。例如:(1) 三角函數(shù),y = sin(x)或y = cos(x),由三角函數(shù)知識可知,|y|1;(2) 漢明窗,y(n) = 0.54-0.46cos 2pn/(N-1) ,0nN-1。因為-1cos 2pn/(N-1)1,所以0.08y

16、(n)1.0;(3) FIR卷積。y(n)=,設(shè),且x(n)是模擬信號12位量化值,即有 211,則211;(4) 理論已經(jīng)證明,在自相關(guān)線性預測編碼(LPC)的程序設(shè)計中,反射系數(shù)滿足下列不等式:,i= 1,2,p, p為LPC的階數(shù)。2統(tǒng)計分析法對于理論上無法確定范圍的變量,一般采用統(tǒng)計分析的方法來確定其動態(tài)范圍。所謂統(tǒng)計分析,就是用足夠多的輸入信號樣值來確定程序中變量的動態(tài)范圍,這里輸入信號一方面要有一定的數(shù)量,另一方面必須盡可能地涉及各種情況。例如,在語音信號分析中,統(tǒng)計分析時就必須采集足夠多的語音信號樣值,并且在所采集的語音樣值中,應(yīng)盡可能地包含各種情況,如音量的大小、聲音的種類(男

17、聲、女聲) 等。只有這樣,統(tǒng)計出來的結(jié)果才能具有典型性。當然,統(tǒng)計分析畢竟不可能涉及所有可能發(fā)生的情況,因此,對統(tǒng)計得出的結(jié)果在程序設(shè)計時可采取一些保護措施,如適當犧牲一些精度,Q值取比統(tǒng)計值稍大些,使用DSP芯片提供的溢出保護功能等。3.2.5 浮點至定點變換的C程序舉例本節(jié)通過一個例子來說明C程序從浮點變換至定點的方法。這是一個對語音信號(0.3kHz3.4kHz)進行低通濾波的C語言程序,低通濾波的截止頻率為800Hz,濾波器采用19點的有限沖擊響應(yīng)FIR濾波。語音信號的采樣頻率為8kHz,每個語音樣值按16位整型數(shù)存放在insp.dat文件中。例3.7 語音信號800Hz 19點FIR

18、低通濾波C語言浮點程序#include <stdio.h>const int length = 180/*語音幀長為180點22.5ms8kHz采樣*/void filter(int xin ,int xout ,int n,float h ); /*濾波子程序說明*/*19點濾波器系數(shù)*/static float h19=0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,0.2289794,0.154465

19、5,0.06446265,-0.008692503,-0.04584568,-0.04743239,-0.02881839,-0.009012882,0.01218354;static int x1length+20;/*低通濾波浮點子程序*/void filter(int xin ,int xout ,int n,float h )int i,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=(i

20、nt)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");/*輸入語音文件*/fp2=fopen(outsp.dat,"wb");/*濾波后語音文件*/frame=0;while(feof(fp1)=0)frame+;printf("frame=%dn",frame);for(i=0;i<len

21、gth;i+) indatai=getw(fp1); /*取一幀語音數(shù)據(jù)*/filter(indata,outdata,19,h);/*調(diào)用低通濾波子程序*/for(i=0;i<length;i+) putw(outdatai,fp2); /*將濾波后的樣值寫入文件*/fcloseall( );/*關(guān)閉文件*/return(0);例3.8 語音信號800Hz 19點FIR低通濾波C語言定點程序 #include <stdio.h>const int length=180;void filter(int xin ,int xout ,int n,int h );static i

22、nt h19=399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450, 7503,5061,2112,-285,-1503,-1555,-945,-296,399; /*Q15*/static int x1length+20;/*低通濾波定點子程序*/void filter(int xin ,int xout ,int n,int h )int i,j;long sum;for(i=0;i<length;i+) x1n+i-1=xini;for (i=0;i<length;i+)sum=0;for(j=0;j<n;j+) sum+

23、=(long)hj*x1i-j+n-1;xouti=sum>>15;for(i=0;i<(n-1);i+) x1n-i-2=xinlength-i-1;主程序與浮點的完全一樣。3.3 DSP定點算術(shù)運算定點DSP芯片的數(shù)值表示是基于2的補碼表示形式。每個16位數(shù)用1個符號位、i個整數(shù)位和15-i個小數(shù)位來表示。因此數(shù)00000010.10100000表示的值為=2.625,這個數(shù)可用Q8格式(個小數(shù)位)來表示,它表示的數(shù)值范圍為-128+127.996,一個Q8定點數(shù)的小數(shù)精度為1/256=0.004。雖然特殊情況(如動態(tài)范圍和精度要求)必須使用混合表示法,但是,更通常的是全

24、部以Q15格式表示的小數(shù)或以Q0格式表示的整數(shù)來工作。這一點對于主要是乘法和累加的信號處理算法特別現(xiàn)實,小數(shù)乘以小數(shù)得小數(shù),整數(shù)乘以整數(shù)得整數(shù)。當然,乘積累加時可能會出現(xiàn)溢出現(xiàn)象,在這種情況下,程序員應(yīng)當了解數(shù)學里面的物理過程以注意可能的溢出情況。下面討論乘法、加法和除法的DSP定點運算,匯編程序以TMS320C25為例。3.3.1 定點乘法2個定點數(shù)相乘時可以分為下列3種情況:1小數(shù)乘小數(shù)Q15×Q15Q30例3.9 0.5*0.5 = 0.250.100000000000000;Q15×0.100000000000000;Q1500.010000000000000000

25、000000000000=0.25 ;Q302個Q15的小數(shù)相乘后得到1個Q30的小數(shù),即有2個符號位。一般情況下相乘后得到的滿精度數(shù)不必全部保留,而只需保留16位單精度數(shù)。由于相乘后得到的高16位不滿15位的小數(shù)精度,為了達到15位精度,可將乘積左移1位,下面是上述乘法的TMS320C25程序:LTOP1;OP1=4000H(0.5/Q15)MPYOP2 ;OP2=4000H(0.5/Q15)PACSACHANS,1;ANS=2000H(0.25/Q15)2整數(shù)乘整數(shù)Q0×Q0 = Q0例3.10 17×(-5)=-850000000000010001=17×1

26、111111111111011=-511111111111111111111111110101011=-853混合表示法許多情況下,運算過程中為了既滿足數(shù)值的動態(tài)范圍又保證一定的精度,就必須采用Q0與Q15之間的表示法。比如,數(shù)值1.2345,顯然Q15無法表示,而若用Q0表示,則最接近的數(shù)是1,精度無法保證。因此,數(shù)1.2345最佳的表示法是Q14。例3.11 1.5×0.75 = 1.12501.10000000000000 = 1.5 ;Q14×00.11000000000000 = 0.75 ;Q140001.0010000000000000000000000000

27、 = 1.125;Q28Q14的最大值不大于2,因此,2個Q14數(shù)相乘得到的乘積不大于4。一般的,若一個數(shù)的整數(shù)位為 i位,小數(shù)位為 j 位,另一個數(shù)的整數(shù)位為 m 位,小數(shù)位為 n 位,則這兩個數(shù)的乘積為 ( i + m )位整數(shù)位和(j + n)位小數(shù)位。這個乘積的最高16位可能的精度為( i + m )整數(shù)位和(15 - i - m)小數(shù)位。但是,若事先了解數(shù)的動態(tài)范圍,就可以增加數(shù)的精度。例如,程序員了解到上述乘積不會大于1.8,就可以用Q14數(shù)表示乘積,而不是理論上的最佳情況Q13。例3.11的TMS320C25程序如下:LTOP1;OP1 = 6000H(1.5/Q14)MPYOP

28、2;OP2 = 3000H(0.75/Q14)PACSACHANS,1;ANS2400H(1.125/Q13)上述方法為了保證精度均對乘的結(jié)果舍位,結(jié)果所產(chǎn)生的誤差相當于減去1個LSB(最低位)。采用下面簡單的舍入方法,可使誤差減少二分之一。LTOP1MPYOP2PACADDONE,14(上舍入)SACHANS,1上述程序說明,不管ANS為正或負,所產(chǎn)生的誤差是1/2 LSB,其中存儲單元ONE的值為1。3.3.2 定點加法乘的過程中,程序員可不考慮溢出而只需調(diào)整運算中的小數(shù)點。而加法則是一個更加復雜的過程。首先,加法運算必須用相同的Q點表示;其次,程序員或者允許其結(jié)果有足夠的高位以適應(yīng)位的增

29、長,或者必須準備解決溢出問題。如果操作數(shù)僅為16位長,其結(jié)果可用雙精度數(shù)表示。下面舉例說明16位數(shù)相加的兩種途徑。1保留32位結(jié)果LACOP1;(Q15)ADDOP2;(Q15)SACHANSHI;(高16位結(jié)果)SACLANSLO;(低16位結(jié)果)2調(diào)整小數(shù)點保留16位結(jié)果LACOP1,15;(Q14數(shù)用ACCH表示)ADDOP2,15;(Q14數(shù)用ACCH表示)SACHANS;(Q14)加法運算最可能出現(xiàn)的問題是運算結(jié)果溢出。TMS320提供了檢查溢出的專用指令BV,此外,使用溢出保護功能可使累加結(jié)果溢出時累加器飽和為最大的整數(shù)或負數(shù)。當然,即使如此,運算精度還是大大降低。因此,最好的方法

30、是完全理解基本的物理過程并注意選擇數(shù)的表達方式。3.3.3 定點除法在通用DSP芯片中,一般不提供單周期的除法指令,為此必須采用除法子程序來實現(xiàn)。二進制除法是乘法的逆運算。乘法包括一系列的移位和加法,而除法可分解為一系列的減法和移位。下面來說明除法的實現(xiàn)過程。設(shè)累加器為8位,且除法運算為10除以3。除的過程就是除數(shù)逐步移位并與被除數(shù)比較的過程,在每一步進行減法運算,如果能減則將位插入商中。(1) 除數(shù)的最低有效位對齊被除數(shù)的最高有效位。000010100001100011110010(2) 由于減法結(jié)果為負,放棄減法結(jié)果,將被除數(shù)左移一位再減。000101000001100011111000(

31、3) 結(jié)果仍為負,放棄減法結(jié)果,被除數(shù)左移一位再減。001010000001100000010000(4) 結(jié)果為正,將減法結(jié)果左移一位后加,作最后一次減。001000010001100000001001(5) 結(jié)果為正,將結(jié)果左移一位加1得最后結(jié)果。高位代表余數(shù),低4位表示商。00010011即商為0011=3,余數(shù)為0001=1。TMS320沒有專門的除法指令,但使用條件減指令SUBC可以完成有效靈活的除法功能。使用這一指令的唯一限制是兩個操作數(shù)必須為正。程序員必須事先了解其可能的運算數(shù)的特性,如其商是否可以用小數(shù)表示及商的精度是否可被計算出來。這里每一種考慮可影響如何使用SUBC指令的問

32、題。下面給出兩種不同情況下的TMS320C25除法程序。(1) 分子小于分母DIV_A:LTNUMERAMPYDENOMPACSACHTEMSGN;取商的符號LACDENOMABSSACLDENOM;使分母為正ZALHNUMERA;使分子為正ABSRPTK14SUBCDENOM;除循環(huán)15次SACLQUOTLACTEMSGNBGEZA1;若符號為正,則完成ZACSUBQUOTSACLQUOT;若為負,則商為負A1:RET這個程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN為暫存單元。(2) 規(guī)定商的精度DIV_B:LTNUMERAMPYDENOMPACSACHT

33、EMSGN;取商的符號LACDENOMABSSACLDENOM;使分母為正LACK15ADDFRACSACLFRAC;計算循環(huán)計數(shù)器LACNUMERAABS;使分子為正RPTFRACSUBCDENOM;除循環(huán)16+FRAC次SACLQUOTLACTEMSGNBGEZB1;若符號為正,則完成ZACSUBQUOTSACLQUOT;若為負,則商為負B1:RET與DIV_A相同,這個程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN為暫存單元。FRAC中規(guī)定商的精度,如商的精度為Q13,則調(diào)用程序前FRAC單元中的值應(yīng)為13。3.4 非線性運算的定點快速實現(xiàn)在數(shù)值運算中,

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

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

36、可得到相應(yīng)的值,因而運算量較小。查表法比較適合于非線性函數(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表示,此時1用32767來表示。(1) 產(chǎn)生512點值的C語言程序如下所示:#define N 512#define pi 3.14159int sin_tab512;vo

37、id main( )int i;for(i=0;i<N;i+) sin_tabi=(int)(32767*sin(2*pi*i/N); (2) 查表查表實際上就是根據(jù)輸入值確定表的地址。設(shè)輸入x在02p之間,則x對應(yīng)于512點表的地址為:index = (int)(512*x/2p),則 y = sin(x) = sin_tabindex。如果x用Q12定點數(shù)表示,將512/2p用Q8表示為 20861,則計算正弦表的地址的公式為:index = (x*20861L)>>20。例3.13 用查表法求以2為底的對數(shù),已知自變量取值范圍為0.51,要求將自變量范圍均勻劃分為10等

38、分。試制作這個表格并說明查表方法。(1) 做表:y = log2(x),由于x在0.5到1之間,因此y在-1到0之間,x和y均可用Q15表示。由于對x均勻劃分為10段,因此,10段對應(yīng)于輸入x的范圍如表3.2所示。若每一段的對數(shù)值都取第1點的對數(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ù)值(Q15)00.500.55-3276810.550.60-2826220.6

39、00.65-2414930.650.70-2036540.700.75-1686250.750.80-1360060.800.85-1054970.850.90-768380.900.95-498190.951.00-2425(2) 查表:查表時,先根據(jù)輸入值計算表的地址,計算方法為:index=(x-16384)×20)>>15。式中,index就是查表用的地址。例如,已知輸入x= 26869,則index=6,因此y=-10549。3混合法(1) 提高查表法的精度上述方法查表所得結(jié)果的精度隨表的大小而變化,表越大,則精度越高,但存儲量也越大。當系統(tǒng)的存儲量有限而精度要

40、求也較高時,查表法就不太適合。那么能否在適當增加運算量的情況下提高非線性運算的精度呢?下面介紹一種查表結(jié)合少量運算來計算非線性函數(shù)的混合法,這種方法適用于在輸入變量的范圍內(nèi)函數(shù)呈單調(diào)變化的情形。混合法是在查表的基礎(chǔ)上采用計算的方法以提高當輸入值處于表格兩點之間時的精度。提高精度的一個簡便方法是采用折線近似法,如圖3.1所示。仍以求以2為底的對數(shù)為例(例3.13)。設(shè)輸入值為x,則精確的對數(shù)值為y,在表格值的兩點之間作一直線,用y作為y的近似值,則有:yy0y圖3.1 提高精度的折線近似法其中y0由查表求得?,F(xiàn)在只需在查表求得y0的基礎(chǔ)上增加y即可。y的計算方法如下:y=(x/x0)y=x(y0

41、/x0)式中y0/x0對每一段來說是一個恒定值,可作一個表格直接查得。此外計算x時需用到每段橫坐標的起始值,這個值也可作一個表格。這樣共有三個大小均為10的表格,分別為存儲每段起點對數(shù)值的表logtab0、存儲每段y0/x0 值的表logtab1和存儲每段輸入起始值x0的表logtab2,表logtab1和表logtab2可用下列兩個數(shù)組表示:int logtab110=22529,20567,18920,17517,16308, 15255,14330,13511,12780,12124; /*y0/x0 : Q13*/int logtab210=16384,18022,19660,2129

42、9,22938, 24576,26214,27853,29491,31130; /* x0: Q15*/綜上所述,采用混合法計算對數(shù)值的方法可歸納為:根據(jù)輸入值,計算查表地址:index=(x-16384)×20)>>15;查表得y0=logtab0index;計算x=x-logtab2index;計算y(x×logtab1index)>>13;計算得結(jié)果y=y0+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;查表得y0=logtab00=-32768;計算x=x-logtab20=17694-16384=1310;計算y(xlogtab10)>>13=(1310*22529L)>>13=3602;計算結(jié)果y=y0+y=-32768+3602=-29166。結(jié)果y為Q15定標,折算成浮點數(shù)為-29166/32768=-0.89,可見精度較高。(2) 擴大自變量范圍如上所述,查表法比較適用于周期函數(shù)或自變量的動態(tài)范圍不是太大的情形。

溫馨提示

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

最新文檔

評論

0/150

提交評論