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;
Pergunta
Dovoevisk66
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
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.