ADSPTigerSHARC中利用查找表快速計(jì)算三角函數(shù)
;;;;;; 摘要:DSP算法中,三角函數(shù)的計(jì)算是一種運(yùn)算量比較大,占用時間比較長的運(yùn)算。如果通過直接調(diào)用DSP生產(chǎn)商或者第三方提供的庫函數(shù)進(jìn)行運(yùn)算,往往需要占用比較多的時鐘周期。在實(shí)時性要求比較高的場合,調(diào)用庫函數(shù)進(jìn)行三角函數(shù)計(jì)算就不能夠達(dá)到實(shí)時性的要求。在這種情況下,利用查找表的方法來得到三角函數(shù)的值就成為一種可行,并能獲得很高實(shí)時性的計(jì)算方法。本文給出了一種在TS101中利用查找來實(shí)現(xiàn)三角函數(shù)計(jì)算的方法,并對這種算法的誤差和運(yùn)算量進(jìn)行了分析,從結(jié)論可以看出,文中提出的通過查找表計(jì)算三角函數(shù)的方法有效而且運(yùn)行效率比較高。
關(guān)鍵詞:查找表;;;;;;;;Tiger;SHARC;TS101;DSP;;;;;;;;實(shí)時性
1.;;;;概述:
;;;;;; 我們知道,在三角函數(shù)的運(yùn)算中,涉及到大量倒數(shù)和平方根的運(yùn)算。TS101的ALU指令中,提供了很方便的求倒數(shù)指令RECIPS和求平方根倒數(shù)指令RSQRTS,在一個指令周期內(nèi),可以完成求一個浮點(diǎn)數(shù)的倒數(shù)或者平方根倒數(shù)的運(yùn)算。但是,在TS101中,倒數(shù)和平方根倒數(shù)指令僅僅提供了8位浮點(diǎn)的近似值,特別在小數(shù)點(diǎn)后位數(shù)比較多的情況下,誤差比較大。并且,在很多計(jì)算過程中,隨著運(yùn)算步驟的增加,其誤差也不斷擴(kuò)大,最終將會導(dǎo)致運(yùn)算的結(jié)果遠(yuǎn)遠(yuǎn)偏離正常的數(shù)值。如果需要提高倒數(shù)和平方根倒數(shù)的運(yùn)算精度,就需要用到收斂算法,這樣就大大增加了運(yùn)算的周期數(shù),使得運(yùn)算量驟增。在需要大量三角函數(shù)運(yùn)算的場合,這么大的運(yùn)算量就顯得很不合適,大大占用了系統(tǒng)的運(yùn)行時間。在ADSP的集成開發(fā)環(huán)境Visual;DSP;3.5++中,生產(chǎn)商雖然提供了進(jìn)行三角函數(shù)計(jì)算的庫函數(shù),并具可以得到很高的計(jì)算精度,但是它的運(yùn)算周期卻比較長,很多情況下并不能滿足我們的要求。
;;;;ADSP;TS101中提供了專用的加法器和乘法器,使得高精度的乘加運(yùn)算可以在一個周期內(nèi)得以完成。如果我們可以利用乘加運(yùn)算代替大運(yùn)算量的求倒數(shù)和求平方根運(yùn)算,那么程序運(yùn)行中就可以大大降低程序的時間消耗。而且,三角函數(shù)具有一定的周期性,我們可以通過三角函數(shù)周期性的變換,將角度值變換到一個周期內(nèi),通過查表的方式來獲得三角函數(shù)的數(shù)值。這種方式直接利用了三角函數(shù)的周期性,其誤差大小決定于查找表的大小,也就是對一個周期內(nèi)三角函數(shù)的數(shù)值進(jìn)行采樣的密度。在誤差允許的情況下,可以以很高的運(yùn)算速度得到三角函數(shù)的數(shù)值。 2.;;;;算法理論與DSP實(shí)現(xiàn):
(1)DSP算法:正弦和余弦函數(shù)是按照2π為周期周期性變化的函數(shù)。對于;和;形式的函數(shù),當(dāng)我們知道x的數(shù)值以后,就可以根據(jù)浮點(diǎn)數(shù)x的小數(shù)部分的數(shù)值求得函數(shù)的數(shù)值,而整數(shù)部分可以作為周期循環(huán)的部分不予考慮。所以運(yùn)算的重點(diǎn)在于如何將小數(shù)部分的數(shù)值轉(zhuǎn)變?yōu)椴楸頃r候所對應(yīng)的地址單元。我們?nèi)∮嘞液瘮?shù);區(qū)間上的數(shù)值,在允許的計(jì)算精度范圍內(nèi)首先對其進(jìn)行采樣。因?yàn)橛嘞液瘮?shù)為偶函數(shù),所以在整個自變量變化的范圍內(nèi)的三角函數(shù)運(yùn)算都可以轉(zhuǎn)變到;區(qū)間內(nèi)進(jìn)行。
;;;;;; 對于三角函數(shù);的數(shù)值的計(jì)算,我們將其自變量x的取值區(qū)間以0為中心分為小于零和大于等于零兩部分。對于小于零的區(qū)間,首先求出x的絕對值,然后減去0.5,將得到的結(jié)果用fix指令求整,再用float指令將其表示為浮點(diǎn)數(shù),將x的絕對值與用float指令求得的數(shù)值相減就提取出了數(shù)據(jù)的小數(shù)部分。對于大于零的區(qū)間,我們不用求其絕對值就可以直接按照上面的步驟提取出其小數(shù)部分。對于正弦函數(shù);,由于正弦函數(shù)是奇函數(shù),情況就相對比較復(fù)雜一些。這時需要判斷x的數(shù)值是大于零等于零還是小于零,如果在大于零的情況下,可以直接將小數(shù)部分提取出來,并對其進(jìn)行查表得到對應(yīng)的三角函數(shù)的數(shù)值,而在x的數(shù)值小于零的情況下,我們需要將在;區(qū)間內(nèi)查表得到的數(shù)值再對其取負(fù)才可以得到相應(yīng)的三角函數(shù)的數(shù)值。我們得到小數(shù)部分的數(shù)值以后,將小數(shù)部分的數(shù)值和采樣的樣本點(diǎn)數(shù)進(jìn)行乘法運(yùn)算,就可以得到查表所需要的相對地址。;查表實(shí)現(xiàn)的簡單的匯編語言算法實(shí)現(xiàn)如下(未優(yōu)化):