2、音频基础与预处理:采样率、位深、帧、窗函数、MFCC特征提取的原理与实现

TinyML 多关键词识别系统的输入并非原始波形,而是经过一系列数字信号处理(DSP)步骤后得到的特征向量。理解音频的数字化表示、时频域转换以及特征压缩方法,是构建高效、低功耗命令词分类器的前提。本章将系统讲解从连续声波到 MFCC 特征矩阵的完整链路,并给出可在微控制器上运行的实现要点。

音频预处理与 MFCC 特征提取链路 连续声波 采样率 fs 位深 N bits → PCM 数字序列 分帧 帧长 25-50ms 帧移 10-20ms 重叠 50%-75% 加窗 Hamming / Hanning 抑制频谱泄漏 旁瓣衰减 FFT 频谱 N=256/512 点 幅度谱 |X[k]| 频率分辨率 fs/N Mel 滤波器组 三角带通滤波器 × 26-40 Mel 刻度:mel = 2595·log₁₀(1+f/700) 对数 + DCT log 压缩动态范围 DCT → MFCC 系数 MFCC 特征矩阵 帧数 × 系数维度 如 32×13 输入 TinyML 分类模型(DS-CNN / LSTM) 典型参数:16kHz / 16bit / 单声道

2.1 数字音频基础:采样率与位深

麦克风拾取的声波是连续时间、连续幅度的模拟信号。微控制器内部的 ADC(模数转换器)按固定时间间隔对信号幅度进行采样,并将幅度离散化为有限位数的整数值,这一过程称为 PCM(脉冲编码调制)。采样率(Sample Rate)决定时间分辨率,位深(Bit Depth)决定幅度分辨率。

  • 采样率(fs):每秒采样次数,单位 Hz。根据奈奎斯特定理,可无混叠表示的最高频率为 fs/2。语音命令词的能量主要集中在 300Hz–4kHz,因此 TinyML 系统常用 16kHz 采样率,兼顾清晰度与计算量。
  • 位深:每个采样点的比特数。16bit 提供 96dB 动态范围,足以覆盖从耳语到正常说话的声压变化。8bit 虽省内存但量化噪声明显,不推荐用于关键词识别。
  • 声道数:TinyML 设备通常使用单声道,避免多通道同步与内存开销。
工程经验:在 STM32F4 系列上配置 I2S 接口读取数字麦克风(如 INMP441)时,DMA 双缓冲机制可避免 CPU 频繁中断。每帧 320 个采样点(20ms @16kHz)恰好匹配 16bit 单声道 DMA 传输粒度。

2.2 分帧与加窗:从连续流到短时平稳片段

语音信号具有短时平稳性——在 10-50ms 内可视为平稳随机过程。分帧将连续采样流切分为固定长度的帧,帧移(Hop Length)控制相邻帧的重叠程度。常用配置为帧长 30ms(480 点 @16kHz)、帧移 20ms(320 点),重叠率约 33%。

直接对矩形截断的帧做 FFT 会产生频谱泄漏——主瓣能量扩散到旁瓣,掩盖弱频率分量。窗函数在帧两端平滑衰减,抑制截断效应。Hamming 窗和 Hanning 窗是语音处理最常用的两种窗,其主瓣宽度与旁瓣衰减特性略有差异。

窗类型主瓣宽度旁瓣衰减适用场景
矩形窗最窄-13dB瞬态分析,不推荐用于频谱
Hamming较宽-43dB语音识别主流选择
Hanning中等-31dB通用频谱分析
Blackman最宽-58dB强干扰下的精细频谱

加窗公式为:y[n] = x[n] · w[n],其中 Hamming 窗定义为:

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

2.3 MFCC 特征提取:从频谱到倒谱系数

MFCC(Mel-Frequency Cepstral Coefficients)模拟人耳对频率的非线性感知。人耳对低频变化敏感、高频变化迟钝,Mel 刻度将线性频率映射到感知频率:

mel = 2595 × log₁₀(1 + f / 700)

提取流程包含四个关键步骤:

  1. FFT 频谱计算:对加窗后的每帧做 N 点 FFT(N 通常取 256 或 512),取幅度谱的平方得到功率谱。
  2. Mel 滤波器组:在 Mel 刻度上均匀布置 M 个三角带通滤波器(通常 M=26~40),每个滤波器对功率谱加权求和,得到 M 个能量值。
  3. 对数压缩:对每个滤波器输出取自然对数,模拟人耳对音量的对数感知,同时压缩动态范围。
  4. 离散余弦变换(DCT):对 M 个对数能量做 DCT,取前 K 个系数(通常 K=13),去除相关性并降维。
实现要点:在 Cortex-M4 内核上,FFT 可使用 CMSIS-DSP 库的 arm_rfft_fast_f32 函数,计算 512 点 FFT 仅需约 0.5ms(@168MHz)。Mel 滤波器组的权重可预先计算并存储为 uint16 定点数,避免运行时浮点乘法。

2.4 案例拆解:16kHz 语音命令词的 MFCC 参数配置

以“是/否/停止/开始”四词识别为例,设计如下参数方案:

参数项数值设计依据
采样率16 kHz覆盖语音主要频带,FFT 点数适中
帧长 / 帧移30ms / 20ms短时平稳假设,时间分辨率足够
FFT 点数512频率分辨率 31.25Hz,满足 Mel 滤波需求
Mel 滤波器数26平衡特征维度与计算量
MFCC 系数13去除高阶倒谱系数,保留主要声学信息
帧数(1s 音频)49 帧1s / 20ms + 1
特征矩阵尺寸49 × 13输入模型前可裁剪为 32×13

实际部署中的关键调整:在 Arduino Nano 33 BLE Sense 上,由于内存仅 256KB,将 MFCC 计算改为逐帧流式处理——每采集 320 个新采样点,立即计算该帧的 13 维 MFCC,存入环形缓冲区。这样避免了存储完整 PCM 波形,峰值内存占用从 49×320×2 字节降至 49×13×4 字节(约 2.5KB)。

常见误区:不要直接对整段音频做一次 FFT 提取特征。语音是非平稳信号,全局频谱会模糊时间信息,导致“是”和“不”这类短促词无法区分。必须保留时间维度的帧序列结构。

2.5 常见误区与调优建议

  • 采样率过高:44.1kHz 采样率对语音识别是浪费,增加 FFT 计算量和内存占用,且高频段多为噪声。
  • 忽略预加重:语音信号的高频分量幅度较低,通常在分帧前做一阶高通滤波(y[n]=x[n]-0.97x[n-1])提升高频能量,使频谱更平坦。此步骤可提高 MFCC 对辅音(如“停”的 t 音)的区分度。
  • MFCC 系数选择不当:前 13 个系数包含声道形状信息,高阶系数包含激励细节。对于命令词识别,13 维已足够;若环境噪声大,可增加第 0 阶系数(反映整体能量)辅助 VAD(语音活动检测)。
  • 未做归一化:不同说话人的音量差异会导致 MFCC 幅度偏移。建议对每帧特征做均值归一化,或对整段特征矩阵做全局标准化,提升模型鲁棒性。
调优实战:当模型在安静环境准确率 95%、在嘈杂环境降至 70% 时,首先检查预处理链路——在频谱图上观察是否有明显的环境噪声底噪。解决方案:在 Mel 滤波前增加谱减法降噪,或使用高通滤波器(截止频率 100Hz)去除低频隆隆声。若仍不达标,可尝试将 MFCC 替换为 log-mel 频谱(不进行 DCT),保留更多原始信息供深度模型学习。

2.6 总结与工程落地清单

音频预处理是 TinyML 关键词识别系统的“感知前端”,其质量直接决定分类器的上限。核心要点可归纳为:

  • 采样率 16kHz、位深 16bit、单声道是 TinyML 语音任务的黄金配置。
  • 分帧(30ms/20ms)+ Hamming 窗是标准操作,保证短时平稳与频谱质量。
  • MFCC 提取链路:FFT → Mel 滤波 → log → DCT,输出 13 维系数。
  • 流式处理是微控制器上的内存优化关键,避免整段缓存。
  • 预加重与归一化是常被忽略但性价比极高的两个步骤。