por*_*uod 13 c++ trigonometry fixed-point approximation
我已经达到了一个项目的重点,开始为向量和misc三角函数构建一些支持类比继续使用ad-hoc函数更有意义.我希望有很多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);
}
Run Code Online (Sandbox Code Playgroud)
所以,在我不必要地推出自己的之前,是否有任何真正快速的c ++定点库,其中包含模板类,例如向量,我可以指定所用整数的宽度,并且具有快速近似值,例如上面的那个,我应该看一下?
几年前,当我必须将一些音频指纹识别代码从浮点转换为定点时,我就走上了这条道路。难点是DCT(使用大余弦表)和高精度对数。令人惊讶的是,我发现现有的图书馆几乎没有什么。从那时起,我听说最初的索尼 PlayStation (PS1) 没有浮点支持,因此它的开发论坛(fori?),如果它们仍然存在,可能有您正在寻找的东西。
与我共事的一些人在NewMat库上很幸运,尽管它面向线性代数而不是三角学,并且似乎专注于浮点数。尽管如此,它的网站还是指向了这个列表,看起来值得一看。我还发现了spuc,一个信号处理库,可能非常适合定点支持。几年前,我看到了 Fraunhofer 的信号处理模板库(sptl)。我认为它是专有的,但可能以某种方式可用。
话虽这么说,我认为你已经非常接近你已经拥有的了。既然你有一个正弦函数,那么你基本上也有一个余弦函数,只要你适当地转换输入(cos(x) == sin(x + pi/2))。由于正切是正弦和余弦 ( tan(x) = sin(x) / cos(x)) 的商,因此您基本上可以进行三角学计算。
关于向量,STL 向量和 valarray 类与 STL 算法的结合是否也能让您非常接近?如果没有,Boost 的数学库总是有的。
抱歉,我无法向您指出您正在寻找的灵丹妙药,但您现在尝试做的事情相当不常见。想要精度的人通常会直接使用浮点,它在现代处理器上具有不错的性能,并且有大量的库支持。那些想要在资源受限的硬件上获得速度的人通常不需要精度,并且不会通过向量进行三角函数,并且可能也不会进行 C++。我认为你最好的选择是自己推出。尝试将其视为在新环境中应用轮子设计模式,而不是重新发明它。:)