回答
如果您還沒有爲您的系統提供的庫你正弦/餘弦函數,或在存儲器中的查找表,則可以非常容易地創建一個。
接着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};
也許你可以發佈這個輸出?我沒有matlab,因爲我期望是常見的。 – wallyk
@wallyk八度是免費的。無論如何,我編輯了這個問題 –
如果目標平臺上沒有FPU,更合適的方法是使用整數對它們進行縮放(並將它們四捨五入)。 –
對於沒有硬件浮點的目標,更好的方法可能是使用定點和CORDIC算法。
安東尼威廉姆斯fixed-point maths library提供標準數學庫的完整類似物爲典型地比對同一目標軟件浮點快大約5倍fixed
數據類型。這是一個C++庫,但只要你的編譯器支持C++,不應該是一個問題,即使你的代碼不使用C++特定功能的其餘部分。大多數情況下,您需要做的就是使用此庫來移植代碼,以便將math.h替換爲fixed.hpp,並將類型關鍵字float
和double
替換爲fixed
類型。
傑克Ganssle對嵌入式系統的優化trig公司的優秀文章:
我不認爲這是有道理的,以提供這樣的庫,因爲是比較太多的設計選擇和參數化到寫自己的困難。我的意思是這些都不是非常困難,但不能作爲適合所有人的解決方案提供。
的參數:
- 罪的參數/餘弦==(無符號)與(簽名)
- 短型,整型,浮點型,固定點
- 範圍:限制(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)和公式角度
- 1. 三角函數
- 2. C中有沒有精確的三角函數?
- 3. 三角三角函數(ActionScript 3)
- 4. SPARQL三角函數
- 5. 處理3.2.2三角函數沒有返回正確的結果
- 6. 的Python:用三角函數
- 7. 逼近反三角函數
- 8. 3d三角函數方程
- 9. Objective-C三角函數
- 10. Mathematica中三角函數和的係數
- 11. CSS三角形有沒有點
- 12. 三角函數的範圍縮減
- 13. Dart語言的三角函數
- 14. PHP中的三角函數(逆正弦)
- 15. 使用javascript的三角函數
- 16. R:奇怪的三角函數行爲
- 17. numpy的某些三角函數包
- 18. 僞代碼中的三角函數
- 19. 數學,簡化三角函數
- 20. As3三角函數和數學
- 21. 在C++中的複數的三角函數和雙曲函數
- 22. OpenGL - 你好三角沒有出現
- 23. OpenGL ES三角沒有顯示
- 24. 三角形塊沒有拉伸全寬
- 25. LWJGL沒有渲染三角形
- 26. 給定的三角函數有什麼區別?
- 27. 存儲三角函數調用的結果是否有意義?
- 28. 紅寶石,SQLite和三角函數
- 29. 三角函數值與現實不符
- 30. 用glDrawArray函數繪製三角形
其中嵌入式系統究竟是我們談論的總和? TI的DSP具有sin函數作爲查找表實現 –
針對沒有FPU的嵌入式目標的豐富標準庫包含使用*軟件浮點運算的完整標準數學庫 - 即使對於8位目標也是如此。性能受到的影響可能相對較高,但這是否是一個問題取決於應用程序,通常不是工具供應商可以或應該做出的決定。你的目標和工具鏈是什麼? GNU libm當然包含這些函數,所以你的庫不是那個或者是一個修改過的實現。你可能會發現它們只是在頭文件中被忽略或有條件地編譯出來? – Clifford