Está en la página 1de 23

D.C.S.E

Algoritmos CORDIC

Alfredo José Fernández Rodríguez

Índice de contenido

1 Introducción

3

1.1 Revisión de conceptos de navegación aérea

3

1.2 Y hoy en día

4

2 Algoritmo CORDIC

5

2.1 Modo de rotación

5

2.1.1

Ejemplo

7

2.1.1.1 Caso 1: 16 repeticiones

8

2.1.1.2 Caso 2: error < 1%

9

2.2 Modo de vectorización

10

2.2.1

Ejemplo

10

2.3 CORDIC Hardware e implementación en FPGAs

11

3 Algoritmo CORDIC generalizado

14

3.1 Sistema circular

14

3.1.1 Seno y coseno

15

3.1.2 Arco seno y arco coseno

15

3.2 Sistema lineal

16

3.2.1 Multiplicación

17

 

3.2.2 División

17

3.2.3 Tangente

17

3.3 Sistema hiperbólico

17

3.3.1 Seno y coseno hiperbólicos

18

3.3.2 Arco tangente hiperbólico

18

3.3.3 Tangente hiperbólica

19

3.3.4 e x

19

3.3.5 Logaritmo natural

19

3.3.6 Raíz cuadrada

19

4 Core de Xilinx

21

1 Introducción

Introducción

En 1956 dos aviones norteamericanos colisionaban en pleno vuelo mientras sobrevolaban el Gran Cañón del Colorado 1 . Murieron 128 personas.

Dicho accidente llevó a un incremento en la financiación para el desarrollo del RADAR, procedimientos para el control aéreo y tecnologías para una navegación más precisas.

Fruto de este nuevo apoyo económico, tres años después Jack E. Volder ideó el algoritmo CORDIC (COordinate Rotation DIgital Computer); un algoritmo que implementa eficientemente las funciones trigonométricas necesarias para navegación aérea en tiempo real y empleando pocos recursos hardware.

Posteriormente (en 1971) John Stephen Walther de Hewlett-Packard generalizó el algoritmo 2 .

Sin extenderme demasiado, me parece interesante introducir en este punto una pequeña revisión matemática de la navegación aérea. Esto sirve como una justificación ejemplar 3 .

1.1 Revisión de conceptos de navegación aérea

Supongamos que somos pilotos de un helicóptero de rescate y recibimos la llamada de un grupo de montañeros que se encuentran atrapados en una montaña. Es de vital importancia conocer qué dirección y velocidad hemos de tomar bajo los efectos del viento 4 .

La siguiente figura muestra el esquema que hay que resolver para conocer la respuesta a dicho problema, partiendo del punto A al C.

la respuesta a dicho problema, partiendo del punto A al C. Ilustración 1: situación típica en

Ilustración 1: situación típica en navegación aérea.

La solución pasa por aplicar dos conocidos teoremas: el del coseno para conocer la rapidez con respecto del suelo (ground speed) y el del seno para conocer la dirección que hemos de seguir.

2 http://es.wikipedia.org/wiki/CORDIC. Última revisión 08/03/2009.

4 En navegación aérea es muy importante tener en cuenta los efectos del viento, ya que la velocidad del vehículo en el aire no es la misma que se aprecia desde tierra.

3/23

1.2 Y hoy en día

Introducción

Hoy en día es posible que se utilicen otras técnicas en cuanto a navegación aérea se refiere, sin embargo el algoritmo CORDIC resulta interesante para aplicaciones en las que no se dispone de unidades aritméticas complejas.

Éste es el caso de las calculadoras de mano, que emplean procesadores baratos y por tanto requieren de este tipo de algoritmo para aproximar funciones transcendentales 5 .

Por otro lado, las FPGAs son cada vez más utilizadas en proyectos que requieren realizar complejos cálculos matemáticos. Aquéllas carecen de un multiplicador dedicado, sin embargo son muy eficaces implementado sumadores y tablas de búsqueda (look up tables), que son el fundamento del algoritmo. Esto hace al algoritmo una solución atractiva para diferentes funciones matemáticas.

4/23

2 Algoritmo CORDIC

Algoritmo CORDIC

El algoritmo de CORDIC se basa principalmente en sumas y desplazamientos de bits, que lo hacen muy atractivo para la tecnología en que divisiones y multiplicaciones son caras computacional o físicamente; como en los ejemplos presentados anteriormente.

Volder presentó un método iterativo capaz de realizar transformaciones coordenadas (Cartesianas- Polares) y un método para realizar rotaciones de planos. Esto hace que se hable de dos modos de funcionamiento para este algoritmo:

vectorización

rotación

Con ambos modos de funcionamiento el algoritmo nos permite calcular el producto, división, seno, coseno, tangente, arco tangente (y las versiones hiperbólicas), logaritmo, exponencial natural y la raíz cuadrada.

A continuación comentaré ambos modos de funcionamiento del algoritmo.

2.1 Modo de rotación

Antes de adentrarme en la matemática de este modo de funcionamiento, quiero reflejar la filosofía del algoritmo de manera cualitativa.

Se trata de hacer girar un vector un determinado ángulo, que sería nuestra referencia. Para girarlo lo vamos a hacer como si fuésemos un controlador, girando en sentido anti horario si aún no hemos llegado a la referencia y en sentido horario si nos hemos pasado.

La idea es que cada vez que giremos lo vamos a hacer un ángulo menor que la vez anterior, aproximándonos así lentamente al ángulo deseado. Al final de este apartado muestro un pequeño ejemplo.

Bien, empecemos con la matemática. En este modo, dado un ángulo y un vector inicial se pretende completar el giro, que se corresponde con la siguiente ecuación.

[

f ] = [ cos   

sin   

x f

y

sin    cos   

][

x

y

s ]

s

[1]

y − sin    cos    ] [ x y s ]

Ilustración 2: rotación de un vector.

Como ya comenté, una aproximación más sencilla que realizar el giro completo de una vez es

5/23

Algoritmo CORDIC

hacerlo como una sucesión de giros pequeños α i (también llamados microángulos), de tal manera que

 = i

i = 0

[2]

eligiendo cuidadosamente el valor de α i podemos calcular eficientemente la rotación, que se convierte en un proceso iterativo que cumple la siguiente ecuación:

x i 1 = x i cos   i − y i sin

y i 1 = x i sin   i   y i cos

  i

  i

Sacando factor común podemos escribir

x i 1 = cos   i x i y i tan   i

y i 1 = cos   i y i x i tan

i

 

[3]

[4]

Ahora, para que el algoritmo sea eficientemente implementable, hay que tomar

de esta manera quedaría

i = arctan   i 2 i

x i 1 = cos   i x i −  i y i 2 i

y i 1 = cos   i y i   i x i 2 i

[5]

[6]

El coseno es un factor de escalado: cada iteración el vector cambia de amplitud (Ilustración 3).

iteración el vector cambia de amplitud (Ilustración 3). Ilustración 3: escalado del vector en cada iteración.

Ilustración 3: escalado del vector en cada iteración.

Normalmente el coseno suele eliminarse a la hora de desarrollar el algoritmo y se deja el escalado para el final, tras realizar la rotación.

Para saber el valor que toma σ i (1 ó -1) en cada iteración, se recurre a una variable auxiliar z.

[7]

z i 1 = z i arctan   i 2 i

La variable z se inicia con el valor del ángulo que queremos rotar el vector y a medida que tiende a cero el vector va completando su giro, en cada iteración de z se descubre que

6/23

Algoritmo CORDIC

i = 1

1

si z 0

i

si z i 0

[8]

Sin embargo al eliminar el coseno hacemos que cada iteración el vector aparte de rotar aumente de

tamaño en un factor

cos i puede demostrar que es K c ≈ 1,6468.

Sin embargo la ganancia exacta depende del número de iteraciones:

; si aplicamos el algoritmo ad infinitum el factor de escala final se

1

K c ,n =

n

1   i ²2 2i 1 / 2

[9]

Destacar que el factor de escala es independiente del ángulo que se gire.

El resultado de repetir este proceso n veces lleva a los valores que se muestran en la siguiente

ecuación, en la que el subíndice 0 indica el valor de inicio.

2.1.1

Ejemplo

x n = K c , n x 0 cos z 0 − y 0 sin z 0

y n = K c, n y 0 cos z 0   x 0 sin z 0

z n = 0

[10]

A continuación me gustaría referir toda la teoría con un ejemplo, girando un ángulo de 51º (el

ángulo de la pirámide de Keops). En este ejemplo pretendo mostrar cómo nos acercamos al ángulo final a medida que aumentamos el número de pasos y cómo disminuye el error.

El

final del proceso puede ser ora el número de iteraciones (16 para el primer caso del ejemplo) ora

el

error (menor del 1% en el segundo caso).

La siguiente tabla muestra los microángulos que se pueden formar

7/23

Iteración

Ángulo

0

45º

1

26,565º

2

14,036º

3

7,125º

4

3,576º

5

1,790º

6

0,895º

7

0,448º

8

0,224º

9

0,112º

10

0,056º

11

0,028º

12

0,014º

13

0,007º

14

0,003º

15

0,002º

Algoritmo CORDIC

Tabla 1: ángulo que se gira en cada iteración.

Y cómo se puede calcular un ángulo típico como sumas y restas de estos microángulos:

30

= 45-26,6+14-7,1+3,6+1,8-0,9+0,4

90

= 45+26,6+14+7,1-3,6+1,8-0,9+0,4

Dependiendo de la precisión que queramos habrá más o menos pasos. Por ejemplo con dos decimales:

51 = 45+26,57-14,04-7,13+3,58-1,79-0,9-0,45+0,22-0,11+0,06-0,03+0,01

y para cuatro:

50,9995 = 45+26,5651-14,0362- +0,014-0,007+0,0035+0,0017

habiendo alcanzado en este punto las 16 iteraciones sin llegar al valor finalmente deseado.

2.1.1.1 Caso 1: 16 repeticiones

Con una precisión de cuatro decimales la siguiente gráfica muestra la evolución del ángulo hacia nuestra referencia de 51º

8/23

Algoritmo CORDIC

evolución del ángulo 70,0000 65,0000 60,0000 ángulos referencia 55,0000 50,0000 45,0000 1 2 3 4
evolución del ángulo
70,0000
65,0000
60,0000
ángulos
referencia
55,0000
50,0000
45,0000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iteraciones
grados

Ilustración 4: ejemplo de rotación con 16 iteraciones.

Para este número de repeticiones el factor de escala es:

2.1.1.2 Caso 2: error < 1%

16

K c = 1   i ²2 2i 1 / 2 1,6468

i = 0

En este caso se representa el error. Finalizaremos el proceso cuando el valor absoluto del error sea menor del 1%.

evolución del error 10,0000 5,0000 0,0000 -5,0000 -10,0000 Error (%) -15,0000 referencia -20,0000 referencia
evolución del error
10,0000
5,0000
0,0000
-5,0000
-10,0000
Error (%)
-15,0000
referencia
-20,0000
referencia
-25,0000
-30,0000
-35,0000
-40,0000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iteraciones
error (%)

Ilustración 5: ejemplo de rotación para un error menor del 1%.

En este caso llegamos a repetir el proceso siete veces.

Si empleamos esta técnica, debemos tener una tabla con todos los factores de escala para cada iteración, y elegir el que corresponda con la iteración que hemos alcanzado. En este caso:

6

K c = 1   i ²2 2i 1 / 2 1,64669

i = 0

9/23

2.2 Modo de vectorización

Algoritmo CORDIC

La aplicación más usual del algoritmo de Volder es la conversión de coordenadas cartesianas a coordenadas polares; esto se consigue modificando ligeramente el procedimiento explicado anteriormente.

En este caso dado un vector (x s ,y s ) se trata de hacer cero su componente y mediante una serie de rotaciones igual que se hacía en el modo de rotación, almacenando el ángulo resultante en la variable z. Si el ángulo se suma o resta depende del valor de y según

i =

1

1

si

si

y i 0 y i 0

[11]

El valor final tras n iteraciones en este modo de funcionamiento del algoritmo es el que refleja la siguiente ecuación:

x n = K c , n x 0 ² y 0 ²

y n = 0

z

n = z 0 arctan y 0

x

0

[12]

La variable x guarda el valor del módulo del vector (multiplicado por el factor de escalado) y z el ángulo. A continuación muestro un ejemplo de realización del algoritmo en modo vectorización.

2.2.1

Ejemplo

Se trata de encontrar el módulo y argumento del vector iniciales x 0 e y 0 . Mientras que z 0 = 0;

v =  2,14 , 3,37

. Éstos serán los valores

 v =  2,14 , 3,37  . Éstos serán los valores Ilustración 6: ejemplo

Ilustración 6: ejemplo de vectorización. Módulo normalizado en la figura.

Inicialmente debemos comprobar la condición mostrada en la ecuación [11]. Como y 0 = 3,37 > 0

10/23

Algoritmo CORDIC

entonces σ 0 = -1, por tanto tras la primera ejecución del algoritmo (ecuaciones [6] y [7]) quedan los siguientes valores

x 1 = 2,14 – (-1)·3,37·(1) = 5,51 y 1 = 3,37 + (-1)·2,14·(1) = 1,21 z 1 = 0 – arctan((-1) 1) = 0,78rad

En la siguiente iteración se vuelve a comprobar la condición y 1 = 1,21 > 0 luego σ 1 = -1 y se vuelve a repetir el proceso.

x 2 = 1,21 – (-1)·5,51·(0,5) = 6,11 y 2 = 5,51 + (-1)·1,21·(0,5) = -1,54 z 2 = 0,78 – arctan((-1) 0,5) = 1,25rad

Ahora y 2 = -1,54 < 0 luego σ 2 = 1

x 3 = -1,54 – (1)·6,11·(0,25) = 6,49 y 3 = 6,11 + (1)·(-1,54)·(0,25) = -0,01 ≈0 z 3 = 1,25 – arctan((1)·0,25) = 1,004rad →57,52º

Al alcanzar la condición de parada y = 0, dejamos de ejecutar el algoritmo. Para tres repeticiones el

3

factor de escala es K c = 1   i ²2 2i 1 / 2 1,62 Si dividimos el valor de x 3 entre K c obtenemos

el módulo del vector:

i = 0

v= x 3

K c

= 6,49

1,62

4

2.3 CORDIC Hardware e implementación en FPGAs

En este apartado pretendo mostrar diversas maneras de implementar físicamente el algoritmo. La siguiente figura muestra una de ellas, en la que sólo se muestran bloques generales.

11/23

Ilustración 7: Estructura reiterativa CORDIC. Algoritmo CORDIC La Ilustración 7 se corresponde con una implementación

Ilustración 7: Estructura reiterativa CORDIC.

Algoritmo CORDIC

La Ilustración 7 se corresponde con una implementación recursiva; sin embargo podemos encontrar otras maneras de hacerlo, como puede verse en la siguiente ilustración 6 . En ella se muestra una implementación en la que cada valor se calcula en cascada; de tal manera que si la salida de cada bloque es registrada se puede realizar un pipeline.

Así, mientras en un ciclo de reloj se está calculando la segunda rotación, se puede introducir un nuevo vector y un nuevo ángulo. El límite de iteraciones en el algoritmo y el número de cálculos que se pueden “paralelizar” viene impuesto por el número de bloques que se anida en cascada.

25/03/2009

12/23

Algoritmo CORDIC

Algoritmo CORDIC Ilustración 8: implementación tipo pipeline. En cualquier caso los bloques empleados son siempre los

Ilustración 8: implementación tipo pipeline.

En cualquier caso los bloques empleados son siempre los mismos y me gustaría relacionar estos bloques con los medios disponibles en la FPGA estudiada en teoría.

Para los sumadores/restadores se emplean tantas LUTs como bits de resolución tenga nuestro algoritmo; como sabemos cada CLB tiene 4 slices y cada uno de ellos tiene dos LUTs.

Si queremos emplear 16 bits para representar cada dígito en el algoritmo necesitaremos dos CLBs por variable (un total de 6 CLBs: x, y y z). Para los desplazadores es posible usar una LUT para cada variable, ya que se puede implementar un registro de desplazamiento de 16 bits. En este caso se requerirían 16 ciclos de reloj para desplazar completamente un registro.

En cuanto a la ROM delimita el número de iteraciones que se pueden calcular. Esto se ve claramente en el modo de rotación ya que en cada iteración se requiere un nuevo ángulo α calculado.

Así pues, en cada CLB se puede implementar una ROM de 8x16, con lo que podríamos almacenar hasta 8 ángulos α distintos; lo que permitiría un máximo de 8 iteraciones en este caso.

Finalmente me gustaría comentar que Xilinx dispone de cores que implementan el algoritmo CORDIC 7 y que nos otorgan todas las funcionalidades descritas. En el apartado 4 hablaré de las características de este core.

13/23

Algoritmo CORDIC generalizado

3 Algoritmo CORDIC generalizado

La generalización del algoritmo de Volder se debió a Walther y permite, a través de una variable (m), calcular funciones adicionales en tres sistemas coordenados: circular (que es el que hemos visto), lineal e hiperbólico.

Con m seleccionamos el sistema coordenado que queremos emplear:

m =

1 sistema circular

0

sistema lineal sitema hiperbólico

1

[13]

Con esta nueva variable podemos definir el módulo y argumento de un vector V i = (x i , y i ) con las siguientes expresiones 8

V ∣= x i ² m y i ²

arg V = m 1 / 2 arctan m y i

m − 1 / 2 arctan   m y i  x i  [14]

x

i

[14]

Podemos obtener las coordenadas de un nuevo vector aplicando las siguientes ecuaciones en diferencias, que son muy parecidas a las vistas hasta ahora

x i 1 = x i m i y i

[15]

y i 1 = y i i x i

z i 1 = z i   i

Donde α i cumple

 = i

i = 0

[16]

Resolviendo las ecuaciones en diferencias de [15] se obtienen las siguientes expresiones tras n repeticiones, que nos permiten trabajar de manera general con este algoritmo.

x n = K m, n x 0 cos   n m 1 / 2   m 1 / 2 y 0 sin   n m 1 / 2

y n = K m,n y 0 cos   n m 1 / 2 − m 1 / 2 x 0 sin   n m 1 / 2

z n = z 0   n

[17]

K m,n es el factor de escalado que se define como

K

m, n =

n

1 m i

[18]

A continuación, hablaré de las funciones que se pueden implementar según los valores de m, es decir según el sistema coordenado.

3.1 Sistema circular

Aunque ya he hablado en el apartado anterior de una manera general, me gustaría particularizar las expresiones vistas. Dependiendo del valor con que iniciemos las variables y el modo que empleemos (rotación o vectorización) podemos realizar diversas funciones trigonométricas.

8 A unified algorithm for elementary funcitons. Walther, J. S; Spring Joint Computer Conference, 1971.

14/23

3.1.1 Seno y coseno

Algoritmo CORDIC generalizado

El algoritmo CORDIC nos permite averiguar simultáneamente ambos valores de un ángulo en modo de rotación.

Si nos fijamos en la ecuación [10] podemos llegar a la siguiente expresión

x n = K c , n x 0 cos z 0

y n = K c ,n x 0 sin z 0

[19]

. En el caso de que el

factor de escala no fuera correcto, sólo haría falta un multiplicador, lo que sería mucho más eficiente que otras técnicas (por ejemplo, buscar en una look-up table requiere de dos multiplicadores).

seleccionando un vector con coordenada y nula y una coordenada x = 1

K c ,n

3.1.2 Arco seno y arco coseno

En el modo de vectorización lo usual es llevar y al valor 0, sin embargo si llevamos y a un valor c y

partimos de un vector (1,0) en este modo z almacena el ángulo que hemos girado para que y valga c;

concretamente:

z n = z 0 arcsen

c

K c , n x 0

[20]

Para mí es un caso difícil de ver a simple vista, por lo que voy a mostrar un ejemplo en el queremos calcular el arco seno de 0,5369 (que se averigua en tres iteraciones del algoritmo).

x i 1 = cos   i x i −  i y i 2 i

y i 1 = cos   i y i   i x i 2 i

Iniciamos las variables:

x 0 = 1 y 0 = 0 z 0 = 0

Y para c hacemos:

c' =

c ,n x 0 = 0,5369 c = 0,5369 K c,3 = 0,875

K c

[21]

Calculando el factor de escalado para tres repeticiones.

Comprobamos las condiciones del algoritmo en vectorización y 0 c ⇒  0 = 1 y realizamos el primer paso del algoritmo.

x 1 = x 0 – σ 0 y 0 2 0 = 1

y 1 = y 0 + σ 0 x 0 2 0 = 1

z 1 = z 0 – arctan (σ 0 2 0 ) = -0,785

σ 1 = -1

Realizamos el segundo paso

15/23

x 2 = x 1 – σ 1 y 1 2 -1 = 1 y 2 = y 1 + σ 1 x 1 2 -1 = 1 z 2 = z 1 – arctan (σ 1 2 -1 ) = -0,3218 σ 2 = 1

Y finalizamos el algoritmo

x 3 = x 2 – σ 2 y 2 2 -2 = 1,375 y 3 = y 2 + σ 2 x 2 2 -2 = c = 0,875 z 3 = z 2 – arctan (σ 2 2 -2 ) = -0,5667 = -32,4712º

Algoritmo CORDIC generalizado

Aplicando el algoritmo tal cual está definido tenemos un problema con el signo del ángulo; en este caso el algoritmo debería ser modificado para obtener valores correctos en signo:

z i 1 = z i arctan   i 2 i

Para calcular el arco coseno no es necesario realizar un nuevo algoritmo, ya que se puede calcular directamente del arco seno restando π/2 al resultado de éste.

El arco seno es efectivo para valores de c que cumplen 1 c n x 0 1 ya que para valores

cercanos a ±1 se tienen grandes errores.

K c,

3.2 Sistema lineal

a ±1 se tienen grandes errores. K c, 3.2 Sistema lineal Ilustración 9: coordenadas lineales En

Ilustración 9: coordenadas lineales

En este caso sustituimos m = 0 en la ecuación [15] para obtener las ecuaciones en diferencias que rigen este algoritmo en un sistema lineal.

x i 1 = x i

y i

1 = y i −  i x i

z i 1 = z i   i

[22]

Donde los valores de σ i se calculan como hasta ahora se ha explicado y α i = σ i 2 -i .

Dependiendo del modo de funcionamiento del algoritmo y de la iniciación que se dé a las variables se pueden realizar multiplicaciones y divisiones.

16/23

3.2.1 Multiplicación

Algoritmo CORDIC generalizado

Funcionando en modo rotación, tras n repeticiones calculando las ecuaciones representadas en [22] llegamos a las siguientes expresiones.

x n = x 0

y n = y 0 x 0 z 0

z n = 0

[23]

Si iniciamos la variable y con y 0 = 0 al final del algoritmo obtendremos en esa misma variable el producto z 0 ·x 0 .

3.2.2

División

Para calcular el cociente entre dos números se utiliza CORDIC en modo vectorización, que llevaría a las siguientes expresiones tras n iteraciones.

x n = x 0

y n = 0

z

n = z 0 y 0 x 0

Eligiendo z 0 = 0 al final se obtiene la división de y 0 /x 0 .

[24]

3.2.3 Tangente

Ahora que sabemos hacer una división con el algoritmo y el seno y coseno podemos calcular la sin z 0 tangente como tan z 0 = cos z 0 . Para ello debemos ejecutar el algoritmo en coordenadas

circulares para calcular el seno y coseno, almacenarlos y volver a ejecutar el algoritmo, esta vez en coordenadas lineales, para obtener el cociente.

3.3 Sistema hiperbólico

Sustituyendo m=-1 en la ecuación [17] obtenemos senos y cosenos de variables imaginarias que por definición son hiperbólicos.

cosh x  = cos ix = e x e x

2

sinh x  = sin ix  = e x e x

2

[25]

Las ecuaciones en diferencias que rigen el algoritmo en un sistema hiperbólico son muy similares a las que estamos viendo a lo largo de todo el documento; el cambio más reseñable se observa para la variable z.

x

i 1 = x i   i

y i 2 i

y i 1 = y i   i x i 2 i

z i 1 = z i artanh   i 2 i

17/23

[26]

El factor de escala también es distinto:

Algoritmo CORDIC generalizado

lim K h,n = lim

n

n  ∞

n

1 −  i 0,8282

 ∞ n  ∞ ∏ n  1 −  i ≈ 0,8282 Ilustración 10:

Ilustración 10: coordenadas hiperbólicas.

σ i cumple las mismas condiciones que en los otros dos sistemas coordenados.

Al igual que vengo haciendo hasta ahora, a continuación hablaré de las funciones que se pueden implementar eligiendo uno de los dos modos de este algoritmo y unos valores adecuados de iniciación de variables.

3.3.1 Seno y coseno hiperbólicos

En modo rotación tras n iteraciones las expresiones generales que se cumplen son:

x n = K h, n x 0 cosh z 0  y 0 sinh z 0

y n = K h,n y 0 cosh z 0  x 0 sinh z 0

z n = 0

[27]

Si el vector inicial a rotar es el siguiente:

obtendremos tanto el seno como el coseno hiperbólicos de z 0 . Al igual que sucedía en el sistema circular.

1 h,n , y 0 = 0 al cabo de la n-ésima repetición

V = x 0 =

K

3.3.2 Arco tangente hiperbólico

El modo que se emplea en este caso es el de vectorización, que al final resulta:

x n = K h, n 0 0

y n = 0

z n = z 0 artanh y 0 x 0

[28]

En este caso haciendo z 0 = 0 obtenemos el arco tangente hiperbólico directamente.

18/23

3.3.3 Tangente hiperbólica

Algoritmo CORDIC generalizado

Una vez que se ha calculado el seno y coseno hiperbólicos en este sistema, se pueden almacenar en

los valores iniciales de x 0 e y 0 , para ejecutar inmediatamente el algoritmo en modo vectorización en

el sistema lineal.

Obtenemos así el cociente

3.3.4 e x

y 0 = sinh z 0

0 = tanh z 0

x 0 = cosh z

Es una función más fácil de calcular de lo que parece. Primero veamos cómo podemos definir la función:

e x = e x e x e x e x

2 2

= cosh x  sinh x

[29]

Así, ejecutando el algoritmo en modo rotación y sistema hiperbólico obtenemos tras n iteraciones

x n = cosh z 0

y

y n = sinh z 0

. Simplemente sumando x n e y n obtenemos

x n y n = e z 0

3.3.5 Logaritmo natural

Se cumple la siguiente igualdad

ln z  = 2 artanh x y = = z z 1 1

[30]

que se puede demostrar 9 realizando la expansión de ambas funciones en series de Taylor donde ε es un número positivo muy pequeño, ya que en x = 0 el logaritmo natural no existe (o tiende a infinito). Para el logaritmo neperiano (sólo hasta el cuarto grado):

[31]

1

1

1

ln z  =  z −  − 2 z −   ² 3 z −   ³ 4 z −  

Y para el arco tangente hiperbólico (sólo hasta el cuarto grado):

2 artanh z 1

z

1 = z −  − 2 z −   ² 3 z −   ³ 4 z −  

1

1

1

[32]

Entonces el cálculo del logaritmo natural de un número pasa por calcular el arco tangente hiperbólico iniciando las variables x e y correctamente: x 0 = z 0 +1 e y 0 = z 0 -1.

3.3.6 Raíz cuadrada

Si revisamos el modo vectorización para un sistema coordenado hiperbólico, se puede observar que

tras n repeticiones (ecuación [28]) el valor de x n almacena la raíz cuadrada escalada.

Sustituyendo x 0 e y 0 por los valores adecuados se llega a

[33]

x n = K h, n z

Si se cumple lo afirmado en las siguiente ecuación

9 En MATLAB se puede comprobar con la función taylor sobre variables simbólicas. Es conveniente desarrollar para un número mayor de cero, sino da problemas. La misma función la encontramos en MAPLE.

19/23

x 0 = z 1

4 0 =

z

2 16

1

y 0 = z 1 4 0 =

z

2 16

1

z = 0 0 =

z 2

16 1

20/23

Algoritmo CORDIC generalizado

z

2 16

1

[34]

4 Core de Xilinx

Core de Xilinx

El core de Xilinx que implementa el algoritmo CORDIC está disponible para las familias de FPGAs Virtex™, Virtex-E, Virtex-II, Virtex-II Pro, Virtex-4, Spartan™-II, Spartan-IIE, Spartan-3 y

Spartan-3E.

Calcula el seno, coseno y arco tangente tanto normales como hiperbólicos, además del paso de coordenadas rectangulares a polares y viceversa y la raíz cuadrada.

Se puede optimizar para área o retardo y es un diseño completamente síncrono.

área o retardo y es un diseño completamente síncrono. Ilustración 11: esquema del core de Xilinx.

Ilustración 11: esquema del core de Xilinx.

Xilinx nos ofrece una interfaz gráfica que nos permite configurar el algoritmo CORDIC para que se ajuste a nuestras necesidades: pipeline, paralelo o serie, función que realizar, etcétera. La siguiente ilustración muestra esta interfaz; en la que se puede observar que faltan muchas de las funciones que se pueden implementar con el algoritmo.

de las funciones que se pueden implementar con el algoritmo. Ilustración 12: interfaz para configurar el

Ilustración 12: interfaz para configurar el algoritmo en Xilinx.

21/23

Core de Xilinx

Las señales de datos son X_IN, Y_IN, X_OUT e Y_OUT. Dichas señales están representadas en formato 1QN y X_IN e Y_IN deben estar en el rango [-1, 1], ya que fuera de este rango se obtienen valores impredecibles. En formato 1Q10 el rango se representa de la siguiente manera:

+1.0 = “0100000000” = “01.00000000”

–1.0 = “1100000000” = “11.00000000”

Existen dos arquitecturas para implementar el algoritmo, que son las dos posibilidades que se trataban en el apartado 2.3 :

Paralela: en la que cada ciclo se obtiene un valor y requiere de gran cantidad de Silicio.

Serie: en la que se requieren varios ciclos de reloj para obtener un valor, sin embargo emplean menos Silicio.

para obtener un valor, sin embargo emplean menos Silicio. a) Ilustración 13: arquitecturas del core: a)

a)

Ilustración 13: arquitecturas del core: a) serie b) paralela.

La interfaz nos va guiando en cuatro pasos en los que nos permitirá configurar completamente el algoritmo CORDIC. Tras este primer paso en el que definimos las función arquitectura que queremos implementar, se nos presenta otra pantalla en la que podemos configurar el formato de datos, sincronización y variables adicionales de control.

b)

datos, sincronización y variables adicionales de control. b) Ilustración 14: paso 2 en la configuración del

Ilustración 14: paso 2 en la configuración del core.

22/23

Core de Xilinx

Tras este paso debemos seleccionar el método de redondeo que queremos para nuestros datos y si queremos que estén registradas tanto las salidas como entradas. Además seleccionaremos el tamaño en bits de nuestros datos.

seleccionaremos el tamaño en bits de nuestros datos. Ilustración 15: paso 3 en la configuración del

Ilustración 15: paso 3 en la configuración del core.

Finalmente podemos configurar el número de iteraciones o la precisión, así como si queremos que se ajuste el factor de escalado o no.

como si queremos que se ajuste el factor de escalado o no. Ilustración 16: último paso

Ilustración 16: último paso en la configuración del core.

23/23