快速sincos算法,stm32测试
#include "main_task.h"
#include <math.h>//Remez快速正弦算法
#define M_PI (3.1415926f)// lolremez --float --degree 5 --range "1e-50:pi*pi"
// "(sin(sqrt(x))-sqrt(x))/(x*sqrt(x))" "1/(x*sqrt(x))"
// Estimated max error: 1.455468e-9
static inline float f1(float x)
{float u = 1.3528548e-10f;u = u * x + -2.4703144e-08f;u = u * x + 2.7532926e-06f;u = u * x + -0.00019840381f;u = u * x + 0.0083333179f;return u * x + -0.16666666f;
}
// lolremez --float --degree 5 --range "1e-50:pi*pi" "(cos(sqrt(x))-1)/x"
// "1/x"
// Estimated max error: 1.1846383e-8
static inline float f2(float x)
{float u = 1.7290616e-09f;u = u * x + -2.7093486e-07f;u = u * x + 2.4771643e-05f;u = u * x + -0.0013887906f;u = u * x + 0.041666519f;return u * x + -0.49999991f;
}
static inline float fast_sin(float x)
{// si = (int)(x / pi)int si = (int)(x * 0.31830988f);x = x - (float)si * M_PI;if (si & 1){x = x > 0.0f ? x - M_PI : x + M_PI;}return x + x * x * x * f1(x * x);
}
static inline float fast_cos(float x)
{// si = (int)(x / pi)int si = (int)(x * 0.31830988f);x = x - (float)si * M_PI;if (si & 1){x = x > 0.0f ? x - M_PI : x + M_PI;}return 1.0f + x * x * f2(x * x);
}
static inline void fast_sin_cos(float x, float *sin_x, float *cos_x)
{// si = (int)(x / pi)int si = (int)(x * 0.31830988f);x = x - (float)si * M_PI;if (si & 1){x = x > 0.0f ? x - M_PI : x + M_PI;}*sin_x = x + x * x * x * f1(x * x);*cos_x = 1.0f + x * x * f2(x * x);
}
void main_task(void)
{/* 初始化完毕打印当前编译日期时间 */DBG("\n");DBG("************************************\n");DBG("[data:%s][time:%s]\n", __DATE__, __TIME__);DBG("************************************\n");float m = 0, n = 0;uint32_t tickstart = HAL_GetTick();for(int i = 0; i < 1000; i++){m += sin(i);n += cos(i);}DBG("sum = %f\n", m+n);uint32_t tickend = HAL_GetTick();DBG("time = %d\n", tickend-tickstart);m = n = 0;tickstart = HAL_GetTick();for(int i = 0; i < 1000; i++){m += fast_sin(i);n += fast_cos(i);}DBG("sum = %f\n", m+n);tickend = HAL_GetTick();DBG("time = %d\n", tickend-tickstart);while(1){}
}
************************************
[data:Jun 24 2025][time:17:15:29]
************************************
sum = 0.962697
time = 442
sum = 0.962912
time = 98
测试硬件是 STM32L031,主频32MHz。
标准的三角函数需要442ms,Remez快速正弦算法要98ms。