当前位置: 首页 > news >正文

快速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。

http://www.lqws.cn/news/502885.html

相关文章:

  • 如何轻松地将照片从 iPhone 传输到计算机
  • 【LLaMA-Factory 实战系列】三、命令行篇 - YAML 配置与高效微调 Qwen2.5-VL
  • iOS应用开发中的性能调试与数据分析:一套完整实战工具流程
  • 学习threejs,使用kokomi、gsap实现图片环效果
  • AI智能化高效办公:WPS AI全场景深度应用指南
  • pyqt setContentsMargins
  • 左神算法之数字字符串解码方案计数算法
  • Kafka 监控与调优实战指南(二)
  • Matplotlib vs Seaborn:选择与区别
  • 逆向入门(7)汇编篇-mul指令的学习
  • GitLab 备份恢复与配置迁移详尽教程(实战版)
  • 创客匠人拆解知识变现从 IP 到商业闭环的关键要素
  • 基于版本控制+WORM的OSS数据保护:防勒索攻击与法规遵从实践
  • OpenCV CUDA模块设备层-----检查 CUDA 错误并输出调试信息内联函数checkCudaError()
  • 【Linux网络编程】多路转接I/O(一)select,poll
  • HTML炫酷烟花
  • ✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub
  • Flask(二) 路由routes
  • 零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(三):记事本功能实现
  • bmc TrueSight 监控mysql配置
  • prometheus+grafana+Linux监控
  • Linux 中的信号处理方式详解
  • 【机器学习深度学习】多层神经网络的构成
  • 在仓颉开发语言中使用数据库
  • TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
  • 计算机网络第九章——数据链路层《介质访问控制》
  • C++(面向对象编程——多态)
  • 曼昆《经济学原理》第九版 宏观经济学 第二十六章货币增长与通货膨胀
  • python中学物理实验模拟:摩檫力
  • BI财务分析 – 反映盈利水平利润占比的指标如何分析(下)