13

我已经在一个项目中达到了这样的地步:开始为向量和其他三角函数构建一些支持类比继续使用临时函数更有意义。我希望有很多 C++ 库为此,但我不想牺牲我习惯的速度和功能。

具体来说,我希望能够使用整数角度,并且我希望保持这样的近似值所提供的超快速度:

static inline int32_t sin_approx(int32_t angle)
//Angle is -32768 to 32767: Return -32768 to 32767
{
    return (angle<<1) - ((angle*abs(angle))>>14);
}

因此,在我不必要地自己动手之前,是否有任何用于 c++ 的非常快速的定点库,其中包含模板类(例如向量),我可以在其中指定使用的整数的宽度,并且具有快速近似值,例如我应该看的上面那个?

4

1 回答 1

4

几年前,当我不得不将一些音频指纹识别代码从浮点转换为定点时,我就走上了这条路。最难的部分是 DCT(使用大余弦表)和高精度对数。我发现现有图书馆的方式令人惊讶地少。从那以后,我听说最初的 Sony PlayStation (PS1) 没有浮点支持,所以它的开发论坛 (fori?),如果它们仍然存在,可能会有你正在寻找的东西。

与我共事过的一些人对NewMat库很满意,尽管它面向线性代数而不是三角函数,并且似乎专注于浮点数。尽管如此,它的网站仍然指向这个列表,看起来值得一试。我还找到了spuc,一个可能对定点支持有好处的信号处理库。几年前,我看到了来自 Fraunhofer 的信号处理模板库 (sptl)。我认为它是专有的,但可能以某种方式可用。

说了这么多,我认为你已经很接近你已经拥有的东西了。既然你有一个正弦函数,你基本上也有一个余弦函数,只要你适当地转换输入(cos(x) == sin(x + pi/2))。由于正切是正弦和余弦 ( tan(x) = sin(x) / cos(x)) 的商,因此您基本上是三角函数。

关于向量,STL 向量和 valarray 类与 STL 算法相结合是否也让您非常接近?如果没有,总会有 Boost 的数学库

抱歉,我无法为您指出您正在寻找的灵丹妙药,但如今您尝试做的事情并不常见。想要精度的人通常直接使用浮点,它在现代处理器上具有不错的性能,并且有很多库支持。那些想要在资源受限的硬件上提高速度的人通常不需要精度,也不会通过向量进行触发,也可能不会使用 C++。我认为你最好的选择是自己动手。尝试将其视为在新环境中应用轮子设计模式,而不是重新发明它。:)

于 2011-11-22T07:40:16.157 回答