我有一個以高頻運行的控制迴路,需要計算每個週期的平方根。典型的平方根函數工作正常,但花費時間過長。由於我在每個週期中取平方根的值不會變化太多,因此我想找到一個迭代平方根,它將收斂並跟蹤正確的結果。這樣我可以在每個時間步驟做一次迭代,而不是很多次。跟蹤移動值的平方根
問題是我看到的所有迭代平方根方法在輸入發生變化時可能會失敗。特別是當輸入變爲零然後又增加時,看起來會有問題 - 方法不喜歡以猜測零開始。
我的輸入範圍是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