[学习资料]

三角函数运算负担与精度权衡

[复制链接]
499|9
手机看帖
扫描二维码
随时随地手机跟帖
aoyi|  楼主 | 2023-7-18 12:12 | 显示全部楼层 |阅读模式
在嵌入式单片机中,MCU的运算性能往往是有限的,在嵌入式编程中常常会碰到三角函数的运算,精确的三角函数运算是十分消耗MCU资源的,在这个过程中我们应权衡计算负担和计算精度。

以下是在嵌入式单片机中资源相对紧张对计算精度不是十分严格的情况下实现的三角函数运算,函数通过查表得方法,在确保一定精度的前提下,大大节省了MCU的计算资源。

1.函数声明:

int common_sin_val_calculate(int angle);
int common_cos_val_calculate(int angle);
int common_tan_val_calculate(int angle);

#define SIN(val) common_sin_val_calculate(val) / 100.0
#define COS(val) common_cos_val_calculate(val) / 100.0
#define TAN(val) common_tan_val_calculate(val) / 100.0
2. 数据资源表:

static const int sinTable[91] = {0, 2, 3, 5, 7, 9, 10, 12, 14, 16, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 48, 50,
    52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 91,
    92, 93, 93, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100};

static const int cosTable[91] = {100, 100, 100, 100, 100, 100, 99, 99, 99, 99, 98, 98, 98, 97, 97, 97, 96, 96, 95, 95, 94, 93, 93, 92, 91, 91, 90, 89,
    88, 87, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 75, 74, 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 57, 56, 54, 53, 52, 50, 48, 47, 45,
    44, 42, 41, 39, 37, 36, 34, 33, 31, 29, 28, 26, 24, 22, 21, 19, 17, 16, 14, 12, 10, 9, 7, 5, 3, 2, 0};
3.函数实现:

/*angle:(0 ~3600)
return sin(angle) * 100*/
int common_sin_val_calculate(int angle) //
{
    angle = (angle  + 3600 ) % 3600;

    if ((angle >= 0) && (angle <= 900)){
        return sinTable[angle / 10];
    }
    else if ((angle > 900) && (angle <= 1800)){
        return cosTable[(angle - 900) / 10];
    }
    else if ((angle > 1800) && (angle <= 2700)){
        return -sinTable[(angle - 1800) / 10];
    }
    else{
        return -cosTable[(angle - 2700) / 10];
    }
}

/*angle:(0 ~3600)
return sin(angle) * 100*/
int common_cos_val_calculate(int angle) //
{
    angle = (angle  + 3600 ) % 3600;

    if ((angle >= 0) && (angle <= 900)){
        return cosTable[angle / 10];
    }
    else if ((angle > 900) && (angle <= 1800)){
        return -sinTable[(angle - 900) / 10];
    }
    else if ((angle > 1800) && (angle <= 2700)){
        return -cosTable[(angle - 1800) / 10];
    }
    else{
        return sinTable[(angle - 2700) / 10];
    }
}
/*angle:(0 ~3600)
return tan(angle) * 100 */
int common_tan_val_calculate(int angle)
{
    angle = (angle  + 3600 ) % 3600;

    if ((angle % 900 ) == 0) return 0;

    return common_sin_val_calculate(angle) * 100 / common_cos_val_calculate(angle);
}

实验运行测试得出该方法计算精度可控制在0.01左右,在绝大多数嵌入式场景下精度是相对足够的。
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/131702856

使用特权

评论回复
wakayi| | 2024-4-3 15:10 | 显示全部楼层
一般的单片机都不敢轻易尝试三角函数运算

使用特权

评论回复
tpgf| | 2024-4-3 17:26 | 显示全部楼层
这种查表方式会不会占用大量的内存空间呢

使用特权

评论回复
木木guainv| | 2024-4-3 18:03 | 显示全部楼层
如果精度 要求不高的话 应该还不错

使用特权

评论回复
磨砂| | 2024-4-3 18:36 | 显示全部楼层
如果考虑性价比的话 这确实是一个好的处理办法

使用特权

评论回复
chenjun89| | 2024-4-3 20:11 | 显示全部楼层
查表法的应用,对于精度要求不高的场合可以这样用 。

使用特权

评论回复
xiaoqizi| | 2024-4-3 22:47 | 显示全部楼层
想要真正的进行三角函数运算 对单片机的最低要求是什么

使用特权

评论回复
wowu| | 2024-4-3 23:20 | 显示全部楼层
感觉这种查表方式的方法并不算是真正的运算

使用特权

评论回复
lcczg| | 2024-4-8 10:37 | 显示全部楼层
查表法能够提供计算效率

使用特权

评论回复
在没有硬件三角函数的情况下,计算三角函数比较费劲

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

3306

帖子

3

粉丝