Как избавиться от масштабного коэффициента от CORDIC
Из CORDIC, K_i = cos(tan^-1(2^i))
, Как я знаю, К приближается 0.607xxx
, Как мне подойти к 0.607xxx
?
Также это означает, что я могу использовать 0.607xxx
вместо cos(tan^-1(2^I))
? Я цитирую из этой статьи.
Я пытаюсь реализовать гиперболическую функцию Тан. И до сих пор я понимаю (6) уравнение. Я не уверен, как сделать К и как его использовать?
Обновить:
Я хочу знать, где применяется общая концепция масштабирования, чтобы получить синус, потому что угол. Вот некоторый пример, я установил, что указанный угол равен 20. И я хочу знать синус, потому что угол. Процесс происходит следующим образом.
ndxy угол K arctan значение
0 1 0,7071 0,7071 0,7854 0,7071 0,785398
....
10 -1 0,9395 0,3426 0,3497 1 0,000976
Мы можем получить, если указанный угол 20 degree(0.3491)
Тогда мы получим sine (20) = 0.9395
Cos(20) = 0.3497
Готово.
Но мне все еще интересно, где общее масштабирование concept(0.607)
применять? Где общее масштабирование concept(0.607 )
используется, чтобы получить грех, потому что угол?
2 ответа
Каждый шаг в алгоритме CORDIC добавляет масштабирование cos(arctan(2^-i))
(или же 1/sqrt(1+2^-2i)
), поэтому для CORDIC с 4 шагами общее масштабирование составляет:
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
, В вашем примере вы включили масштабный коэффициент, который дает правильный ответ, но не является необходимым и запрещает простую операцию shift+add. Таким образом, мы оставляем масштабирование как постоперацию (или инициализацию) или полностью исключаем, если последующий модуль может иметь дело с масштабированным ответом.
Способ получения греха / кос 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
, который сдвиг и добавить. Вам также не нужно хранить коэффициент масштабирования в ПЗУ или где-либо еще; единственное, что вам нужно, это арктан (2^-i).
Обратите внимание, что вы можете получить немасштабированный результат, начав с X = 0.607
вместо X = 1
,
При использовании CORDIC вы рассчитываете tan и tanh, беря отношение sin к cos или sinh к cosh. Поскольку к обоим терминам применяется масштабный коэффициент, K отменяется, и вам не нужно вносить какие-либо исправления. Вам необходимо знать о потенциальных проблемах с переполнением и убедиться, что в регистрах X и Y достаточно битов для хранения масштабированных значений. Другой вариант - предварительно масштабировать входные значения X и Y (умножить на 0,607), чтобы коэффициент усиления был равен 1 после запуска алгоритма.