跳转至

怎样学习这本书

这本书不是让你背公式,也不是让你复制几段滤波代码。它更关心一件事:当你面对真实测量问题时,能不能判断应该用什么算法、参数为什么这样选、结果应该怎样验证。

学完之后,你不一定要能手推所有公式,但你应该能说清楚:

  • 这个算法解决什么测量问题。
  • 它依赖哪些假设。
  • 参数为什么这样选。
  • 什么情况下不该用它。
  • 怎样验证它真的改善了测量结果。

三种读法

顺序学习。 如果你刚开始接触 MCU 测量算法,建议从第 1 章开始读。采样、噪声、混叠、频率响应这些基础概念,会反复出现在后面的滤波器、状态估计和频域算法里。

按问题查找。 如果你手头已经有项目,可以先看第 8 章的选型地图。根据“随机抖动、尖峰、周期干扰、阈值抖动、慢漂移”等现象找到对应章节,再回头补相关基础。

按代码验证。 如果你已经有一段滤波代码,可以先读对应算法的小节,再对照第 9 章练习和附录代码规范,检查初始化、边界、溢出和参数单位。

每章怎么读

建议按五步走。不要急着从公式开始,也不要一上来就复制代码。先弄清楚问题,再看算法怎样处理这个问题。

第一步:看场景

先确认这个算法解决的是什么问题:是尖峰干扰、随机抖动、慢漂移、周期干扰,还是动态跟踪。

如果连问题都没搞清楚,后面的内容很容易变成“在学一个不知道干嘛用的工具”。

第二步:看输入输出

先明确 x[n] 是当前输入,y[n] 是当前输出,中间有哪些状态变量需要保存。

这一步不需要看懂全部公式,只需要知道数据从哪里来、经过什么变换、变成什么出去。

第三步:看推导

不追求复杂数学证明,但要知道公式为什么长这样,参数影响哪一项。

如果某个推导跳步太多看不懂,先标记下来,不必卡住。学到后面再回来看,往往会更清楚。

第四步:读代码

每个状态变量、阈值和系数都应该能说出用途。

如果你发现某个变量说不清它是干什么的,说明前面的理解还有漏洞。此时不要急着调代码,先回到定义和输入输出。

第五步:手算一小段

用 3 到 5 个数据手算一次,比直接上板子调试更能暴露理解漏洞。

手算不需要精确到小数点后四位,能算出大概趋势就行。你要观察的是输出是否变稳、是否变慢、是否被异常值带偏。

每个算法至少搞清楚六件事

为了避免停留在“会用代码”的层面,每个算法都应该回答下面六个问题。你自己学习时,也可以用这组问题做检查。

问题 要看什么
它解决什么测量问题 它对付的是哪类噪声或信号特征
它的数学定义是什么 差分方程、窗口规则或状态转移规则
它对哪类噪声有效 白噪声、尖峰、周期干扰、机械抖动、慢漂移
它带来什么代价 延迟、过冲、失真、计算量、RAM、启动瞬态
参数怎么从指标反推 由采样率、截止频率、响应时间等指标反推参数
什么时候不该用它 找出算法边界,避免误用

一个算法的边界,比它的优点更能体现工程判断。知道什么时候不该用,往往比知道什么时候该用更重要。

怎样做验证

不要只看滤波后的曲线“顺不顺眼”。验证一个算法,至少保留原始数据和滤波后数据,并记录参数。

建议每次验证都写下这些信息:

传感器/信号类型:
采样率 fs:
算法链路:
关键参数:
原始稳态抖动:
滤波后稳态抖动:
阶跃响应时间:
异常点恢复时间:
是否满足延迟要求:

常用验证方式有四种:

  • 稳态测试:输入不变时,看输出抖动是否降低。
  • 阶跃测试:输入突然变化时,看输出多久跟上。
  • 异常测试:插入尖峰、断点或毛刺,看算法是否被带偏。
  • 长时间测试:连续运行,看是否有漂移、溢出或状态异常。

频域算法还应补充频谱验证:干扰频率是否真的下降,目标信号是否被误伤。

怎样做笔记

读算法章节时,不建议只摘抄公式。更有用的笔记格式是:

算法名称:
解决的问题:
输入输出:
状态变量:
关键参数:
参数反推方法:
主要代价:
失效场景:
我自己的测试数据:

这种笔记可以直接变成项目里的设计说明,也方便以后让别人审查你的参数选择。

代码约定

示例代码使用 C 语言,面向 MCU 环境。

浮点数使用 float。整数使用 <stdint.h> 的固定宽度类型,例如 uint8_tuint16_tuint32_t

有状态滤波器通常使用独立结构体,并提供初始化逻辑。第一次调用时尽量让输出等于第一笔输入,避免从 0 开始造成启动瞬态。

没有 FPU 的 MCU 上,很多算法可以改成整数或定点数。附录会专门说明定点实现的思路。

AI 怎么配合

AI 可以帮你解释段落、检查公式、生成测试数据、审核 C 代码,也可以帮你把工程条件整理成参数设计起点。

但不要把最终判断交给 AI。测量算法最终要回到真实数据验证:原始数据、滤波后数据、参数、延迟、异常恢复和边界情况都要看。

第 10 章提供了一组可直接复制使用的 AI 学习助手 Skill。读完一章后,可以用它们做概念复习、公式审核、代码审核和参数反推。

学完第一阶段你应该能回答的问题

学完基础阶段,试着不翻书独立回答下面这些问题。如果能回答清楚,说明你已经理解了这些算法的本质,不是只会复制代码。

  • ADC 数值偶尔跳很大,先试什么?
  • 数值随机抖动但没有明显尖峰,用什么?
  • 按键为什么不能直接读一次就判断?
  • 阈值控制为什么要有回差?
  • 平滑越强,为什么响应越慢?
  • 一个窗口长度为 10 的滑动平均,在 100 Hz 采样率下大约带来多少延迟?
  • 为什么采样率太低时,数字滤波器无法消除已经发生的混叠?

回答不上来也没关系,回到对应章节再看一遍。算法理解不是一次到位的。有时候学到后面的章节,再回头看前面的内容,会有新的理解。