当前位置: 首页 > 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.lryc.cn/news/574761.html

相关文章:

  • 用Rust写平衡三进制加法器
  • 【unitrix】 4.3 左移运算(<<)的实现(shl.rs)
  • 【WCF】单例模式的线程安全缓存管理器实现,给你的WebApi加入缓存吧
  • MyBatis Plus与P6Spy日志配置
  • leetcode230-二叉搜索树中第K小的元素
  • 【计算机网络】期末复习
  • 【教学类-89-08】20250624新年篇05——元宵节灯笼2CM黏贴边(倒置和正立数字 )
  • STM32学习笔记——中断控制
  • (C++)标准模板库(STL)相关介绍(C++教程)
  • C语言专题——关键字详解
  • 前端后端文件下载防抖实现方案
  • 浅谈开源在线客服系统与 APP 集成的技术方案与优劣势
  • 华为云Flexus+DeepSeek征文 | 基于华为云的 Dify-LLM 企业级 AI 开发平台部署指南
  • React Hooks详解
  • 开源跨平台的轻量 C# 编辑器
  • 想考华为HCIA-AI,应该怎么入门?
  • 第五课:大白话教你用K邻近算法做分类和回归
  • (三十六)深度解析领域特定语言(DSL)第七章——语法制导翻译——案例语义模型
  • 10-Python模块详解
  • wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段
  • 美团小程序闪购 mtgsig1.2
  • Vue的学习内容和目标
  • OSS迁移实战:从自建MinIO到阿里云OSS的完整数据迁移方案
  • Rust 项目实战:多线程 Web 服务器
  • Lombok注解 - 提高Java开发效率
  • order、sort、distribute和cluster by(Spark/Hive)
  • 开篇:4周的时间设计并开发一个个性化具备专业知识的东方命理师AI agent!
  • 【JavaEE】(5) 网络原理的基础认识
  • spring-security-oauth2系列:授权码授权模式
  • F5推出AI网关,赋能企业化解大模型应用风险