CORDIC

Le (méthode de chiffre-par-chiffre, algorithme de Volder) CORDIC (pour l'omputer gital de C R otation DI d'ordonnée de Co ) est un algorithme simple et efficace pour calculer le les fonctions trigonométriques hyperboliques de et de il est utilisé généralement quand aucun multiplicateur de matériel n'est disponible (par exemple, les microcontrôleurs simples et le FPGAs comme les seules opérations qu'il exige sont addition, soustraction, Bitshift et consultation de table .

L'algorithme CORDIC moderne a été décrit la première fois dans le 1959 par le Jack E. Il a été développé au département d'aeroelectronics du Convair pour remplacer le séparateur analogue du dans l'ordinateur de la navigation du du bombardier du B-58 , bien qu'il soit semblable aux techniques éditées par le Henry Briggs dès le 1624 . Le John Stephen que Walther au Hewlett-Packard promeuvent a généralisé l'algorithme, laissant calculer le le logarithme hyperbolique des fonctions exponentielles de et de , la multiplication , la division , et la racine carrée .

À l'origine, CORDIC a été mis en application using le système de chiffre binaire de . Dans les années 70, le décimal CORDIC est devenu employé couramment dans des calculatrices pocket plus dont fonctionner dans le binaire-coder-décimal du (BCD) plutôt que la binaire. CORDIC est particulièrement bien adapté pour les calculatrices tenues dans la main, une demande desquelles a coûté (c., le compte de porte de morceau doit être réduit au minimum) est beaucoup plus importante qu'est la vitesse. Également les sous-routines CORDIC pour des fonctions trigonométriques et hyperboliques peuvent partager la majeure partie de leur code.

Application

CORDIC est généralement plus rapide que d'autres approches quand un multiplicateur de matériel est indisponible (par exemple dans un microcontrôleur), ou quand le nombre de portes exigées pour mettre en application un doit être réduit au minimum (par exemple dans un FPGA ). D'une part, quand un multiplicateur de matériel est disponible (par exemple dans un microprocesseur de DSP), les méthodes de table-consultation et les séries entières sont généralement plus rapides que CORDIC.

Mode de fonctionnement

CORDIC peut être employé pour calculer un certain nombre de différentes fonctions. Cette explication montre comment employer CORDIC dans le mode de rotation pour calculer le péché et le cos d'un angle, et suppose que l'angle voulu est donné en radians et représenté dans un format du point fixe . Pour déterminer le sinus ou le cosinus pour un d'angle \ bêta , le y ou x d'un point sur le cercle d'unité correspondant à l'angle voulu doit s'avérer. Using CORDIC, nous commencerions par le v_0 de vecteur : le v_o de de

= \ commencent {pmatrix} 1 \ \ 0 \ extrémité {pmatrix}

Dans la première itération, ce vecteur serait 45° tourné dans le sens contraire des aiguilles d'une montre pour obtenir le v_1 de vecteur. Les itérations successives tourneront le vecteur dans la bonne direction par moitié de la quantité de l'itération précédente jusqu'à ce que la valeur voulue ait été réalisée.

Plus formellement, chaque itération calcule une rotation, qui est effectuée en multipliant le vecteur v_i avec le R_ de la matrice de rotation de {I} :

v_ {i+1} = R_ {I} v_ {} d'I \

La matrice R de rotation est donnée par : R_ {I} de

= \ (\ commencent {rangée} {rr} \ cos \ gamma_ {I} et - \ péché \ gamma_ {I} \ \ \ péché \ gamma_ {I} et \ cos \ gamma _ {} d'I \ extrémité {rangée} \ droit) laissé

Using les deux identités trigonométriques suivantes

\ commencent {aligner} \ cos \ alpha et = et {} de 1 \ au-dessus de \ racine carrée {1 + \ tan^2 \ alpha} \ \ \ péché \ alpha et = et } de tan \ alpha \ au-dessus de \ racine carrée {1 + \ tan^2 \ alpha \ extrémité {aligner}

la matrice de rotation devient :

R_ {I} = {1 \ au-dessus de \ racine carrée {1 + \ tan^2 \ gamma_ {I}}} \ commencent {pmatrix} 1 et - \ tan \ gamma_ {} d'I \ \ \ tan \ gamma_ {I} et 1 \ extrémité {pmatrix}

L'expression pour le v_ tourné de vecteur {i+1} = le v_ de R_ {I} {I} devient alors :

v_ {i+1} = {1 \ au-dessus de \ racine carrée {1 + \ tan^2 \ gamma_ {I}}} \ commencent {x_ de pmatrix} {I} - y_ {I} \ tan \ gamma_ {I} \ \ x_ {I} \ tan \ gamma_ {I} + y_ {} d'I \ extrémité {pmatrix}

là où x_i et y_i sont les composants de v_i. La restriction du d'angles \ du gamma_ {I} de sorte que le \ tan \ gamma_ {I} prenne sur le de valeurs \ P. 2^ {- I} la multiplication avec la tangente peut être remplacée par une division par une puissance de deux, qui est efficacement faite dans le matériel de calculateur numérique using un décalage de peu de . L'expression devient alors :

v_ {i+1} = K_ {I} \ commencent {x_ de pmatrix} {I} - \ sigma_ {I} 2^ {- I} y_ {I} \ \ \ sigma_ {I} 2^ {-} x_ I {I} + y_ {} d'I \ extrémité {pmatrix}

là où K_i de

= {1 \ au-dessus de \ racine carrée {1 + 2^ {- 2i}}}

et le \ sigma_ {I} peuvent avoir les valeurs du &minus ; 1 ou 1 et est employé pour déterminer la direction de la rotation : si le d'angle \ beta_i est positif qu'alors le \ sigma_i soit 1, autrement c'est &minus ; 1.

Nous pouvons ignorer le K_i dans le processus itératif et puis l'appliquer après par un facteur de cadrage : K (n) = \ ^ de prod_ {i=0} {n-1} K_i = \ ^ de prod_ {i=0} {n-1} 1 \ racine carrée {1 + 2^ {- 2i}} de

ce qui est calculé à l'avance et stocké dans une table. En plus il peut noter cela = de de

K \ lim_ {n \ \ infty} K (n) \ approximativement 0.6072529350088812561694

pour permettre davantage de réduction de la complexité de l'algorithme. Après un nombre suffisant d'itérations, l'angle du vecteur sera proche du voulu d'angle \ beta. Pour la plupart des buts ordinaires, 40 itérations (n = 40) est suffisante pour obtenir le résultat correct à la 10ème décimale décimale.

La seule tâche laissée est de déterminer si la rotation est dans le sens des aiguilles d'une montre ou dans le sens contraire des aiguilles d'une montre à chaque itération (choisissant la valeur de \ sigma). Ceci est fait en maintenant combien nous avons tourné à chaque itération et à soustraire cela de l'angle voulu, et alors la vérification si le \ beta_ {n+1} est positif et nous devons tourner dans le sens des aiguilles d'une montre ou s'il est négatif nous devons tourner dans le sens contraire des aiguilles d'une montre afin d'obtenir plus près du voulu d'angle \ beta. de

\ beta_ {i+1} = \ - de beta_i \ sigma_i \ gamma_i. \ quadruple \ gamma_i = \ 2^ arctan {- I},

Les valeurs du \ gamma_n doivent également precomputed et stockées. Mais pour de petits angles, \ (\ gamma_n) = arctan \ gamma_n dans la représentation de point fixe, réduisant la taille de table.

Comme peut être vu dans l'illustration ci-dessus, le sinus du d'angle \ beta est y du v_ final de vecteur {n} , alors que x est la valeur de cosinus.

Exécution dans l'octave de MATLAB/GNU

Ce qui suit est un MATLAB /exécution de l'octave GNU de de CORDIC qui ne compte sur aucune fonction transcendantale excepté dans le precomputation des tables. Si le nombre du n d'itérations est prédéterminé, alors la deuxième table peut être remplacée par une constante simple. Deux-par-deux la multiplication de Matrix de représente une paire de décalages simples et s'ajoute. Avec l'arithmétique à double précision standard et le " de MATLAB ; long" de format ; la liste imprimée, les résultats augmentent dans l'exactitude pour le n jusqu'environ à 48.

 fonction v = cordic (bêta, n) % que cette fonction calcule v = péché (bêta) (bêta en radians) % using des itérations de n. N croissant augmentera la précision. 

si bêta < - pi/2 | bêta > pi/2 si bêta < 0 v = cordic (bêta + pi, n) ; autrement v = cordic (bêta - pi, n) ; extrémité v = - v ; % de chiquenaude le signe pour le deuxième ou troisième quart de cercle retour extrémité

% d'initialisation des tables des constantes employées par CORDIC % du besoin une table des arctangentes des puissances négatives de deux, en radians : % pêche = atan (2.^- (le 0h27)); angles =… 0.00000000745058] ; % et une table des produits des longueurs réciproques des vecteurs 2^-j : Kvalues =… 0.60725293500888] ; Kn = Kvalues (minute (n, longueur (Kvalues)));

% initialisent des variables de boucle : v = ; % de début avec le cosinus de 2 vecteurs et le sinus de zéro poweroftwo = 1 ; l'angle = pêche (1) ;

% d'itérations pour j = 0 : n-1 ; si bêta < 0 sigma = -1 ; autrement sigma = 1 ; extrémité facteur = sigma * poweroftwo ; R = - facteur ; facteur, 1 ; v = R * v ; % 2 de la matrice by-2 se multiplient bêta = bêta - sigma * angle ; % de mise à jour l'angle restant poweroftwo = poweroftwo/2 ; % de mise à jour l'angle de la table, ou par la suite en se divisant juste par deux si j+2 > longueur (angles) angle = angle/2 ; autrement l'angle = pêche (j+2) ; extrémité extrémité

% ajustent la longueur du vecteur de rendement pour être péché (bêta) : v = v * Kn ; retour

Algorithmes relatifs

CORDIC fait partie de la classe du " ; décaler-et-add" ; algorithmes, de même que le logarithme et les algorithmes exponentiels dérivés du travail de Henry Briggs. Des autres décaler-et-ajoutent l'algorithme qui peut être employé pour calculer beaucoup de fonctions élémentaires est l'algorithme du BKM, qui est une généralisation du logarithme et des algorithmes exponentiels au plan complexe. Par exemple, BKM peut être employé pour calculer le sinus et le cosinus d'un vrai angle x (en radians) en calculant l'exponentiel de 0+ix, qui est \ cos X + I \ péché x. l'algorithme de BKM est légèrement plus complexe que CORDIC, mais a l'avantage qu'il n'a pas besoin d'un facteur de cadrage (k).

Histoire

Volder a été inspiré par la formule suivante dans l'édition 1946 du manuel de centre de détection et de contrôle de de la chimie et de la physique : le de \ commencent {aligner} K_n \ péché (\ thêta \ P. \ phi) &= R \ péché (\ \) de thêta \ P. 2^ {- n} R \ cos (\ phi) \ K_n \ cos (\ thêta \ P. \ phi) &= R \ cos (\) de thêta \ MP 2^ {- n} R \ péché (\ phi) \ extrémité {aligner} avec = de K_n \ racine carrée {1+2^ {- 2n}} , les séries de coprocesseur du 80x87 d'Intel jusqu'au Intel 80486 , et au Motorola 68881 .

CORDIC décimal a été proposé la première fois par Hermann Schmid et Anthony Bogacki

.

Random links:Bétail des montagnes | Liste de cratères sur Mars | WWE assez dur | Repaire (journal) | Kryuchkov | CÓRDICO