跳转至

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

和普通代码教程有什么不同

很多教程会直接给出代码:

读 ADC。
套一个滤波函数。
输出结果。

真实项目里,问题通常不在“函数会不会写”,而在前面的判断:

  • 采样率是否足够,是否已经混叠?
  • 噪声是随机抖动、尖峰,还是固定频率干扰?
  • 允许多大延迟?
  • 参数能不能从截止频率、窗口长度或最大变化速度反推?
  • 算法会不会把真实变化也当成噪声抹掉?
  • MCU 的 RAM、FPU 和中断周期能不能承受?
  • 结果有没有用原始数据和滤波后数据对比验证?

所以本书每个重要算法都尽量包含:

  • 适用场景。
  • 数学定义。
  • 频域或统计解释。
  • 参数反推方法。
  • 代价与边界。
  • MCU C 实现。
  • 验证方法。

代码约定

示例代码使用 C 语言,尽量贴近 MCU 工程。

  • 浮点数使用 float
  • 整数使用 <stdint.h> 的固定宽度类型,例如 uint8_tuint16_tuint32_t
  • 有状态滤波器使用结构体保存状态。
  • 第一次调用时初始化输出,避免从 0 开始造成假瞬态。
  • 涉及窗口、累加和抽取时,会说明 RAM、溢出和实时性代价。

代码服务于理解算法,不追求封装成完整库。真实工程中可以在此基础上增加状态码、空指针检查、配置结构体和统一接口。

一个核心原则

初级算法也要专业地讲。

限幅、中值、平均、一阶滞后、消抖和迟滞,解决的是很多 MCU 项目里最常见的问题。把这些基础工具讲透,比一开始复制复杂算法更重要。

如果你学完前几章,能独立回答下面这些问题,就已经开始形成工程判断了:

  • ADC 数值偶尔跳很大,先试什么?
  • 数值随机抖动但没有明显尖峰,用什么?
  • 按键为什么不能直接读一次就判断?
  • 阈值控制为什么要有回差?
  • 平滑越强,为什么响应越慢?
  • 采样率改了,为什么滤波参数也要重新看?