CORDIC

CORDIC — Простий та ефективний алгоритм обчислення багатьох елементарних функцій. Назва методу походить від англ. Coordinate Rotation Digital Computer — цифровий комп'ютер для обертання координат.

Класичний CORDIC-метод

Відомий класичний CORDIC-метод описав Джек Волдер (Jack E. Volder) ще у 1959 р. [1].З того часу опубліковано надзвичайно багато робіт з цієї проблематики [2 — 10].Метод популярний і нині завдяки простоті його програмної та апаратної реалізації. Адже для класичного CORDIC потрібен лише невеликий об'єм пам'яті та деякі елементарні операції типу зчитування з пам'яті, додавання, віднімання та зсуву.

Розгляд методу почнемо з опису двох поширених кривих другого порядку — кола одиничного радіуса та гіперболи.Якщо параметрично подати коло та гіперболу, то положення будь-якої точки на цих кривих з координатами (x, y)Т описується такими рівняннями:

для кола

x = c o s ϕ , {\displaystyle x=cos\phi ,}
y = s i n ϕ , ( 1 ) {\displaystyle y=sin\phi ,(1)}
ϕ = a r c t a n ( y x ) ; {\displaystyle \phi =arctan\left({\frac {y}{x}}\right);}

для гіперболи

x = c o s h ϕ , {\displaystyle x=cosh\phi ,}
y = s i n h ϕ , ( 2 ) {\displaystyle y=sinh\phi ,(2)}
ϕ = a r c t a n h ( y x ) ; {\displaystyle \phi =arctanh\left({\frac {y}{x}}\right);}

де φ — кут, який утворює вектор початкового положення (xo,yo)T = (1,0)T, рухаючись по колу або гіперболі, з віссю абсцис; кінець вектора досягає точки (x, y)T(Т- символ транспонування). Зв'язок між координатами двох точок, що лежать на колі (гіперболі), можна описати за допомогою повороту вектора навколо початку декартової системи координат. Точка, що розміщена на кінці вектора і має початкові координати (x, y)T, завдяки повороту вектора на кут φ переміститься у нове положення з координатами (x' ,y')T. Якщо вектор рухається проти годинникової стрілки, то зв'язок (для кола) описується такими рівняннями:

[ x y ] {\displaystyle {\begin{bmatrix}x'\\y'\end{bmatrix}}} = [ c o s ϕ s i n ϕ s i n ϕ c o s ϕ ] {\displaystyle {\begin{bmatrix}cos\phi &-sin\phi \\sin\phi &cos\phi \end{bmatrix}}} [ x y ] ( 3 ) {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}(3)}

Для гіперболи цей зв'язок можна подати рівняннями:

[ x y ] {\displaystyle {\begin{bmatrix}x'\\y'\end{bmatrix}}} = [ s i n h ϕ c o s h ϕ c o s h ϕ s i n h ϕ ] {\displaystyle {\begin{bmatrix}sinh\phi &cosh\phi \\cosh\phi &sinh\phi \end{bmatrix}}} [ x y ] ( 4 ) {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}(4)}

Якщо зобразити рух точки по колу (гіперболі) як сумарний результат мікрообертань вектора навколо початку системи координат на мікрокути α i {\displaystyle \alpha _{i}} , що є частиною загального вхідного кута ϕ {\displaystyle \,\phi } , зв'язок між двома сусідніми точками з координатами (xі,yі)T та (xі+1,yі+1)T для колового обертання вектора буде таким:

[ x i + 1 y i + 1 ] {\displaystyle {\begin{bmatrix}x_{i+1}\\y_{i+1}\end{bmatrix}}} = [ c o s α i s i n α i s i n α i c o s α i ] {\displaystyle {\begin{bmatrix}cos\alpha _{i}&-sin\alpha _{i}\\sin\alpha _{i}&cos\alpha _{i}\end{bmatrix}}} [ x i y i ] ( 5 ) {\displaystyle {\begin{bmatrix}x_{i}\\y_{i}\end{bmatrix}}(5)}

Якщо точка рухається по гіперболі, рівняння набувають вигляду:

[ x i + 1 y i + 1 ] {\displaystyle {\begin{bmatrix}x_{i+1}\\y_{i+1}\end{bmatrix}}} = [ c o s h α i s i n h α i s i n h α i c o s h α i ] {\displaystyle {\begin{bmatrix}cosh\alpha _{i}&sinh\alpha _{i}\\sinh\alpha _{i}&cosh\alpha _{i}\end{bmatrix}}} [ x i y i ] ( 6 ) {\displaystyle {\begin{bmatrix}x_{i}\\y_{i}\end{bmatrix}}(6)}

Надалі розглядатимемо лише колове обертання.

Як бачимо, для здійснення одного мікрообертання потрібно обчислити значення синуса та косинуса кута α i {\displaystyle \alpha _{i}} та виконати чотири операції множення. Перетворимо систему (5), щоб зменшити кількість необхідних операцій та спростити апаратну реалізацію пристрою. Для цього зобразимо систему у такому вигляді:

[ x i + 1 y i + 1 ] {\displaystyle {\begin{bmatrix}x_{i+1}\\y_{i+1}\end{bmatrix}}} = c o s α i [ 1 t a n α i t a n α i 1 ] {\displaystyle cos\alpha _{i}{\begin{bmatrix}1&-tan\alpha _{i}\\tan\alpha _{i}&1\end{bmatrix}}} [ x i y i ] ( 7 ) {\displaystyle {\begin{bmatrix}x_{i}\\y_{i}\end{bmatrix}}(7)}

Тепер спробуємо замінити множення зсувами.

Виконаємо заміну в системі (7) — виберемо елементарні кути α i {\displaystyle \,\alpha _{i}} на підставі

α i = a r c t a n ( 2 i ) ( 8 ) {\displaystyle \alpha _{i}=arctan\left(2^{-i}\right)(8)}

У цьому випадку t a n α i = t a n ( a r c t a n ( 2 i ) ) = 2 i {\displaystyle tan\alpha _{i}=tan{\big (}arctan{\big (}2^{-i}{\big )}{\big )}=2^{-i}} ,a кут повороту φ наближається сумою знакозмінних кутів α i {\displaystyle \alpha _{i}} :

ϕ = i = 0 m σ i α i , ( 9 ) {\displaystyle \phi =\sum _{i=0}^{m}\sigma _{i}\alpha _{i},(9)}

де σ i { 1 , 1 } {\displaystyle \sigma _{i}\in {\big \{}-1,1{\big \}}}  — оператор вибору (decision operator) напрямку обертання.
Тоді (7) можна замінити на

[ x i + 1 y i + 1 ] {\displaystyle {\begin{bmatrix}x_{i+1}\\y_{i+1}\end{bmatrix}}} = c o s α i [ 1 σ i 2 i σ i 2 i 1 ] {\displaystyle cos\alpha _{i}{\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}}} [ x i y i ] ( 10 ) {\displaystyle {\begin{bmatrix}x_{i}\\y_{i}\end{bmatrix}}(10)}

Отже, щоб здійснити одне мікрообертання, необхідно заздалегідь обчислити значення косинуса кута α i {\displaystyle \alpha _{i}} та виконати лише дві операції множення. Дві інші операції множення замінено операціями зсуву.

Ураховуючи (3), (8) — (10), можемо записати:

[ x y ] {\displaystyle {\begin{bmatrix}x'\\y'\end{bmatrix}}} = c o s α 0 [ 1 σ 0 2 0 σ 0 2 0 1 ] {\displaystyle cos\alpha _{0}{\begin{bmatrix}1&-\sigma _{0}2^{-0}\\\sigma _{0}2^{-0}&1\end{bmatrix}}} c o s α 1 [ 1 σ 1 2 1 σ 1 2 1 1 ] {\displaystyle cos\alpha _{1}{\begin{bmatrix}1&-\sigma _{1}2^{-1}\\\sigma _{1}2^{-1}&1\end{bmatrix}}} c o s α 2 [ 1 σ 2 2 2 σ 2 2 2 1 ] {\displaystyle cos\alpha _{2}{\begin{bmatrix}1&-\sigma _{2}2^{-2}\\\sigma _{2}2^{-2}&1\end{bmatrix}}} c o s α m [ 1 σ m 2 m σ m 2 m 1 ] {\displaystyle \cdots cos\alpha _{m}{\begin{bmatrix}1&-\sigma _{m}2^{-m}\\\sigma _{m}2^{-m}&1\end{bmatrix}}} [ x y ] {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}} =

= i = 0 m cos ( arctan ( 2 i ) ) {\displaystyle =\prod _{i=0}^{m}\cos {\Big (}\arctan {\Big (}2^{-i}{\Big )}{\Big )}} ( i = 0 m {\displaystyle {\big (}\prod _{i=0}^{m}} [ 1 σ i 2 i σ i 2 i 1 ] ) {\displaystyle {\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}}{\big )}} [ x y ] {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}} = P {\displaystyle {\boldsymbol {=P}}} ( i = 0 m {\displaystyle {\big (}\prod _{i=0}^{m}} [ 1 σ i 2 i σ i 2 i 1 ] ) {\displaystyle {\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}}{\big )}} [ x y ] , ( 11 ) {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}},(11)}

де

P = {\displaystyle {\boldsymbol {P=}}} ( i = 0 m cos ( arctan ( 2 i ) ) = c o n s t . ( 12 ) {\displaystyle {\big (}\prod _{i=0}^{m}\cos {\Big (}\arctan {\Big (}2^{-i}{\Big )}{\Big )}{\boldsymbol {=const.}}(12)}

Зауважимо, що у такому разі

sin α i = 2 i / 1 + 2 2 i ; ( 13 ) {\displaystyle \sin \alpha _{i}=2^{-i}/{\sqrt {1+2^{-2i}}};(13)}
cos α i = 1 / 1 + 2 2 i ; ( 14 ) {\displaystyle \cos \alpha _{i}=1/{\sqrt {1+2^{-2i}}};(14)}
tan   α i   = 2 i . ( 15 ) {\displaystyle \tan \ \alpha _{i}\ =2^{-i}.(15)}

Отже, (11) запишемо у вигляді

[ x y ] = {\displaystyle {\begin{bmatrix}x^{'}\\y^{'}\end{bmatrix}}=} P {\displaystyle {\boldsymbol {P}}} ( i = 0 m {\displaystyle {\big (}\prod _{i=0}^{m}} [ 1 σ i 2 i σ i 2 i 1 ] ) {\displaystyle {\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}}{\big )}} [ x y ] , ( 16 ) {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}},(16)}

де

P = {\displaystyle {\boldsymbol {P=}}} ( i = 0 m cos ( arctan ( 2 i ) ) = i = 0 m ( 1 1 + 2 2 i ) = c o n s t . {\displaystyle {\big (}\prod _{i=0}^{m}\cos {\Big (}\arctan {\Big (}2^{-i}{\Big )}{\Big )}{\boldsymbol {=}}\prod _{i=0}^{m}\left({\frac {1}{\sqrt {1+2^{-2i}}}}\right){\boldsymbol {=const.}}}

Своєю чергою, добуток матриць, взятий у дужки (16), можна зобразити однією результуючою матрицею повороту T r {\displaystyle T_{r}}

T r = {\displaystyle {\boldsymbol {T_{r}=}}} [ C C S S S S C C ] = {\displaystyle {\begin{bmatrix}CC&-SS\\SS&CC\end{bmatrix}}{\boldsymbol {=}}} i = 0 m {\displaystyle \prod _{i=0}^{m}} [ 1 σ i 2 i σ i 2 i 1 ] , ( 17 ) {\displaystyle {\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}},(17)}

де

C C = {\displaystyle {\boldsymbol {CC=}}} c o s ϕ / P = c o s ( i = 0 m σ i α i ) / P , {\displaystyle cos\phi /P=cos{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}/P,}
S S = {\displaystyle {\boldsymbol {SS=}}} s i n ϕ / P = s i n ( i = 0 m σ i α i ) / P , {\displaystyle sin\phi /P=sin{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}/P,}

Звідси (16) набуде вигляду

[ x y ] {\displaystyle {\begin{bmatrix}x'\\y'\end{bmatrix}}} = P [ c o s ϕ / P s i n ϕ / P s i n ϕ / P c o s ϕ / P ] {\displaystyle {\boldsymbol {=P}}{\begin{bmatrix}cos\phi /P&-sin\phi /P\\sin\phi /P&cos\phi /P\end{bmatrix}}} [ x y ] {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}} = [ C C S S S S C C ] {\displaystyle {\boldsymbol {=}}{\begin{bmatrix}CC&-SS\\SS&CC\end{bmatrix}}} [ x P y P ] ( 18 ) {\displaystyle {\begin{bmatrix}xP\\yP\end{bmatrix}}(18)}

Як випливає з (11), (16), множення замінено зсувами, що значно спрощує апаратну реалізацію обчислювачів.

Вилучивши з (10) масштабуючий коефіцієнт c o s α i = 1 / 1 + 2 2 i {\displaystyle cos\alpha _{i}=1/{\sqrt {1+2^{-2i}}}} , отримаємо класичний (спрощений) ітераційний CORDIC. Ротації в такому випадку називають псевдоротаціями, а рівняння набувають вигляду

[ x i + 1 y i + 1 ] {\displaystyle {\begin{bmatrix}x_{i+1}\\y_{i+1}\end{bmatrix}}} = [ 1 σ i 2 i σ i 2 i 1 ] {\displaystyle {\begin{bmatrix}1&-\sigma _{i}2^{-i}\\\sigma _{i}2^{-i}&1\end{bmatrix}}} [ x i y i ] ( 19 ) {\displaystyle {\begin{bmatrix}x_{i}\\y_{i}\end{bmatrix}}(19)}

або в розгорнутому вигляді

{ x i + 1 = x i σ i y i 2 i y i + 1 = y i + σ i x i 2 i ( 20 ) {\displaystyle {\begin{cases}x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i}\\y_{i+1}=y_{i}+\sigma _{i}x_{i}2^{-i}\end{cases}}(20)}

Якщо виконати всі m + 1 {\displaystyle m+1} ітерації за алгоритмом (20), то отримаємо:

[ x m + 1 y m + 1 ] {\displaystyle {\begin{bmatrix}x_{m+1}\\y_{m+1}\end{bmatrix}}} = [ C C S S S S C C ] {\displaystyle {\boldsymbol {=}}{\begin{bmatrix}CC&-SS\\SS&CC\end{bmatrix}}} [ x y ] = {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}=} [ c o s ϕ / P s i n ϕ / P s i n ϕ / P c o s ϕ / P ] {\displaystyle {\begin{bmatrix}cos\phi /P&-sin\phi /P\\sin\phi /P&cos\phi /P\end{bmatrix}}} [ x y ] {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}}} = 1 / P [ c o s ϕ s i n ϕ s i n ϕ c o s ϕ ] {\displaystyle {\boldsymbol {=1/P}}{\begin{bmatrix}cos\phi &-sin\phi \\sin\phi &cos\phi \end{bmatrix}}} [ x y ] , ( 21 ) {\displaystyle {\begin{bmatrix}x\\y\end{bmatrix}},(21)}
[ x m + 1 y m + 1 ] {\displaystyle {\begin{bmatrix}x_{m+1}\\y_{m+1}\end{bmatrix}}} = [ c o s ϕ s i n ϕ s i n ϕ c o s ϕ ] {\displaystyle {\boldsymbol {=}}{\begin{bmatrix}cos\phi &-sin\phi \\sin\phi &cos\phi \end{bmatrix}}} [ x / P y / P ] , ( 22 ) {\displaystyle {\begin{bmatrix}x/P\\y/P\end{bmatrix}},(22)}

або

x m + 1 = K m [ x c o s ( i = 0 m σ i α i ) y s i n ( i = 0 m σ i α i ) ] ; ( 23 ) {\displaystyle x_{m+1}=K_{m}{\big [}x\;cos{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}-y\;sin{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}{\big ]};(23)}
y m + 1 = K m [ y c o s ( i = 0 m σ i α i ) + x s i n ( i = 0 m σ i α i ) ] ; ( 24 ) {\displaystyle y_{m+1}=K_{m}{\big [}y\;cos{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}+x\;sin{\big (}\sum _{i=0}^{m}\sigma _{i}\alpha _{i}{\big )}{\big ]};(24)}
K m = 1 / P = i = 0 m 1 + 2 2 i , ( 25 ) {\displaystyle K_{m}=1/P=\prod _{i=0}^{m}{\sqrt {1+2^{-2i}}},(25)}

де K m {\displaystyle K_{m}}  — коефіцієнт деформації вектора.

Зв'язок між векторами (xm+1,ym+1)T та (x',y')T такий:

[ x y ] {\displaystyle {\begin{bmatrix}x'\\y'\end{bmatrix}}} = P [ x m + 1 y m + 1 ] . ( 26 ) {\displaystyle {\boldsymbol {=P}}{\begin{bmatrix}x_{m+1}\\y_{m+1}\end{bmatrix}}.(26)}
Ілюстрація ітерацій CORDIC

Рівняння (27) — (30) описують традиційний ітераційний CORDIC у режимі обертання (Rotation mode) для колової системи координат

x i + 1 = x i σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\;}
y i + 1 = y i + σ i x i 2 i ; ( 27 ) {\displaystyle y_{i+1}=y_{i}+\sigma _{i}x_{i}2^{-i};\;(27)}
z i + 1 = z i σ i α i ; ( 28 ) {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i};\;(28)}

де

σ i = { 1 if  z i < 0 + 1 if  z i 0 {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}z_{i}<0\\+1&{\mbox{if }}z_{i}\geq 0\end{cases}}} i = 0 , 1 , 2 , . . . , m , ( 29 ) {\displaystyle {\boldsymbol {i=0,1,2,...,m}},(29)}
α i = arctan ( 2 i ) , ( 30 ) {\displaystyle \alpha _{i}=\arctan {\big (}2^{-i}{\big )},(30)}

причому

x 0 = x , y 0 = y , z 0 = ϕ {\displaystyle x_{0}=x,y_{0}=y,z_{0}=\phi }

Тут введено ще одну змінну z {\displaystyle z\,} для зрівноваження значення вхідного кута ϕ {\displaystyle \phi \,} . Якщо i →∝ {\displaystyle i\to \propto } , значення залишкового кута z i + 1 {\displaystyle z_{i+1}\,} прямує до 0.
Для компенсації деформації вектора використовують початкове значення x 0 = x P = x / K m , y 0 = y P = y / K m , {\displaystyle x_{0}=xP=x/K_{m},y_{0}=yP=y/K_{m},\,} як випливає з (22) та (26).

Якщо прийняти x 0 = P = 1 / K m , y 0 = 0 , {\displaystyle x_{0}=P=1/K_{m},y_{0}=0,\,} то в результаті виконання (27) — (30) буде реалізовано функції синуса та косинуса за системою рівнянь (1).
Для гіперболічної системи координат у режимі обертання (Rotation mode) рівняння матимуть вигляд

x i + 1 = x i + σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}+\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i + σ i x i 2 i ; ( 31 ) {\displaystyle y_{i+1}=y_{i}+\sigma _{i}x_{i}2^{-i};(31)\,}
z i + 1 = z i σ i α i ; ( 32 ) {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i};(32)\,}

де

σ i = { 1 if  z i < 0 ; + 1 if  z i 0 ; {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}z_{i}<0;\\+1&{\mbox{if }}z_{i}\geq 0;\end{cases}}} i = 1 , 2 , 3 , 4 , 4 , 5...12 , 13 , 13 , 14 , . . . , m , ( 33 ) {\displaystyle {\boldsymbol {i=1,2,3,4,4,5...12,13,13,14,...,m}},(33)}
α i = arctan h ( 2 i ) , ( 34 ) {\displaystyle \alpha _{i}=\arctan h{\big (}2^{-i}{\big )},(34)}

причому x 1 = x , y 1 = y , z 1 = ϕ {\displaystyle x_{1}=x,y_{1}=y,z_{1}=\phi } . Початкові умови з урахуванням компенсації деформації вектора такі самі, як і для колової системи координат. Однак звернемо увагу на те, що початкове значення змінної i {\displaystyle i} дорівнює 1, а деякі її значення повторюються для забезпечення збіжності ітераційного процесу (див. рівняння (33)) [1;10].Ці обставини також треба враховувати, обчислюючи значення коефіцієнта деформації вектора для гіперболічної системи координат K m {\displaystyle K_{m}^{'}} за такими формулами

P m 1 = i = 1 m c o s h ( α i ) = i = 1 m 1 1 2 2 i ; {\displaystyle P_{m1}^{'}=\prod _{i=1}^{m}cosh{\big (}\alpha _{i})=\prod _{i=1}^{m}{\frac {1}{\sqrt {1-2^{-2i}}}};}
P m 2 = 1 1 2 8 1 1 2 26 1 1 2 80 ; {\displaystyle P_{m2}^{'}={\frac {1}{\sqrt {1-2^{-8}}}}{\frac {1}{\sqrt {1-2^{-26}}}}{\frac {1}{\sqrt {1-2^{-80}}}};}
P = P m 1 P m 2 ; {\displaystyle P^{'}=P_{m1}^{'}P_{m2}^{'};}
K m = 1 / P . {\displaystyle K_{m}^{'}=1/P^{'}.}

Якщо ж початковий вектор задано координатами x 0 = x , y 0 = y , z 0 = 0 {\displaystyle x_{0}=x,y_{0}=y,z_{0}=0\,} і при цьому зрівноважується значення змінної y {\displaystyle y\,} , тобто при i →∝ {\displaystyle i\to \propto } значення y i + 1 {\displaystyle y_{i+1}\,} прямує до 0, то це так званий векторний режим роботи (Vectoring mode).
Тоді для колової системи координат рівняння набувають вигляду

x i + 1 = x i + σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}+\sigma _{i}y_{i}2^{-i}\,;}
y i + 1 = y i σ i x i 2 i ; ( 35 ) ; {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i};(35)\,;}
z i + 1 = z i + σ i α i ; ( 36 ) {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i};(36)\,}

де

σ i = { 1 if  y i < 0 + 1 if  y i 0 {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}y_{i}<0\\+1&{\mbox{if }}y_{i}\geq 0\end{cases}}} i = 0 , 1 , 2... , m , ( 37 ) {\displaystyle {\boldsymbol {i=0,1,2...,m}},(37)}
α i = arctan ( 2 i ) . ( 38 ) {\displaystyle \alpha _{i}=\arctan {\big (}2^{-i}{\big )}.(38)}

У такому разі обчислюються функції

X m + 1 K m x 0 2 + y 0 2 ; {\displaystyle X_{m+1}\approx K_{m}{\sqrt {x_{0}^{2}+y_{0}^{2}}};}
Z m + 1 arctan ( y 0 x 0 ) . ( 39 ) {\displaystyle Z_{m+1}\approx \arctan {\big (}{\frac {y_{0}}{x_{0}}}{\big )}.(39)}

Для гіперболічної системи координат у векторному режимі (Vectoring mode) рівняння матимуть вигляд

x i + 1 = x i σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i σ i x i 2 i ; ( 40 ) {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i};(40)\,}
z i + 1 = z i + σ i α i , ( 41 ) {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i},(41)\,}

де

σ i = { 1 if  y i < 0 ; + 1 if  y i 0 ; {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}y_{i}<0;\\+1&{\mbox{if }}y_{i}\geq 0;\end{cases}}} i = 1 , 2 , 3 , 4 , 4 , 5...12 , 13 , 13 , 14 , . . . , m , ( 42 ) {\displaystyle {\boldsymbol {i=1,2,3,4,4,5...12,13,13,14,...,m}},(42)}
α i = arctan h ( 2 i ) , ( 43 ) {\displaystyle \alpha _{i}=\arctan h{\big (}2^{-i}{\big )},(43)}
X m + 1 K m x 1 2 y 1 2 ; {\displaystyle X_{m+1}\approx K_{m}{\sqrt {x_{1}^{2}-y_{1}^{2}}};}
Z m + 1 arctan ( y 1 x 1 ) . ( 44 ) {\displaystyle Z_{m+1}\approx \arctan {\big (}{\frac {y_{1}}{x_{1}}}{\big )}.(44)}

Для уніфікації методу CORDIC пропонуємо використати такий варіант узагальнення [11]:

x i + 1 = x i M ( R V ) σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}-M{\big (}R-V)\sigma _{i}y_{i}2^{-i};}
y i + 1 = y i + ( R V ) σ i x i 2 i ; ( 45 ) {\displaystyle y_{i+1}=y_{i}+{\big (}R-V)\sigma _{i}x_{i}2^{-i};(45)}
z i + 1 = z i + ( V R ) σ i α i . ( 46 ) {\displaystyle z_{i+1}=z_{i}+{\big (}V-R)\sigma _{i}\alpha _{i}.(46)}

де M {\displaystyle \,M-} параметр, що вказує на систему координат, в якій працює CORDIC ( M = 1 {\displaystyle M=1} -колова, M = 1 {\displaystyle M=-1} - гіперболічна, M = 0 {\displaystyle M=0}  — лінійна);
в режимі обертання (Rotation mode) R=1, V=0 та у векторному режимі (Vectoring mode) — навпаки R=0, V=1;

σ i {\displaystyle \sigma _{i}\,} - оператор вибору напрямку обертання (його вибирають з умови σ i = s i g n ( z i ) {\displaystyle \sigma _{i}=sign{\big (}z_{i})} для режиму обертання (Rotation mode) або σ i = s i g n ( y i ) {\displaystyle \sigma _{i}=sign{\big (}y_{i})} для векторного режиму (Vectoring mode) і набуває значення σ i = { 1 , + 1 } ; {\displaystyle \sigma _{i}={\big \{}-1,+1{\big \}};}
для M = 1   α i = a r c t a n ( 2 i ) ; {\displaystyle M=1\ \alpha _{i}=arctan{\big (}2^{-i});} для M = 1   α i = a r c t a n h ( 2 i ) ; {\displaystyle M=-1\ \alpha _{i}=arctanh{\big (}2^{-i});} для M = 0 α i = 2 i . {\displaystyle M=0\,\alpha _{i}=2^{-i}.\,} .

Таблиця деяких функцій, що обчислюються з допомогою CORDIC:
R o t a t i o n ( R = 1 ; V = 0 ; z i 0 ) {\displaystyle Rotation{\big (}R=1;V=0;z_{i}\to 0{\big )}}
σ i = { 1 if  z i < 0 + 1 if  z i 0 {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}z_{i}<0\\+1&{\mbox{if }}z_{i}\geq 0\end{cases}}}
V e c t o r i n g ( R = 0 ; V = 1 ; y i 0 ) {\displaystyle Vectoring{\big (}R=0;V=1;y_{i}\to 0{\big )}}
σ i = { 1 if  y i < 0 + 1 if  y i 0 {\displaystyle \sigma _{i}={\begin{cases}-1&{\mbox{if }}y_{i}<0\\+1&{\mbox{if }}y_{i}\geq 0\end{cases}}}
M = 1 {\displaystyle M=1}
α i = arctan ( 2 i ) , {\displaystyle \alpha _{i}=\arctan {\big (}2^{-i}{\big )},}
i = 0 , 1 , 2 , . . . , m {\displaystyle {\boldsymbol {i=0,1,2,...,m}}}
P = {\displaystyle {\boldsymbol {P=}}} i = 0 m cos ( α i ) = i = 0 m 1 1 + 2 2 i {\displaystyle \prod _{i=0}^{m}\cos {\Big (}\alpha _{i}{\Big )}{\boldsymbol {=}}\prod _{i=0}^{m}{\frac {1}{\sqrt {1+2^{-2i}}}}}
K m = 1 / P = i = 0 m 1 + 2 2 i {\displaystyle K_{m}=1/P=\prod _{i=0}^{m}{\sqrt {1+2^{-2i}}}}
x i + 1 = x i σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i + σ i x i 2 i {\displaystyle y_{i+1}=y_{i}+\sigma _{i}x_{i}2^{-i}\,}
z i + 1 = z i σ i α i {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}\,}
x 0 = P , y 0 = 0 , z 0 = ϕ {\displaystyle x_{0}=P,y_{0}=0,z_{0}=\phi }
x m + 1 c o s ( ϕ ) {\displaystyle x_{m+1}\approx cos{\big (}\phi )}
y m + 1 s i n ( ϕ ) {\displaystyle y_{m+1}\approx sin{\big (}\phi )}
ϕ [ 0 , 1.74 ] {\displaystyle \phi \in {\big [}0,1.74{\big ]}}
x i + 1 = x i + σ i y i 2 i ; {\displaystyle x_{i+1}=x_{i}+\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i σ i x i 2 i {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i}\,}
z i + 1 = z i + σ i α i {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i}\,}
x 0 = X , y 0 = Y , z 0 = 0 {\displaystyle x_{0}=X,y_{0}=Y,z_{0}=0\,}
X m + 1 K m X 2 + Y 2 ; {\displaystyle X_{m+1}\approx K_{m}{\sqrt {X^{2}+Y^{2}}};}
Z m + 1 arctan ( Y X ) {\displaystyle Z_{m+1}\approx \arctan {\big (}{\frac {Y}{X}}{\big )}}
X 2 + Y 2 X m + 1 P {\displaystyle {\sqrt {X^{2}+Y^{2}}}\approx X_{m+1}P}
M = 1 {\displaystyle M=-1\,}
α i = arctan h ( 2 i ) , {\displaystyle \alpha _{i}=\arctan h{\big (}2^{-i}{\big )},}
i = 1 , 2 , 3 , 4 , 4 , 5...12 , 13 , 13 , 14 , . . , m {\displaystyle {\boldsymbol {i=1,2,3,4,4,5...12,13,13,14,..,m}}}
P m 1 = i = 1 m c o s h ( α i ) = i = 1 m 1 1 2 2 i ; {\displaystyle P_{m1}^{'}=\prod _{i=1}^{m}cosh{\big (}\alpha _{i})=\prod _{i=1}^{m}{\frac {1}{\sqrt {1-2^{-2i}}}};}
P m 2 = 1 1 2 8 1 1 2 26 1 1 2 80 ; {\displaystyle P_{m2}^{'}={\frac {1}{\sqrt {1-2^{-8}}}}{\frac {1}{\sqrt {1-2^{-26}}}}{\frac {1}{\sqrt {1-2^{-80}}}};}
P = P m 1 P m 2 ; {\displaystyle P^{'}=P_{m1}^{'}P_{m2}^{'};}
K m = 1 / P {\displaystyle K_{m}^{'}=1/P^{'}}
1. x i + 1 = x i + σ i y i 2 i ; {\displaystyle 1.\qquad x_{i+1}=x_{i}+\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i + σ i x i 2 i {\displaystyle y_{i+1}=y_{i}+\sigma _{i}x_{i}2^{-i}\,}
z i + 1 = z i σ i α i {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}\,}
x 0 = P , y 0 = 0 , z 0 = ϕ {\displaystyle x_{0}=P^{'},y_{0}=0,z_{0}=\phi \,}
x m + 1 c o s h ( ϕ ) {\displaystyle x_{m+1}\approx cosh{\big (}\phi )\,}
y m + 1 s i n h ( ϕ ) {\displaystyle y_{m+1}\approx sinh{\big (}\phi )\,}
ϕ [ 0 , 1.118 ] {\displaystyle \phi \in {\big [}0,1.118{\big ]}\,}
x m + 1 + y m + 1 e x p ( ϕ ) {\displaystyle x_{m+1}+y_{m+1}\approx exp{\big (}\phi )\,}
x m + 1 y m + 1 e x p ( ϕ ) {\displaystyle x_{m+1}-y_{m+1}\approx exp{\big (}-\phi )\,}
2. q i + 1 = q i + σ i q i 2 i {\displaystyle 2.\qquad q_{i+1}=q_{i}+\sigma _{i}q_{i}2^{-i}\,}
z i + 1 = z i σ i α i {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}\,}
q 0 = P , z 0 = ϕ {\displaystyle q_{0}=P^{'},z_{0}=\phi \,}
q m + 1 e x p ( ϕ ) {\displaystyle q_{m+1}\approx exp{\big (}\phi )\,}
ϕ [ 0 , 1.118 ] {\displaystyle \phi \in {\big [}0,1.118{\big ]}\,}
3. q i + 1 = q i σ i q i 2 i {\displaystyle 3.\qquad q_{i+1}=q_{i}-\sigma _{i}q_{i}2^{-i}\,}
z i + 1 = z i σ i α i {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}\,}
q 0 = P , z 0 = ϕ {\displaystyle q_{0}=P^{'},z_{0}=\phi \,}
q m + 1 e x p ( ϕ ) {\displaystyle q_{m+1}\approx exp{\big (}-\phi )\,}
ϕ [ 0 , 1.118 ] {\displaystyle \phi \in {\big [}0,1.118{\big ]}\,}
1. x i + 1 = x i σ i y i 2 i ; {\displaystyle 1.\qquad x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i σ i x i 2 i {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i}\,}
z i + 1 = z i + σ i α i {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i}\,}
x 1 = X , y 1 = Y , z 1 = 0 {\displaystyle x_{1}=X,y_{1}=Y,z_{1}=0\,}
x m + 1 K m X 2 Y 2 ; {\displaystyle x_{m+1}\approx K_{m}^{'}{\sqrt {X^{2}-Y^{2}}};\,}
z m + 1 arctan h ( Y X ) {\displaystyle z_{m+1}\approx \arctan h{\big (}{\frac {Y}{X}}{\big )}\,}
X 2 Y 2 x m + 1 P {\displaystyle {\sqrt {X^{2}-Y^{2}}}\approx x_{m+1}P^{'}\,}
f o r   a r c t a n h y 1 x 1 [ 0 , 0.8069 ] {\displaystyle for\ arctanh-{\frac {y_{1}}{x_{1}}}\in {\big [}0,0.8069{\big ]}\,}
2. x i + 1 = x i σ i y i 2 i ; {\displaystyle 2.\qquad x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i σ i x i 2 i {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i}\,}
x 1 = W + 0.25 ,   y 1 = W 0.25 {\displaystyle x_{1}=W+0.25,\ y_{1}=W-0.25\,}
W [ 0.03 , 2.33 ] {\displaystyle W\in {\big [}0.03,2.33{\big ]}\,}
W x m + 1 / K m = x m + 1 P {\displaystyle {\sqrt {W}}\approx x_{m+1}/K_{m}^{'}=x_{m+1}P^{'}\,}
3. x i + 1 = x i σ i y i 2 i ; {\displaystyle 3.\qquad x_{i+1}=x_{i}-\sigma _{i}y_{i}2^{-i};\,}
y i + 1 = y i σ i x i 2 i {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{i}2^{-i}\,}
z i + 1 = z i + σ i α i {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i}\,}
x 1 = W + 1 , y 1 = W 1 , z 1 = 0 {\displaystyle x_{1}=W+1,y_{1}=W-1,z_{1}=0\,}
l n ( W ) 2 z m + 1 {\displaystyle ln{\big (}W)\approx 2z_{m+1}\,}
W [ 0.107 , 9.359 ] {\displaystyle W\in {\big [}0.107,9.359{\big ]}\,}
M = 0 {\displaystyle M=0\,}
α i = 2 i {\displaystyle \alpha _{i}=2^{-i}\,}
i = 0 , 1 , 2 , . . . m {\displaystyle i=0,1,2,...m\,}
1. y i + 1 = y i + σ i x 0 2 i {\displaystyle 1.\qquad y_{i+1}=y_{i}+\sigma _{i}x_{0}2^{-i}\,}
z i + 1 = z i σ i α i {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}\,}
x 0 = X , y 0 = 0 , z 0 = Z {\displaystyle x_{0}=X,y_{0}=0,z_{0}=Z\,}
y m + 1 X Z {\displaystyle y_{m+1}\approx XZ\,}
2. y i + 1 = y i + σ i x 0 2 i {\displaystyle 2.\qquad y_{i+1}=y_{i}+\sigma _{i}x_{0}2^{-i}\,}
z i + 1 = z i σ i α i Y {\displaystyle z_{i+1}=z_{i}-\sigma _{i}\alpha _{i}*Y\,}
x 0 = X , y 0 = X , z 0 = Z Y {\displaystyle x_{0}=X,y_{0}=X,z_{0}=Z-Y\,}
x m + 1 Z X / Y {\displaystyle x_{m+1}\approx ZX/Y\,}
y i + 1 = y i σ i x 0 2 i {\displaystyle y_{i+1}=y_{i}-\sigma _{i}x_{0}*2^{-i}\,}
z i + 1 = z i + σ i α i {\displaystyle z_{i+1}=z_{i}+\sigma _{i}\alpha _{i}\,}
x 0 = X , y 0 = Y , z 0 = 0 {\displaystyle x_{0}=X,y_{0}=Y,z_{0}=0\,}
z m + 1 Y / X {\displaystyle z_{m+1}\approx Y/X\,}

Модифікований CORDIC-метод

Модифікації (вдосконалення) методу CORDIC спрямовані на підвищення швидкодії, зменшення кількості ітерацій, розширення функціональних можливостей, спрощення апаратної реалізації, збільшення набору реалізованих функцій. Зокрема, одне з основних завдань модифікацій методу — зменшити кількість ітерацій, зберігши похибки обчислень класичного методу. Опис (45) — (46) поширюється лише на синхронний режим роботи CORDIC (або на знакозмінні ітерації) [4]. Це пов'язано з тим що треба зберегти сталість значення коефіцієнта деформації вектора [4, 7]. Однак існують функції, для яких не потрібно дотримуватись цих вимог, тому що коефіцієнт деформації не входить до складу виразів, за якими обчислюють, або його вплив усувається, оскільки в цих операціях(макроопераціях) виконується операція ділення. Зокрема, це стосується обчислення функцій t a n ( X ) {\displaystyle tan{\big (}X)} , a r c t a n ( Y / X ) {\displaystyle arctan{\big (}Y/X)} , t a n h ( X ) {\displaystyle tanh{\big (}X)} , та інших. В таких випадках можна використати асинхронний режим роботи CORDIC (або знакосталі ітерації), який теж забезпечує збіжність ітераційного процесу і підвищує швидкодію приблизно вдвічі [11].

Список літератури

1. Jack E. Volder, The CORDIC Trigonometric Computing Technique, IRE Transactions on Electronic Computers, pp330-334, September 1959 [Архівовано 19 липня 2011 у Wayback Machine.] 2. Walther, J.S. A unified algorithm for elementary functions// In Proceedings of AFIPS, 1971, Spring Joint Computer Conference, vol. 38, AFIPS Press, Arlington, Va., 1971, pp. 379-385.
3. Оранский А. М. Аппаратные методы в цифровой вычислительной технике. — Минск: Издательство БГУ, 1977. −208 с.
4. *Байков В. Д., Смолов В. Б. Аппаратурная реализация элементарных функций в ЦВМ, Ленинград, изд-во ЛГУ, 1975, 96 стр. [Архівовано 15 січня 2011 у Wayback Machine.]
5.* Байков В. Д., Смолов В. Б. Специализированные процессоры: итерационные алгоритмы и структуры, Москва, «Радио и связь» 1985, 288 стр. [Архівовано 18 липня 2011 у Wayback Machine.]
6. Pramod K. Meher, Javier Valls,Tso-Bing Juang,K. Sridharan, Koushik Maharatna. 50 Years of CORDIC: Algorithms, Architectures, and Applications/IEEE Transactions on Circuits and Systems—I: Regular Papers, Vol. 56, No. 9, September 2009, pp. 1893-1907.
7. Аристов В. В. Функциональные макрооперации. Основы итерационных алгоритмов. -К.: Наукова думка, 1992. −280 с.
8. Lakshmi B. and Dhar A. S. CORDIC Architectures: A Survey. VLSI Design. Volume 2010, Article ID 794891, 19 pages, January 8, 2010.
9. Llamocca-Obregón D.R., Agurto-Ríos C.P. A Fixed-Point Implementation of the Natural Logarithm Based on a Expanded Hyperbolic CORDIC Algorithm. XII WORKSHOP IBERCHIP, 2006, pp. 322 −323.
10. X. Hu, R. Huber, S. Bass, Expanding the Range of Convergence of the CORDIC Algorithm// IEEE Transactions on Computers. Vol. 40, Nº 1,1991, pp. 13-21.
11. Мороз Л. В. Адаптивний CORDIC-метод обчислення деяких функцій// Комп'ютерні технології друкарства. 2010, рр. № 24. C. 105–110.
12. CORDIC Bibliography Site [Архівовано 10 червня 2015 у Wayback Machine.]
13. M. Zechmeister Solving Kepler’s equation with CORDIC double iterations Institut für Astrophysik, Georg-August-Universität, Friedrich-Hund-Platz 1, 37077 Göttingen, Germany, Preprint 10 August 2020, p.1-10. [Архівовано 22 серпня 2021 у Wayback Machine.]


Алгоритми Це незавершена стаття про алгоритми.
Ви можете допомогти проєкту, виправивши або дописавши її.
Ця стаття потребує додаткових посилань на джерела для поліпшення її перевірності. Будь ласка, допоможіть удосконалити цю статтю, додавши посилання на надійні (авторитетні) джерела. Зверніться на сторінку обговорення за поясненнями та допоможіть виправити недоліки.
Матеріал без джерел може бути піддано сумніву та вилучено.
(травень 2016)
Ця стаття містить текст, що не відповідає енциклопедичному стилю. Будь ласка, допоможіть удосконалити цю статтю, погодивши стиль викладу зі стилістичними правилами Вікіпедії. Можливо, сторінка обговорення містить зауваження щодо потрібних змін. (травень 2016)

П:  Портал «Програмування»