定点三角函数用于嵌入式应用


9

我需要在嵌入式应用程序中进行旋转(和其他)转换,需要sin()cos()和tan()函数。我知道您可以使用查找表,这是我自己进行研究时可以找到的唯一解决方案,但是那里有一个好的定点触发库吗?

我正在考虑为应用程序使用cortex M3,因此我想尽可能远离浮点,以使应用程序保持简洁。


有两种想法:旋转的传统原始实现是CORDIC算法。您可能还会看到您的供应商现在是否在提供与您正在考虑的M3竞争的Cortex M4。
克里斯·斯特拉顿

4
您为什么不想使用查找表?这对于罪恶和cos非常有效。从算法上做正弦和余弦将花费更长的时间。唯一的好处可能是减少了使用的程序存储空间,但这在您的应用程序中真的重要吗?
奥林·拉斯洛普

@OlinLathrop,我想知道其他人发现了什么:也许存在一些我没有找到的有效解决问题的有效方法,几乎​​没有错误,同时又节省了存储空间?据我所知(我可能是错的),使用标准库进行算法求解的最大问题是,所有数学运算都是在浮点数中完成的,而没有FPU,所有数学运算都必须以数字形式完成,这效率低下。 ..查询表的最大麻烦是:我需要达到多少精度?如果精度要求发生变化,我是否还会有足够的程序存储空间?
Bob

您需要多少精度?适中的查找表足以满足大多数嵌入式sin / cos需求。使用1025个表条目,您将获得4096角度分辨率。那时,线性互操作为您提供表条目之间的良好准确性。关于正弦查找似乎有很多错误的神话。有关更多详细信息,请参见electronics.stackexchange.com/a/16516/4512上的答复。
Olin Lathrop

我听到您在说什么,并且我了解正弦函数查找表的概念,但是如果我的代码有限(项目总是填充代码空间),是否有更紧凑的方式来处理此问题?这就是为什么我问:有很多有才华的人在做贡献,我想知道他们是否找到了更好的东西。
Bob

Answers:


6

在嵌入式应用程序中执行三角函数的一种好方法是对所需函数使用多项式逼近。该代码紧凑,数据由几个系数组成,唯一需要的运算是乘法和加法/减法。许多嵌入式系统都有硬件倍增器,可提供良好的性能。


1
有没有人发布过针对嵌入式应用而优化的C版本,而不是使用浮点指令?多项式逼近任一边的高误差使自己倾向于使用技巧来对不同的段使用不同的多项式以减少误差,或者使用其他技巧...
Bob

1
通用C不直接支持非整数定点数据类型和操作,因此对此数据类型的优化往往是特定于平台的。例如,大多数DSP直接在其硬件中支持定点小数数据类型。从C,您可以通过专有库进行访问。
Dave Tweed13年


通用C通过_Fract数据类型获得支持,但是大多数微控制器实现确实具有特定于供应商的库。我将libmathq15用于所有定点需求。到目前为止已经完成了工作。
slightlynybbled

_Fract是恕我直言的废话;我讨厌它由C委员会“标准化”的事实。它迫使您对所有问题都使用Q15或Q31,这在许多情况下都没有意义,并且使您在这些情况下束手无策。
詹森·S

3

您是否反对为此使用定点Cortex库?

q31_t arm_sin_q31(q31_t x)
快速逼近Q31数据的正弦三角函数。

从:

CMSIS-DSP:DSP库集合,具有60多种功能,适用于各种数据类型:定点(分数q7,q15,q31)和单精度浮点(32位)。该库可用于Cortex-M0,Cortex-M3和Cortex-M4。

它使用具有二次插值的查找表,但是速度非常快。您可以将其调整为线性插值,以提高速度,但增加误差。

另请注意,即使Cortex M4也不一定具有FPU。如果他们这样做,我已经看到他们称为“ M4F”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.