Как избавиться от масштабного коэффициента от CORDIC

Из КОРДИК, K_i = cos(tan^-1(2^i)). Насколько я знаю, K приближается к 0.607xxx. Как мне подойти к 0.607xxx?

Также означает ли это, что я могу использовать 0.607xxx вместо cos(tan^-1(2^I))? Я цитирую из этой статьи.

Я пытаюсь реализовать гиперболическую функцию tanh. И пока я понимаю (6) уравнение. Я не уверен, как сделать K и как его использовать?

Обновлять :

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

n d x y угол K значение арктангенса

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 ) используется для получения sin, cos угла?


person user5014962    schedule 18.06.2015    source источник


Ответы (2)


Каждый шаг в алгоритме 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
comment
Если у меня 10 итераций, то может ли масштаб перейти к 1 от 0,607252935? От Кевина Тибедо - person user5014962; 19.06.2015
comment
Общий коэффициент масштабирования представляет собой произведение всех коэффициентов масштабирования итерации. Масштабирование десятой итерации приблизительно равно 1, что хорошо, поскольку означает, что умножение всех масштабов будет сходиться. Он сходится к 0,607252935. - person Jonathan Drolet; 19.06.2015
comment
Это немного не в тему. Зачем нам тотальное масштабирование? Я полностью понимаю, что если у меня есть итерация, я могу получить 0,607 ... но почему мы получаем общее значение масштабирования? Для чего? - person user5014962; 19.06.2015
comment
Возможно, я ошибся в вашем вопросе, хотя вы хотели знать, откуда взялся коэффициент 0,607. Это кумулятивное масштабирование, полученное из алгоритма CORDIC. Он нужен для корректировки результата CORDIC. Например, если вы выполняете преобразование полярных координат в прямоугольные, используя CORDIC, длина полученного вектора будет в 1,65 раза больше, чем ожидаемое значение. 1,65 это 1/0,607. Когда интерпретация результата требует реального результата, вы должны компенсировать это масштабирование. - person Jonathan Drolet; 19.06.2015
comment
Как я знаю, в режиме вращения K получается из (1/sqrt(1+2^(-2*n)). Поэтому, когда n стремится к бесконечности, K выглядит так: 0,7071 0,8944 0,9701 0,9923 0,9981 0,995 0,9999 1,0000 1.0000 .... но я не могу понять концепцию общего масштабирования. Нужна ли концепция общего масштабирования в полярном режиме CORDIC? Если вы можете, дайте мне пример? Когда используется общий масштаб - person user5014962; 19.06.2015
comment
Применяется масштабирование n-й итерации. Чтобы получить больше точности в CORDIC, вы используете больше итераций. Поскольку на каждой итерации применяется масштабирование 1/sqrt(1+2^-2n), общее масштабирование после X итерации, если X достаточно велико, составляет приблизительно 0,607 (1/(sqrt(2)*sqrt(1+2^ -2)*кв.(1+2^-4)*кв.(1+2^-6)...) - person Jonathan Drolet; 19.06.2015
comment
Ух ты! это гениально! ; Как я могу определить +,- Y из Xi = Xi-1 +- Yi-1 * 2^-i, а также Почему вы получаете значения Z? Он нигде не используется. - person user5014962; 19.06.2015
comment
Вы инициализируете Z под углом, от которого хотите получить sin/cos. Вы обновляете его Zi = Zi-1 +- arctan(2^-i). Вам нужно Z, так как его знак определяет знак обновления Z, X и Y. - person Jonathan Drolet; 19.06.2015

При использовании CORDIC вы вычисляете tan и tanh, взяв отношение sin к cos или sin к cosh. Поскольку к обоим терминам применяется масштабный коэффициент, K сокращаются, и вам не нужно делать никаких исправлений. Вам необходимо знать о потенциальных проблемах с переполнением и убедиться, что в регистрах X и Y присутствует достаточно битов для хранения масштабированных значений. Другим вариантом является предварительное масштабирование входных значений X и Y (умножение на 0,607), чтобы коэффициент усиления был равен 1 после запуска алгоритма.

person Kevin Thibedeau    schedule 18.06.2015
comment
Спасибо, подскажите пожалуйста, что это значит? Поскольку к обоим терминам применяется масштабный коэффициент, K сокращаются, и вам не нужно делать никаких исправлений. я не могу этого понять - person user5014962; 18.06.2015
comment
@user5014962. гиперболический CORDIC(a) производит Kcosh(a) и Ksinh(a) в качестве результатов в регистрах X и Y. (K*sinh(a)) / (K*cosh(a)) = tanh(a). Отмена K в делении без необходимости корректировки усиления. Обратите внимание, что масштабный коэффициент для гиперболического CORDIC составляет: K[i] = sqrt(1-2^(-2i)), который сходится к 1 примерно после 10 итераций вместо 1,647 для круговой реализации. - person Kevin Thibedeau; 18.06.2015
comment
Упс. Гиперболический масштабный коэффициент сходится к 0,82978 без каких-либо повторных итераций и к 0,82816 с добавлением повторных итераций (4, 13, 40, ...) для принудительной сходимости алгоритма. - person Kevin Thibedeau; 18.06.2015