Libm没有三角函数

时间:2013-02-08 07:39:28

标签: c embedded gnu libm

由于缺少fp-operation单元,特定嵌入式系统上的libmath没有sincos等功能。

是否有一些库通过查找表提供功能?我实际上并不需要100%可靠的值。

5 个答案:

答案 0 :(得分:2)

根据速度和精度的所需要求,您可以通过编写程序来创建查找表,从而创建简单查找表所需的功能。或者使用CORDIC

答案 1 :(得分:2)

对于没有硬件浮点的目标,更好的方法可能是使用定点和CORDIC算法。

Anthony Williams'fixed-point maths library提供了fixed数据类型的标准数学库的完整模拟,通常比软件浮点快5倍左右。同一目标。它是一个C ++库,但只要您的编译器支持C ++即使代码的其余部分不使用C ++特定功能也不应该成为问题。在大多数情况下,端口代码使用此库需要做的就是用fixed.hpp替换math.h并将类型关键字floatdouble替换为fixed类型

答案 2 :(得分:1)

如果您的系统没有库提供sin / cos函数或内存中的查找表,则可以非常轻松地创建库。

下一个matlab函数将在c标题sin(x)中为您提供myheader.h([0,2 * pi]范围,2 * pi / 100步):

step=2*pi/100;
x=[0:step:2*pi];
y=floor(0.5 * 65535 * sin(x));

fd=fopen('myheader.h','wt');
fprintf(fd,'int16_t y[%d]={%g',length(y),y(1));
fprintf(fd,',\n %.9g',y(2:end));
fprintf(fd,'};\n');
fclose(fd);

标题如下所示:

int16_t y[101]={0,
 2057,
 4107,
 6140,
 8149,
 10126,
 12063,
 13952,
 15786,
 17558,
 19260,
 20887,
 22431,
 23886,
 25248,
 26509,
 27667,
 28714,
 29649,
 30466,
 31164,
 31738,
 32187,
 32509,
 32703,
 32767,
 32703,
 32509,
 32187,
 31738,
 31164,
 30466,
 29649,
 28714,
 27667,
 26509,
 25248,
 23886,
 22431,
 20887,
 19260,
 17558,
 15786,
 13952,
 12063,
 10126,
 8149,
 6140,
 4107,
 2057,
 -0,
 -2057,
 -4107,
 -6140,
 -8149,
 -10126,
 -12063,
 -13952,
 -15786,
 -17558,
 -19260,
 -20887,
 -22431,
 -23886,
 -25248,
 -26509,
 -27667,
 -28714,
 -29649,
 -30466,
 -31164,
 -31738,
 -32187,
 -32509,
 -32703,
 -32768,
 -32703,
 -32509,
 -32187,
 -31738,
 -31164,
 -30466,
 -29649,
 -28714,
 -27667,
 -26509,
 -25248,
 -23886,
 -22431,
 -20887,
 -19260,
 -17558,
 -15786,
 -13952,
 -12063,
 -10126,
 -8149,
 -6140,
 -4107,
 -2057,
 -0};

答案 3 :(得分:0)

Jack Ganssle有一篇关于优化嵌入式系统触发的文章:

http://www.ganssle.com/approx/approx.pdf

答案 4 :(得分:0)

我认为提供这样一个库是没有意义的,因为与编写自己的难度相比,设计选择和参数设置太多了。我的意思是这些都不是很困难,但不能作为适合所有人的解决方案提供。

  • 参数:

    • sin / cos ==(unsigned)vs(signed)
    • 的参数
    • short,int,float,fixed point
    • 范围:有限(mod pi,mod 2pi)
    • 是参数radians,degrees或其他(例如2pi == 65536 == 0)
    • 浮动与固定点与缩放整数
    • 仅限第一象限,完整或扩展范围(不需要减少参数的模数)
    • 两个正弦和两个余弦,或只是正弦
  • 要求

    • 代码大小
    • 数据大小
    • 执行速度
      • "恒定" VS
      • 允许很多变化
    • 精度
      • 最小化一些最小二乘方度
      • 最小化一些最大错误
      • 最小化1 - sin(x)^ 2 - cos(x)^ 2错误
  • 方法

    • 指示a = LUT [b]
    • 镜像取决于象限:a =符号(b)* LUT [b ^ mirror(b)]; //概念公式
    • CORDIC
    • 3度或5度泰勒多项式
    • 使用两个LUT表LUTA(x)= sin(x)增加(角度)精度; LUTB(x)= sin(x / 256)和角度和的公式