2、音频基础:声音的数字化、采样率、位深、声道、频谱与时域特征,以及人耳感知特性

在进入 STM32 麦克风采集与 MFCC 特征提取之前,必须先建立扎实的音频基础认知。声音本质上是空气压力的周期性变化,而嵌入式系统只能处理离散的数字信号。从模拟声波到数字比特流的转换过程,决定了后续关键词识别系统的上限——如果采样率不足或位深不够,再优秀的神经网络也无法从残缺的数据中恢复信息。本章将系统梳理声音数字化的四个核心参数(采样率、位深、声道数、采样格式),对比时域与频域两种分析视角,并深入探讨人耳感知特性如何指导特征工程的设计。这些知识将直接决定 STM32 上麦克风驱动配置、DMA 缓冲区大小以及 MFCC 滤波器组参数的选择。

音频数字化与感知特征链路 模拟声波 连续压力变化 频率 20Hz~20kHz 采样保持 采样率 fs 奈奎斯特 fs ≥ 2fmax 量化编码 位深 16bit/24bit 动态范围 6.02N+1.76dB 数字音频流 PCM 编码 I2S/TDM 传输 时域特征 • 短时能量:音量/端点检测 • 过零率:清音/浊音区分 • 幅值包络:语音起止边界 • 自相关:基频估计 频域特征 • FFT 频谱:频率成分分布 • 频谱质心:音色明亮度 • 谱熵:语音/噪声区分 • MFCC:Mel 倒谱系数 人耳感知特性 • Mel 刻度:非线性频率感知 • 掩蔽效应:强音掩盖弱音 • 响度感知:dB SPL 对数关系 • 临界频带:听觉滤波器组 STM32 关键词识别特征工程 采样率 16kHz · 位深 16bit · 单声道 · 帧长 25ms · 帧移 10ms · MFCC 13维

2.1 声音数字化的核心参数

2.1.1 采样率:时间轴的离散化

采样率(Sample Rate)决定了每秒从连续模拟信号中抽取的样本点数,单位是 Hz。根据奈奎斯特采样定理,要无失真地重建原始信号,采样率必须至少为信号最高频率分量的两倍。人耳听觉范围约为 20Hz~20kHz,因此 CD 音质采用 44.1kHz 采样率,留出约 2.05kHz 的过渡带余量。对于语音关键词识别场景,人类语音的主要能量集中在 300Hz~3.4kHz(电话语音带宽),因此 16kHz 采样率是嵌入式语音识别的黄金选择——既能覆盖语音全部有效频带,又比 44.1kHz 减少约 63% 的数据量,显著降低 STM32 的存储与计算压力。

工程要点:STM32 的 I2S 外设支持多种采样率配置,但实际采样率由系统时钟分频决定。例如使用 16kHz 采样率时,若主时钟为 8MHz,则分频系数为 500。务必使用逻辑分析仪或示波器实测 I2S 的 WS(字选择)引脚频率,确认实际采样率与预期偏差小于 ±1%,否则 MFCC 滤波器组的频率映射会产生系统性偏移。

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 的计算流程将在后续章节详细展开。
经验之谈:在 STM32 上做实时 FFT 时,建议使用 CMSIS-DSP 的 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),这一操作不仅压缩了动态范围,还使得特征对输入信号的全局增益不敏感——无论说话人离麦克风近还是远,对数域的特征差异被显著缩小。

常见误区:有些开发者为了省事,直接对 FFT 幅度谱取对数,而不经过 Mel 滤波器组。这种做法虽然也能压缩动态范围,但丢失了人耳临界频带的频率分辨率特性,导致识别准确率下降 5~10%。Mel 滤波器组是 MFCC 的核心,不可省略。

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 默认在上升沿采样,导致最高位(符号位)被错误读取。

实际操作步骤:

  1. 修改 I2S 配置,将 I2S_InitStruct.I2S_CPOL = I2S_CPOL_LOW,使数据在时钟上升沿稳定。
  2. 在 DMA 接收回调中,对每帧数据减去直流分量(计算帧内平均值并扣除)。
  3. 使用定时器测量 I2S 的 WS 引脚频率,实测为 16.02kHz,偏差 0.125%,在可接受范围内。
  4. 录制 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 是语音识别标准配置