【摘 要】在現(xiàn)今DSP軟件工程設(shè)計中,廣泛采用高級語言(如C語言)直接調(diào)用三角函數(shù)進行計算。然而,匯編語言的穩(wěn)定性、可讀性和執(zhí)行效率均優(yōu)于高級語言,因缺少可供直接調(diào)用的三角函數(shù)庫,其開發(fā)周期長,且計算精度難以保證,在工程中推廣較少。本文就基于DSP匯編語言,提出一種高精度三角函數(shù)算法。
【關(guān)鍵詞】三角函數(shù) 傳統(tǒng)查表法 線性查表法 MATLAB仿真
一、引言
隨著現(xiàn)代科技的高速發(fā)展,帶三角函數(shù)的大型DSP復(fù)雜算法被廣泛應(yīng)用于各個領(lǐng)域,高級語言(如C語言)編程實現(xiàn)時,其穩(wěn)定性、可讀性、執(zhí)行效率均不及匯編語言。然而,匯編算法沒有標準的三角函數(shù)庫,需軟件開發(fā)人員自己編寫,這就延長了軟件的開發(fā)周期,同時,其計算精度難以得到保證。本文就基于DSP匯編語言,提出一種占用資源低且精度較高的線性查表法,實現(xiàn)三角函數(shù),并通過MATLAB仿真與傳統(tǒng)查表法進行對比分析。
二、查找表建模
假設(shè)以等步長step定義了點數(shù)為N的三角函數(shù)查找表,表中地址n處的值為(x0,y0),若要計算某x處的三角函數(shù)值y,用傳統(tǒng)查找表實現(xiàn),即近似于地址n處的查表值y0。其查找生成方式為:TAB_X(n)=Fx(n*step),n=0,1,2……N-1。其中TAB_X為三角函數(shù)表,F(xiàn)x代表相應(yīng)的標準三角函數(shù)。
而用線性查找表實現(xiàn),即近似于(x0,y0)點切線上x處所對應(yīng)的值y’。設(shè)切線的斜率為C,則用公式可表示為:
y≈y’=y0+C×=y0+C*(x-x0)
由公式可知,線性查找表需要包含x0處的三角函數(shù)值y0和切線斜率C,因此,采取y0值與C值交替存放方式,即為:TAB_X(n)=Fx(n*step),n=0,2,4……N-2;TAB_X(n)=Fc(n*step),n=1,3,5……N-1。其中Fc代表斜率函數(shù),其對應(yīng)關(guān)系見表1。
三、工程實現(xiàn)方法
對正弦和余弦函數(shù),其函數(shù)本身與切線斜率正好互補,因此可共用一張查找表。此外,因正弦和余弦函數(shù)互余,可通過或?qū)⑵涠x域映射到0~/4。對反三角函數(shù),其計算的值域范圍為0~/2,隨著x0值的增加,其斜率值單調(diào)遞增,這將會導(dǎo)致圖1中的y’值逐漸偏離y值,增大誤差。因此,采取將反三角函數(shù)/4~/2的值域映射到/4~0的值域中進行計算。其中,反正弦、反余弦、反正切函數(shù)分別通過、、進行映射,這樣,反正弦和反余弦函數(shù)的定義域范圍為0~0.707,反正切函數(shù)的定義域范圍為0~1。以正弦函數(shù)查找表為列,其實現(xiàn)算法如下:
從表2中看出,相同點數(shù)時的線性查表法計算精度要比傳統(tǒng)查表法高出2個數(shù)量級以上。隨著查找表點數(shù)的增加,線性查表法的計算精度將會越來越優(yōu)于非線性查表法。
五、結(jié)論
線性查表法與傳統(tǒng)查表法相比,其計算精度高,且正、余弦函數(shù)可共用查找表,資源占用少。在工程實現(xiàn)中,其匯編代碼實現(xiàn)簡單、可讀性強,易于在工程中推廣。
參考文獻:
[1] 高等數(shù)學(xué),楊海濤等,2006,同濟大學(xué)出版社
[2] MATLAB仿真技術(shù)與應(yīng)用,張葛祥 李娜,2003,清華大學(xué)出版社