在小型嵌入式系统中,用到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_表示角度值。

实现比较简单,不再冗述。

/******************************************************************

*

* 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

*/

#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 */

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐