2、声音检测基础:音频信号特征、采样率、FFT、梅尔频谱与MFCC的基本概念

在TinyML声音检测项目中,无论是关键词唤醒、异常声音识别还是环境声分类,其本质都是将人耳可听的声波转化为机器可理解的数值特征。本章将系统梳理从原始音频波形到MFCC特征向量的完整链路,重点剖析采样率、FFT、梅尔滤波器组与MFCC的核心数学原理与工程取舍。理解这些基础概念,是后续在STM32、ESP32与Arduino上进行模型部署与内存优化的前提。

声音检测特征提取链路 原始音频波形 连续声压信号 单位: Pa 或 dB 采样与量化 采样率 fs (Hz) 位深 (16bit/24bit) 分帧与加窗 帧长 20-40ms 帧移 10-20ms FFT频谱 N点FFT 幅度谱/功率谱 梅尔滤波器组 三角带通滤波器 (26-40个) 模拟人耳非线性感知 对数压缩 + DCT 取log(能量) 离散余弦变换 → MFCC 特征向量 典型MFCC特征: 13维系数 × 每帧 → 用于TinyML模型输入

2.1 音频信号的核心属性与采样定理

声音本质是空气压力的周期性波动,在数字系统中必须通过模数转换器(ADC)将其离散化。两个最关键的参数是采样率(Sample Rate)与位深(Bit Depth)。采样率决定了时间分辨率,位深决定了幅度分辨率。根据奈奎斯特采样定理,采样率必须至少为信号最高频率的两倍,才能无失真地重建原始波形。例如,人声主要能量集中在300Hz-3.4kHz,电话系统采用8kHz采样率即可满足清晰通话需求;而音乐或环境声分类任务,通常需要16kHz或44.1kHz采样率以保留更多高频细节。

工程经验:在TinyML项目中,采样率并非越高越好。更高的采样率意味着每秒需要处理更多的数据点,直接导致内存占用和计算量成倍增长。对于STM32F4系列(主频168MHz,RAM 192KB),推荐使用16kHz采样率、16bit量化,单帧数据量约为320字节(20ms),既满足语音识别需求,又不会压垮有限的资源。

2.2 分帧、加窗与短时傅里叶变换

音频信号是非平稳的,其统计特性随时间变化。直接对整个信号做傅里叶变换会丢失时间信息。因此,工程上采用短时傅里叶变换(STFT):将长信号切割成短帧(通常20-40ms),假设帧内信号平稳,再对每一帧做FFT。分帧时相邻帧之间通常有50%的重叠(帧移10-20ms),以避免帧边界处的信息丢失。

加窗是分帧后必须进行的操作。直接截断会产生频谱泄漏,即能量从主频泄漏到旁瓣。汉明窗(Hamming Window)是最常用的窗函数,其表达式为:

w[n] = 0.54 - 0.46 * cos(2πn / (N-1)),  0 ≤ n ≤ N-1

其中N为帧长。加窗后,帧两端的幅度被平滑衰减,显著抑制了频谱泄漏。FFT的点数通常取2的幂次(如256、512、1024),便于硬件高效计算。对于16kHz采样率、20ms帧长,N=320点,实际FFT可补零至512点以提高频率分辨率。

参数 典型值 对TinyML的影响
采样率 16kHz 每秒16000个采样点,内存占用与计算量直接相关
帧长 20ms (320点) 频率分辨率50Hz,适合语音分析
帧移 10ms (160点) 每秒产生100帧,特征序列长度影响模型推理延迟
FFT点数 512 频率分辨率31.25Hz,计算量约O(N log N)
梅尔滤波器数 26 每个滤波器输出一个能量值,降低特征维度
MFCC系数 13 最终特征维度,直接影响模型输入层大小

2.3 梅尔频谱与人耳听觉特性

人耳对频率的感知是非线性的:对低频变化敏感,对高频变化迟钝。梅尔刻度(Mel Scale)正是模拟这种听觉特性而设计的非线性频率刻度。其转换公式为:

mel(f) = 2595 * log10(1 + f / 700)

梅尔滤波器组是一组三角带通滤波器,在梅尔刻度上等间距排列,覆盖人耳敏感的频率范围(通常为0-8kHz)。每个滤波器对FFT幅度谱进行加权求和,得到该频带内的能量。这一过程将高维的FFT频谱(如256个频点)压缩为低维的梅尔频谱(如26个频带),大幅减少了数据量,同时保留了与听觉感知相关的关键信息。

实战建议:在ESP32上部署时,由于内置ADC精度有限(12bit),建议外接I2S数字麦克风(如INMP441),以获得更干净的音频信号。梅尔滤波器组的系数可以预先计算并存储为查找表,避免在MCU上重复计算三角函数,节省大量CPU周期。

2.4 MFCC:从梅尔频谱到倒谱系数

MFCC(Mel-Frequency Cepstral Coefficients)是在梅尔频谱基础上进一步处理得到的特征。其计算步骤为:先对梅尔频谱取对数(模拟人耳对响度的对数感知),再进行离散余弦变换(DCT)。DCT的作用是去相关,将能量集中到前几个系数中。通常取前13个系数(不含第0个直流分量),即可捕获语音信号的主要特征。

MFCC的物理意义可以理解为:它描述了频谱包络的形状,而非精细的谐波结构。在语音识别中,频谱包络对应声道形状,是区分不同音素的关键。对于TinyML应用,MFCC的维度远低于原始波形(例如一帧320个采样点压缩为13个系数),这使得神经网络模型的输入层可以设计得非常紧凑,适合在资源受限的MCU上运行。

常见误区:不要盲目追求高阶MFCC系数。在MCU上,每增加一个特征维度,模型参数和推理计算量都会线性增长。对于简单的关键词识别(如"Hey STM32"),13维MFCC已经足够;对于更复杂的声学场景分类,可考虑使用梅尔频谱的26维能量值直接作为特征,有时效果优于MFCC,且省去DCT计算。

2.5 案例拆解:在STM32上实现实时MFCC提取

以STM32F446RE(Cortex-M4F,带FPU)为例,设计一个实时关键词识别系统的前端特征提取模块。系统约束:主频180MHz,RAM 128KB,需要同时处理音频采集和特征计算,预留足够资源给神经网络推理。

初始目标:每10ms输出一组13维MFCC特征,延迟不超过5ms。关键参数选择:采样率16kHz,帧长320点(20ms),帧移160点(10ms),FFT点数512,梅尔滤波器26个。

实现步骤:

  1. 音频采集:使用I2S接口连接数字麦克风,DMA双缓冲模式,避免CPU干预数据搬运。每个DMA中断触发一次处理。
  2. 加窗与FFT:利用CMSIS-DSP库的arm_cfft_f32函数,该函数针对Cortex-M4F的FPU做了深度优化,512点FFT仅需约120μs。
  3. 梅尔滤波:预计算26个滤波器的系数表(每个滤波器约20个非零系数),存储为const数组放在Flash中。计算时逐滤波器累加,总耗时约80μs。
  4. 对数与DCT:对数运算使用logf,DCT使用arm_dct4_f32,两者合计约60μs。

性能结果:单帧总耗时约260μs,远小于10ms的帧移间隔,CPU占用率仅2.6%,剩余资源可全部用于神经网络推理。内存占用方面,FFT工作缓冲区约4KB(512点复数),梅尔能量数组26×4B=104B,MFCC数组13×4B=52B,整体特征提取模块内存开销小于5KB。

复盘经验:在MCU上实现特征提取,关键在于预计算和利用硬件加速单元。所有滤波器系数、窗函数、DCT旋转因子都应提前算好存入Flash,运行时只做乘加运算。此外,使用定点数(Q15格式)可以进一步降低计算开销,但会牺牲一定精度,需根据模型容错性权衡。

2.6 常见误区与总结

在TinyML声音检测项目中,特征提取环节的常见错误包括:

  • 采样率与模型不匹配:训练模型时使用44.1kHz采样,部署时却用16kHz,导致特征分布偏移,准确率骤降。必须保证训练与部署的采样率完全一致。
  • 忽略直流分量与工频干扰:音频信号中常混有50Hz/60Hz电源噪声,应在预处理阶段加入高通滤波器(截止频率100Hz),否则FFT低频段能量会被污染。
  • 帧移过大导致特征丢失:帧移超过20ms时,快速变化的辅音(如"t"、"k")可能被完全错过,影响识别精度。
  • 过度依赖MFCC:对于非语音声音(如玻璃破碎声、机器异常声),梅尔频谱的原始能量分布往往比MFCC更具区分度,应根据任务类型选择特征。