Ir para conteúdo
Fórum Script Brasil
  • 0

CORDIC


Dovoevisk66

Pergunta

Eu estou fazendo um algoritmo  CORDIC. Ele faz operações trigonométricas e funções afins  à trigonometria. Quero saber se alguém tem alguma ideia para otimizá-lo o máximo possível. Neste caso ele está no modo de rotação, ou seja, calcula o seno e cosseno, neste caso.

// 360 graus == 32767 CAU

// saída(passo) = 127 * sen(passo) + 127; os valores ficarão assim: 0 < saída <255; para a modulação PWM. Obs: todos os cálculos já foram feitos para otimizá-lo.

#include "stdio.h"
#include "stdlib.h"

int sen(int angulo);


int main() 
{
    int passo = 0;
    int seno[32768] = { 0 };
    unsigned int n = 0;
    int m = 0;

    scanf("%d", &passo); // passo 2047 17 pontos; // passo 1 32768 pontos, essa configuração é para ficar bem pesado para rodar, assim fica perceptível alguma alteração de                                                                                                                                                                                                                                                                                desempenho.

    for (n = 0; n <= 32767; n += passo) {
    
        seno [m] = sen(n) + 127;
        m++;
        //printf("sen(%d) = %d\n", n, seno);
    }

    for (m = 0; m <= 32767; m++) {

        printf("%d\n", seno[m]);

    }

    
    
    system("pause");
    return 0;
}


int sen(int angulo)
{
    int arcTan[] =
    {
        4096,
        2418,
        1278,
        649,
        326,
        163,
        81,
        41,
        20
    };


    int xi = 77; // cos
    int yi = 0;  // sen

    int xn = 0; // cos
    int yn = 0; // sen

    int zi = 0; //angulo
    int zn = 0; // angulo


    char i = 0;
    char d = 0;
    char n = 0;
    int v = 0;
    char sinal = 0;
    

    if(angulo <= 8192)
    {    
        //nada;
        sinal = 0;   
    }
    else if (angulo <= 16383)
    {
        angulo = 16383 - angulo;
        sinal = 0;
    }
    else if (angulo <= 24575)
    {
        angulo = angulo - 16383;
        sinal = 1;
    }
    else if (angulo <= 32767)
    {
        angulo = 32767 - angulo;
        sinal = 1;
    }

    
    for (i = 0; i < 9; i++)
    {
        if (i == 0)
        {
            v = 1;
        }
        else
        {
            v = 2 << i - 1;
        }

        if (angulo < zn)
        {
            d = 1;
        }

        if (angulo > zn)
        {
            d = -1;
        }

        xn = xi - yi * d / v;
        yn = yi + xi * d / v;
        zn = zn + (zi - d * arcTan[n]);

        xi = xn;
        yi = yn;
        n++;

    }

    switch (sinal){

    case 1:
        return yn;
        break;

    default:
        return -yn;
        break;

    }

}

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...