CORDIC ( Metoda CORDIC din engleză. Coordinate Rotation DIgital Computer - un computer digital pentru rotirea sistemului de coordonate; metoda „cifră cu cifră” , algoritmul lui Walder ) este o metodă iterativă pentru reducerea calculelor directe ale funcțiilor complexe la efectuarea de operații simple de adăugare și schimbare . .
Ideea metodei este de a reduce calculul valorilor funcțiilor complexe (de exemplu, hiperbolice ) la un set de pași simpli - adăugare și schimbare.
Această abordare este utilă în special atunci când se calculează caracteristici pe dispozitive cu capacități de calcul limitate, cum ar fi microcontrolere sau matrice logice programabile ( FPGA ). În plus, deoarece pașii sunt de același tip, implementarea hardware a algoritmului poate fi extinsă într-o conductă sau prăbușită într-o buclă.
Metoda a fost descrisă pentru prima dată în aplicarea la calculul funcţiilor trigonometrice şi a operaţiilor de transformare a coordonatelor de către Jack Walder în 1956 , apoi în 1959 . În 1956, Akushsky și Yuditsky au prezentat o idee similară pentru calcularea funcțiilor exponențiale și logaritmice. Inițial, o idee apropiată de aceasta a fost propusă de Henry Briggs în 1624 , când compila tabele de logaritmi .
Metoda a fost folosită în implementarea unor tipuri de instrucțiuni în virgulă mobilă în coprocesoarele matematice Intel , inclusiv 8087 [1] [2] [3] [4] [5] , 80287 [5] [6] , 80387 [5] ] [6] și până la 80486 [1] , precum și în coprocesoarele Motorola 68881 [1] [2] și 68882. Acest lucru a făcut posibilă reducerea numărului de elemente logice (și complexității) coprocesorului.
Ideea generală a metodei este următoarea. Prin multiplicarea succesivă a argumentului cu constante preselectate, aduceți argumentul mai aproape de unul cu o precizie dată pentru unele funcții și de zero pentru alte funcții. Cu toate acestea, pentru ca valoarea funcției în sine să rămână neschimbată, este necesar să se efectueze simultan acțiuni echivalente asupra constantelor alese. Prin alegerea valorilor constantelor într-un mod special, este posibilă simplificarea semnificativă a calculului valorilor funcției.
De exemplu, Briggs a înmulțit valoarea argumentului funcției logaritm zecimal cu constante de forma: fie .
În acest caz, alegerea primului multiplicator ( ) a fost efectuată dacă valoarea curentă a cantității s-a dovedit a fi mai mică de unu, iar al doilea , dacă valoarea curentă a fost mai mare de unu. Alegând succesiv valorile exponentului de la 1 la , unde a fost eroarea maximă admisă de calcul, Briggs a redus valoarea la una cu precizia necesară și, astfel, valoarea funcției la zero.
Totuși, pentru echivalența acestor transformări, este necesară împărțirea valorii indicate la aceeași valoare concomitent cu înmulțirea valorii curente . Dar, după cum știți, logaritmul coeficientului este egal cu diferența dintre logaritmii numărătorului și numitorului. Prin urmare, simultan cu înmulțirea curentului cu este necesar să se scadă funcția calculată anterior a logaritmului valorii din produsul argumentului cu factorul .
Valorile tuturor constantelor formularului și pot fi calculate în avans, deoarece sunt relativ puține dintre ele. De exemplu, cu o eroare acceptabilă, există doar douăsprezece dintre ele.
Rămâne de clarificat faptul că înmulțirea prin constante ale formei și se reduce la operații de adunare, scădere și transfer de virgulă (deplasare).
Prin urmare, procedura de calcul al funcției logaritmului Briggs se reduce la operațiile de adunare, scădere și deplasare zecimală.
Generalizarea ideii metodei Briggs la numere complexe a fost realizată la mijlocul anilor cincizeci de către Jack Walder și aproape simultan cu el de către Akushsky și Yuditsky. Acest lucru a făcut posibilă calcularea funcțiilor trigonometrice.
CORDIC poate fi folosit pentru a calcula un număr de funcții diferite. Această explicație arată cum să utilizați CORDIC în modul de rotație pentru a calcula sinusul și cosinusul unui unghi. Se presupune că unghiul dorit este dat în radiani , iar rezultatele sunt în format de punct fix . Pentru a determina sinusul sau cosinusul unui unghi , coordonatele unui punct y sau x de pe cercul unitar trebuie găsite în funcție de unghiul dorit. Folosind CORDIC, începem cu un vector :
În prima iterație , acest vector va fi rotit cu 45° în sens invers acelor de ceasornic pentru a obține vectorul . Iterațiile succesive vor roti vectorul într-o direcție sau alta în trepte descrescătoare până când se atinge unghiul dorit. Valoarea pasului i este arctg(1/(2 i −1 )), pentru i = 1, 2, 3, ….
Mai formal, la fiecare iterație, se calculează rotația, care se realizează prin înmulțirea vectorului cu matricea de rotație :
Matricele de rotație R sunt determinate de formula:
Folosind următoarele două identități trigonometrice
obținem matricea de rotație:
Expresia pentru vector rotit :
unde si sunt componentele . Prin limitarea valorilor unghiurilor astfel încât să ia valori, înmulțirea cu tangentă poate fi înlocuită cu împărțirea cu o putere de doi, care este implementată eficient în hardware-ul computerului digital prin deplasare de biți . Obținem expresia:
Unde
și poate avea valorile -1 sau 1 și este folosit pentru a determina direcția de rotație: dacă unghiul este pozitiv atunci este egal cu 1, în caz contrar este egal cu -1.
Îl putem ignora în mod iterativ și apoi îl putem aplica ulterior pentru a obține factorul de scalare:
care este calculat în avans și stocat într-un tabel, sau ca o singură constantă dacă numărul de iterații este fix. Această corecție se poate face și în prealabil prin scalare .
Singura sarcină care rămâne este de a determina dacă rotația în sensul acelor de ceasornic sau în sens invers acelor de ceasornic trebuie efectuată la fiecare iterație (alegerea unei valori de ). Acest lucru se face ținând evidența cantității de rotație la fiecare iterație și scăzând din unghiul dorit, apoi verificând dacă este pozitiv, atunci ar trebui să rotim în sensul acelor de ceasornic sau dacă este negativ ar trebui să rotim în sens invers acelor de ceasornic pentru a ne apropia de unghi .
De asemenea, valorile trebuie calculate în avans. Dar pentru unghiuri mici în reprezentarea punctului fix, ceea ce permite reducerea dimensiunii mesei.
După cum puteți vedea în ilustrația de mai sus, sinusul unghiului este coordonata y a vectorului final , iar coordonata x este valoarea cosinusului.
În lucrările [7] și [8] s-a propus utilizarea metodei „iterațiilor duble” pentru calcularea funcțiilor arcsinX, arccosX, lnX, expX, precum și pentru calcularea funcțiilor hiperbolice . Constă în faptul că, spre deosebire de metoda clasică CORDIC, unde valoarea pasului de iterație se modifică de fiecare dată, i.e. la fiecare iterație, cu metoda iterațiilor duble, valoarea pasului de iterație se repetă de două ori și se modifică doar după o iterație. De aici a apărut notația pentru exponent pentru iterațiile duble: i = 1,1,2,2,3,3... În timp ce pentru iterațiile obișnuite: i =1,2,3... Metoda iterațiilor duble garantează convergența a metodei în toată gama permisă de modificări de argument.
Generalizarea problemelor de convergență a algoritmilor metodei CORDIC la un sistem de numere pozițional arbitrar cu baza R, dat în [9] , a arătat că pentru funcțiile sin, cos, arctg, este suficient să se efectueze (R-1) -iterații pentru fiecare valoare a lui i (i de la 0 sau 1 la n, unde n este numărul de cifre), adică. pentru fiecare cifră a rezultatului. Pentru funcțiile ln, exp, sh, ch, arth, R trebuie efectuate iterații pentru fiecare valoare a lui i. Pentru funcțiile arcsin și arccos, ar trebui efectuate 2 ⋅ (R-1) iterații pe bit, adică. pentru fiecare valoare a lui i.
Pentru funcțiile arsh, arch, numărul de iterații va fi 2R pentru fiecare i, i.e. pentru fiecare cifră a rezultatului.