4、特征提取概念:时域特征(均值、方差、峰值)、频域特征(FFT、功率谱)、特征归一化方法
在CMSIS-DSP信号处理管线中,特征提取是将原始传感器数据(如加速度计、麦克风、振动传感器)转化为可用于分类或回归的数值向量的关键环节。原始波形数据往往包含大量冗余信息和噪声,直接送入机器学习模型不仅计算开销大,而且容易导致过拟合。特征提取的核心目标是通过数学变换,从高维原始信号中提炼出低维、稳定、具有判别力的信息表示。本章将系统讲解时域特征、频域特征以及特征归一化三大模块,并结合CMSIS-DSP库函数给出工程实现路径。
上图展示了CMSIS-DSP特征提取管线的整体数据流。原始信号经过预处理后,并行提取时域和频域特征,最终通过归一化形成统一尺度的特征向量。下面分别对三大模块进行深入剖析。
4.1 时域特征:均值、方差与峰值
4.1.1 核心原理
时域特征直接对采样点序列进行统计计算,计算复杂度低,适合在MCU上实时运行。均值反映信号的直流分量或趋势中心;方差描述信号围绕均值的波动程度,即能量大小;峰值则表征信号的最大冲击幅度。对于周期性信号(如振动、心电),还可扩展计算峰峰值、均方根(RMS)和过零率。
在CMSIS-DSP中,均值可通过 arm_mean_f32() 实现,方差需结合 arm_var_f32(),峰值则需自行遍历或使用 arm_max_f32()。这些函数均针对ARM Cortex-M内核做了SIMD优化,执行效率远高于手写循环。
4.1.2 判断方法与操作流程
- 确定窗口长度:根据信号周期和采样率选择分析窗口。例如,50Hz工频干扰采样率1kHz时,窗口至少取20ms(20个采样点);对于机械振动,通常取10-20个完整周期。
- 去直流分量:先计算均值并从每个采样点中减去,避免直流偏置对方差和峰值计算的干扰。
- 计算统计量:依次调用CMSIS-DSP函数获取均值、方差、最大值、最小值。
- 组合特征:将多个统计量拼接为特征向量的一部分,注意记录特征顺序以便后续归一化。
4.1.3 案例拆解:电机振动异常检测
某工业设备通过ADXL345加速度计监测电机轴承振动,采样率4kHz,每次分析取1024点(256ms)。初始现象:正常运行时振动幅度平稳,但轴承磨损早期信号时域波形变化不明显。关键参数:正常状态均值≈0.02g,方差≈0.15g²,峰值≈1.2g;故障初期均值漂移至0.08g,方差增至0.42g²,峰值达到2.8g。通过计算发现,方差和峰值对早期故障更敏感,而均值变化滞后。实际操作中,将窗口滑动重叠50%,每256ms输出一组时域特征,送入阈值分类器。结果:提前3天预警轴承异常,避免了设备停机。风险点:峰值易受随机噪声干扰,需配合中值滤波或多次采样取最大值。
4.1.4 常见误区与总结
- 误区一:直接使用原始均值而不去直流,导致方差计算错误。
- 误区二:忽略峰值的方向性,对于双向振动信号应分别统计正峰值和负峰值。
- 误区三:窗口过短导致统计量波动大,窗口过长则响应延迟增加。
时域特征适合作为第一层快速筛查,计算量小、物理意义明确,但难以区分频率成分不同的信号,因此需要频域特征补充。
4.2 频域特征:FFT与功率谱
4.2.1 核心原理
频域特征通过傅里叶变换将时域信号分解为不同频率分量的幅度和相位。CMSIS-DSP提供 arm_rfft_fast_f32() 和 arm_cfft_f32() 等高效FFT实现。功率谱密度(PSD)表示信号功率在频域的分布,可通过幅度谱平方除以分辨率带宽获得。频域特征能有效区分不同振动源、语音音素和电磁干扰模式。
4.2.2 操作流程与关键参数
| 步骤 | 操作 | CMSIS-DSP函数 | 注意事项 |
|---|---|---|---|
| 1 | 加窗(汉宁/汉明) | arm_mult_f32() | 减少频谱泄漏,窗函数需预先生成 |
| 2 | FFT变换 | arm_rfft_fast_f32() | 输入长度需为2的幂次 |
| 3 | 计算幅度谱 | arm_cmplx_mag_f32() | 取复数模值 |
| 4 | 功率谱密度 | 幅度平方 / (N * fs) | 单边谱需乘以2(除直流和奈奎斯特点) |
| 5 | 提取频带特征 | 手动累加或 arm_mean_f32() | 按频带划分(如低频、中频、高频) |
4.2.3 实战场景:语音端点检测中的频域特征
在智能语音门锁中,需要区分人声和环境噪声。采样率16kHz,FFT点数512,频率分辨率31.25Hz。初始现象:人声和空调噪声在时域波形上幅度相近,难以区分。关键输入:计算功率谱后,人声集中在300Hz-3.4kHz,且谱质心约1.2kHz;空调噪声主要分布在100Hz以下,谱质心约80Hz。分析判断:提取4个频带(0-100Hz、100-500Hz、500-2kHz、2kHz-4kHz)的能量占比作为特征。实际操作:对每帧20ms信号加汉宁窗,做512点FFT,计算各频带能量比。结果:人声检测准确率从时域阈值的72%提升至94%。代价:FFT计算耗时约0.8ms(Cortex-M4 @ 100MHz),可满足实时性要求。
4.2.4 常见误区与总结
- 误区一:未加窗直接FFT,导致频谱泄漏严重,旁瓣掩盖弱信号。
- 误区二:混淆功率谱和幅度谱,功率谱强调强频率成分,更适合能量分布分析。
- 误区三:忽略直流分量,直流分量通常不包含有用信息,应置零或单独处理。
频域特征物理意义清晰,但特征维度较高(每个频点一个值),直接使用会导致维度灾难,需通过频带划分或谱形状参数降维。
4.3 特征归一化方法
4.3.1 核心原理
不同特征具有不同的量纲和数值范围。例如,均值可能为0.02,而方差可能为0.15,功率谱能量可能高达数千。若直接送入距离度量型分类器(如KNN、SVM),数值范围大的特征将主导相似度计算,导致小数值特征失效。归一化将所有特征缩放到统一尺度,保证各特征对模型的贡献均衡。
4.3.2 三种常用方法对比
| 方法 | 公式 | 适用场景 | CMSIS-DSP实现 |
|---|---|---|---|
| Min-Max缩放 | (x - min) / (max - min) | 特征有明确上下界,分布均匀 | 先 arm_min_f32() 和 arm_max_f32(),再逐元素计算 |
| Z-score标准化 | (x - μ) / σ | 特征分布近似高斯,存在离群值 | arm_mean_f32() + arm_std_f32(),再逐元素操作 |
| L2范数归一化 | x / ||x||₂ | 特征向量用于余弦相似度计算 | arm_power_f32() 求平方和,再开方和除法 |
4.3.3 操作流程与工程实现
// Z-score标准化示例(CMSIS-DSP)
float32_t features[64]; // 原始特征向量
float32_t norm_feats[64]; // 归一化后特征
float32_t mean, std, inv_std;
arm_mean_f32(features, 64, &mean);
arm_std_f32(features, 64, &std);
inv_std = 1.0f / std;
// 逐元素标准化
for (int i = 0; i < 64; i++) {
norm_feats[i] = (features[i] - mean) * inv_std;
}
注意:归一化参数(min/max或μ/σ)必须在训练集上计算并保存,推理时使用同一组参数,避免数据泄漏。在嵌入式系统中,可将这些参数存储为常量数组,避免运行时重复计算。
4.3.4 案例拆解:多传感器融合的归一化策略
某可穿戴设备同时采集加速度(±16g)和心率(30-220bpm)数据。初始现象:加速度特征数值范围在0-16之间,心率特征在30-220之间,直接拼接特征向量后,KNN分类器几乎完全由心率主导。关键输入:加速度方差特征约2.5,心率均值特征约75。分析判断:采用Z-score标准化,分别计算两类特征的均值和标准差。实际操作:采集1000组训练数据,计算加速度特征的μ=1.8、σ=0.9,心率特征的μ=72、σ=15。推理时使用这些固定参数。结果:活动识别准确率从61%提升至89%。风险:若设备佩戴者心率异常(如疾病),标准化后特征可能超出[-3,3]范围,需设置截断阈值。
4.3.5 常见误区与总结
- 误区一:在完整数据集上计算归一化参数后再划分训练/测试集,造成数据泄漏。
- 误区二:对稀疏特征使用Min-Max缩放,导致大部分值被压缩到接近0。
- 误区三:忽略归一化对异常值的敏感性,Z-score对离群点鲁棒性优于Min-Max。
归一化是特征工程中成本最低但收益最明显的步骤。在CMSIS-DSP中,归一化计算量远小于FFT,但能显著提升模型稳定性。建议在特征提取管线末端统一执行归一化,并输出归一化后的特征向量供后续分类器使用。