O documento descreve o algoritmo CORDIC, projetado para realizar cálculos de rotação de vetores de forma iterativa utilizando apenas soma e deslocamentos de bits. O algoritmo foi desenvolvido para permitir que computadores digitais realizassem tais cálculos em tempo real de forma eficiente. O texto explica a matemática por trás do algoritmo CORDIC iterativo e como ele pode ser implementado tanto em software quanto em hardware usando circuitos digitais.
Algoritmo CORDIC: uma solução iterativa para cálculo de funções trigonométricas
1. Algoritmo CORDIC
Cairo P. Cheble Caplan
CBPF - Linguagem de Programa¸c˜ao
Prof. Pablo Diniz Batista
21/08/2013
2. Introdu¸c˜ao
CORDIC - COordinate Rotation DIgital Computer
Computador digital de rota¸c˜ao coordenada
Figura 1 : ”A necessidade ´e a m˜ae da inven¸c˜ao”. Bombardeiro
supersˆonico B-58 que motivou a cria¸c˜ao do CORDIC
3. Introdu¸c˜ao
• No in´ıcio de 1956 o departamento de Aeroeletrˆonica da
Convair, em Fort Worth, foi encarregado de determinar a
possibilidade de substitui¸c˜ao do sistema de navega¸c˜ao
anal´ogico do bombardeiro B-58 por um computador digital.
Esta substitui¸c˜ao foi necess´aria pela baixa precis˜ao dos
elementos anal´ogicos de c´alculo do sistema.
• Eletrˆonica digital era bastante limitada na ´epoca, transistores
eram novidade e trabalhavam a uma baixa velocidade e havia
a necessidade do sistema obter resultados em tempo real.
• Publicado por Jack E. Volder em mar¸co de 1959, o algoritmo
e computador digital CORDIC podia realizar c´alculos de
rota¸c˜ao, magnitude a ˆangulo de vetores.
• Neste trabalho ser´a apresentado o algoritmo do CORDIC
iteratico para c´alculo de cossenos e senos e um ˆangulo de
entrada.
4. Vantagens do CORDIC
Vantagens do algoritmo CORDIC em rela¸c˜ao aos dois m´etodos
tradicionais de fun¸c˜oes trancedentais como armazenamento em
tabela de valores e por s´erie de Taylor:
• Alta precis˜ao dos resultados, em oposi¸c˜ao ao m´etodo de
tabela de valores.
• N˜ao h´a necessidade de uso de unidades de multipli¸c˜ao ou
divis˜ao, em oposi¸c˜ao ao m´etodo por s´erie de Taylor
• Opera¸c˜ao com n´umeros reais em formato de ponto fixo.
Permitindo seu uso em microcontroladores ou CPUs simples e
diminuindo o custos de circuitos em hardware dedicado.
5. Implementa¸c˜oes do CORDIC
O projeto da CORDIC pode ser usado em duas base formas
diferentes
• Software - Podendo ser escrito em liguagens de program¸c˜ao
tradicionais como C ou assembly, destinado `a execuc˜ao de
microcontroladores ou CPUs.
• Hardware - Podendo ser escritos em linguagens de descri¸c˜ao
de hardware, como VHDL ou Verilog, destinado `a
implementa¸c˜ao em circuitos digitais dedicados como em
Circuitos Integrados, ASICs e FPGAs. Uma implemena¸c˜ao em
VHDL para FPGA foi feita para este trabalho.
7. Matem´atica da Rota¸c˜ao
• {x= v .cos(φ)
{y= v .sin(φ) [1]
• x’= v’ .cos(φ+θ)
y’= v’ .sin(φ+θ)
v’ = v [2]
• sin(φ+θ) = sinφ.cosθ + sinθ.cosφ
cos(φ+θ) = cosφ.cosθ - sinθ.sinφ [3]
• x’ = v .cos(φ+θ) = v .cosφ.cosθ - v .sinθ.sinφ
y’ = v .sin(φ+θ) = v .sinφ.cosθ + v .sinθ.cosφ [4]
8. Matem´atica da Rota¸c˜ao
• Aplicando [1] em [4] Temos:
x’ = x.cosθ - y.sinθ
y’ = y.cosθ + x.sinθ [5]
• Rearranjando a express˜ao anterior colocando o cosseno em
evidˆencia:
x’ = cos(θ).(x - y.tanθ)
y’ = cos(θ).(y + x.tanθ) [6]
• A raz˜ao entre x’ e y’ permanece a mesma pois ambos s˜ao
multiplicados por cos(θ).
• Ainda s˜ao necess´arias as opera¸c˜oes de multiplica¸c˜ao e fun¸c˜ao
tangente.
9. Algoritmo CORDIC iterativo
Ideias chaves da proposta do algoritmo:
• Rotacionar o vetor gradualmente com passos de ˆangulos bem
definidos, onde seus valores s˜ao tabelados.
• tan(θi) = ±2−i
| i={0,1,2,... n} [7]
• Substituindo as express˜oes originais em [6] por uma forma
iterativa temos:
x[i+1] = Ki(x[i] - y[i].tanθi)
y[i+1] = Ki(y[i] + x[i].tanθi) [8]
Onde θi pode ser positivo ou negativo dependendo do sentido
necess´ario da rota¸c˜ao e Ki = cos(θi) = cos(-θi).
• Como tan(θi) = - tan(- θi) ent˜ao podemos reduzir o n´umero
de valores da express˜ao [7] pela metade adicionando o
parˆametro di, definindo o sinal o ˆangulo.
tan(±θi)= di.2−i
| i={0,1,2,... n} ∧ di = 1 se rota¸c˜ao
positiva ou -1 se negativa [9]
• Logo, substituindo [9] em [8]:
x[i+1] = Ki(x[i] - y[i].di.2−i
)
y[i+1] = Ki(y[i] + x[i].di.2−i
) [10]
10. Algoritmo CORDIC iterativo
• Pr´e-c´alculo dos cossenos das intera¸c˜oes, as constantes Ki
• Lembrando que Ki = cos(θi)
• Ao final das n itera¸c˜oes as constantes multiplicativas Ki
podem ser sintetizadas em uma ´unica Kpn.
Kpn = K0.K1..Kn
Kpn =
n
i=0Ki [11]
• Discretizando θi por θi =arctan(2−i
) Temos:
Ki = cos(tan−1
(2−i
))
∴ Ki = 1/
√
1 + 2−2i [12]
• Aplicando [12] em [11]
Kpn =
n
i=0(1/
√
1 + 2−2i) [13]
• O valor do produt´orio Kpn converge para um valor finito:
K=Kp∞ = limn→∞(
n
i=0(1/
√
1 + 2−2i))
K≈0,670252935008881256194... [14]
11. Algoritmo CORDIC iterativo
Sintetizando:
• Partindo da express˜ao [10] e assumindo que se queira obter
rota¸c˜ao de um vetor unit´ario partindo do ˆangulo zero, pode-se
aplicar a constante final K [14] no in´ıcio das itera¸c˜oes,
extinguindo a ´ultima opera¸c˜ao de multiplica¸c˜ao das itera¸c˜oes
de [10].
x[0] = (1)*K e y[0] = (0)*K
x[i+1] = (x[i] - y[i].di.2−i)
y[i+1] = (y[i] + x[i].di.2−i)
• Os valores de di s˜ao decididos de acordo com o ˆangulo teste
atual, chamado de zi, criado para medir a distˆancia angular
do resultante das itera¸c˜oes com o ˆangulo dado.
z[0] = ˆAngulo desejado
e z[i+1] = z[i] - θi
∴ z[i+1] = z[i] - di. arctan(2−i)
Onde d[i] = -1 se z[i]<0 ou 1 se ≥0
12. Algoritmo CORDIC iterativo
Ao final das N itera¸c˜oes temos:
• X como cosseno do ˆangulo.
• Y como seno do ˆangulo
• Z como diferen¸ca ˆangular dos ˆangulos da sa´ıdas X e Y em
rela¸c˜ao ao ˆAngulo dado. Servindo como parˆametro de
precis˜ao.
• O ˆAngulo de entrada deve estar compreendido entre 0 e 90
graus.
17. Referˆencias Bibliogr´aficas
• ”The Birth of CORDIC”, Jack E. Volder, Journal of VLSI
Signal Processing 25, 101–105, 2000.
• ”FPGA Implementation of Sine and Cosine Value Generators
using Cordic Algorithm for Satellite Attitude Determination
and Calculators”, Shoaib Bhuria, Student Member, IEEE, and
P.Muralidhar, Member, IEEE.
• ”A survey of CORDIC algorithms for FPGA based
computers”, Ray Andraka, Andraka Consulting Group Inc.