CORDIC

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 2 octombrie 2017; verificările necesită 19 modificări .

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

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ă.

Istorie

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.

metoda Briggs

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.

Orele de deschidere

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.


Metoda „iterațiilor duble”

Î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.

Literatură

Note

  1. 1 2 3 Muller Jean-Michel. Funcții elementare: algoritmi și implementare . - editia a 2-a. - Boston: Birkhäuser, 2006. - P. 134. - ISBN 978-0-8176-4372-0 . Arhivat pe 5 iunie 2011 la Wayback Machine
  2. 1 2 Nava Rafi. Implementarea funcțiilor transcendentale pe un procesor numeric // Microprocesare și microprogramare. - 1983. - T. 11 , nr. 3-4 . — S. 221–225 .
  3. John F. Palmer, Stephen Paul Morse. Primerul 8087 . - John Wiley & Sons Australia, Limited, 1984. - ISBN 9780471875697 . Arhivat la 30 decembrie 2016 la Wayback Machine
  4. Glass L. Brent. Coprocesoare matematice: o privire asupra a ceea ce fac și cum o fac // Byte Magazine. - 1990. - T. 15 , nr 1 . — S. 337–348 . — ISSN 0360-5280 .
  5. 1 2 3 Pitts Jarvis. Implementarea algoritmilor CORDIC - O singură rutină compactă pentru calcularea funcțiilor transcendentale // Dr. Jurnalul Dobbs. - 1990. - T. 15 , nr 10 . — S. 152–156 .
  6. 1 2 A. K. Yuen. Procesoarele Intel cu virgulă mobilă // Electro/88 Record Conference. - 1988. - S. 48 / 5 / 1-7 .
  7. Implementarea hardware a funcțiilor elementare prin tehnica digit-by-digit (CORDIC) . Preluat la 24 decembrie 2020. Arhivat din original la 11 ianuarie 2011.
  8. Baikov V.D., Smolov V.B. Implementarea hardware a funcțiilor elementare într-un computer digital . Preluat la 24 decembrie 2020. Arhivat din original la 15 ianuarie 2011.
  9. Baikov V.D., Smolov V.B. Procesoare specializate: algoritmi și structuri iterative . Preluat la 29 decembrie 2020. Arhivat din original la 18 iulie 2011.