4

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

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

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

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

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

4

4 回答 4

3

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

于 2011-05-07T10:35:57.817 回答
3

不幸的是,您必须使用不支持 C++ 的 C30 编译器,否则我会指出您使用定点算术及其相关库优化数学密集型应用程序。

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

在此处输入图像描述

在此处输入图像描述

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

于 2011-05-07T16:45:08.020 回答
2

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

这里有一些例子。

这个问题也有一些相关的链接。

于 2011-05-08T01:04:52.257 回答
0

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

就与内置版本的比较而言,您必须对其进行测试。这样做时,请注意图像的大小增加了多少。在某些系统中,标准输入实现可能非常庞大。

于 2011-05-07T18:15:21.287 回答