gba-trycatch

annotate src/sincos.c @ 4:78d1664c2443

- fixed sin_x16/cos_x16 - added fixed point header
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 14 Jun 2014 03:04:56 +0300
parents 8e9225853d75
children
rev   line source
nuclear@3 1 #include <math.h>
nuclear@4 2 #include "fixed.h"
nuclear@3 3 #include "sincos.h"
nuclear@3 4 #include "logger.h"
nuclear@3 5
nuclear@3 6 void sincos_init(void)
nuclear@3 7 {
nuclear@3 8 int i;
nuclear@3 9
nuclear@3 10 logmsg(LOG_ALL, "calculating sin/cos lut...\n");
nuclear@3 11
nuclear@3 12 for(i=0; i<SINLUT_SIZE; i++) {
nuclear@3 13 float angle = 2.0 * M_PI * ((float)i / (float)SINLUT_SIZE);
nuclear@3 14 float val = sin(angle);
nuclear@3 15 sinlut[i] = (int16_t)(val * SINLUT_SCALE);
nuclear@3 16 }
nuclear@3 17 }
nuclear@3 18
nuclear@3 19 int16_t sin_int(int16_t norm_angle)
nuclear@3 20 {
nuclear@3 21 norm_angle %= SINLUT_SIZE;
nuclear@3 22 if(norm_angle < 0) {
nuclear@3 23 norm_angle += SINLUT_SIZE;
nuclear@3 24 }
nuclear@3 25 return sinlut[norm_angle];
nuclear@3 26 }
nuclear@3 27
nuclear@3 28 int16_t cos_int(int16_t norm_angle)
nuclear@3 29 {
nuclear@3 30 return sin_int(norm_angle + SINLUT_SIZE / 4);
nuclear@3 31 }
nuclear@3 32
nuclear@3 33 int32_t sin_x16(int32_t radians)
nuclear@3 34 {
nuclear@4 35 int32_t na = x16div(radians, M_PI_X16 * 2);
nuclear@4 36 return (sin_int((na * SINLUT_SIZE) >> 16) << 16) / SINLUT_SCALE;
nuclear@3 37 }
nuclear@3 38
nuclear@3 39 int32_t cos_x16(int32_t radians)
nuclear@3 40 {
nuclear@4 41 int32_t na = x16div(radians, M_PI_X16 * 2);
nuclear@4 42 return (cos_int((na * SINLUT_SIZE) >> 16) << 16) / SINLUT_SCALE;
nuclear@3 43 }