我有一个以高频运行的控制回路,需要计算每个周期的平方根。典型的平方根函数工作正常,但花费时间过长。由于我在每个周期中取平方根的值不会变化太多,因此我想找到一个迭代平方根,它将收敛并跟踪正确的结果。这样我可以在每个时间步骤做一次迭代,而不是很多次。跟踪移动值的平方根
问题是我看到的所有迭代平方根方法在输入发生变化时可能会失败。特别是当输入变为零然后又增加时,看起来会有问题 - 方法不喜欢以猜测零开始。
我的输入范围是0-4.5,我需要大约0.01的精度,所以使用0.01的递增/递减可能需要很长时间 - 我希望它主要收敛在10个周期或更少。
仅供参考我使用16/32位定点输入是16位q12。这是在一个微控制器上,所以我不想使用1K查找表。该代码也是从simulink模型生成的,它们的表查找函数充满了开销。
有没有一个很好的解决方案呢?
一杆(http://www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm)应该做的罚款。如果你想避免分裂,改为更新1/sqrt(x)并使用牛顿或哈雷。 – 2012-04-12 15:58:39
你是什么意思,价值变化?你是说你想找到'sqrt(x + epsilon)'知道'x'和'sqrt(x)'而不必直接计算它?或者你说包含x的寄存器是不稳定的,并且可以在计算过程中改变(!?!)? – 2012-04-12 20:50:49
看看游戏中使用的'FastSqrt'功能http://www.gamedev.net/topic/278840-fast-sqrt/ – ja72 2012-04-13 19:31:59