4. 特征工程

在TinyML电机振动异常评分模型中,原始振动信号只是时间序列的原始采样点,无法直接作为轻量级模型的输入。特征工程的目标是将高采样率、高维度的原始信号压缩为低维度、高区分度的特征向量,同时兼顾嵌入式设备的计算与存储约束。本章围绕时域、频域、时频三大类特征展开,重点讲解各特征的计算原理、物理含义、在电机故障诊断中的适用场景,以及如何在资源受限的MCU上高效实现。

电机振动信号特征提取技术路线 原始振动信号 采样率 1kHz~50kHz 时域特征 均值、方差、峰值、峭度 波形因子、峰值因子 计算量:O(N) 适合:实时性要求高 频域特征 FFT频谱、功率谱密度 频谱峰值、重心频率 计算量:O(N log N) 适合:稳态运行状态 时频特征 小波变换、短时傅里叶 时频分辨率权衡 计算量:较高 适合:非平稳/瞬态信号 特征融合与降维 PCA / 特征选择 / 归一化 TinyML 模型输入特征向量

上图展示了三类特征提取的完整技术路线。时域特征直接对原始采样点进行统计计算,计算效率最高;频域特征通过傅里叶变换将信号分解到频率分量,适合分析周期性振动成分;时频特征则同时保留时间与频率信息,能够捕捉瞬态冲击和变频过程。在实际TinyML部署中,需要根据电机工况、故障类型和MCU算力综合选择特征组合。

4.1 时域特征:快速统计与冲击检测

核心原理

时域特征直接对振动加速度信号的时间序列进行统计计算,反映信号的幅值分布、能量大小和冲击特性。对于N个采样点组成的序列 x[0], x[1], ..., x[N-1],常用特征包括:

  • 均值(Mean):反映信号的直流分量,正常电机振动均值接近0,若出现明显偏移可能指示传感器漂移或机械松动。
  • 方差(Variance):衡量信号波动程度,与振动能量直接相关,轴承磨损或转子不平衡会导致方差显著增大。
  • 峰值(Peak):信号绝对值的最大值,对瞬态冲击敏感,如齿轮断齿、轴承滚动体缺陷会产生尖锐峰值。
  • 峭度(Kurtosis):四阶中心矩与方差平方的比值,描述信号分布的"尖峰"程度。正态分布峭度为3,轴承早期故障时峭度可升至5~10以上。
工程提示:峭度是轴承早期故障最敏感的时域指标之一。当峭度超过4.5时,应触发预警;超过7时,通常表明存在明显的冲击性缺陷。但峭度对随机噪声也较敏感,建议结合峰值因子(峰值/RMS)共同判断。

计算与实现

在MCU上实现时域特征计算时,可采用单次遍历算法,避免多次访问数据。以下为C语言实现示例:

// 单次遍历计算时域特征
void compute_time_features(float* x, int N, float* mean, float* var, float* peak, float* kurt) {
    float sum = 0, sum_sq = 0, sum_4th = 0;
    float max_val = 0;
    for (int i = 0; i < N; i++) {
        sum += x[i];
        sum_sq += x[i] * x[i];
        float abs_x = fabsf(x[i]);
        if (abs_x > max_val) max_val = abs_x;
    }
    *mean = sum / N;
    float rms = sqrtf(sum_sq / N);
    *peak = max_val;
    // 第二遍计算峭度(可合并到第一遍,此处为清晰展示)
    for (int i = 0; i < N; i++) {
        float diff = x[i] - *mean;
        sum_4th += diff * diff * diff * diff;
    }
    float variance = sum_sq / N - (*mean) * (*mean);
    *var = variance;
    *kurt = (sum_4th / N) / (variance * variance);
}

案例拆解:滚动轴承外圈故障的时域特征变化

某工厂一台55kW异步电机驱动离心泵,振动传感器安装在驱动端轴承座上,采样率12.8kHz,每次采集4096点(0.32秒)。正常运行时的基线数据为:均值0.02g,方差0.85g²,峰值2.1g,峭度3.1。运行6个月后,振动数据出现以下变化:均值0.05g,方差1.42g²,峰值5.8g,峭度6.7。通过时域特征对比,峰值和峭度显著上升,而均值变化不大,初步判断为轴承外圈出现局部缺陷。后续停机检查确认外圈存在剥落坑,更换轴承后特征恢复至基线水平。

注意:时域特征无法区分故障的具体频率成分。例如,不平衡和不对中都会导致方差增大,但两者的故障机理和维修方式完全不同。因此,时域特征适合作为快速筛查和异常预警,精确定位需要结合频域分析。

4.2 频域特征:FFT频谱与功率谱密度

核心原理

频域分析通过离散傅里叶变换(DFT)将时域信号转换为频谱,揭示振动能量在不同频率上的分布。对于N点序列,FFT计算复杂度为O(N log N),在Cortex-M4/M7等带FPU的MCU上,1024点FFT约需0.5~2ms。常用频域特征包括:

  • FFT频谱幅值:各频率分量的幅值,可直接识别转频(1X)、2X、边频带等特征频率。
  • 功率谱密度(PSD):单位频带内的功率分布,采用Welch方法(分段平均)可降低方差,获得更稳定的频谱估计。
  • 频谱峰值与对应频率:最大幅值及其频率位置,用于识别主导振动源。
  • 重心频率(FC):频谱的能量重心,反映信号频率分布的集中趋势。

电机故障特征频率

故障类型 特征频率 频谱表现
转子不平衡 1×转频(f_r) 转频处幅值显著增大
轴不对中 2×f_r 2倍转频幅值增大,常伴1X
轴承外圈故障 BPFO(约0.4×N×f_r) BPFO及其谐波,伴边频带
轴承内圈故障 BPFI(约0.6×N×f_r) BPFI及其谐波,调制边带明显
齿轮断齿 啮合频率f_m及其谐波 f_m处幅值增大,两侧出现边频

功率谱密度计算流程

  1. 将N点信号分段,每段M点(如256点),段间重叠50%。
  2. 对每段加汉宁窗(Hanning)抑制频谱泄漏。
  3. 对每段执行M点FFT,计算幅值平方作为功率估计。
  4. 对所有段的功率谱取平均,得到PSD估计。
部署建议:在TinyML场景中,不建议直接传输完整频谱(数据量大),而是提取频谱的统计特征(如峰值频率、峰值幅值、频谱质心、频带能量比)作为模型输入。例如,将0~5kHz频段划分为10个子带,计算每个子带的能量占比,形成10维特征向量。

4.3 时频特征:小波变换与短时傅里叶变换

核心原理

电机在启动、停机、负载突变过程中,振动信号呈现非平稳特性,单一频域分析无法反映频率随时间的变化。时频分析同时提供时间和频率信息,适合捕捉瞬态冲击和变频过程。

  • 短时傅里叶变换(STFT):将信号加窗后分段做FFT,得到时间-频率二维谱图。窗口长度决定时间分辨率与频率分辨率的权衡:窗口越长,频率分辨率越高但时间分辨率越低。
  • 小波变换(WT):使用可伸缩平移的小波基函数,在高频段自动获得高时间分辨率,在低频段获得高频率分辨率,更适合分析瞬态冲击信号。

STFT与小波变换对比

对比维度 短时傅里叶变换 小波变换
时频分辨率 固定窗口,分辨率恒定 自适应,高频时间分辨率高
计算复杂度 O(N log N) × 窗口数 O(N)(离散小波变换)
适合信号 准平稳信号 瞬态冲击、非平稳信号
MCU实现难度 需多次FFT,内存占用大 可用滤波器组实现,内存友好
特征提取方式 时频图能量分布 各尺度小波系数能量

小波变换在TinyML中的轻量化实现

离散小波变换(DWT)可通过Mallat算法实现,每层分解使用低通和高通滤波器对信号进行下采样。对于嵌入式部署,可选择Daubechies-4(db4)小波,滤波器系数仅4个,计算量小。以3层分解为例,可获得近似系数cA3和细节系数cD1、cD2、cD3,各层能量可作为特征:

// 单层DWT分解(db2小波,4个系数)
void dwt_one_level(float* x, int N, float* cA, float* cD, int* len_out) {
    // db2低通滤波器系数
    const float h[4] = {0.48296, 0.83652, 0.22414, -0.12941};
    // db2高通滤波器系数(由低通推导)
    const float g[4] = {-0.12941, -0.22414, 0.83652, -0.48296};
    int len = N / 2;
    for (int i = 0; i < len; i++) {
        float sum_low = 0, sum_high = 0;
        for (int j = 0; j < 4; j++) {
            int idx = (2*i + j) % N;  // 循环边界处理
            sum_low += h[j] * x[idx];
            sum_high += g[j] * x[idx];
        }
        cA[i] = sum_low;
        cD[i] = sum_high;
    }
    *len_out = len;
}

案例拆解:变频器供电电机的瞬态冲击检测

某轧钢车间的变频电机在加速过程中出现异常振动。使用STFT(窗口256点,汉宁窗,重叠50%)分析发现,在加速阶段(2~4秒),频谱中出现了随时间线性增高的频率成分,从800Hz升至1500Hz,这是典型的变频供电引起的谐波共振。进一步使用db4小波3层分解,发现细节系数cD2(对应500~1000Hz频带)的能量在加速阶段突增3倍。通过时频分析,定位到问题源于变频器载波频率与电机结构固有频率的耦合共振,调整载波频率后振动恢复正常。

资源约束提醒:STFT需要存储整个时频矩阵(如64×128=8192个浮点数),在内存有限的MCU上可能不现实。建议在MCU上仅计算小波分解的各层能量,或提取STFT的时频峰值轨迹,避免存储完整二维矩阵。

4.4 特征选择与融合策略

特征维度与模型性能的平衡

TinyML模型的特征维度直接影响内存占用和推理延迟。以Cortex-M4(主频80MHz,FPU)为例,一个浮点特征占用4字节,100维特征向量需400字节存储,MLP推理一次约需0.5ms。特征维度并非越多越好,过多特征会导致过拟合和计算浪费。

推荐特征组合方案

应用场景 推荐特征组合 特征维度 适用模型
实时监测(低算力) 均值、方差、峰值、峭度、峰值因子 5维 决策树/逻辑回归
稳态故障诊断 时域5维 + 频谱峰值频率/幅值 + 3个子带能量 10维 MLP(1~2层)
非平稳/瞬态检测 时域5维 + 小波3层能量 + 频谱质心 9维 MLP/1D-CNN

特征归一化与数据预处理

不同特征的量纲和数值范围差异大(如均值约0.01g,峭度可达10),直接输入模型会导致训练不稳定。推荐使用Z-score归一化:

// Z-score归一化
float z_score(float x, float mean, float std) {
    return (x - mean) / std;
}
// 归一化参数(mean, std)在训练集上计算并固化到模型部署代码中

常见误区与复盘

  • 误区1:特征越多越好。实际中,10个精心选择的特征往往优于50个冗余特征。建议使用相关性分析和特征重要性排序(如随机森林特征重要性)进行筛选。
  • 误区2:忽略采样率与频率分辨率的匹配。若采样率12.8kHz,FFT点数1024,频率分辨率仅12.5Hz,无法分辨间隔小于12.5Hz的相邻频率成分。需要根据目标特征频率间隔选择FFT点数。
  • 误区3:直接使用原始频谱作为模型输入。原始频谱维度高(512点),且包含大量无关噪声,应提取频谱统计特征或降维。
  • 误区4:忽视计算时间预算。若MCU需要每100ms完成一次推理,则特征提取总耗时需控制在50ms以内。需评估FFT、小波变换等算法的实际耗时。
总结复盘:特征工程的核心原则是"匹配故障机理、匹配计算资源、匹配模型需求"。时域特征提供快速筛查能力,频域特征实现故障定位,时频特征捕捉瞬态过程。在TinyML部署中,建议采用"时域快速筛查 + 频域精确定位"的两级策略:第一级使用5维时域特征判断是否异常,第二级在异常时触发频域分析,从而在保证诊断精度的同时降低平均计算功耗。