CORDIC es un algoritmo iterativo para el cálculo de funciones hiperbólicas o trigonométricas como seno, coseno, la magnitud y fase (arcotangente) con la precisión deseada. Este algoritmo es especialmente adecuado para implementaciones hardware, ya que no requiere de un multiplicador.
En el artículo de “Trigonometría en NXT-G” mostrábamos cómo implementar las funciones trigonométricas mediante desarrollo en serie de Taylor. Tradicionalmente el cálculo de funciones transcendentales y trigonométricas se ha realizado mediante expansiones polinómicas, como polinomos de Taylor, Min-Max o Chevichev. En todos estos casos la evaluación de polinomios, aunque se simplifique mediante la regla de Horner, requiere el uso de multiplicaciones. En la actualidad, las CPUs modernas disponen de instrucciones de multiplicación muy rápidas, pero no es el caso en sistemas empotrados o en ASICs.
CORDIC significa “COordinate Rotation DIgital Computer” y trabaja en torno a la idea de “rotación” de fase de un número complejo, multiplicándolo por una serie de valores constantes. En estas multiplicaciones, si elegimos como multiplicadores potencias de 2 nos encontramos que en aritmética binaria podemos implementarlos mediante desplazamientos y sumas, por lo que desaparece la necesidad de disponer de un multiplicador, que es lo que se pretendía.
En comparación con otras alternativas al cálculo de estas funciones, CORDIC presenta ventajas cuando no disponemos de un multiplicador hardware, como por ejemplo en un microcontrolador, o cuando quieres ahorrarte (normalmente reduciendo velocidad de cálculo) espacio ocupado en una FPGA. Por otra parte, cuando sí disponemos de un multiplicador hardware, como por ejemplo en un microprocesador DSP, el CORDIC no suele ser ventajoso respecto a otras soluciones como la búsqueda en tablas (table-lookup), generalmente más rápida que CORDIC.
Los que quieran disponer de estas implementaciones en NXT-G están de suerte, porque Claude Baumann ya las ha implementado mediante el toolkit NXT de LabVIEW. Dado que el NXT sólo trabaja con enteros, los ángulos deben ser introducidos en décimas de grados y el resultado es en milésimas de grado.
Ejemplo: sin(600deci°) = 860 milésimas = 0.860
El tiempo empleado en el cálculo en el NXT es de unos 14 ms.
El siguiente programa muestra un ejemplo de cómo representar la función sin(x) en el display. El único objeto de las operaciones aritméticas que podemos ver es el de centrar la representación en el display, teniendo en cuenta sus dimensiones y la forma en la que la función trigonométrica recibe y presenta los datos.
El resultado es el siguiente: