2、音频基础与预处理:采样率、位深、帧、窗函数、MFCC特征提取的原理与实现
TinyML 多关键词识别系统的输入并非原始波形,而是经过一系列数字信号处理(DSP)步骤后得到的特征向量。理解音频的数字化表示、时频域转换以及特征压缩方法,是构建高效、低功耗命令词分类器的前提。本章将系统讲解从连续声波到 MFCC 特征矩阵的完整链路,并给出可在微控制器上运行的实现要点。
2.1 数字音频基础:采样率与位深
麦克风拾取的声波是连续时间、连续幅度的模拟信号。微控制器内部的 ADC(模数转换器)按固定时间间隔对信号幅度进行采样,并将幅度离散化为有限位数的整数值,这一过程称为 PCM(脉冲编码调制)。采样率(Sample Rate)决定时间分辨率,位深(Bit Depth)决定幅度分辨率。
- 采样率(fs):每秒采样次数,单位 Hz。根据奈奎斯特定理,可无混叠表示的最高频率为 fs/2。语音命令词的能量主要集中在 300Hz–4kHz,因此 TinyML 系统常用 16kHz 采样率,兼顾清晰度与计算量。
- 位深:每个采样点的比特数。16bit 提供 96dB 动态范围,足以覆盖从耳语到正常说话的声压变化。8bit 虽省内存但量化噪声明显,不推荐用于关键词识别。
- 声道数:TinyML 设备通常使用单声道,避免多通道同步与内存开销。
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)
提取流程包含四个关键步骤:
- FFT 频谱计算:对加窗后的每帧做 N 点 FFT(N 通常取 256 或 512),取幅度谱的平方得到功率谱。
- Mel 滤波器组:在 Mel 刻度上均匀布置 M 个三角带通滤波器(通常 M=26~40),每个滤波器对功率谱加权求和,得到 M 个能量值。
- 对数压缩:对每个滤波器输出取自然对数,模拟人耳对音量的对数感知,同时压缩动态范围。
- 离散余弦变换(DCT):对 M 个对数能量做 DCT,取前 K 个系数(通常 K=13),去除相关性并降维。
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)。
2.5 常见误区与调优建议
- 采样率过高:44.1kHz 采样率对语音识别是浪费,增加 FFT 计算量和内存占用,且高频段多为噪声。
- 忽略预加重:语音信号的高频分量幅度较低,通常在分帧前做一阶高通滤波(y[n]=x[n]-0.97x[n-1])提升高频能量,使频谱更平坦。此步骤可提高 MFCC 对辅音(如“停”的 t 音)的区分度。
- MFCC 系数选择不当:前 13 个系数包含声道形状信息,高阶系数包含激励细节。对于命令词识别,13 维已足够;若环境噪声大,可增加第 0 阶系数(反映整体能量)辅助 VAD(语音活动检测)。
- 未做归一化:不同说话人的音量差异会导致 MFCC 幅度偏移。建议对每帧特征做均值归一化,或对整段特征矩阵做全局标准化,提升模型鲁棒性。
2.6 总结与工程落地清单
音频预处理是 TinyML 关键词识别系统的“感知前端”,其质量直接决定分类器的上限。核心要点可归纳为:
- 采样率 16kHz、位深 16bit、单声道是 TinyML 语音任务的黄金配置。
- 分帧(30ms/20ms)+ Hamming 窗是标准操作,保证短时平稳与频谱质量。
- MFCC 提取链路:FFT → Mel 滤波 → log → DCT,输出 13 维系数。
- 流式处理是微控制器上的内存优化关键,避免整段缓存。
- 预加重与归一化是常被忽略但性价比极高的两个步骤。