Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#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);
}