2、时域信号基础:采样、离散信号、时间序列表示,以及为什么在TinyML中优先使用时域特征

在进入TinyML特征提取的细节之前,我们必须先建立对时域信号本身的清晰认知。TinyML设备(如MCU、传感器节点)处理的对象并非连续的物理量,而是经过采样和量化后得到的离散时间序列。理解采样定理、离散信号的表示方式以及时间序列的数学含义,是后续计算均值、RMS、峰值和峭度的前提。更重要的是,我们需要回答一个战略性问题:为什么在资源极度受限的TinyML场景中,时域特征往往比频域特征(如FFT)更受青睐?本章将围绕这些核心问题展开,为后续特征计算打下坚实的理论基础。

连续物理信号 x(t) 模拟量 采样保持 ADC @ Fs 离散时间序列 x[n] n=0 1 2 3 4 5 6 7 8 9 时域特征提取(TinyML 端侧计算) 均值 (Mean) μ = (1/N)Σx[n] RMS √(Σx²[n]/N) 峰值 (Peak) max|x[n]| 峭度 (Kurtosis) E[(x-μ)⁴]/σ⁴ 计算复杂度:O(N) 单次遍历 | 内存占用:O(1) 滚动更新 | 无需FFT/窗函数 适用场景:振动监测、人体活动识别、异常检测、语音端点检测

2.1 采样与离散信号:从连续世界到数字世界的桥梁

物理世界中的传感器输出本质上是连续时间信号 x(t),例如加速度计的电压输出、麦克风的气压波动或温度传感器的电阻变化。TinyML设备中的微控制器(MCU)无法直接处理连续信号,必须通过模数转换器(ADC)以固定时间间隔 Δt 对信号进行采样,得到离散时间信号 x[n] = x(n·Δt),其中 n 为整数索引。采样率 Fs = 1/Δt 决定了时间分辨率,而ADC的位宽(如12位、16位)决定了幅度分辨率。

根据奈奎斯特采样定理,为了无失真地重建原始信号,采样率必须至少为信号最高频率成分的两倍。例如,若振动信号包含最高500Hz的频率成分,则采样率至少需要1000Hz。在实际TinyML应用中,考虑到抗混叠滤波器的非理想特性,通常选择采样率为最高频率的3~5倍。采样后的离散序列还需要经过量化,将连续幅度映射到有限个离散电平。量化误差(量化噪声)是TinyML系统中不可避免的噪声源,其信噪比约为 6.02×B + 1.76 dB,其中B为ADC位数。

工程要点:在TinyML中,采样率的选择直接影响功耗和内存占用。过高的采样率会导致ADC频繁唤醒、数据量激增,而过低的采样率则会丢失关键瞬态特征。建议在项目初期通过示波器或逻辑分析仪观察原始信号,确定有效带宽后再设定采样率。

2.2 时间序列的数学表示与窗口化处理

离散时间序列 x[n] 在数学上可以看作一个长度为N的向量,即 x = [x[0], x[1], ..., x[N-1]]。在TinyML特征提取中,我们通常对固定长度的窗口(Window)进行处理,窗口长度 N 的选择需要权衡时间分辨率和统计稳定性。例如,对于加速度信号,常用的窗口长度为 50~200 个采样点(对应 0.1~0.5 秒 @ 400Hz采样率),既保证足够的统计样本,又不会过度平滑瞬态事件。

窗口化处理有两种常见模式:滑动窗口(Sliding Window)和事件触发窗口(Event-triggered Window)。滑动窗口以固定步长(如50%重叠)在数据流上移动,适用于连续监测场景;事件触发窗口则通过阈值检测或中断信号启动采集,适用于稀疏事件(如冲击、异常振动)检测。在内存受限的MCU上,滑动窗口通常使用环形缓冲区(Ring Buffer)实现,仅需分配 N 个浮点或整型数组即可持续更新。

窗口类型内存占用延迟适用场景典型实现
滑动窗口(50%重叠)2×N×sizeof(type)低(实时)连续监测、活动识别环形缓冲区 + 双缓冲
事件触发窗口N×sizeof(type)中(需等待触发)异常冲击、语音唤醒中断 + DMA采集
非重叠固定窗口N×sizeof(type)低批量处理、离线分析直接数组切片

2.3 为什么TinyML优先使用时域特征?

在传统信号处理中,频域特征(如FFT频谱、功率谱密度)往往能提供更丰富的频率信息。然而在TinyML场景下,时域特征具有不可替代的优势,主要体现在以下四个维度:

  • 计算复杂度极低:均值、RMS、峰值、峭度等时域特征的计算复杂度均为 O(N),只需一次遍历即可完成,且不需要复杂的三角函数或复数运算。相比之下,N点FFT的复杂度为 O(N log N),且需要额外的旋转因子表和位反转操作,在Cortex-M0等低端MCU上可能占用数百个时钟周期。
  • 内存占用极小:时域特征可以流式(Streaming)计算,即每来一个采样点就更新一次统计量,只需维护几个累加器和计数器(O(1)空间)。而FFT需要存储完整的N点数据(O(N)空间),且输出频谱还需要额外的N/2个复数存储。
  • 实时性与低延迟:时域特征可以在采样过程中即时更新,无需等待整个窗口采集完毕。例如,在电机异常检测中,RMS值可以在每个采样点后立即更新,一旦超过阈值即可触发报警,延迟仅为单个采样周期。
  • 物理意义明确:均值反映直流分量,RMS反映信号能量,峰值反映瞬态冲击,峭度反映分布尖锐程度。这些指标直接对应机械故障(如轴承磨损导致峭度升高)、人体运动强度(RMS与运动幅度相关)等物理现象,便于工程师理解和调试。
注意:时域特征并非万能。当信号包含多个频率成分且需要区分不同频率源时(如区分50Hz工频干扰与200Hz机械振动),时域特征无法提供频率选择性。此时应结合频域特征或使用小波变换,但需评估MCU的计算能力是否允许。

2.4 案例拆解:基于加速度计的电机异常检测

我们以一个实际的TinyML项目为例,说明时域特征的选择与验证过程。某工厂需要在电机轴承上部署无线振动传感器节点,节点采用STM32L0系列MCU(Cortex-M0+,32MHz),内置12位ADC,采样率设置为 4kHz,每次采集 256 个采样点(64ms窗口)。目标是检测轴承早期磨损故障。

初始现象与约束:正常轴承振动信号近似高斯分布,峭度约为3;当轴承出现点蚀或剥落时,振动信号会出现周期性冲击,峭度显著升高(>5)。然而,仅靠峭度无法区分冲击的重复频率,因此需要结合RMS和峰值进行综合判断。节点电池容量为500mAh,要求续航6个月,因此每次特征提取的CPU时间必须小于2ms。

分析判断过程:我们首先在PC端使用Python对历史数据进行离线分析,计算正常与故障状态下的均值、RMS、峰值和峭度。结果显示:正常状态RMS为0.12g,峰值0.45g,峭度2.9;故障状态RMS为0.28g,峰值1.2g,峭度6.8。仅使用峭度阈值5即可实现100%的区分度,但为了减少误报,我们决定采用多特征融合:当RMS>0.2g 且 峭度>4.5 时判定为异常。

实际操作步骤:在MCU上实现时,我们采用流式计算:每采集一个采样点,更新 sum、sum_sq、sum_cu、sum_qu 四个累加器,窗口结束后一次性计算四个特征。由于Cortex-M0+不支持硬件浮点单元(FPU),我们使用Q15定点数格式(将浮点数乘以32768后取整)进行计算,将计算时间控制在1.2ms以内。同时,我们利用DMA(直接内存访问)将ADC数据直接搬运到内存,CPU仅在DMA传输完成中断中执行特征计算,功耗降低40%。

结果对比与复盘:部署后运行3个月,系统成功检测到2次轴承早期故障(均在峭度超过5.2时触发),无漏报和误报。复盘发现,单纯使用峭度在负载波动时会产生误报(峭度短暂超过4.5),而加入RMS条件后误报率降为零。此外,我们意识到采样率4kHz对于轴承故障特征(通常<2kHz)足够,但若需要检测更高频的齿轮故障,需将采样率提升至8kHz,此时窗口长度应相应缩短以保持相同的时间分辨率。

经验总结:在TinyML中设计时域特征方案时,建议遵循以下流程:① 离线分析确定候选特征及阈值;② 在MCU上实现流式计算并验证数值精度(定点数vs浮点数);③ 进行功耗与延迟实测;④ 在真实环境中进行长期稳定性测试。切勿跳过离线分析直接上板调试,否则会浪费大量调试时间。

2.5 常见误区与总结复盘

在时域信号基础与特征选择中,初学者常犯以下错误:

  1. 忽略采样率对特征值的影响:如果采样率过低,峰值可能被漏采,导致峭度计算失真。例如,对于持续时间仅0.5ms的冲击信号,若采样率低于2kHz,则可能完全错过该冲击。
  2. 窗口长度选择不当:窗口过短(如N=16)会导致统计量方差过大,特征值抖动剧烈;窗口过长(如N=1024)则会平滑掉瞬态特征,且增加内存占用。建议根据信号的最低频率成分确定窗口长度,至少包含5~10个最低频率周期。
  3. 忽视直流偏移:许多传感器输出包含直流偏置(如加速度计的0g对应1.65V),若不进行去均值处理,RMS值将包含直流分量,导致特征失真。应在计算RMS前先减去均值,或使用高通滤波器去除直流。
  4. 定点数溢出:在MCU上使用16位整数累加时,若窗口长度N=256且信号幅度接近满量程,sum_sq 可能超过32位整数范围。建议使用32位累加器或分块累加。