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

从正弦查找表计算arcin的效率,c,performance,embedded,trigonometry,lookup-tables,C,Performance,Embedded,Trigonometry,Lookup Tables,我在我的系统中实现了一个查找表来计算正弦/余弦值。我现在需要反三角函数(arcin/arccos) 我的应用程序运行在一个嵌入式设备上,由于程序内存有限,我无法在该设备上为arcsin添加第二个查找表。所以我想到的解决方案是浏览sine查找表来检索相应的索引 我想知道这个解决方案是否比使用来自数学标准库的标准实现更有效。 有人已经做过这个实验了吗 LUT的当前实现是从0到PI/2的正弦值数组。将表中存储的值乘以4096,以保持整数值的精度,以满足我的应用程序的需要。查找表的分辨率为1/4096,

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

我的应用程序运行在一个嵌入式设备上,由于程序内存有限,我无法在该设备上为arcsin添加第二个查找表。所以我想到的解决方案是浏览sine查找表来检索相应的索引

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

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


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

由于您没有告诉我们有关硬件、编译器或代码的信息,所以很难确定地说什么。但是,从先验来看,我希望编译器的标准库比代码更有效。

< P>也许你很不幸,你必须使用不支持C++的C30编译器,否则我会指点你和它的关联库。 然而,应用的一般原则,内存占用将远远小于您当前的实现。这篇文章解释了arctan()的生成,arccos()和arcsin()可以从中计算出来,如前所述


当然,这也意味着你还需要平方根和除法。虽然PIC24/dsPIC有硬件整数除法,但这些可能很昂贵。关于数学加速的文章也涉及平方根。对于直接查找,您的查找表方法可能会更快,但对于反向搜索,可能不会更快,但本文中介绍的方法更通用、更精确(库使用64位整数作为36.28位定点,您可能会在应用程序中获得更低的精度和范围),而且肯定比使用软件浮点的标准库实现更快。

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

与内置版本相比,您必须进行测试。当你这样做的时候,注意你的图像的大小增加了多少。在某些系统中,stdin的实现可能非常强大

您可以使用“中间”方法,结合粗粒度查找表以节省内存,以及中间值的数值近似值(例如,这将比线性插值更精确。)

一些例子


还有一些相关链接。

请描述您当前的正弦/余弦表的结构,并与finnw达成一致。根据现在表的结构,您可以对表执行二进制搜索,这可能足够快。但这样也会或多或少地失去准确性。我用查找表实现的信息编辑了我的问题。我添加了查找表实现的信息&它运行的设备。哎呀,我错过了你说你买不起第二个表的那一行。我仍然会看到通过删除stdlib可以节省多少钱