MCU 测量算法入门
这是一本面向 MCU 单片机与测量系统的算法入门书。它讲的不是“复制一段滤波代码”,而是怎样从真实测量问题出发,判断噪声类型、选择算法、反推参数、写出可部署的 C 代码,并用数据验证效果。
很多测量问题看起来只是“数值有点跳”。但背后可能是量化噪声、随机热噪声、偶发尖峰、机械抖动、工频干扰、慢漂移,也可能是采样率太低导致的混叠。问题类型不同,算法选择完全不同。
这本书想帮你建立一套工程判断:
适合谁读
刚开始做 MCU 测量。 你知道 ADC 能读到一个数,但不知道为什么数值一直跳,也不知道限幅、中值、平均、一阶滞后分别该在什么时候用。
已经写过一些滤波代码。 你项目里可能用过平均滤波、卡尔曼滤波或低通滤波,但还不确定参数怎么选、延迟怎么估、什么场景会用错。
想把 AI 用得更准。 AI 可以帮你写代码、检查公式、生成测试数据,但前提是你能把采样率、信号带宽、噪声类型、延迟要求和 MCU 约束说清楚。
这本书讲什么
本书围绕 MCU 测量场景中最常见的几类问题展开:
| 问题 | 常用工具 |
|---|---|
| ADC 数值小幅随机抖动 | 平均、滑动平均、一阶滞后 |
| 偶尔出现离谱尖峰 | 限幅、中值、Hampel |
| 按键或开关输入抖动 | 消抖、状态确认 |
| 阈值附近反复报警 | 迟滞、消抖、状态机 |
| 稳态要稳,变化要快 | 动态一阶滞后、自适应窗口 |
| 需要预测位置或速度 | α-β 滤波、卡尔曼滤波 |
| 陀螺仪和加速度计融合 | 互补滤波、Mahony、Madgwick |
| 固定频率干扰 | FIR、IIR、Biquad、陷波 |
| 判断某个频率是否存在 | Goertzel |
| 特殊检测和异常处理 | 变化率门限、LMS、形态学、统计剔除 |
这些算法有些看起来很简单,但简单不等于随便。平均滤波有频率响应和零点,一阶滞后有截止频率和启动瞬态,中值滤波不是线性系统,卡尔曼滤波也不是“高级平均”。
学习路线
建议按顺序读。前面的章节会提供后面需要的概念、符号和工程直觉。
| 章节 | 重点 |
|---|---|
| 怎样学习这本书 | 读书方法、验证方法和自查问题 |
| 01 测量信号的基础 | 采样、量化、噪声、混叠、频率响应 |
| 02 基础滤波算法 | 限幅、中值、平均、一阶滞后、消抖、迟滞 |
| 03 组合滤波与工程改进 | 先去异常、再平滑、最后约束输出 |
| 04 趋势感知与自适应滤波 | 动态参数、趋势估计、自适应窗口 |
| 05 状态估计与传感器融合 | 预测、更新、卡尔曼、互补滤波 |
| 06 频域滤波与数字滤波器 | FIR、IIR、Biquad、陷波、CIC、Goertzel |
| 07 专用算法与特殊场景 | LMS、变化率检测、形态学、统计异常处理 |
| 08 选型地图与工程配方 | 从现象到算法链路,从指标到参数 |
| 09 推导与实现练习 | 手算、推导、代码边界和练习 |
| 10 用 AI 辅助学习这本书 | 可复制使用的学习与审核 Skill |
和普通代码教程有什么不同
很多教程会直接给出代码:
真实项目里,问题通常不在“函数会不会写”,而在前面的判断:
- 采样率是否足够,是否已经混叠?
- 噪声是随机抖动、尖峰,还是固定频率干扰?
- 允许多大延迟?
- 参数能不能从截止频率、窗口长度或最大变化速度反推?
- 算法会不会把真实变化也当成噪声抹掉?
- MCU 的 RAM、FPU 和中断周期能不能承受?
- 结果有没有用原始数据和滤波后数据对比验证?
所以本书每个重要算法都尽量包含:
- 适用场景。
- 数学定义。
- 频域或统计解释。
- 参数反推方法。
- 代价与边界。
- MCU C 实现。
- 验证方法。
代码约定
示例代码使用 C 语言,尽量贴近 MCU 工程。
- 浮点数使用
float。 - 整数使用
<stdint.h>的固定宽度类型,例如uint8_t、uint16_t、uint32_t。 - 有状态滤波器使用结构体保存状态。
- 第一次调用时初始化输出,避免从 0 开始造成假瞬态。
- 涉及窗口、累加和抽取时,会说明 RAM、溢出和实时性代价。
代码服务于理解算法,不追求封装成完整库。真实工程中可以在此基础上增加状态码、空指针检查、配置结构体和统一接口。
一个核心原则
初级算法也要专业地讲。
限幅、中值、平均、一阶滞后、消抖和迟滞,解决的是很多 MCU 项目里最常见的问题。把这些基础工具讲透,比一开始复制复杂算法更重要。
如果你学完前几章,能独立回答下面这些问题,就已经开始形成工程判断了:
- ADC 数值偶尔跳很大,先试什么?
- 数值随机抖动但没有明显尖峰,用什么?
- 按键为什么不能直接读一次就判断?
- 阈值控制为什么要有回差?
- 平滑越强,为什么响应越慢?
- 采样率改了,为什么滤波参数也要重新看?