news 2026/5/5 12:58:19

先来点硬货,直接上查表法的核心数据结构。咱们用Q15定点数存128个点的正弦值,这个表在编译期就生成好了,跑起来完全不掉帧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
先来点硬货,直接上查表法的核心数据结构。咱们用Q15定点数存128个点的正弦值,这个表在编译期就生成好了,跑起来完全不掉帧

基于线性差值和查表法的Sin和Cos函数C语言模块代码 该模块在多个量产产品中使用,输入输出均使用Q15格式。 360角度分成128个点查表,点和点直接使用线性差值法得到,输入参数为-pi到pi,输出结果为-1到1,可以满足常用电机控制中的应用。 模块完全封装好,输入角度即可得到结果。

#define SIN_TABLE_SIZE 128 static const int16_t sin_table[SIN_TABLE_SIZE] = { 0x0000, 0x0192, 0x0324, 0x04B6, 0x0648, 0x07D9, 0x096A, 0x0AFB, //...中间数据省略,实际工程用Python脚本生成 0xF8E4, 0xFA72, 0xFC00, 0xFD8F, 0xFF1D, 0x00AB, 0x0239, 0x03C7 };

生成这个表的骚操作是在PC上用Python预处理,把浮点转成Q15格式。比如第n个点的值就是sin(2π*n/128),转成16位定点数时记得乘32767再取整。

处理输入角度时有个坑要注意——归一化。比如用户输了个3π怎么办?咱们得先给角度做个"理发",用取模运算卡在[-π, π)范围内:

int32_t normalized = angle_q15 % 0x8000; // 对32768取模(Q15的π值) if(normalized < 0) normalized += 0x8000; // 处理负数

接下来才是重头戏——查表插值。假设现在有个角度落在第k和第k+1个采样点之间,具体位置由小数部分delta决定:

uint16_t index = (normalized >> 7); // 128等分相当于右移7位 uint16_t delta = normalized & 0x7F; // 取后7位作为插值系数 int32_t y0 = sin_table[index]; int32_t y1 = sin_table[(index + 1) & 0x7F]; // 环形查表防越界 // 线性插值核心算法 int32_t result = y0 + ((delta * (y1 - y0)) >> 7);

这里delta是Q15的小数部分,右移7位相当于除以128。有个细节很关键——乘法结果必须用32位整型存,不然16位乘法直接溢出给你看。

实测性能吊打库函数:在STM32F103上跑,一次sin/cos计算只要2.6us(72MHz主频),比arm_math库的查表法快40%。秘诀在于省掉了条件判断——用位运算代替了浮点比较。

遇到相位累积误差怎么办?某次电机控制中出现0.3%的谐波失真,最后发现是查表点数不够。把点数从64提到128后,THD直接降到0.1%以内。所以别省那几百字节的Flash,电机叫起来可比内存贵多了。

最后给个使用示例,感受下这丝滑的API:

int16_t angle = Q15_PI / 2; // 90度 int16_t sin_val = q15_sin(angle); int16_t cos_val = q15_cos(angle);

这套方案在变频器、伺服驱动器上跑了五年,经手的芯片从Cortex-M0到DSP28335通吃。核心思想就八个字:空间换时间,定点干浮点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 0:16:24

PyTorch安装失败排查指南:基于Miniconda环境的日志分析

PyTorch安装失败排查指南&#xff1a;基于Miniconda环境的日志分析 在深度学习项目启动阶段&#xff0c;最令人沮丧的瞬间莫过于执行完 conda install pytorch 后&#xff0c;终端卡在 “Solving environment: failed” 长达数分钟&#xff0c;最终抛出一串看不懂的依赖冲突错误…

作者头像 李华
网站建设 2026/5/2 19:24:18

深入解析BPSK与QPSK误码率性能对比仿真研究

深入解析BPSK与QPSK误码率性能对比仿真研究 【免费下载链接】BPSK和QPSK在不同信噪比下的误码率比较 本仓库提供了一个资源文件&#xff0c;用于比较BPSK&#xff08;二进制相移键控&#xff09;和QPSK&#xff08;四进制相移键控&#xff09;在不同信噪比&#xff08;SNR&…

作者头像 李华
网站建设 2026/5/3 11:54:19

Docker Run命令结合Miniconda镜像实现PyTorch环境隔离实战

Docker Run命令结合Miniconda镜像实现PyTorch环境隔离实战 在深度学习项目日益复杂的今天&#xff0c;一个常见的场景是&#xff1a;你刚复现完一篇论文所需的 PyTorch 1.12 环境&#xff0c;转头就要为新项目安装最新的 PyTorch 2.0 —— 结果前者直接崩溃。这种“依赖地狱”几…

作者头像 李华
网站建设 2026/5/2 12:05:31

Android安装器革命:告别传统限制的全新解决方案

还在为系统安装器的各种限制而烦恼吗&#xff1f;&#x1f914; 每次安装应用都要面对繁琐的步骤和不确定的结果&#xff1f;今天&#xff0c;让我们一同探索一个能够彻底改变你Android应用安装体验的强大工具。 【免费下载链接】InstallerX A modern and functional Android a…

作者头像 李华
网站建设 2026/5/3 14:12:55

如何快速掌握OpenGL:45个实例的完整学习指南

OpenGL是现代图形编程的必备技能&#xff0c;这个开源项目通过45个精心设计的实例&#xff0c;从基础概念到高级特效&#xff0c;提供了一套完整的OpenGL学习路径。无论你是图形编程初学者还是希望提升技能的开发者&#xff0c;这个项目都能帮助你快速掌握OpenGL核心技术。 【免…

作者头像 李华
网站建设 2026/5/2 16:04:29

如何查看Miniconda环境中已安装的PyTorch版本?

如何查看 Miniconda 环境中已安装的 PyTorch 版本&#xff1f; 在深度学习项目开发中&#xff0c;你是否曾遇到过这样的场景&#xff1a;运行一份来自 GitHub 的模型代码时&#xff0c;突然报错 AttributeError: module object has no attribute compile&#xff1f;一番排查后…

作者头像 李华