在小型嵌入式系统中,用到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_表示角度值。
实现比较简单,不再冗述。
附h文件如下:
/******************************************************************
*
* 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 */