4、特征提取基础:时域特征(均值、方差、峰值、过零率)与频域特征(FFT频谱、功率谱)的概念与数学原理

在CMSIS-DSP驱动的嵌入式信号处理链路中,特征提取是将原始ADC采样数据转化为可判读信息的关键枢纽。无论是电机振动监测、心电(ECG)分析,还是声音事件检测,系统最终依赖的往往不是原始波形,而是从波形中提炼出的低维特征向量。本章聚焦两类最基础、也最常用的特征族:时域特征(均值、方差、峰值、过零率)与频域特征(FFT频谱、功率谱)。我们将从数学定义出发,结合CMSIS-DSP的具体函数映射,讨论其物理含义、计算代价以及在低功耗MCU上的实现取舍。

时域与频域特征提取知识框架 时域特征 • 均值 (Mean) • 方差 (Variance) • 峰值 (Peak) • 过零率 (ZCR) CMSIS-DSP: arm_mean_f32 arm_var_f32, arm_max_f32 arm_min_f32 特点:计算量小,适合连续 流式处理,对冲击敏感 频域特征 • FFT 频谱 • 功率谱 (PSD) • 频谱峰值/重心 • 子带能量 CMSIS-DSP: arm_rfft_fast_f32 arm_cmplx_mag_f32 arm_power_f32 特点:频率分辨率清晰, 适合周期性成分分析 互补融合 时域看冲击/趋势 频域看周期/共振 CMSIS-DSP 优化策略:定点Q15 + 分帧处理 + 硬件加速

上图展示了时域与频域特征在CMSIS-DSP中的基本映射关系。时域特征直接对采样序列进行算术运算,计算复杂度为O(N),适合在MCU上逐帧实时计算;频域特征则需要先进行FFT变换,计算复杂度为O(N log N),但能揭示信号中隐藏的周期性成分。在实际嵌入式系统中,两者往往配合使用:时域特征用于快速粗筛,频域特征用于精确诊断。

4.1 时域特征:数学定义与物理意义

时域特征直接对ADC采集到的离散时间序列 x[n](n=0,1,...,N-1)进行统计计算。它们的共同优点是计算简单、延迟低,适合在中断服务程序或实时任务中逐样本更新。在CMSIS-DSP中,这些运算均有对应的优化函数,底层利用ARM Cortex-M内核的SIMD(单指令多数据)指令和硬件浮点单元(FPU)加速。

4.1.1 均值(Mean)与直流分量

均值是信号的一阶统计量,定义为:

μ = (1/N) * Σ x[n]  (n=0 到 N-1)

在CMSIS-DSP中,使用 arm_mean_f32(pSrc, blockSize, pResult) 函数计算。均值反映了信号的直流分量。在振动监测中,均值通常被去除后再进行后续分析,因为直流分量不包含机械故障信息,反而会占用ADC的动态范围。在ECG分析中,均值漂移可能指示电极接触不良或基线漂移。

工程经验:在低功耗设计中,均值计算可以分帧进行。例如每帧256点,计算帧均值后,用滑动平均(EMA)更新长期基线,避免存储整个数据块。CMSIS-DSP的 arm_mean_q15 函数在定点处理器上比浮点版本快3-5倍,如果ADC分辨率是12位或16位,建议使用Q15格式。

4.1.2 方差(Variance)与信号能量

方差描述信号围绕均值的波动程度,定义为:

σ² = (1/N) * Σ (x[n] - μ)²

CMSIS-DSP提供 arm_var_f32(pSrc, blockSize, pResult) 函数,内部采用两遍扫描算法以避免数值不稳定。方差的开方即为标准差σ,在工程中更常用。方差对信号幅值变化非常敏感,适合检测突发冲击或幅值异常。例如,在电机轴承磨损初期,振动信号的方差会明显增大,而均值可能几乎不变。

值得注意的是,CMSIS-DSP还提供 arm_rms_f32 函数计算均方根值(RMS),它与方差的关系为:RMS² = σ² + μ²。RMS在交流信号分析中更常用,因为它直接对应信号的有效值功率。

4.1.3 峰值(Peak)与峰峰值

峰值定义为信号在窗口内的最大绝对值:

Peak = max(|x[n]|)  (n=0 到 N-1)

CMSIS-DSP使用 arm_max_f32 和 arm_min_f32 分别获取最大值和最小值,峰峰值 = max - min。峰值特征对瞬态冲击非常敏感,但容易受噪声干扰。在实际系统中,通常结合阈值判断:如果峰值超过预设门限,则触发中断或唤醒更高功耗的处理器进行详细分析。这种"事件驱动"策略是低功耗设计的关键。

4.1.4 过零率(Zero Crossing Rate, ZCR)

过零率统计信号在单位时间内穿越零点的次数,定义为:

ZCR = (1/(N-1)) * Σ |sign(x[n]) - sign(x[n-1])| / 2

其中sign()为符号函数。CMSIS-DSP没有直接的ZCR函数,但可以通过 arm_sign_f32 配合差分运算实现。ZCR是语音活动检测(VAD)和音频分类的经典特征:清音(辅音)的ZCR较高,浊音(元音)的ZCR较低。在振动分析中,ZCR可以粗略反映信号频率的高低,但精度远不如FFT。

时域特征CMSIS-DSP函数计算复杂度典型应用低功耗注意事项
均值arm_mean_f32/q15O(N)直流偏置去除、基线校准分帧滑动更新,避免全量存储
方差arm_var_f32O(N)异常检测、幅值波动监测两遍扫描,注意浮点精度
峰值arm_max_f32 / arm_min_f32O(N)冲击检测、阈值触发可硬件比较器实现零功耗监控
过零率arm_sign_f32 + 自定义O(N)语音检测、频率粗估适合定点实现,避免浮点开销

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

频域特征通过傅里叶变换将时域信号分解为不同频率分量的叠加。对于长度为N的实序列x[n],其离散傅里叶变换(DFT)定义为:

X[k] = Σ x[n] * e^(-j2πkn/N)  (n=0 到 N-1, k=0 到 N-1)

直接计算DFT需要O(N²)次复数乘法,而快速傅里叶变换(FFT)利用旋转因子的对称性和周期性,将复杂度降至O(N log N)。CMSIS-DSP提供完整的FFT函数族,包括 arm_rfft_fast_f32(实数FFT)、arm_cfft_f32(复数FFT)以及对应的Q15/Q31定点版本。

4.2.1 FFT频谱的物理含义

FFT输出的X[k]是复数,其幅值 |X[k]| 表示频率为 f_k = k * fs / N 的分量强度,其中fs为采样率。CMSIS-DSP中,使用 arm_cmplx_mag_f32 函数计算复数幅值。频谱分析的核心价值在于:将时域中难以分辨的多个叠加周期信号,在频域中分离为清晰的谱线。

例如,一个包含50Hz基波和150Hz三次谐波的振动信号,在时域波形中可能呈现复杂的畸变,但在频谱中会清晰显示两个峰值。对于旋转机械,基频对应转频,谐波成分的幅值比例可以诊断不对中、松动等故障。

4.2.2 功率谱密度(PSD)与能量分布

功率谱描述信号功率在频率上的分布。对于周期信号,功率谱可以通过FFT幅值的平方计算:

P[k] = |X[k]|² / N

CMSIS-DSP中,可以先计算幅值,再用 arm_power_f32 求平方。更常用的方法是直接使用 arm_cmplx_dot_prod_f32 计算频谱的自相关。功率谱比幅值谱更平滑,对小幅值分量更敏感,适合宽带信号分析。

在实际工程中,常将功率谱划分为若干子带(Sub-band),计算每个子带的能量占比。例如,在音频分析中,将0-4kHz分为8个子带,每个子带500Hz,提取子带能量作为特征向量。CMSIS-DSP的 arm_fir_f32 滤波器组可以实现子带分解,但计算量较大,低功耗场景下建议使用FFT后直接累加对应频点。

4.2.3 频谱特征参数

从FFT频谱或功率谱中,可以进一步提取以下特征:

  • 频谱峰值频率:幅值最大的频点,对应信号的主频率。使用 arm_max_f32 在幅值数组中搜索。
  • 频谱重心(Spectral Centroid):加权平均频率,反映信号的"明亮度"。计算公式为 Σ(f_k * P[k]) / ΣP[k]。
  • 频谱带宽:功率集中区域的宽度,反映信号的频率分散程度。
  • 谐波失真度(THD):谐波功率与基波功率之比,用于评估信号质量。

这些参数在CMSIS-DSP中没有直接函数,但可以通过基本运算组合实现。由于MCU的算力有限,建议在提取这些参数时使用定点运算,并预先计算好频率索引表,避免运行时重复计算。

案例拆解:电机轴承故障的时频联合诊断
背景与约束:某工业设备使用STM32F4系列MCU(Cortex-M4F,168MHz)监测电机轴承状态。采样率fs=8kHz,每次分析窗口N=1024点(128ms)。系统要求:特征提取阶段的总功耗不超过5mA@3.3V,且必须在1ms内完成单帧特征计算。
初始现象:轴承正常时,振动信号近似白噪声,方差较小;当轴承外圈出现裂纹时,时域波形出现周期性冲击,但肉眼难以分辨。
关键数据:正常状态:均值≈0.02V,方差≈0.15V²,峰值≈0.8V,ZCR≈1800次/秒;故障状态:均值≈0.03V,方差≈0.42V²,峰值≈1.6V,ZCR≈2200次/秒。
分析过程:仅靠时域特征,方差和峰值有明显变化,但无法确定故障频率。进一步做FFT分析,发现频谱在123Hz处出现明显峰值(对应轴承外圈故障特征频率BPFO),且伴有边带成分。
实际操作:① 使用 arm_rfft_fast_f32 对1024点数据做实数FFT,耗时约0.3ms;② 使用 arm_cmplx_mag_f32 计算幅值谱;③ 在0-4kHz范围内搜索峰值频率,使用 arm_max_f32 找到123Hz;④ 计算123Hz附近±5Hz内的能量占比,作为故障指标。
结果对比:仅用时域特征,诊断准确率约78%;加入频域特征后,准确率提升至96%。代价是计算时间增加0.4ms,但仍在1ms预算内。
风险与代价:FFT需要额外4KB的RAM存储中间结果(1024点复数),在资源紧张的系统中需谨慎规划。此外,FFT对窗函数敏感,直接使用矩形窗会导致频谱泄漏,建议使用汉宁窗(CMSIS-DSP提供 arm_hanning_f32)。
复盘经验:时域特征适合作为第一级粗筛,当方差或峰值超过阈值时,才启动FFT进行精确诊断。这种分级策略可将平均功耗降低60%。

4.3 低功耗实现策略与常见误区

在MCU上实现特征提取,功耗优化需要从算法、数据格式和硬件加速三个维度综合考虑。CMSIS-DSP提供了丰富的优化选项,但使用不当反而会降低效率。

4.3.1 定点与浮点的选择

Cortex-M4F/M7/M33等内核带有FPU,浮点运算速度较快,但功耗高于定点运算。对于电池供电设备,建议使用Q15或Q31定点格式。CMSIS-DSP的 arm_rfft_fast_q15 比浮点版本快约40%,功耗降低约30%。但定点FFT需要额外的Q15格式转换和饱和处理,代码复杂度增加。

常见误区:不要盲目使用浮点FFT。如果ADC是12位,信号动态范围有限,Q15格式(16位)完全足够。浮点FFT的额外精度在大多数嵌入式场景中是无意义的,只会增加功耗和内存占用。

4.3.2 分帧处理与数据复用

特征提取通常采用分帧(Framing)方式:每帧N个样本,帧与帧之间可能有重叠(Overlap)。重叠率越高,特征的时间分辨率越高,但计算量也越大。低功耗设计中,建议采用50%重叠,并使用滑动窗口技术复用上一帧的部分FFT结果。CMSIS-DSP的 arm_rfft_fast_f32 支持原地运算(in-place),可以节省内存。

4.3.3 硬件加速与DMA

CMSIS-DSP底层利用ARM的SIMD指令(如SMLAD、SSAT)和可选的FPU加速。在Cortex-M7上,还可以使用双精度FPU。此外,利用DMA将ADC数据直接传输到内存,避免CPU参与数据搬运,可以显著降低功耗。在特征计算期间,CPU可以进入睡眠模式,由DMA完成数据采集。

4.3.4 常见误区总结

误区后果正确做法
忽略直流分量直接做FFT频谱0Hz处出现巨大峰值,掩盖低频信号先减去均值,或使用高通滤波器
FFT点数N与采样率不匹配频率分辨率不足或频谱混叠确保N ≥ 2 * fs / f_min,且满足奈奎斯特定理
使用矩形窗频谱泄漏严重,旁瓣干扰使用汉宁窗或汉明窗,CMSIS-DSP提供现成函数
每帧都重新计算窗函数浪费CPU周期预先计算窗函数并存储在Flash中
特征提取与分类器耦合过紧算法升级困难设计独立特征提取模块,输出标准化特征向量

4.4 本章总结与工程要点

时域特征与频域特征各有不可替代的价值。时域特征计算快、物理意义直观,适合实时监控和事件触发;频域特征精度高、抗干扰能力强,适合离线分析和故障诊断。在CMSIS-DSP框架下,两者可以无缝衔接:先用 arm_mean_f32 和 arm_var_f32 做快速筛查,当检测到异常时,再调用 arm_rfft_fast_f32 进行频谱分析。

低功耗设计的核心原则是"按需计算":不要每帧都计算所有特征,而是根据应用场景选择最有效的特征子集。例如,在持续监测场景中,可以只计算均值和方差,每100帧才计算一次FFT;在事件驱动场景中,使用峰值检测作为唤醒源,仅在事件发生时启动完整特征提取。

最后,务必验证CMSIS-DSP函数在目标MCU上的实际性能。CMSIS-DSP提供了 arm_cortexM7l_math.lib 等预编译库,但不同编译选项(如优化等级、是否使用FPU)会影响性能。建议使用 DWT->CYCCNT 寄存器测量函数执行周期数,确保满足实时性要求。