CORDIC

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 2 oktober 2017; kontroller kräver 19 redigeringar .

CORDIC ( CORDIC Method från engelska.  Coordinate Rotation DIgital Computer  - en digital dator för att rotera koordinatsystemet; metoden "siffra för siffra" , Walders algoritm ) är en iterativ metod för att reducera direkta beräkningar av komplexa funktioner till att utföra enkla additions- och skiftoperationer .

Metodidé

Tanken med metoden är att reducera beräkningen av värdena för komplexa (till exempel hyperboliska ) funktioner till en uppsättning enkla steg - addition och skift.

Detta tillvägagångssätt är särskilt användbart vid beräkning av funktioner på enheter med begränsade beräkningsmöjligheter, såsom mikrokontroller eller programmerbara logiska arrayer ( FPGA ). Dessutom, eftersom stegen är av samma typ, kan hårdvaruimplementeringen av algoritmen utökas till en pipeline eller kollapsa till en loop.

Historik

Metoden beskrevs först i tillämpning för beräkning av trigonometriska funktioner och koordinattransformationsoperationer av Jack Walder 1956 , sedan 1959 . År 1956 lade Akushsky och Yuditsky fram en liknande idé för beräkning av exponentiella och logaritmiska funktioner. Ursprungligen föreslog Henry Briggs en idé nära detta 1624 när han sammanställde tabeller över logaritmer .

Metoden har använts i implementeringen av vissa typer av flyttalsinstruktioner i Intels matematiska samprocessorer , inklusive 8087 [1] [2] [3] [4] [5] , 80287 [5] [6] , 80387 [5 ] [6] och upp till 80486 [1] , samt i samprocessorerna Motorola 68881 [1] [2] och 68882. Detta gjorde det möjligt att minska antalet logiska element (och komplexiteten) hos samprocessorn.

Briggs metod

Den allmänna idén med metoden är följande. Genom successiv multiplikation av argumentet med förvalda konstanter, för argumentet närmare ett med en given noggrannhet för vissa funktioner och till noll för andra funktioner. Men för att värdet på själva funktionen ska förbli oförändrat är det nödvändigt att samtidigt utföra ekvivalenta åtgärder på de valda konstanterna. Genom att välja värdena för konstanterna på ett speciellt sätt är det möjligt att avsevärt förenkla beräkningen av funktionens värden.

Till exempel multiplicerade Briggs värdet av argumentet för decimallogaritmfunktionen med konstanter av formen: antingen .

I det här fallet utfördes valet av den första multiplikatorn ( ) om det aktuella värdet av kvantiteten visade sig vara mindre än en, och den andra , om det aktuella värdet var större än en. Genom att successivt välja exponentens värden från 1 till , där var det maximala tillåtna beräkningsfelet, reducerade Briggs värdet till ett med den erforderliga noggrannheten, och därmed värdet på funktionen till noll.

För ekvivalensen av dessa transformationer är det emellertid nödvändigt att dividera det angivna värdet med samma värde samtidigt med multiplikationen av det aktuella värdet. Men som ni vet är kvotens logaritm lika med skillnaden mellan täljarens och nämnarens logaritmer. Därför, samtidigt med multiplikationen av strömmen med , är det nödvändigt att subtrahera den tidigare beräknade funktionen av logaritmen av värdet från produkten av argumentet med faktorn .

Värdena för alla konstanter i formen och kan beräknas i förväg, eftersom det finns relativt få av dem. Till exempel, med ett acceptabelt fel finns det bara tolv av dem.

Det återstår att klargöra att multiplikation med konstanter av formen och reduceras till operationer för addition, subtraktion och överföring av ett kommatecken (skift).

Därför reduceras proceduren för att beräkna Briggs logaritmfunktion till operationerna addition, subtraktion och decimalskifte.

Generaliseringen av idén om Briggs-metoden till komplexa tal utfördes i mitten av slutet av femtiotalet av Jack Walder och nästan samtidigt med honom av Akushsky och Yuditsky. Detta gjorde det möjligt att beräkna trigonometriska funktioner.

Öppettider

CORDIC kan användas för att beräkna ett antal olika funktioner. Den här förklaringen visar hur man använder CORDIC i rotationsläge för att beräkna sinus och cosinus för en vinkel. Det antas att den önskade vinkeln anges i radianer och att resultaten är i fixpunktsformat . För att bestämma sinus eller cosinus för en vinkel måste koordinaterna för en punkt y eller x på enhetscirkeln hittas enligt den önskade vinkeln. Med CORDIC börjar vi med en vektor :

I den första iterationen kommer denna vektor att roteras 45° moturs för att få vektorn . Successiva iterationer kommer att rotera vektorn i den ena eller den andra riktningen i minskande steg tills den önskade vinkeln uppnås. Värdet på det i -te steget är arctg(1/(2 i −1 )), för i  = 1, 2, 3, ….

Mer formellt, vid varje iteration, beräknas rotationen, vilket utförs genom att multiplicera vektorn med rotationsmatrisen :

Rotationsmatriserna R bestäms av formeln:

Med hjälp av följande två trigonometriska identiteter

vi får rotationsmatrisen:

Uttryck för roterad vektor :

var och är komponenterna . Genom att begränsa värdena på vinklarna så att det tar värden kan multiplikation med tangenten ersättas med division med en potens av två, vilket effektivt implementeras i digital datorhårdvara genom bitskiftning . Vi får uttrycket:

var

och kan ha värdena −1 eller 1 och används för att bestämma rotationsriktningen: om vinkeln är positiv är den lika med 1, annars är den lika med −1.

Vi kan ignorera det iterativt och sedan tillämpa det efteråt för att få skalningsfaktorn:

som beräknas i förväg och lagras i en tabell, eller som en enda konstant om antalet iterationer är fast. Denna korrigering kan också göras i förväg genom skalning .

Den enda uppgiften som återstår är att avgöra om rotation medurs eller moturs ska utföras vid varje iteration (välj ett värde på ). Detta görs genom att hålla reda på mängden rotation vid varje iteration och subtrahera från den önskade vinkeln, sedan kontrollera om är positivt så ska vi rotera medurs eller om det är negativt ska vi rotera moturs för att komma närmare vinkeln .

Värdena måste också beräknas i förväg. Men för små vinklar i fast punkt representation, vilket gör det möjligt att minska storleken på tabellen.

Som du kan se i illustrationen ovan är vinkelns sinus y -koordinaten för den slutliga vektorn , och x -koordinaten är cosinusvärdet.


Metoden för "dubbla iterationer"

I arbeten [7] och [8] föreslogs det att använda metoden med "dubbla iterationer" för att beräkna funktionerna arcsinX, arccosX, lnX, expX, såväl som för att beräkna hyperboliska funktioner . Den består i att, till skillnad från den klassiska CORDIC-metoden, där värdet på iterationssteget ändras VARJE gång, d.v.s. vid varje iteration, med metoden med dubbla iterationer, upprepas värdet för iterationssteget två gånger och ändras endast efter en iteration. Därför uppträdde notationen för exponenten för dubbla iterationer: i = 1,1,2,2,3,3... Medan för vanliga iterationer: i =1,2,3... Metoden med dubbla iterationer garanterar konvergensen av metoden i alla tillåtna intervall av argumentändringar.

Generaliseringen av frågorna om konvergens av algoritmer för CORDIC-metoden till ett godtyckligt positionstalssystem med basen R, givet i [9] , visade att för funktionerna sin, cos, arctg räcker det att utföra (R-1) -iterationer för varje värde på i (i från 0 eller 1 till n, där n är antalet siffror), dvs. för varje siffra i resultatet. För funktionerna ln, exp, sh, ch, arth bör R iterationer utföras för varje värde på i. För funktionerna arcsin och arccos bör 2 ⋅ (R-1) iterationer per bit utföras, dvs. för varje värde på i.

För funktionerna arsh, arch kommer antalet iterationer att vara 2R för varje i, dvs. för varje siffra i resultatet.

Litteratur

Anteckningar

  1. 1 2 3 Muller Jean-Michel. Elementära funktioner: Algoritmer och implementering . - 2 upplagor. - Boston: Birkhäuser, 2006. - S. 134. - ISBN 978-0-8176-4372-0 . Arkiverad 5 juni 2011 på Wayback Machine
  2. 1 2 Rafi Nave. Implementering av transcendentala funktioner på en numerisk processor // Mikrobehandling och mikroprogrammering. - 1983. - T. 11 , nr 3-4 . — S. 221–225 .
  3. John F. Palmer, Stephen Paul Morse. 8087 Primer . - John Wiley & Sons Australia, Limited, 1984. - ISBN 9780471875697 . Arkiverad 30 december 2016 på Wayback Machine
  4. Glas L. Brent. Math Coprocessors: En titt på vad de gör och hur de gör det // Byte Magazine. - 1990. - T. 15 , nr 1 . — S. 337–348 . — ISSN 0360-5280 .
  5. 1 2 3 Pitts Jarvis. Implementering av CORDIC-algoritmer - En enda kompakt rutin för beräkning av transcendentala funktioner // Dr. Dobbs Journal. - 1990. - T. 15 , nr 10 . — S. 152–156 .
  6. 1 2 A. K. Yuen. Intels Floating-Point-processorer // Electro/88 Conference Record. - 1988. - S. 48 / 5 / 1-7 .
  7. Hårdvaruimplementering av de elementära funktionerna med siffra för siffra (CORDIC) teknik . Hämtad 24 december 2020. Arkiverad från originalet 11 januari 2011.
  8. Baikov V.D., Smolov V.B. Hårdvaruimplementering av elementära funktioner i en digital dator . Hämtad 24 december 2020. Arkiverad från originalet 15 januari 2011.
  9. Baikov V.D., Smolov V.B. Specialiserade processorer: iterativa algoritmer och strukturer . Hämtad 29 december 2020. Arkiverad från originalet 18 juli 2011.