4. 时域特征工程

振动信号是设备状态最直接的“生理指标”。当我们从加速度传感器或压电传感器采集到一段原始时域波形时,它往往是一条看似杂乱无章的曲线,直接观察很难判断设备是否存在早期故障。时域特征工程的核心任务,就是通过数学统计手段,将这段波形压缩成一组具有明确物理意义的标量值,从而把“波形长什么样”转化为“设备状态怎么样”。在TinyML异常检测场景中,由于MCU的算力与内存极其有限,时域特征提取几乎是唯一能在传感器端实时完成的前处理手段,其计算量小、无需频域变换、可逐帧流水线处理,因此是边缘端异常检测的第一道关卡。

时域特征提取在TinyML异常检测中的工程链路 原始振动信号 采样率 1~25.6 kHz 帧长 256~1024 点 预处理 去直流 / 去均值 加窗 / 异常值剔除 时域特征提取 均值 / 方差 / 峰值 峰峰值 / 均方根 / 峭度 波形因子 / 峰值因子 共 8 维特征向量 TinyML模型 异常检测 分类 / 回归 工程要点: ① 每帧信号独立计算,帧与帧之间无重叠或50%重叠;② 特征计算需使用定点数或低精度浮点(FP32→FP16);③ 特征向量直接作为TinyML模型输入,无需额外存储原始波形。 特征维度物理意义对比 特征名称 物理含义 对故障敏感度 典型应用场景 均值 信号直流分量 低(受安装影响) 传感器零漂检测 方差/标准差 信号波动能量 中(整体磨损) 轴承磨损趋势 峭度 冲击脉冲程度 高(早期故障) 轴承点蚀/剥落 峰值因子 峰值与有效值比 高(冲击敏感) 齿轮断齿/裂纹

4.1 核心原理:从波形到特征向量的数学映射

时域特征提取的本质,是将一段长度为N的离散振动序列 x = {x₁, x₂, ..., xₙ} 通过统计函数映射为低维特征向量。这些特征各自捕捉信号的不同侧面:均值反映直流偏置,方差与均方根反映能量大小,峰值与峰峰值反映冲击强度,峭度反映分布尾部厚度,波形因子与峰值因子则描述波形形态的相对关系。在TinyML场景中,这些特征的计算复杂度均为O(N),且不需要额外存储整个帧的数据——可以边采样边累加中间变量,非常适合在MCU上以流式方式实现。

特征名称 计算公式 计算复杂度 内存占用 对异常敏感度
均值 (Mean) μ = (1/N)Σxᵢ O(N) 1个累加器 低
方差 (Variance) σ² = (1/N)Σ(xᵢ-μ)² O(N) 2个累加器 中
峰值 (Peak) x_peak = max|xᵢ| O(N) 1个比较器 高(冲击)
峰峰值 (Peak-to-Peak) x_pp = max(xᵢ) - min(xᵢ) O(N) 2个比较器 高(大幅值)
均方根 (RMS) x_rms = √[(1/N)Σxᵢ²] O(N) 1个累加器+开方 中高
峭度 (Kurtosis) K = (1/N)Σ(xᵢ-μ)⁴ / σ⁴ O(N) 3个累加器 极高(早期故障)
波形因子 (Shape Factor) SF = x_rms / (1/N)Σ|xᵢ| O(N) 2个累加器 中
峰值因子 (Crest Factor) CF = x_peak / x_rms O(N) 2个累加器 高(冲击)
工程实现提示:在MCU上计算方差时,建议使用“两遍扫描法”或“Welford在线算法”。Welford算法只需一遍遍历即可同时更新均值和方差,数值稳定性优于直接累加平方和,尤其当信号均值不为零时,可避免灾难性抵消导致的精度损失。

4.2 判断方法与操作流程:特征提取的标准流水线

在实际TinyML项目中,时域特征提取并非简单套用公式,而是需要遵循一套标准化的操作流程,以确保特征的一致性和可比性。以下是推荐的五步流水线:

  1. 信号预处理:首先去除直流分量(减去均值),消除传感器零漂影响;然后进行异常值剔除(如3σ原则),防止传感器饱和或电磁干扰产生的伪峰值污染特征。
  2. 帧划分:将连续信号流切分为固定长度的帧,典型帧长为256、512或1024点。帧长选择需权衡时间分辨率与频率分辨率——帧越短,检测响应越快,但统计稳定性下降。
  3. 加窗处理:若后续需要做FFT,则需加汉宁窗或汉明窗;若仅做时域特征,可省略加窗或使用矩形窗,以减少计算开销。
  4. 特征计算:按表4-1中的公式逐帧计算8个特征值。注意计算顺序:先算均值,再算方差/峭度,最后算RMS和因子类特征。
  5. 特征归一化:将特征值缩放到[0,1]或[-1,1]区间,避免不同量纲特征对TinyML模型权重更新造成偏置。推荐使用离线统计的min-max归一化参数,而非在线动态归一化。
// C语言伪代码:单帧时域特征提取(适用于Cortex-M4/M33)
typedef struct {
    float mean;
    float variance;
    float peak;
    float peak_to_peak;
    float rms;
    float kurtosis;
    float shape_factor;
    float crest_factor;
} TimeDomainFeatures;

TimeDomainFeatures extract_features(const float* x, uint16_t N) {
    TimeDomainFeatures feat;
    float sum = 0.0f, sum_sq = 0.0f, sum_abs = 0.0f;
    float sum_4th = 0.0f;
    float min_val = x[0], max_val = x[0];
    
    // 第一遍:累加基本统计量
    for (uint16_t i = 0; i < N; i++) {
        sum += x[i];
        sum_sq += x[i] * x[i];
        sum_abs += fabsf(x[i]);
        if (x[i] < min_val) min_val = x[i];
        if (x[i] > max_val) max_val = x[i];
    }
    
    feat.mean = sum / N;
    feat.rms = sqrtf(sum_sq / N);
    feat.peak = fmaxf(fabsf(min_val), fabsf(max_val));
    feat.peak_to_peak = max_val - min_val;
    
    // 第二遍:计算方差和峭度(需要均值)
    float variance_sum = 0.0f;
    for (uint16_t i = 0; i < N; i++) {
        float diff = x[i] - feat.mean;
        variance_sum += diff * diff;
        sum_4th += diff * diff * diff * diff;
    }
    feat.variance = variance_sum / N;
    float std = sqrtf(feat.variance);
    feat.kurtosis = (sum_4th / N) / (std * std * std * std);
    
    // 因子类特征
    float mean_abs = sum_abs / N;
    feat.shape_factor = feat.rms / mean_abs;
    feat.crest_factor = feat.peak / feat.rms;
    
    return feat;
}

4.3 案例拆解:滚动轴承早期点蚀的时域特征识别

某工厂的离心泵电机轴承(型号6305)出现间歇性异响,振动传感器安装在电机驱动端轴承座上,采样率12.8kHz,帧长1024点(即每帧80ms)。设备正常运行时,振动速度有效值约1.2mm/s,峭度约3.0。近期监测发现,峭度值逐步攀升至5.8,但RMS仅上升至1.5mm/s,传统阈值报警(RMS>2.8mm/s)尚未触发。

分析过程:工程师提取了连续100帧的时域特征,发现以下规律:

  • 峭度:从3.0升至5.8,且波动增大(标准差从0.2升至0.7),表明信号中出现了明显的冲击脉冲成分。
  • 峰值因子:从4.2升至6.5,进一步确认冲击特征。
  • 波形因子:从1.3缓慢升至1.45,说明波形从正弦状向尖峰状演变。
  • 均值与方差:基本稳定,排除传感器松动或负载变化。

判断结论:结合峭度>4且峰值因子>5.5的联合判据,判定轴承外圈出现早期点蚀。随后停机拆检,发现外圈滚道存在直径约0.3mm的微小剥落坑,与特征分析结论一致。

经验总结:单一特征容易误判,建议采用“峭度+峰值因子+波形因子”的组合判据。当峭度>4且峰值因子>5.5时,大概率存在冲击性故障;若仅RMS升高而峭度不变,则更可能是磨损类故障或负载增加。

4.4 常见误区与工程复盘

误区一:忽略直流分量。许多工程师直接对原始信号计算特征,导致均值不为零,方差和峭度被直流偏置污染。正确做法是先减去均值,再计算高阶统计量。

误区二:帧长选择不当。帧长过短(如64点)会导致峭度估计方差极大,产生大量误报;帧长过长(如4096点)则响应迟缓,无法捕捉瞬态冲击。建议根据设备转速选择:每帧至少包含5~10个旋转周期。

误区三:峭度计算中的数值溢出。在MCU上使用float32计算四次方时,若信号幅值较大(如±10g),四次方可达10⁴量级,累加1024点后可能接近float32的精度极限。解决方案:先对信号做归一化(除以峰值),再计算峭度,最后乘以归一化系数的四次方还原。

误区四:忽视特征间的相关性。峰值因子与峭度高度相关(相关系数常达0.8以上),若同时作为TinyML模型输入,会造成特征冗余,增加模型过拟合风险。建议使用主成分分析(PCA)或互信息法进行特征选择,保留3~4个最具区分度的特征。

风险提示:在TinyML设备上部署时,务必验证特征计算的数值稳定性。建议在PC端用Python/Matlab计算基准值,然后在MCU上运行相同数据,对比特征误差是否在±1%以内。若误差过大,需检查是否使用了不安全的优化编译选项(如-ffast-math)导致精度损失。

复盘总结:时域特征工程是TinyML异常检测的基石。均值、方差、峰值、峰峰值、RMS、峭度、波形因子、峰值因子这8个特征,构成了一个从能量、幅值、形态到冲击性的多维描述体系。在实际项目中,应根据设备类型、故障模式和计算资源,合理选择特征子集,并建立“离线训练+在线推理”的标准化流程。下一阶段,我们将在此基础上引入频域特征,进一步揭示振动信号的频率成分变化,为更精细的故障诊断提供依据。