Ho un ciclo di controllo in esecuzione ad alta frequenza e ho bisogno di calcolare una radice quadrata per ogni ciclo. Le funzioni tipiche della radice quadrata funzionano bene ma richiedono un tempo eccessivo. Dal momento che il valore che sto prendendo la radice quadrata di non cambia troppo in ogni ciclo, vorrei trovare una radice quadrata iterativa che convergerà e quindi traccia il risultato corretto. In questo modo ho potuto fare una singola iterazione ad ogni passo temporale, piuttosto che molti.radice quadrata di rilevamento del valore mobile
Il problema è che probabilmente tutti i metodi di radice quadrata iterativi che ho visto avranno esito negativo quando l'input sta cambiando. In particolare sembra che ci saranno problemi quando l'input va a zero e poi aumenta nuovamente - i metodi non amano iniziare con un'ipotesi di zero.
Il mio intervallo di input è 0-4,5 e ho bisogno di una precisione di circa 0,01, quindi l'utilizzo di un incremento/decremento di 0,01 potrebbe richiedere troppo tempo - voglio che converga principalmente in 10 cicli o meno.
FYI Sto usando il punto fisso 16/32 bit l'ingresso è 16 bit q12. È su un microcontrollore quindi non mi interessa usare 1K per una tabella di ricerca. Il codice viene generato anche da un modello simulink e le loro funzioni di ricerca tabella sono piuttosto piene di overhead.
C'è una buona soluzione a questo?
Un colpo del metodo di Halley (http://www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm) dovrebbe fare bene. Se vuoi evitare la divisione, aggiorna 1/sqrt (x) e usa Newton o Halley. –
Cosa vuoi dire, il valore cambia? Stai dicendo che vuoi trovare 'sqrt (x + epsilon)' conoscendo 'x' e' sqrt (x) 'senza dover calcolare direttamente?O stai dicendo che il registro che contiene x è volatile e può cambiare nel mezzo del calcolo (!?!)? –
Guarda questa funzione 'FastSqrt' usata nei giochi http://www.gamedev.net/topic/278840-fast-sqrt/ – ja72