从正弦查找表计算arcsin的效率

时间:2011-05-07 10:27:26

标签: c performance embedded trigonometry lookup-tables

我已经实现了一个查找表来计算系统中的正弦/余弦值。我现在需要反三角函数(arcsin / arccos)。

我的应用程序在嵌入式设备上运行,我无法为arcsin添加第二个查找表,因为我在程序内存中受限。所以我想到的解决方案是浏览正弦查找表以检索相应的索引。

我想知道这个解决方案是否比使用来自数学标准库的标准实现更有效 有人已经对此进行过实验吗?

LUT的当前实现是从0到PI / 2的正弦值数组。存储在表中的值乘以4096以保持整数值,并为我的应用程序提供足够的精度。查找表的分辨率为1/4096,它为我们提供了6434个值的数组。 然后我有两个功能正弦和正弦;以弧度为单位的余弦乘以4096作为参数。这些函数将给定角度转换为第一象限中的相应角度,并读取表格中的相应值。

我的应用程序在dsPIC33F上以40 MIPS运行,我使用的是C30编译套件。

4 个答案:

答案 0 :(得分:3)

由于您没有告诉我们硬件,编译器或您的代码,因此很难确定地说出任何事情。但是,先验的是,我希望编译器中的标准库比代码更有效。

答案 1 :(得分:3)

或许不幸的是你必须使用不支持C ++的C30编译器,否则我会指向Optimizing Math-Intensive Applications with Fixed-Point Arithmetic及其相关的库。

然而,the CORDIC algorithm的一般原则适用,并且内存占用量将远远小于您当前的实现。文章解释了arctan()的生成,arccos()和arcsin()可以从here所描述的那里计算出来。

enter image description here

enter image description here

当然,这也表明你还需要平方根和分裂。尽管PIC24 / dsPIC具有硬件整数除法,但这些可能很昂贵。关于数学加速的文章也涉及平方根。您的查找表方法可能更快,直接查找,但可能不适用于反向搜索,但本文中解释的方法更通用,更精确(库使用64位整数为36.28位固定点,您可能会在应用程序中以较低的精度和范围逃脱),并且肯定比使用软件浮点的标准库实现更快。

答案 2 :(得分:1)

您可以使用“中途”方法,组合粗粒度查找表以节省内存,以及中间值的数值近似值(例如Maclaurin Series,这将比线性插值更准确。)< / p>

一些例子here

This question也有一些相关的链接。

答案 3 :(得分:0)

6434的二进制搜索将需要~12次查找才能找到该值,如果需要更高精度,则需要进行插值。由于sin曲线的性质,你将在一端获得比另一端更高的精度。如果您可以节省内存,那么在输入上均匀分布您自己的反向表可能是速度和准确性的更好选择。

在与内置版本的比较方面,您必须对此进行测试。执行此操作时,请注意图像大小的增加量。在某些系统中,stdin实现可能非常重要。

相关问题