3. 采样基础
TinyML 系统的输入几乎都来自物理世界的连续模拟信号——加速度计的振动、麦克风的气压波动、温度传感器的热噪声。而数字处理器只能理解离散的二进制数值。采样,就是连接连续物理世界与离散数字世界的桥梁。本章将深入剖析采样的四个核心环节:采样定理、采样率选择、量化精度以及数据格式组织,并揭示它们如何从底层影响模型推理的准确率、时延与功耗。理解这些基础,是后续优化传感器唤醒策略与窗口长度的前提。
3.1 核心原理:奈奎斯特采样定理与混叠效应
采样定理(Nyquist-Shannon Theorem)是数字信号处理的基石。它指出:为了能从离散样本中无失真地重建原始连续信号,采样频率 \( f_s \) 必须至少大于信号中最高频率分量 \( f_{max} \) 的两倍,即 \( f_s > 2 \cdot f_{max} \)。这个临界频率 \( f_s/2 \) 被称为奈奎斯特频率。当采样率不足时,高于奈奎斯特频率的信号成分会“折叠”回低频区域,产生混叠(Aliasing)现象。混叠不是简单的信息丢失,而是产生虚假的、原本不存在的低频信号,这些虚假成分会被模型当作真实特征学习,导致严重的推理错误。
在 TinyML 场景中,混叠问题尤为隐蔽。例如,一个用于电机故障诊断的振动传感器,电机转速为 3000 RPM(基频 50Hz),但轴承故障可能产生 2.5kHz 的高频冲击。如果采样率仅设为 1kHz,这些高频冲击会混叠为 500Hz 以下的虚假信号,模型可能据此做出完全错误的故障判断。因此,在设计采样方案时,必须首先明确信号的有效带宽,并预留足够的裕量。
3.2 采样率选择:从信号带宽到功耗权衡
采样率直接决定了单位时间内产生的数据量,进而影响 MCU 的唤醒时间、DMA 传输负载、内存占用以及无线传输功耗。选择采样率不能盲目追求“越高越好”,而应遵循“够用且留有余量”的原则。以下是工程上常用的判断流程:
- 确定信号有效带宽: 通过 FFT 分析或查阅相关标准,找出信号中承载关键信息的最高频率分量 \( f_{max} \)。对于语音,通常取 4kHz(电话带宽)或 8kHz(宽带语音);对于人体活动识别,主要能量集中在 0.5Hz~20Hz。
- 计算理论最低采样率: \( f_{s\_min} = 2 \times f_{max} \)。
- 应用工程裕量系数: 考虑到抗混叠滤波器的非理想滚降特性,实际采样率建议为 \( f_{s\_actual} = (2.5 \sim 4) \times f_{max} \)。裕量越大,对滤波器要求越低,但功耗越高。
- 评估系统功耗预算: 采样率每提高一倍,ADC 功耗、内存写入功耗和后续处理功耗近似线性增加。若电池容量有限,可考虑降低采样率并配合数字滤波,或采用事件驱动采样。
| 应用场景 | 典型信号带宽 | 推荐采样率 | 单次采样字节数 (int16) | 1秒数据量 |
|---|---|---|---|---|
| 人体活动识别 (IMU) | 0.5 ~ 20 Hz | 50 Hz | 6 (3轴 × 2B) | 300 B |
| 工业振动监测 | 10 Hz ~ 5 kHz | 12.5 kHz | 2 (单轴) | 25 KB |
| 语音关键词识别 | 300 Hz ~ 4 kHz | 16 kHz | 2 (单通道) | 32 KB |
| 环境温湿度监测 | 0 ~ 0.1 Hz | 1 Hz | 4 (温湿度各2B) | 4 B |
从上表可见,不同应用的数据量差异巨大。对于低频信号,过高的采样率只会产生大量冗余数据,增加模型输入维度,却无法提供额外信息,反而可能导致过拟合。
3.3 量化与数据格式:精度、动态范围与内存布局
量化是将连续幅值映射到有限个离散电平的过程。量化位数 N 决定了动态范围(约 \( 6.02N + 1.76 \) dB)。在 TinyML 中,常见的量化格式包括:
- float32: 模型训练和调试时的标准格式,精度高,但内存占用大(4字节/样本),计算开销高,不适合在 MCU 上大规模部署。
- float16: 半精度,内存减半,部分 MCU(如带 FPU 的 Cortex-M7)支持,但动态范围较窄,需注意溢出。
- int8 / int16: 定点格式,是 TinyML 推理的主流选择。int8 内存占用最小,但需要做缩放因子(scale)和零点(zero point)校准。int16 在动态范围要求高时是更好的折中。
数据格式不仅影响精度,还影响内存访问效率。例如,在 Cortex-M4 上,非对齐的 int16 数组访问可能引发总线错误或性能惩罚。因此,建议将传感器数据按通道交错排列(SoA,Structure of Arrays)或按帧连续排列(AoS,Array of Structures),并确保起始地址对齐到 4 字节边界。
arm_offset_q15 等函数可以高效地完成去直流和缩放操作。
3.4 案例拆解:智能手环的计步算法采样参数优化
背景与约束: 一款基于 Nordic nRF52840(Cortex-M4F)的智能手环需要实现 24 小时连续计步功能。硬件采用 BMI270 六轴 IMU,电池容量 180mAh,目标平均工作电流小于 50μA。初始方案采用 100Hz 采样率、int16 格式、窗口长度 4 秒。
初始现象: 实测平均电流达到 85μA,超出预算 70%。进一步分析发现,MCU 每 4 秒唤醒一次,每次唤醒需处理 400 组(100Hz × 4s)三轴数据,DMA 传输和 FFT 计算占据了 80% 的唤醒时间。
分析判断过程: 人体步行频率通常在 1~3 Hz 之间,其谐波主要能量集中在 10Hz 以下。100Hz 采样率远高于实际需求,导致数据冗余。同时,int16 格式虽然精度足够,但 400 组 × 6 字节 = 2400 字节的缓冲区占用了大量 RAM,且处理耗时。
实际操作步骤:
- 将采样率从 100Hz 降至 25Hz(满足 10Hz 带宽的 2.5 倍裕量)。
- 启用 BMI270 内置的硬件平均滤波器(Average Filter),将 4 个原始样本平均为 1 个输出,等效于抗混叠滤波。
- 将数据格式从 int16 转为 int8。通过分析加速度幅值范围(±2g 量程下,步态信号峰值约 ±1.5g),确定缩放因子为 256(即 1g = 128 LSB),零点为 0。量化后步态信号特征保持完好。
- 窗口长度调整为 2 秒(50 组样本),因为 25Hz 下 2 秒窗口已包含 2~3 个完整步态周期。
结果对比: 优化后,每次唤醒需处理的数据量从 2400 字节降至 50 组 × 3 轴 × 1 字节 = 150 字节,处理时间缩短 85%。MCU 平均电流降至 32μA,且计步准确率从 92% 提升至 96%(因为减少了高频噪声干扰)。
风险与代价: int8 量化引入了约 0.4% 的幅值误差,对于需要精细振动分析的场景可能不够,但计步场景完全可接受。此外,硬件平均滤波器引入了 4 个样本的延迟,对实时性要求极高的闭环控制不适用。
复盘经验: 采样参数优化应首先从信号带宽出发,而非盲目降低采样率。量化格式的选择需结合信号动态范围和模型鲁棒性。在 TinyML 中,“数据量最小化” 是降低功耗的第一原则,但必须确保信息无损或损失可控。
3.5 常见误区与总结复盘
在采样环节,工程师常陷入以下误区:
- 误区一:采样率越高越好。 这会导致数据洪流,增加功耗和存储压力,且对模型精度提升有限。正确做法是匹配信号带宽。
- 误区二:忽略抗混叠滤波器。 即使采样率满足奈奎斯特定理,若信号中存在带外强干扰(如 50Hz 工频),仍需硬件或软件滤波。
- 误区三:量化位数越低越好。 过低的位数会淹没微弱特征(如心跳信号的细微变化)。建议先评估信号的最小可分辨幅值。
- 误区四:数据格式随意排列。 未对齐的内存访问在 Cortex-M0+ 上会导致 HardFault,在 M4 上会降低效率。
总结: 采样是 TinyML 系统的“味觉”,决定了模型能“尝”到什么信息。正确的采样策略应遵循:先定带宽,再定采样率;先定动态范围,再定量化位数;先定内存布局,再定数据格式。 通过本章的方法,你可以为后续的窗口长度设计和推理频率优化打下坚实基础。