CÓRDICO

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 2 de octubre de 2017; las comprobaciones requieren 19 ediciones .

CORDIC ( método CORDIC del inglés.  Computadora  digital de rotación de coordenadas: una computadora digital para rotar el sistema de coordenadas; el método "dígito por dígito" , algoritmo de Walder ) es un método iterativo para reducir los cálculos directos de funciones complejas a realizar operaciones simples de suma y cambio .

Idea de método

La idea del método es reducir el cálculo de los valores de funciones complejas (por ejemplo, hiperbólicas ) a un conjunto de pasos simples: suma y desplazamiento.

Este enfoque es especialmente útil cuando se calculan funciones en dispositivos con capacidades informáticas limitadas, como microcontroladores o matrices lógicas programables ( FPGA ). Además, dado que los pasos son del mismo tipo, la implementación de hardware del algoritmo se puede expandir en una canalización o colapsar en un bucle.

Historia

El método fue descrito por primera vez en aplicación al cálculo de funciones trigonométricas y operaciones de transformación de coordenadas por Jack Walder en 1956 y luego en 1959 . En 1956, Akushsky y Yuditsky propusieron una idea similar para calcular funciones exponenciales y logarítmicas. Inicialmente, una idea cercana a esta fue propuesta por Henry Briggs en 1624 cuando estaba compilando tablas de logaritmos .

El método se ha utilizado en la implementación de algunos tipos de instrucciones de punto flotante en los coprocesadores matemáticos de Intel , incluido el 8087 [1] [2] [3] [4] [5] , 80287 [5] [6] , 80387 [5 ] [6] y hasta 80486 [1] , así como en los coprocesadores Motorola 68881 [1] [2] y 68882. Esto permitió reducir el número de elementos lógicos (y la complejidad) del coprocesador.

Método de Briggs

La idea general del método es la siguiente. Mediante la multiplicación sucesiva del argumento por constantes preseleccionadas, acerque el argumento a uno con una precisión dada para algunas funciones y a cero para otras funciones. Sin embargo, para que el valor de la función en sí permanezca sin cambios, es necesario realizar simultáneamente acciones equivalentes en las constantes elegidas. Al elegir los valores de las constantes de una manera especial, es posible simplificar significativamente el cálculo de los valores de la función.

Por ejemplo, Briggs multiplicó el valor del argumento de la función de logaritmo decimal por constantes de la forma: o .

En este caso, la elección del primer multiplicador ( ) se realizaba si el valor actual de la cantidad resultaba menor que uno, y el segundo , si el valor actual era mayor que uno. Al elegir sucesivamente los valores del exponente de 1 a , donde estaba el error de cálculo máximo permitido, Briggs redujo el valor a uno con la precisión requerida y, por lo tanto, el valor de la función a cero.

Sin embargo, para la equivalencia de estas transformaciones, es necesario dividir el valor indicado por el mismo valor simultáneamente con la multiplicación del actual. Pero, como sabes, el logaritmo del cociente es igual a la diferencia entre los logaritmos del numerador y el denominador. Por lo tanto, simultáneamente con la multiplicación de la corriente por es necesario restar la función previamente calculada del logaritmo del valor del producto del argumento por el factor .

Los valores de todas las constantes de la forma y se pueden calcular de antemano, ya que hay relativamente pocos de ellos. Por ejemplo, con un error aceptable, solo hay doce.

Queda por aclarar que la multiplicación por constantes de la forma e se reduce a operaciones de suma, resta y traslado de una coma (desplazamiento).

Por tanto, el procedimiento para calcular la función logaritmo de Briggs se reduce a las operaciones de suma, resta y desplazamiento decimal.

La generalización de la idea del método de Briggs a números complejos se llevó a cabo a mediados de los años cincuenta por Jack Walder y casi simultáneamente con él por Akushsky y Yuditsky. Esto hizo posible calcular funciones trigonométricas.

Horario de apertura

CORDIC se puede utilizar para calcular una serie de funciones diferentes. Esta explicación muestra cómo usar CORDIC en modo de rotación para calcular el seno y el coseno de un ángulo. Se supone que el ángulo deseado se da en radianes y los resultados están en formato de punto fijo . Para determinar el seno o el coseno de un ángulo , se deben encontrar las coordenadas de un punto y o x en el círculo unitario de acuerdo con el ángulo deseado. Usando CORDIC, comenzamos con un vector :

En la primera iteración , este vector se girará 45° en sentido contrario a las agujas del reloj para obtener el vector . Las iteraciones sucesivas rotarán el vector en una dirección u otra en incrementos decrecientes hasta alcanzar el ángulo deseado. El valor del i -ésimo paso es arctg(1/(2 i −1 )), para i  = 1, 2, 3, ….

Más formalmente, en cada iteración se calcula la rotación, que se realiza multiplicando el vector por la matriz de rotación :

Las matrices de rotación R están determinadas por la fórmula:

Usando las siguientes dos identidades trigonométricas

obtenemos la matriz de rotación:

Expresión para vector rotado :

donde y son los componentes . Al limitar los valores de los ángulos para que tome valores, la multiplicación por la tangente se puede reemplazar por la división por una potencia de dos, que se implementa de manera eficiente en el hardware de la computadora digital mediante el cambio de bits . Obtenemos la expresión:

dónde

y puede tener los valores −1 o 1 y se usa para determinar la dirección de rotación: si el ángulo es positivo entonces es igual a 1, de lo contrario es igual a −1.

Podemos ignorarlo iterativamente y luego aplicarlo para obtener el factor de escala:

que se calcula de antemano y se almacena en una tabla, o como una sola constante si el número de iteraciones es fijo. Esta corrección también se puede hacer por adelantado escalando .

La única tarea que queda es determinar si se debe realizar una rotación en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj en cada iteración (eligiendo un valor de ). Esto se hace haciendo un seguimiento de la cantidad de rotación en cada iteración y restando del ángulo deseado, luego verificando si es positivo, entonces debemos rotar en el sentido de las agujas del reloj o si es negativo, debemos rotar en el sentido contrario a las agujas del reloj para acercarnos al ángulo .

Los valores también deben calcularse por adelantado. Pero para ángulos pequeños en representación de punto fijo, lo que permite reducir el tamaño de la tabla.

Como puede ver en la ilustración anterior, el seno del ángulo es la coordenada y del vector final y la coordenada x es el valor del coseno.


El método de las "dobles iteraciones"

En los trabajos [7] y [8] se propuso utilizar el método de las "dobles iteraciones" para el cálculo de las funciones arcsinX, arccosX, lnX, expX, así como para el cálculo de funciones hiperbólicas . Consiste en el hecho de que, a diferencia del método CORDIC clásico, donde el valor del paso de iteración cambia CADA vez, es decir en cada iteración, con el método de iteraciones dobles, el valor del paso de iteración se repite dos veces y cambia solo después de una iteración. Así apareció la notación para el exponente para iteraciones dobles: i = 1,1,2,2,3,3... Mientras que para iteraciones ordinarias: i =1,2,3... El método de iteraciones dobles garantiza la convergencia del método en todo el rango permitido de cambios de argumento.

La generalización de los temas de convergencia de algoritmos del método CORDIC a un sistema numérico posicional arbitrario con base R, dada en [9] , mostró que para las funciones sin, cos, arctg, es suficiente realizar (R-1) -iteraciones para cada valor de i (i de 0 o 1 a n, donde n es el número de dígitos), es decir para cada dígito del resultado. Para las funciones ln, exp, sh, ch, arth, R se deben realizar iteraciones para cada valor de i. Para las funciones arcsen y arccos, se deben realizar 2 ⋅ (R-1) iteraciones por bit, es decir para cada valor de i.

Para las funciones arsh, arch, el número de iteraciones será 2R para cada i, es decir para cada dígito del resultado.

Literatura

Notas

  1. 1 2 3 Müller Jean-Michel. Funciones elementales: algoritmos e implementación . - 2 edición. - Boston: Birkhäuser, 2006. - Pág. 134. - ISBN 978-0-8176-4372-0 . Archivado el 5 de junio de 2011 en Wayback Machine .
  2. 1 2 Rafi Nave. Implementación de Funciones Trascendentales en un Procesador Numérico // Microprocesamiento y Microprogramación. - 1983. - T. 11 , N° 3-4 . — S. 221–225 .
  3. John F. Palmer, Stephen Paul Morse. La cartilla 8087 . - John Wiley & Sons Australia, Limited, 1984. - ISBN 9780471875697 . Archivado el 30 de diciembre de 2016 en Wayback Machine .
  4. Vidrio L. Brent. Coprocesadores matemáticos: una mirada a lo que hacen y cómo lo hacen // Byte Magazine. - 1990. - T. 15 , N º 1 . — S. 337–348 . — ISSN 0360-5280 .
  5. 1 2 3 Pitts Jarvis. Implementación de algoritmos CORDIC: una sola rutina compacta para calcular funciones trascendentales // Dr. Diario Dobbs. - 1990. - T. 15 , N º 10 . — S. 152–156 .
  6. 1 2 AK Yuen. Procesadores de coma flotante de Intel // Electro/88 Conference Record. - 1988. - S. 48/5/1-7 .
  7. Implementación hardware de las funciones elementales mediante la técnica dígito a dígito (CORDIC) . Consultado el 24 de diciembre de 2020. Archivado desde el original el 11 de enero de 2011.
  8. Baikov V.D., Smolov V.B. Implementación de hardware de funciones elementales en una computadora digital . Consultado el 24 de diciembre de 2020. Archivado desde el original el 15 de enero de 2011.
  9. Baikov V.D., Smolov V.B. Procesadores especializados: estructuras y algoritmos iterativos . Consultado el 29 de diciembre de 2020. Archivado desde el original el 18 de julio de 2011.