在小型嵌入式系统中,用到sin,cos等三角函数时,不能象在pc上编程般运用math库来实现,若没有浮点运算器,也不能运用泰勒公式展开来计算三角函数值。本文提供一种简单的查表法来计算。
文 件i_sin.h中,保存了0-90度角的sin值向左位移15后的结果。对每个角度的三角函数做运算时,以角度为小标在sin_map表中查找相应的 sin值(位移后的结果)。之所以要对sin值向左位移,是保证可以用整数来表达sin值。位移的大小(本文中为15),标称了sin值取值的精度,越 大,sin值取值越精确。
文件i_sin.h中,提供了两个三角函数的计算宏:
rsin(_r_, _d_),
rcos(_r_, _d_),
参数_r_表示得到的sin或是cos值扩大的倍数;
参数_d_表示角度值。
实现比较简单,不再冗述。
[代码] [C/C++/Objective-C]代码
- /******************************************************************
- *
- * File Name: pw_sin.h
- * Description: The sin() function map. Using it to calculate a
- * angle's sine value and cosine value.
- * e.g.
- * angle d=30 degrees,
- * sin(d) = (sin_map[30] >> SIN_MAP_SHIFT)
- * result: sin(30) = 0.5
- *
- * Author : Jiang Peifu
- * Date: 2009.04.27
- */
- #ifndef PW_SIN_H
- #define PW_SIN_H
- /* -------------------------------------------------------------------------- */
- #define SIN_MAP_SHIFT 15
- #define DEGREE_MIN 0
- #define DEGREE_MAX 90
- #define SIN_MAP_SIZE (DEGREE_MAX - DEGREE_MIN + 1)
- #define rsin(_r_, _d_) ((_r_ * sin_map[_d_] + 0x4000) >> SIN_MAP_SHIFT)
- #define rcos(_r_, _d_) ((_r_ * sin_map[DEGREE_MAX-_d_] + 0x4000) >> SIN_MAP_SHIFT)
- int sin_map[SIN_MAP_SIZE] = {
- 0,
- 572,
- 1144,
- 1715,
- 2286,
- 2856,
- 3425,
- 3993,
- 4560,
- 5126,
- 5690,
- 6252,
- 6813,
- 7371,
- 7927,
- 8481,
- 9032,
- 9580,
- 10126,
- 10668,
- 11207,
- 11743,
- 12275,
- 12803,
- 13328,
- 13848,
- 14365,
- 14876,
- 15384,
- 15886,
- 16384,
- 16877,
- 17364,
- 17847,
- 18324,
- 18795,
- 19261,
- 19720,
- 20174,
- 20622,
- 21063,
- 21498,
- 21926,
- 22348,
- 22763,
- 23170,
- 23571,
- 23965,
- 24351,
- 24730,
- 25102,
- 25466,
- 25822,
- 26170,
- 26510,
- 26842,
- 27166,
- 27482,
- 27789,
- 28088,
- 28378,
- 28660,
- 28932,
- 29197,
- 29452,
- 29698,
- 29935,
- 30163,
- 30382,
- 30592,
- 30792,
- 30983,
- 31164,
- 31336,
- 31499,
- 31651,
- 31795,
- 31928,
- 32052,
- 32166,
- 32270,
- 32365,
- 32449,
- 32524,
- 32588,
- 32643,
- 32688,
- 32723,
- 32748,
- 32763,
- 32768,
- };
- #endif /* PW_SIN_H */
转载于:https://blog.51cto.com/3595505/761640