2、音频基础:声音的数字化、采样率、位深、声道、频谱与时域特征,以及人耳感知特性
在进入 STM32 麦克风采集与 MFCC 特征提取之前,必须先建立扎实的音频基础认知。声音本质上是空气压力的周期性变化,而嵌入式系统只能处理离散的数字信号。从模拟声波到数字比特流的转换过程,决定了后续关键词识别系统的上限——如果采样率不足或位深不够,再优秀的神经网络也无法从残缺的数据中恢复信息。本章将系统梳理声音数字化的四个核心参数(采样率、位深、声道数、采样格式),对比时域与频域两种分析视角,并深入探讨人耳感知特性如何指导特征工程的设计。这些知识将直接决定 STM32 上麦克风驱动配置、DMA 缓冲区大小以及 MFCC 滤波器组参数的选择。
2.1 声音数字化的核心参数
2.1.1 采样率:时间轴的离散化
采样率(Sample Rate)决定了每秒从连续模拟信号中抽取的样本点数,单位是 Hz。根据奈奎斯特采样定理,要无失真地重建原始信号,采样率必须至少为信号最高频率分量的两倍。人耳听觉范围约为 20Hz~20kHz,因此 CD 音质采用 44.1kHz 采样率,留出约 2.05kHz 的过渡带余量。对于语音关键词识别场景,人类语音的主要能量集中在 300Hz~3.4kHz(电话语音带宽),因此 16kHz 采样率是嵌入式语音识别的黄金选择——既能覆盖语音全部有效频带,又比 44.1kHz 减少约 63% 的数据量,显著降低 STM32 的存储与计算压力。
2.1.2 位深:幅值轴的量化精度
位深(Bit Depth)表示每个采样点用多少比特来量化幅值。16bit 量化提供 65536 个离散电平,动态范围理论值为 6.02×16+1.76 ≈ 98dB;24bit 则达到 146dB。语音识别场景中,16bit 已足够——环境噪声通常在 30~50dB SPL,而正常对话在 60~70dB SPL,98dB 的动态范围完全覆盖。更高的位深只会增加存储和传输开销,对识别准确率提升微乎其微。
量化过程中会产生量化噪声,其功率与量化步长成正比。对于 16bit 系统,量化信噪比(SQNR)约为 98dB,远高于麦克风阵列自身的信噪比(通常 60~70dB),因此量化噪声不会成为系统瓶颈。但在 STM32 内部处理时,需要注意:如果使用定点数运算,MFCC 计算过程中的中间变量需要足够的位宽(如 Q15 格式配合 32bit 累加器),否则截断误差会累积。
2.1.3 声道数与采样格式
声道数直接影响数据吞吐量。单声道(Mono)每帧数据量为 采样率×位深/8 字节/秒;双声道(Stereo)则翻倍。对于关键词识别,单声道完全足够——人声定位不是本系统的目标。STM32 的 I2S 接口通常配置为单声道接收模式,DMA 每次传输 16bit 数据,缓冲区大小需按帧长计算:16kHz 采样率、25ms 帧长对应 400 个采样点,即 800 字节。
常见的采样格式包括:有符号 16bit 整数(PCM S16LE,最常用)、有符号 24bit 整数(需 32bit 容器存储)、32bit 浮点(适合后期处理但占用资源大)。STM32 的 SAI/I2S 外设原生支持 16bit 和 32bit 帧格式,推荐使用 16bit 有符号整数,与 CMSIS-DSP 库的 q15_t 类型无缝对接。
| 参数 | 电话语音 | CD 音质 | STM32 关键词识别推荐 |
|---|---|---|---|
| 采样率 | 8kHz | 44.1kHz | 16kHz |
| 位深 | 8bit | 16bit | 16bit |
| 声道数 | 单声道 | 双声道 | 单声道 |
| 数据率 | 8KB/s | 176.4KB/s | 32KB/s |
| 频率范围 | 300~3.4kHz | 20~20kHz | 0~8kHz |
2.2 时域特征与频域特征
2.2.1 时域特征:直观但信息有限
时域特征直接对采样点序列进行分析,计算量小,适合在 STM32 上做实时预处理。最常用的三个时域特征包括:
- 短时能量:对一帧内所有采样点求平方和。语音段能量显著高于静音段,可用于端点检测(VAD)。但能量对幅值敏感,不同说话人距离麦克风的远近会导致能量差异巨大,因此需要配合自适应阈值。
- 过零率(ZCR):一帧内信号符号变化的次数。清音(如 /s/、/f/)的过零率高,浊音(如 /a/、/i/)的过零率低。ZCR 对噪声敏感,需先做高通滤波去除直流偏置。
- 幅值包络:通过滑动窗口取局部最大值,反映语音的起止边界和节奏信息。包络提取可用简单的峰值检测或希尔伯特变换(计算量较大,不推荐在 MCU 上使用)。
时域特征的局限性在于无法区分相同能量但不同频率成分的信号。例如,100Hz 的纯音和 1000Hz 的纯音如果幅值相同,其短时能量完全一致,但人耳感知截然不同。因此,仅靠时域特征无法实现鲁棒的关键词识别。
2.2.2 频域特征:揭示频率成分
频域分析通过傅里叶变换(FFT)将时域信号分解为不同频率分量的幅度和相位。STM32F4 系列内置硬件 FPU 和 CMSIS-DSP 库,可以高效执行 256 点或 512 点 FFT。对于 16kHz 采样率、25ms 帧长(400 点),通常补零到 512 点做 FFT,频率分辨率为 16000/512 = 31.25Hz。
从频谱中可以提取多种高级特征:
- 频谱质心:频谱的能量重心,反映音色的明亮程度。语音中元音的频谱质心通常在 500~2000Hz 之间。
- 谱熵:频谱的平坦程度。语音的谱熵较低(能量集中在少数频带),白噪声的谱熵接近最大值。可用于语音/噪声判别。
- Mel 频率倒谱系数(MFCC):模拟人耳听觉特性的特征参数,是当前语音识别的主流前端特征。MFCC 的计算流程将在后续章节详细展开。
arm_rfft_fast_f32 函数,它针对 Cortex-M4/M7 做了优化。512 点 FFT 在 168MHz 主频下约耗时 50μs,远小于 10ms 的帧移间隔,不会成为系统瓶颈。
2.3 人耳感知特性与 Mel 刻度
2.3.1 人耳的非线性频率感知
人耳对频率的感知不是线性的。在低频段(<1kHz),人耳对频率变化非常敏感,能分辨 2~3Hz 的差异;在高频段(>4kHz),分辨能力急剧下降,可能需要数百赫兹的差异才能被察觉。Stevens 和 Volkmann 在 1937 年提出了 Mel 刻度(Mel Scale),将物理频率映射到感知频率:
Mel(f) = 2595 × log10(1 + f / 700)
这一公式意味着:在 0~1kHz 区间,Mel 频率与物理频率近似线性;在 1kHz 以上,Mel 频率增长放缓。MFCC 特征的核心思想就是:在 Mel 刻度上均匀分布滤波器组,从而模拟人耳的非线性频率分辨率。对于 STM32 实现,通常使用 20~40 个 Mel 滤波器组,覆盖 0~8kHz 频带。
2.3.2 掩蔽效应与临界频带
掩蔽效应是指一个强音信号会提高人耳对邻近频率弱音的听觉阈值。例如,在 1kHz 的 80dB 纯音旁边,2kHz 的 40dB 纯音可能完全听不见。掩蔽效应在频域上表现为以掩蔽声频率为中心的三角形掩蔽曲线,其带宽称为临界频带(Critical Band)。人耳共有约 24 个临界频带,每个频带的宽度在低频约 100Hz,高频可达数千赫兹。
MFCC 滤波器组的设计正是基于临界频带的概念——每个 Mel 滤波器的带宽近似对应一个临界频带。这种设计使得 MFCC 特征对频率的微小偏移不敏感,增强了系统对说话人差异和环境变化的鲁棒性。
2.3.3 响度感知与对数压缩
人耳对响度的感知遵循韦伯-费希纳定律:主观响度与声强的对数成正比。因此,MFCC 计算中对 Mel 滤波器组输出的能量取对数(log),这一操作不仅压缩了动态范围,还使得特征对输入信号的全局增益不敏感——无论说话人离麦克风近还是远,对数域的特征差异被显著缩小。
2.4 案例:16kHz/16bit 单声道音频配置的完整验证
假设我们使用 STM32F407 开发板搭配 INMP441 数字 MEMS 麦克风(I2S 接口),目标是采集 16kHz/16bit 单声道音频用于关键词识别。以下是完整的配置与验证流程:
背景与约束:INMP441 输出 24bit 数据,但 STM32 的 I2S 外设可配置为 16bit 帧格式,此时麦克风会自动截断低 8 位。系统主频 168MHz,I2S 使用 PLLI2S 作为时钟源。目标:确认实际采样率偏差小于 ±1%,且数据无直流偏置。
初始现象:首次配置后,通过串口打印采样数据,发现波形幅值正常但存在约 200mV 的直流偏置,且 FFT 频谱在 0Hz 处有异常高能量峰。
分析判断:直流偏置可能来自两个原因:一是 INMP441 的 PDM 解码器输出未做高通滤波;二是 I2S 配置为左对齐格式时,数据位与时钟相位不匹配导致符号位错误。通过示波器观察 I2S 的 SD 引脚,发现数据在时钟下降沿变化,而 STM32 默认在上升沿采样,导致最高位(符号位)被错误读取。
实际操作步骤:
- 修改 I2S 配置,将
I2S_InitStruct.I2S_CPOL = I2S_CPOL_LOW,使数据在时钟上升沿稳定。 - 在 DMA 接收回调中,对每帧数据减去直流分量(计算帧内平均值并扣除)。
- 使用定时器测量 I2S 的 WS 引脚频率,实测为 16.02kHz,偏差 0.125%,在可接受范围内。
- 录制 1kHz 正弦波测试信号,计算 FFT 频谱,确认峰值位于第 32 个频点(512 点 FFT,频率分辨率 31.25Hz,32×31.25=1000Hz)。
结果对比:修正后,直流偏置从 200mV 降至 2mV 以下,0Hz 处能量峰降低 40dB。1kHz 正弦波的频谱峰值位置准确,幅值误差小于 0.5dB。
风险与代价:修改 I2S 时钟极性后,需要重新验证与麦克风的时序兼容性;直流扣除操作增加了约 5μs 的处理时间,对 10ms 帧移无影响。
复盘经验:I2S 的时钟极性和相位是嵌入式音频最常见的坑。建议在硬件调试阶段就使用逻辑分析仪抓取 I2S 波形,确认数据建立/保持时间满足麦克风数据手册要求。此外,INMP441 的 24bit 数据在 16bit 模式下会截断低 8 位,这相当于引入了约 0.4% 的量化误差,对 MFCC 特征的影响可以忽略。
2.5 常见误区与总结
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 采样率越高越好 | 数据量增大,MCU 存储和计算压力上升,功耗增加 | 语音识别选 16kHz,音乐场景才需要 44.1kHz |
| 位深越高识别越准 | 24bit 数据在 16bit MCU 上处理效率低,收益甚微 | 16bit 足够,重点优化前端信噪比 |
| 忽略直流偏置 | FFT 频谱 0Hz 处能量异常,影响低频 Mel 滤波器输出 | 每帧做直流扣除或加高通滤波器 |
| 直接对幅度谱取 log | 丢失临界频带分辨率,识别率下降 | 必须经过 Mel 滤波器组 |
| 帧长/帧移随意设置 | 帧长过短频率分辨率差,帧移过长丢失动态信息 | 帧长 25ms,帧移 10ms 是语音识别标准配置 |