Skip to content
sinfastsmall.c 1.88 KiB
Newer Older
#define _USE_MATH_DEFINES
#include <math.h>
#include "stm32f3xx_hal.h"
#include "globals.h"

const uint16_t sintab[91]= {
	0,571,1143,1714,2285,2855,3425,3993,4560,5125,5689,6252,6812,7370,7927,8480,9031,9580,10125,10667,11206,11742,12274,12803,13327,13847,
	14364,14875,15383,15885,16383,16876,17363,17846,18323,18794,19259,19719,20173,20620,21062,21497,21925,22347,22761,23169,23570,23964,24350,
	24729,25100,25464,25820,26168,26509,26841,27165,27480,27787,28086,28377,28658,28931,29195,29450,29696,29934,30162,30381,30590,30790,30981,31163,
	31335,31497,31650,31793,31927,32050,32164,32269,32363,32448,32522,32587,32642,32687,32722,32747,32762,32767
};

#define sincoeff (1.0f/32767.0f)

// ramen  sin[0..89]

#ifdef CCMRAM
__attribute__((section("ccmram")))
#endif

// future optim 2x : sin(90-x) = cos(x) ; sin(90+x) = cos(x); sin(x) = cos(90-x) ; cos(90+x) = -sin(x)
// Optim 2x : sin(x+180)=-sin(x) ;  cos(x+180)=-cos(x)
// Optim 2x : cos(180-x)=-cos(x) ; sin(180-x) = sin(x)
float sinfsm(float x)
{
	int i;
	
	i = (x*180.0f/M_PI);
	i = i % 360;
	
	if (i<0)
		i+=360;

	// 4 cadrans.
	if (i>=270)			 // 270..359
		return -sincoeff*sintab[360-i];
	else if (i>=180) // 180..269
		return -sincoeff*sintab[i-180];
	else if (i>=90)	// 90..179
		return sincoeff*sintab[180-i];
	else						// 0..89
		return sincoeff*sintab[i];
}

#ifdef CCMRAM
__attribute__((section("ccmram")))
#endif

// future optim 2x :  cos(x)= sin(90-x) ; cos(x)=sin(90+x)  ;  sin(x) = cos(90-x) ; cos(90+x) = -sin(x)
float cosfsm(float x)
{
	int i;
	
	i = (x*180.0f/M_PI);
	i = i % 360;
	
	if (i<0)
		i+=360;

	// 4 cadrans.
	if (i>=270)			 // 270..359
		return sincoeff*sintab[i-270];
	else if (i>=180) // 180..269
		return -sincoeff*sintab[270-i]; // sin(180-x) = sin(x)
	else if (i>=90)	// 90..179
		return -sincoeff*sintab[i-90];
	else						// 0..89
		return sincoeff*sintab[90-i];
}

float tanfsm(float x)
{
	return sinfsm(x)/cosfsm(x);
}