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