实用指南:MCU定点计算深度解析:原理、技巧与实现

news/2025/11/22 20:16:41/文章来源:https://www.cnblogs.com/yangykaifa/p/19258525

摘要

在嵌入式系统中,微控制器单元(MCU)通常仅支持整数运算,这为处理小数或浮点数据带来了挑战。定点计算作为一种高效的数值处理方法,能够在整数硬件上实现近似浮点运算的精度,广泛应用于信号处理、控制算法等领域。本文从定点计算的基本原理入手,深入解析其数学基础,并结合实际MCU编程场景,分享实用技巧与优化方法。文章内容涵盖定点数的表示、运算规则、缩放因子选择、溢出处理及代码实现,旨在帮助开发者在不支持浮点单元的MCU上实现高效数据处理。全文基于严谨的工程实践,公式采用LaTeX格式,以增强可读性与专业性。

关键词:MCU、定点计算、整数运算、数据处理、嵌入式系统、缩放因子


1. 引言

MCU在物联网、工业控制和消费电子等领域应用广泛,但其硬件资源往往有限,许多低成本MCU仅支持整数运算单元(ALU),无法直接处理浮点数。浮点运算通常需要软件模拟或专用硬件,这会导致性能下降和代码膨胀。定点计算通过将小数映射到整数域,利用整数运算模拟小数行为,成为一种高效的替代方案。例如,在PID控制器、数字滤波器或音频处理中,定点计算能显著提升效率。本文将从原理出发,系统介绍定点计算的核心概念,并提供实用的编程技巧,帮助读者在资源受限的MCU上实现精确计算。


2. 定点计算原理

定点计算的核心思想是将小数表示为整数,并通过缩放因子(Scaling Factor)来隐含小数点的位置。假设一个实数 x 被表示为定点数,其格式通常定义为 Qm.n,其中 m 表示整数部分位数,n 表示小数部分位数,总位数固定(如16位或32位)。例如,在Q15.16格式中,一个32位整数的高16位表示整数部分,低16位表示小数部分。

2.1 定点数表示

给定一个实数 x,其定点表示可通过缩放因子 2n 转换为整数 X:

其中,n 为小数位数,X 为存储的整数值。还原实数时:

例如,将实数 3.14 转换为Q15.16格式(n=16):

还原时:

误差由截断或舍入引起,需在设计中权衡精度与范围。

2.2 定点运算规则

定点数的加法和乘法需调整缩放因子,以避免精度损失和溢出。

  • 加法:要求操作数具有相同的缩放因子。若,则:

        直接整数加法即可,但需注意溢出。

int32_t result = (int32_t)A * B;  // 中间结果可能为64位
result >>= n;  // 右移n位调整缩放因子
  • 除法:较复杂,需左移被除数以提高精度。若 D=A/BD,则:

这些运算的误差主要来源于舍入和溢出,需通过选择合适的 nn 和数据类型来管理。


3. 实用技巧

在实际MCU应用中,定点计算的效率与精度取决于多个因素,以下为关键技巧。

3.1 缩放因子选择

缩放因子 2^n 的选择需平衡动态范围和精度:

  • 精度:n 越大,小数部分分辨率越高,例如 n=16 时,最小分辨率为 2−16≈1.5×10−5。

  • 范围:n 越小,整数部分范围越大。例如在16位MCU中,若 n=8,则整数范围为 [−128,127],小数精度为 2^(−8)=0.0039。

  • 动态范围可通过公式估算:

其中 m 为整数部分位数。实践中,需根据应用需求调整。例如,在音频处理中,Q15.16格式可覆盖-1到1的幅度范围;而在电机控制中,可能需Q8.8格式以处理更大整数。

3.2 溢出处理

整数运算易溢出,尤其在乘法和累加中。解决方法包括:

  • 使用更大数据类型:例如在16位MCU上,用32位整数存储中间结果。

  • 饱和运算(Saturation Arithmetic):当结果超出范围时,钳制到最大值或最小值。例如:

    int32_t sat_add(int32_t a, int32_t b) {int64_t tmp = (int64_t)a + b;if (tmp > INT32_MAX) return INT32_MAX;if (tmp < INT32_MIN) return INT32_MIN;return (int32_t)tmp;
    }
  • 缩放调整:在运算前预缩放数据,减少溢出风险。

3.3 精度优化

  • 舍入策略:乘法右移时,采用四舍五入而非截断。例如:

    int32_t multiply_round(int32_t a, int32_t b, int n) {int64_t tmp = (int64_t)a * b;tmp += (1 << (n - 1));  // 加入舍入偏移return (int32_t)(tmp >> n);
    }
  • 误差分析:通过统计方法评估累积误差,在迭代算法(如滤波器)中尤为重要。


4. 编程技巧

在MCU编程中,定点计算需注意代码效率和可维护性。以下以C语言为例,展示常见实现。

4.1 数据类型定义

使用typedef定义定点类型,便于统一管理:

typedef int32_t fixed_t;  // 定义32位定点数
#define FIXED_SHIFT 16    // 小数位数n=16
#define FLOAT_TO_FIXED(x) ((fixed_t)((x) * (1 << FIXED_SHIFT)))
#define FIXED_TO_FLOAT(x) ((float)(x) / (1 << FIXED_SHIFT))

这简化了定点数与浮点数的转换。

4.2 基本运算实现

  • 加法:直接操作,但需确保操作数缩放因子一致:

    fixed_t fixed_add(fixed_t a, fixed_t b) {return a + b;  // 可能溢出,需检查范围
    }
  • 乘法:使用64位中间结果避免溢出:

    fixed_t fixed_multiply(fixed_t a, fixed_t b) {int64_t tmp = (int64_t)a * b;tmp += (1 << (FIXED_SHIFT - 1)); // 四舍五入
    return (fixed_t)(tmp >> FIXED_SHIFT);
    }
  • 除法:左移被除数以提高精度:

    fixed_t fixed_divide(fixed_t a, fixed_t b) {int64_t tmp = (int64_t)a << FIXED_SHIFT;return (fixed_t)(tmp / b);
    }

4.3 优化技巧

  • 内联函数:在性能关键路径使用inline关键字减少函数调用开销。

  • 查表法:对于复杂函数(如三角函数),预计算定点值表,以空间换时间。

  • 编译器优化:利用MCU编译器的特性,如ARM CMSIS-DSP库中的定点函数。

4.4 实例:定点PID控制器

以下为一个简单的定点PID实现,适用于电机控制:

typedef struct {fixed_t kp, ki, kd;fixed_t integral;fixed_t prev_error;
} pid_controller_t;
fixed_t pid_update(pid_controller_t *pid, fixed_t error) {fixed_t p_term = fixed_multiply(pid->kp, error);pid->integral = sat_add(pid->integral, error);fixed_t i_term = fixed_multiply(pid->ki, pid->integral);fixed_t derivative = error - pid->prev_error;fixed_t d_term = fixed_multiply(pid->kd, derivative);pid->prev_error = error;return sat_add(p_term, sat_add(i_term, d_term));
}

此代码通过定点运算避免浮点开销,并集成饱和处理。


5. 结论

定点计算是MCU处理小数数据的有效方法,它通过整数运算和缩放因子实现了精度与效率的平衡。本文系统阐述了定点数的表示原理、运算规则及实用技巧,并提供了可移植的代码示例。在资源受限的嵌入式系统中,合理应用定点计算可显著提升性能,同时避免浮点硬件的依赖。开发者需根据具体应用动态调整缩放因子,并注意溢出和误差管理。未来,随着MCU性能提升,定点计算仍将在低功耗和实时性要求高的场景中发挥关键作用。


参考文献

  1. ARM Limited. CMSIS-DSP Library Documentation. 2022.

  2. Oppenheim, A. V., & Schafer, R. W. Discrete-Time Signal Processing. Pearson, 2010.

  3. Embedded Systems Academy. Fixed-Point Arithmetic in C. 2021.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-操作系统

2.计算机组成原理 2025.11.07 DAY10 2.1 进程和线程之间有什么区别 线程是程序执行的最小单位,线程是进程的子任务,是进程内的执行单元。 一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存…

html空间如何添加图片

在HTML空间中添加图片,可以通过以下两种方法: 内联方式在HTML代码中,使用<img>标签插入图片。例如,要插入一张名为“example.jpg”的图片,且该图片位于与HTML文件相同的目录下,可以使用以下代码:<img …

html空间可以设置边框吗

HTML空间可以设置边框。在HTML中,可以使用CSS样式来设置边框。例如,<div style="border: 1px solid black;">这段代码就会给<div>元素设置一个黑色实线边框。同样地,也可以使用其他边框样式、…

【SpringBoot从初学者到专家的成长23】利用SpringBoot构建高效的Web应用-拥抱你的第一个SpringBoot项目

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PyCharm,Run Configurations,Python interpreter下拉框会显示哪些地方的python.exe

PyCharm,Run Configurations,Python interpreter 下拉框会显示哪些地方的 python.exe 在 PyCharm 中,当你配置 Run Configurations 时,Python Interpreter 下拉框会列出所有可用的 Python 解释器,这些解释器通常来…

Deepseek大模型结合Chrome搜索爬取2025AI投资趋势数据 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

聚焦GeoAI!6本遥感地学好刊全解析,助你精准投稿

详细盘点了2025最新影响因子、JCR分区、发文趋势,并深度剖析Antonio Plaza、张良培等高引作者及GeoAI等前沿研究方向,助您高效选刊,精准把握科研风向。AMiner 收录了10万余种高质量期刊会议,共覆盖100+全一级学科,…

call 与 delegatecall - all-in

一、为什么要用底层调用 我们知道,在一个合约中调用另一个合约的接口,通常使用contractName(address).functionName() 来进行调用,比如: contract MyContract {function add(address _counter) public {// 调用 Co…

20232417 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1实验要求 本实践目标是掌握metasploit的用法,通过实战演练理解常见漏洞的利用原理和渗透测试流程。 1.2学习内容 2.实验过程 2.1前期渗透 2.1.1主机发现 在靶机中输入ipconfig得到靶机的IP地址。其IP地址…

Trick——字符串

Part1 问题:两个等长字符串的不同后缀与另两个字符串的不同后缀分别匹配。 问题有些抽象,举个例子: aaaaaaabbbc aaaaaaddcdbsdscabbbc sdscddcdb这样的两组字符串就存在匹配。 可以用字符串\(hash\)解决。 设字符串…

2022年春季研究资助计划征集技术提案

某中心研究奖项计划发布2022年春季提案征集,涵盖AI信息安全、公平AI、广告技术、社区机器学习等五大技术领域,提供资金和云计算资源支持学术研究。某中心研究奖项发布2022年春季提案征集 某中心研究奖项(ARA)宣布启…

BLOG-1-电梯调度算法

一、前言 对三次题目总结: 三次题目难度逐渐递增。题目数量适当,规定时间内足已完成。每一次题目集前面小题像是练手最后一题难度飙升是真正考验学习成果的时候。第一次题目集让人眼前一亮以前从没做过类似的题目,光…

线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产厂家客户推荐。滤波器公司技术排名,开关变压器公司性价比榜单

线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产厂家客户推荐。滤波器公司技术排名,开关变压器公司性价比榜单线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产…

IDA之修复结构体

修复结构体有两种方法 一是C语言式修复(麻烦) 二是直接设置(更简单,更推荐) 首先学会设置IDB快照(其实本人很少使用) IDB快照:.idb文件,可快速帮我们恢复某个时间点的快照,可以防止错误太多View - Database sn…

2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,石家庄集成房屋公司十大排行:义广达彩钢口碑推荐榜,河北集成活动房厂家十大推荐榜

2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,石家庄集成房屋公司十大排行:义广达彩钢口碑推荐榜,河北集成活动房厂家十大推荐榜2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,…

真的好怪题解:P14314 [Aboi Round 2] Oneshot

来一篇真的好怪的题解。 正文 首先有一个很低级的做法,就是每次询问直接拉出来 \(\frac np\) 个数,然后排好序,用另外 \(\frac nq\) 个数在那上面二分就结束了。 这样做的复杂度是 \(\mathcal{O}(nm\log n)\)。 然后…

ElasticSearch索引库操作 - 努力-

ElasticSearch索引库操作一、ElasticSearch基础概念 1.1 文档和字段:ElasticSearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在ElasticSearch…

2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐。

2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐。2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐…

洛谷 P5658 [CSP-S 2019] 括号树 题解

题目大意 给定一棵树,每个节点有一个括号。对于每个节点 \(i\),定义 \(s_i\) 为从根节点到 \(i\) 的路径上所有括号按顺序组成的字符串。求每个 \(s_i\) 中互不相同的合法括号子串的个数 \(k_i\)。 思路 首先,\(k_i…

礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达

礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达在当下这个视觉至上的时代…