Ir para conteúdo
Fórum Script Brasil

Dovoevisk66

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Sobre Dovoevisk66

Dovoevisk66's Achievements

0

Reputação

  1. 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; } }
×
×
  • Criar Novo...