干货|高效实现数学函数的方式——sin/cos篇
技术文章:实现三角函数(正弦和余弦)的自定义算法用于资源受限硬件平台
在硬件平台上,尤其是在那些RAM、ROM存储空间有限以及处理速度较慢的条件下,实现高效的数学运算至关重要。尤其是对于包含定点处理器的系统,直接使用浮点运算并非有效之举,因为我们面临着内存占用和计算效率的双重挑战。本文将介绍一种利用查表法实现三角函数(正弦与余弦)计算的策略,适用于软件编程以优化硬件资源利用。
理念简介
直接使用硬件中的三角函数运算器可能会受到资源限制的制约,而通过实现自定义三角函数库能够在不牺牲性能的情况下减少对硬件资源的需求。尤其在使用Q格式数据(量化为定点数)时,这种方法可以极大降低内存需求和计算成本,适合在资源紧缺的平台上应用。
正弦函数实现的关键步骤
1. 波形解析:
先理解正弦波的基本波形。在研究正弦表实现时,首先将一个完整的正弦周期细分为几个部分,满足操作要求时,通常会选择四分之一的周期作为数据来源,这是因为每一完整周期的波形对称且重复。
2. 正弦表构建:
按照我们的划分等级(例如1024个细分数据,对应于整数部分的计算),生成所需的数据集。这些数据通常是一个数组,其中包含正弦函数在设计的几个关键x值(在这里是[0, 2π]或[π, π])上的y值。
3. 数据格式转换:
从浮点类型转换为Q格式(比如,Q1.15格式),这一转换不仅仅是精度的考虑,更涉及到如何有效地利用内存和计算资源。通过左移和右移操作来代替乘法和除法,以提高运算效率。
4. 上采样和时间效率提升:
在实际应用中,直接存储在一个产出周期内点数的数组可能不足以服务更广泛的x值要求。为了提供更广泛覆盖率的正弦值,即所谓的“上采样”,需要通过数学变换根据查询值来查找适当的x点值,并计算最终的正弦值。
5. 补码考虑:
处理负数时, especially in Qformat,用到补码表示。负数的补码表示除了符号位外,其余位取反后加上1。理解这个表示对于理解的角色转变至关重要,例如,0x8000代表的数值是32768(针对有符号的int16), 而对于无符号的uint16,同一位模式代表的是正数,可产生误解。
算法实现概览
本文通过分析ST的mcsdk中实现的算法类,介绍了具体针对正弦函数的自定义实现方法。关键在于如何高效地利用数据结构(如查找表),通过映射运算(如左移、右移)来替代复杂的浮点运算或除法。通过四分之一周期的波形可行性以及后续的最终映射和计算,使该算法能有效覆盖整个正弦周期。通过深入理解Q格式和补码处理,实现了一种能够灵活地在资源受限的平台上高速而高精度地计算正弦函数的方法。