arctan查表法 arctan 函式的查表演算法

2021-10-13 01:45:16 字數 1177 閱讀 7870

arctan()函式的查表演算法

文集庫2020-05-13 14:34:56

目標:實現反正切函式的查表演算法,精度0.5°。

分析:f(x)=arctan(x)函式單調但非線性,越接近原點處,斜率越大。

90°比較特殊,其值為正無窮大,只要得到的正切值tana大於114.59(89.5度對應的正切值),就可以認為是90度。

假如0-89.5°用乙個查詢表實現,索引為正切值,值為角度值。tan89.5為115,假如用n點uint16_t型查詢表,需要保證

arctan(115 / n) < 0.5°

即 115 / n < 0.0087

可選的最小值為13219,意味著至少要建立一張13k×16的表,占用26kb的flash,對於一般的mcu來說不可接受。

如果0-45°用乙個查詢表實現,由於tan45°=1,根據上面的計算公式,可以得出n的最小值為114,這個n值對一般的mcu均可以接受,甚至可以增加至256點來提高精度。對於45°以上的角度,可以根據兩角和的三角公式來得到,推導過程如下:

如果測量的正切值k大於1,那麼根據最後的公式,可以求出比45°大的那個角度a,再加上45°就是實際的角度。而a的計算可以由256點查詢表來快速得到,這樣就實現了用乙個小容量查詢表計算90度以內的反正切值。

查詢表涉及兩個數值:表索引idx和表的角度值angle[idx]。

索引值idx對應0-45°的正切值,由於這些值均小於1,採用整體擴大256倍的方法,將正切值就對映到了0-256的區間,從而索引idx的範圍為0-255。

角度值angle是uint16_t型的,而實際的範圍為0-45,根據65536/45=1456,可以用q12的表示方式來提高解析度。

查詢表如下:

static const uint16_t tb_atan[256]=;"

# print ","

,round(cos(3.1415926*2*i/128),4)

for i in range(142,180):

print i/2.0,

tan(i * pi / 360)

val_tan=

num=256

for i in range(num):

# 格式化輸出

print "static const uint16_t arctan[%d]=;"

分享:

arctan查表法 查表法

查表法是將一些事先計算好的結果,儲存在常量陣列中,執行時節省計算開銷。例如,計算位元組中位1的個數,int countbits unsigned char dat static char nbittab 256 return nbittab dat 或將位元組按位逆序,unsigned char r...

arctan查表法 DSP正弦波查表法原理

為取樣頻率 ss ft即為取樣間隔。因此,要想產生乙個正弦波,需要在每乙個取樣間隔計算 x n 的值,並通過數模轉換器 dacdigital to analog convector 輸出。通過將 x n 的值以不同的幅度和不同的取樣間 隔輸出,就可以得到任意幅度 任意頻率的正弦波或余弦波。根據上式,...

折半查表法

即對從大到小或從小到大排列的陣列中數進行查詢時用到的搜尋方法 我是在對應熱敏電阻阻值與實際溫度值時用到 一維陣列,標號代表溫度,間隔為1,所以正好,每個陣列內容對應該阻值下的溫度 得到熱敏電阻阻值後,開始從中間開始比大小,大了,把低端的指標指向陣列中間的資料位址,小了則把高階的指標指向中點 然後再迴...