|
/************************************************************************ |
|
Algoritmo básico Cordic para geração de Seno e Cosseno |
|
|
|
Autor: Felipe Neves |
|
REV: 00 |
|
************************************************************************/ |
|
|
|
/************************************************************************ |
|
Arquivo: Cordic.c |
|
Funções: |
|
- doCordicSine() |
|
************************************************************************/ |
|
|
|
/************************************************************************ |
|
--INCLUDES: |
|
************************************************************************/ |
|
|
|
#include "Cordic.h" //arquivo com as definições e constantes |
|
|
|
/************************************************************************ |
|
--Variaveis globais |
|
************************************************************************/ |
|
extern Cpx FFT_Array; //matriz de dados para FFT |
|
|
|
/************************************************************************ |
|
--FUNCOES |
|
************************************************************************/ |
|
|
|
|
|
/************************************************************************ |
|
FUNCAO: doCordic () |
|
DESCRICAO: Executa algoritmo Cordic em 360 e salva em uma tabela |
|
|
|
ENTRADA: wAngle |
|
SAIDA: Nenhuma |
|
*************************************************************************/ |
|
|
|
int doCordicSine (signed int wAngle) |
|
{ |
|
//signed int wAngle = 0; //Angulo de partida |
|
long dwdx, dwdy, dwda; //Vetores de rotacionamento |
|
int wAtan[RESOLUTION] = {0x648,0x3B5,0x1F5,0xFE,0x7F,0x3F,0x1F,0x0F,0x07, |
|
0x03,0x01,0}; //Steps do angulo Theta para multiplicação |
|
int wSin = 0, wCos = KCOS; |
|
int by; //loop count |
|
|
|
for (by = 0; by < RESOLUTION ; by++) |
|
{ |
|
dwdx = wCos >> by; //rotaciona vetor |
|
dwdy = wSin >> by; |
|
dwda = wAtan [by]; //recupera angulo |
|
|
|
if(wAngle >= 0) |
|
{ |
|
wCos = wCos - dwdy; |
|
wSin = wSin + dwdx; //rotaciona vetores no sentido horario |
|
wAngle = wAngle - dwda; //p´roximo angulo |
|
} |
|
else |
|
{ |
|
wCos = wCos + dwdy; |
|
wSin = wSin - dwdx; //rotaciona vetores no sentido anti -horario |
|
wAngle = wAngle + dwda; //p´roximo angulo |
|
} |
|
} |
|
|
|
return (wSin); //retorna o seno da funcao |
|
|
|
} |
|
|
|
/************************************************************************ |
|
FUNCAO: doCordic Cosine() |
|
DESCRICAO: Executa algoritmo Cordic em 360 e salva em uma tabela |
|
|
|
ENTRADA: wAngle |
|
SAIDA: Nenhuma |
|
*************************************************************************/ |
|
|
|
int doCordicCosine (signed int wAngle) |
|
{ |
|
//signed int wAngle = 0; //Angulo de partida |
|
long dwdx, dwdy, dwda; //Vetores de rotacionamento |
|
int wAtan[RESOLUTION] = {0x648,0x3B5,0x1F5,0xFE,0x7F,0x3F,0x1F,0x0F,0x07, |
|
0x03,0x01,0}; //Steps do angulo Theta para multiplicação |
|
int wSin = 0, wCos = KCOS; |
|
int by; //loop count |
|
|
|
for (by = 0; by < RESOLUTION ; by++) |
|
{ |
|
dwdx = wCos >> by; //rotaciona vetor |
|
dwdy = wSin >> by; |
|
dwda = wAtan [by]; //recupera angulo |
|
|
|
if(wAngle >= 0) |
|
{ |
|
wCos = wCos - dwdy; |
|
wSin = wSin + dwdx; //rotaciona vetores no sentido horario |
|
wAngle = wAngle - dwda; //p´roximo angulo |
|
} |
|
else |
|
{ |
|
wCos = wCos + dwdy; |
|
wSin = wSin - dwdx; //rotaciona vetores no sentido anti -horario |
|
wAngle = wAngle + dwda; //p´roximo angulo |
|
} |
|
} |
|
|
|
return (wCos); //retorna o seno da funcao |
|
|
|
} |
|
|
|
/**************************************************************************** |
|
Fim do arquivo Cordic.c |
|
****************************************************************************/ |
|
|