2013-02-08 28 views
3

特定的嵌入式系統上的libmath不具有像sincos功能由於缺少FP-操作單元。的libm沒有三角函數

有一些庫周圍通過查找表提供的功能?我實際上並不需要100%可靠的值。

+1

其中嵌入式系統究竟是我們談論的總和? TI的DSP具有sin函數作爲查找表實現 –

+0

針對沒有FPU的嵌入式目標的豐富標準庫包含使用*軟件浮點運算的完整標準數學庫 - 即使對於8位目標也是如此。性能受到的影響可能相對較高,但這是否是一個問題取決於應用程序,通常不是工具供應商可以或應該做出的決定。你的目標和工具鏈是什麼? GNU libm當然包含這些函數,所以你的庫不是那個或者是一個修改過的實現。你可能會發現它們只是在頭文件中被忽略或有條件地編譯出來? – Clifford

回答

2

根據對速度和精度的要求,需要,也許你可以通過編寫一個程序來創建查找表中創建一個簡單的查找表所需要的功能。或使用CORDIC

+0

聽起來不錯,但是沒有構建這樣的表的「開箱即用」解決方案? – Stasik

+0

@Stasik:真的嗎?這並不難。如果您不想編寫代碼,請使用電子表格,輸出爲CSV文件,然後將代碼中初始括號「{...}」之間的逗號分隔值複製並粘貼。 – Clifford

1

如果您還沒有爲您的系統提供的庫你正弦/餘弦函數,或在存儲器中的查找表,則可以非常容易地創建一個。

接着matlab函數將提供sin(x)([0,2 * PI]用2 * PI/100步驟的範圍內)在AC頭myheader.h

step=2*pi/100; 
x=[0:step:2*pi]; 
y=floor(0.5 * 65535 * sin(x)); 

fd=fopen('myheader.h','wt'); 
fprintf(fd,'int16_t y[%d]={%g',length(y),y(1)); 
fprintf(fd,',\n %.9g',y(2:end)); 
fprintf(fd,'};\n'); 
fclose(fd); 

頭看起來像這樣:

int16_t y[101]={0, 
2057, 
4107, 
6140, 
8149, 
10126, 
12063, 
13952, 
15786, 
17558, 
19260, 
20887, 
22431, 
23886, 
25248, 
26509, 
27667, 
28714, 
29649, 
30466, 
31164, 
31738, 
32187, 
32509, 
32703, 
32767, 
32703, 
32509, 
32187, 
31738, 
31164, 
30466, 
29649, 
28714, 
27667, 
26509, 
25248, 
23886, 
22431, 
20887, 
19260, 
17558, 
15786, 
13952, 
12063, 
10126, 
8149, 
6140, 
4107, 
2057, 
-0, 
-2057, 
-4107, 
-6140, 
-8149, 
-10126, 
-12063, 
-13952, 
-15786, 
-17558, 
-19260, 
-20887, 
-22431, 
-23886, 
-25248, 
-26509, 
-27667, 
-28714, 
-29649, 
-30466, 
-31164, 
-31738, 
-32187, 
-32509, 
-32703, 
-32768, 
-32703, 
-32509, 
-32187, 
-31738, 
-31164, 
-30466, 
-29649, 
-28714, 
-27667, 
-26509, 
-25248, 
-23886, 
-22431, 
-20887, 
-19260, 
-17558, 
-15786, 
-13952, 
-12063, 
-10126, 
-8149, 
-6140, 
-4107, 
-2057, 
-0}; 
+0

也許你可以發佈這個輸出?我沒有matlab,因爲我期望是常見的。 – wallyk

+0

@wallyk八度是免費的。無論如何,我編輯了這個問題 –

+0

如果目標平臺上沒有FPU,更合適的方法是使用整數對它們進行縮放(並將它們四捨五入)。 –

2

對於沒有硬件浮點的目標,更好的方法可能是使用定點和CORDIC算法。

安東尼威廉姆斯fixed-point maths library提供標準數學庫的完整類似物爲典型地比對同一目標軟件浮點快大約5倍fixed數據類型。這是一個C++庫,但只要你的編譯器支持C++,不應該是一個問題,即使你的代碼不使用C++特定功能的其餘部分。大多數情況下,您需要做的就是使用此庫來移植代碼,以便將math.h替換爲fixed.hpp,並將類型關鍵字floatdouble替換爲fixed類型。

0

我不認爲這是有道理的,以提供這樣的庫,因爲是比較太多的設計選擇和參數化到寫自己的困難。我的意思是這些都不是非常困難,但不能作爲適合所有人的解決方案提供。

  • 的參數:

    • 罪的參數/餘弦==(無符號)與(簽名)
    • 短型,整型,浮點型,固定點
    • 範圍:限制(MOD PI ,MOD 2PI)
    • 爲參數弧度,度或別的東西(例如2PI == 65536 == 0)
  • 數值

    • 浮點數與固定點數對比縮放整數
    • 第一象限只,完整的或擴展範圍
    • 兩個正弦&餘弦,或者只是正弦
  • 要求

    • 代碼大小
    • (沒有模所需的參數的減少)
    • 數據大小
    • 執行速度
      • 「恆定」 與
      • 很多變化的允許
    • 精度
      • 最小化一些最小二乘度量
      • 最小化一些最大誤差
      • 最小化1 - 的sin(x)^ 2 - cos(x)^ 2 error
  • 方法

    • 直接A = LUT並[b]
    • 鏡像取決於象限:一個=符號(b)中* LUT並[b ^鏡(B)]; //概念式
    • CORDIC
    • 第三或第五度泰勒多項式
    • 使用兩個LUT表的LUTa(X)= SIN
    • 加入(角)精度(X); LUTB(X)=的sin(x/256)和公式角度