【问题标题】:Efficiency of arcsin computation from sine lookup table从正弦查找表计算 arcsin 的效率
【发布时间】:2011-05-07 10:27:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请描述一下你当前正弦/余弦表的结构
  • 同意 finnw。根据现在表的结构,您可以对表进行二进制搜索,这可能足够快。但是这样你也会或多或少地失去准确性。
  • 我用查找表实现的信息编辑了我的问题

标签: c performance embedded trigonometry lookup-tables


【解决方案1】:

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

【讨论】:

  • 我添加了有关查找表的实现及其运行设备的信息。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    一些例子here

    This question也有一些相关链接。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 哎呀,我错过了你说你买不起第二张桌子的那一行。我仍然会看到删除 stdlib d 可以节省多少
      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多