Я работаю над реализацией алгоритма FFT в сборке на 8-битном микроконтроллере (HCS08) для развлечения. Как только алгоритм будет завершен, у меня будет массив 8-битных пар вещественных и мнимых чисел, и я хочу найти величину каждого из этих значений. То есть, если x сложный, я хочу найти
|x| = sqrt(Re{x}^2 + Im{x}^2)
Теперь мне доступны 16-битный регистр и 8-битный регистр. Я думал просто возвести их в квадрат, сложить и извлечь квадратный корень из результата, но это создает проблему: максимально возможное значение суммы квадратов двух 8-битных чисел составляет ~ 130k, что больше, чем максимальное значение, которое может содержать 16-битный регистр (65,5 КБ).
Я придумал подпрограмму, которая вычисляет целочисленный квадратный корень из 16-битного числа, и она работает хорошо, но, очевидно, я не могу гарантировать, что буду работать со значениями, которые поместятся в 16-битные числа. Сейчас я думаю, что есть алгоритм, который будет напрямую приближать то, что мне нужно, но я ничего не могу найти. Любые идеи очень приветствуются.
Подводя итог: скажем, у меня есть вектор с двумя 8-битными компонентами, и я хочу найти длину вектора. Как я могу аппроксимировать это без фактического вычисления квадратов и квадратных корней?
Спасибо!
<x,y>
в какой-то новый вектор<x1,0>
(или эквивалентно<0,y1>
.x1
(илиy1
) дает величину исходного вектора, а CORDIC можно реализовать без умножения. Я никогда не делал этого сам, и понятия не имею, насколько это сложно . - person mtrw   schedule 03.04.2011sqrt
- см. Ответ ниже. - person Paul R   schedule 04.04.2011