Каждый шаг в алгоритме CORDIC добавляет масштабирование cos(arctan(2^-i))
(или 1/sqrt(1+2^-2i)
), поэтому для 4-шагового алгоритма CORDIC общее масштабирование составляет:
cos(arctan(2^-0))*cos(arctan(2^-1))*cos(arctan(2^-2))*cos(arctan(2^-3)) = 0.60883
Если вы добавите больше итераций, получится 0,607252935 и даже больше. Что делать с этим фактором, зависит от вас и функции, которую вы реализуете. Возможно, вы захотите удалить его и получить немасштабированный результат, или ваш потребитель сможет справиться с этим проще.
В случае tanh
, я думаю, есть деление двух значений с одинаковым масштабированием, поэтому в этом случае оно уравновешивается. Я действительно не уверен в этом, так как я не использовал CORDIC в этом режиме, так что вам придется выяснить это самостоятельно.
Обновлять
Преимущество CORDIC в том, что каждая итерация представляет собой сдвиг + добавление к X
и Y
. В вашем примере вы включили коэффициент масштабирования, который дает правильный ответ, но не является необходимым и запрещает простую операцию сдвига + добавления. Таким образом, мы оставляем масштабирование как пост-операцию (или инициализацию) или полностью исключаем его, если последующий модуль может обрабатывать масштабированный ответ.
Способ получить sin/cos 20, начиная с X = 1; Y = 0; Z = 20
:
Z0 = 20 - 45.00 = -25.00; X0 = 1 - 0 = 1; Y0 = 0 + 2^-0 = 1
Z1 = Z0 + 26.57 = 1.57; X1 = X0 + Y0*2^-1 = 1.5000; Y1 = Y0 - X0*2^-1 = 0.5000
Z2 = Z1 - 14.04 = -12.47; X2 = X1 - Y1*2^-2 = 1.3750; Y2 = Y1 + X1*2^-2 = 0.8750
Z3 = Z2 + 7.13 = - 5.35; X3 = X2 + Y2*2^-3 = 1.4844; Y3 = Y2 - X2*2^-3 = 0.7031
Z4 = Z3 + 3.58 = - 1.77; X4 = X3 + Y3*2^-4 = 1.5283; Y4 = Y3 - X3*2^-4 = 0.6104
Z5 = Z4 + 1.79 = 0.02; X5 = X4 + Y4*2^-5 = 1.5474; Y5 = Y4 - X4*2^-5 = 0.5626
Z6 = Z5 - 0.90 = - 0.88; X6 = X5 - Y5*2^-6 = 1.5386; Y6 = Y5 + X5*2^-6 = 0.5868
Окончательный ответ масштабируется: cos(20) = X6*0.607 = 0.9339
и sin(20) = Y6*0.607 = 0.3562
. Преимущество игнорирования коэффициента масштабирования должно быть очевидным, каждая итерация равна Xi = Xi-1 +- Yi-1 * 2^-i
, что является сдвигом и добавлением. Вам также не нужно хранить коэффициент масштабирования в ПЗУ или где-то еще; единственная память, которая вам нужна, предназначена для arctan(2^-i).
Обратите внимание, что вы можете получить немасштабированный результат, начав с X = 0.607
вместо X = 1
.
person
Jonathan Drolet
schedule
18.06.2015