отслеживание квадратного корня из движущегося значения

У меня есть контур управления, работающий на высокой частоте, и мне нужно вычислять квадратный корень в каждом цикле. Типичные функции извлечения квадратного корня работают нормально, но занимают слишком много времени. Поскольку значение, из которого я беру квадратный корень, не слишком сильно меняется в каждом цикле, я хотел бы найти повторяющийся квадратный корень, который будет сходиться, а затем отслеживать правильный результат. Таким образом, я мог бы выполнять одну итерацию на каждом временном шаге, а не много.

Проблема в том, что все итерационные методы извлечения квадратного корня, которые я видел, вероятно, не сработают при изменении входных данных. В частности, похоже, что будут проблемы, когда ввод будет равен нулю, а затем снова увеличится - методы не любят начинать с предположения нуля.

Мой входной диапазон составляет 0–4,5, и мне нужна точность около 0,01, поэтому использование приращения/уменьшения 0,01 может занять слишком много времени — я хочу, чтобы оно в основном сходилось за 10 циклов или меньше.

К вашему сведению, я использую 16/32-битную фиксированную точку, входной сигнал — 16-битный q12. Он на микроконтроллере, поэтому я не заинтересован в использовании 1K для таблицы поиска. Код также генерируется из модели simulink, и их функции поиска в таблице довольно накладные.

Есть ли хорошее решение этой проблемы?

7
задан phkahler 12 April 2012 в 15:15
поделиться