C Libm没有三角函数
由于缺少fp操作单元,特定嵌入式系统上的libmath没有类似于C Libm没有三角函数,c,embedded,gnu,libm,C,Embedded,Gnu,Libm,由于缺少fp操作单元,特定嵌入式系统上的libmath没有类似于sin和cos的功能 是否存在通过查找表提供函数的库?实际上,我并不需要100%的可靠值。根据所需的速度和精度要求,也许您可以通过编写创建查找表的程序来创建简单查找表所需的函数。或者使用。如果您的系统没有为您提供sin/cos函数的库,或者内存中没有查找表,您可以非常轻松地创建一个 下一个matlab函数将在c头myheader.h中为您提供sin(x)([0,2*pi]范围和2*pi/100步): step=2*pi/100; x
sin
和cos
的功能
是否存在通过查找表提供函数的库?实际上,我并不需要100%的可靠值。根据所需的速度和精度要求,也许您可以通过编写创建查找表的程序来创建简单查找表所需的函数。或者使用。如果您的系统没有为您提供sin/cos函数的库,或者内存中没有查找表,您可以非常轻松地创建一个 下一个matlab函数将在c头
myheader.h
中为您提供sin(x)
([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};
对于没有硬件浮点的目标,更好的方法可能是使用定点和CORDIC算法
Anthony Williams’提供了一个标准数学库的完整模拟,用于
固定的数据类型,通常比同一目标上的软件浮点运算快5倍左右。它是一个C++库,但是只要编译器支持C++,即使你的代码不使用C++特定的特性,也不应该是个问题。在大多数情况下,使用此库移植代码所需要做的就是用fixed.hpp替换math.h,用fixed.hpp替换type关键字float
和double
替换为fixed
类型。Jack Gansle有一篇关于优化嵌入式系统触发器的优秀文章:
我认为提供这样一个库是没有意义的,因为与编写自己的库相比,设计选择和参数化太多了。我的意思是,这些都不是很难,但不能提供适合所有人的解决方案
- 参数:
- sin/cos==(无符号)vs(有符号)的参数
- 短、整数、浮点、定点
- 范围:有限(模块pi、模块2pi)
- 参数是弧度、度数或其他值(例如2pi==65536==0)
- 价值观
- 浮点与定点与缩放整数
- 仅第1象限,完整或扩展范围(无需模化参数缩减)
- 正弦和余弦,或仅正弦
- 要求
- 代码大小
- 数据大小
- 执行速度
- “常数”vs
- 允许有很多变化
- 精密度
- 最小化某些最小二乘度量
- 最小化一些最大误差
- 最小化1-sin(x)^2-cos(x)^2错误
- 方法
- 直接a=LUT[b]
- 根据象限进行镜像:a=符号(b)*LUT[b^镜像(b)];//概念公式
- 科迪奇
- 三次或五次泰勒多项式
- 使用两个LUT表添加(角度)精度LUTA(x)=sin(x);LUTB(x)=sin(x/256)和角度和公式
我们到底在谈论哪个嵌入式系统?TI的DSP将sin函数实现为查找表。许多用于嵌入式目标的标准库(无FPU)包括使用软件浮点算法的完整标准数学库,甚至用于8位目标。性能影响可能相对较高,但这是否是一个问题取决于应用程序,通常不是工具供应商可以或应该做出的决定。你的目标和工具链是什么?GNULibm当然包括这些函数,所以您的库不是这样,就是一个修改过的实现。你可能会发现它们只是在头文件中被省略或有条件地编译出来的?听起来不错,但是没有“现成”的解决方案来构造这样的表?@Stasik:真的吗?这并不难。如果您不想编写代码,请使用电子表格,输出为CSV文件,然后在代码中的初始化器括号{…}
之间复制并粘贴逗号分隔的值。也许您可以发布此输出?我没有matlab,正如我所期望的那样,这是很普遍的。@wallyk八度音阶是免费的。不管怎样,我编辑了这个问题。如果目标平台上没有FPU,一个更合适的方法是用整数来缩放它们(并对它们进行四舍五入)。@Akisuikkonen对。修复了它当它运行时,尝试输入16_t for-xxxx(注意没有+32768)