现在的位置: 首页 > 综合 > 正文

用于小型嵌入式系统的三角函数C实现

2013年03月20日 ⁄ 综合 ⁄ 共 1979字 ⁄ 字号 评论关闭


在小型嵌入式系统中,用到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 */

 

抱歉!评论已关闭.