Как избавиться от масштабного коэффициента от 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 после запуска алгоритма.

Другие вопросы по тегам