4、音频信号采集与预处理:麦克风选型、采样率与位深设置、音频数据采集方法、预加重、分帧、加窗等预处理技术
异常声音检测(Anomaly Sound Detection, ASD)在工业设备状态监测、安防监控、智能家居等场景中具有重要应用价值。STM32Cube AI 工具链的核心能力是将训练好的神经网络模型部署到 STM32 系列 MCU 上,但模型性能的上限往往由输入数据的质量决定。本章聚焦于音频信号从物理世界到数字特征的完整链路,涵盖麦克风选型、采样参数配置、数据采集方法以及预加重、分帧、加窗等关键预处理技术。这些环节直接决定了后续特征提取(如 MFCC、Mel 频谱)的有效性,进而影响模型在嵌入式设备上的推理精度与实时性。
4.1 麦克风选型:从传感器端保证信号质量
麦克风是音频采集链路的起点,其性能直接决定了后续数字信号处理的上限。在 STM32 嵌入式系统中,常用的麦克风类型包括模拟驻极体麦克风(ECM)、模拟 MEMS 麦克风以及数字 MEMS 麦克风(PDM 接口)。选型时需要综合考虑灵敏度、信噪比(SNR)、频率响应、功耗以及接口兼容性。
核心原理:麦克风的核心参数包括灵敏度(单位 mV/Pa 或 dBFS)、信噪比(SNR,通常 58-65 dB)、频率响应范围(工业异常声通常集中在 100 Hz - 8 kHz)、最大声压级(SPL,避免削波失真)。对于 STM32 平台,模拟麦克风需要外置运算放大器和 ADC 采样,而数字 PDM 麦克风可直接连接 STM32 的 SAI 或 DFSDM 外设,简化硬件设计。
| 对比维度 | 模拟 ECM | 模拟 MEMS | 数字 PDM MEMS |
|---|---|---|---|
| 接口 | 模拟输出 + 外部ADC | 模拟输出 + 外部ADC | PDM 数字接口(SAI/DFSDM) |
| 信噪比 | 50-60 dB | 58-65 dB | 60-70 dB |
| 抗干扰能力 | 较差(易受EMI) | 中等 | 强(数字传输) |
| 典型型号 | CMA-4544PF-W | ICS-40300 | ICS-43434 / INMP441 |
| STM32适配 | 需外置运放+ADC | 需外置运放+ADC | 直接连接 SAI/DFSDM |
4.2 采样率与位深设置:平衡精度与资源
采样率和位深是音频数字化的两个基本参数。采样率决定了可采集的最高频率分量(奈奎斯特定理),位深决定了动态范围和量化噪声。在嵌入式系统中,这两个参数直接关联到存储开销、计算负载和功耗。
判断方法:对于异常声音检测,需要根据目标声源的频率范围确定采样率。工业设备(如轴承、齿轮箱)的异常声通常集中在 500 Hz - 5 kHz,采用 16 kHz 采样率即可覆盖;若需检测更高频的超声泄漏(如压缩空气泄漏),则需 48 kHz 或更高。位深方面,16 bit 提供 96 dB 动态范围,足以覆盖大多数工业声学场景;24 bit 适用于动态范围极大的环境(如安静实验室中的微弱异常声)。
// STM32CubeMX 中配置 I2S/SAI 采样参数示例
hi2s.Init.AudioFreq = I2S_AUDIOFREQ_16K; // 16 kHz 采样率
hi2s.Init.DataFormat = I2S_DATAFORMAT_16B; // 16 bit 位深
hi2s.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s.Init.Mode = I2S_MODE_MASTER_RX;
hi2s.Init.ClockSource = I2S_CLOCK_SYSCLK;
实战场景:某工业风机异常检测项目,目标频率范围为 200 Hz - 6 kHz。选择 16 kHz 采样率(覆盖 8 kHz 带宽),16 bit 位深。每帧 512 点(32 ms),帧移 256 点(16 ms),每秒产生约 62 帧。每帧数据量 1 KB,双缓冲需 2 KB RAM,在 STM32F446(128 KB RAM)上完全可行。
4.3 音频数据采集方法:DMA 与双缓冲机制
在 STM32 上实现连续音频采集,必须采用 DMA(直接内存访问)方式,避免 CPU 逐样本搬运数据。核心方法是配置 DMA 的双缓冲循环模式(Ping-Pong Buffer),实现采集与处理并行。
操作流程:
- 初始化 I2S/SAI 外设,配置为 DMA 接收模式。
- 配置 DMA 通道为循环模式,设置两个缓冲区(Buffer0 和 Buffer1),每个缓冲区存放一帧数据。
- 使能 DMA 传输完成中断(Half Transfer 和 Transfer Complete)。
- 在 Half Transfer 中断中处理 Buffer0,在 Transfer Complete 中断中处理 Buffer1。
- 处理函数中执行预处理和特征提取,将结果送入推理引擎。
// DMA 双缓冲配置核心代码
static int16_t audio_buffer[2][512]; // 双缓冲,每帧512样本
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s) {
process_audio_frame(audio_buffer[0]); // 处理前半部分
}
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) {
process_audio_frame(audio_buffer[1]); // 处理后半部分
}
案例拆解:某变电站变压器异常声监测系统,使用 STM32L496 + ICS-43434 PDM 麦克风。通过 DFSDM 外设完成 PDM 到 PCM 的转换,输出 16 kHz/16 bit 数据。DMA 双缓冲每帧 512 点,CPU 负载仅占 12%(80 MHz 主频),剩余资源用于 MFCC 特征提取和 CNN 推理。系统连续运行 72 小时无数据丢失,验证了双缓冲机制的可靠性。
4.4 预加重、分帧与加窗:信号预处理三要素
预处理的目标是消除采集过程中的干扰,突出目标信号特征,并为 FFT 分析准备合适的数据格式。三个核心步骤为预加重、分帧和加窗。
核心原理:
- 预加重:语音和机械声信号的高频分量通常能量较低,预加重通过一阶高通滤波器提升高频成分,公式为 y[n] = x[n] - α·x[n-1],α 通常取 0.95-0.97。这有助于后续特征提取时保留高频细节。
- 分帧:音频信号是非平稳的,但在短时间(10-40 ms)内可视为平稳。分帧将连续信号切分为重叠的短帧,帧长 20-40 ms,帧移通常为帧长的 50%(如帧长 32 ms,帧移 16 ms)。
- 加窗:直接对帧信号做 FFT 会产生频谱泄漏。加窗(如 Hamming 窗)可减少帧边缘的不连续性,公式为 w[n] = 0.54 - 0.46·cos(2πn/(N-1))。加窗后的信号为 x_w[n] = x[n]·w[n]。
| 预处理步骤 | 参数选择 | 作用 | STM32实现 |
|---|---|---|---|
| 预加重 | α = 0.95-0.97 | 提升高频分量 | 1次乘加/样本 |
| 分帧 | 帧长 512点@16kHz(32ms) | 短时平稳处理 | 指针偏移操作 |
| 加窗 | Hamming/Hanning | 减少频谱泄漏 | 查表法(预存窗系数) |
常见误区:
- 误区一:跳过预加重。对于机械异常声(如轴承磨损),高频成分往往是关键特征,跳过预加重会导致高频特征被噪声淹没。
- 误区二:帧移过大。帧移超过 50% 会导致帧间信息丢失,影响时序特征的连续性(如 MFCC 的一阶差分)。
- 误区三:窗函数选择不当。矩形窗虽然主瓣窄,但旁瓣衰减慢,频谱泄漏严重;Hamming 窗是默认选择,兼顾主瓣宽度和旁瓣衰减。
- 误区四:忽略直流偏移。部分麦克风电路存在直流偏置,需在预加重前进行去直流处理(减去均值)。
4.5 实战案例:STM32 上的完整预处理链路
以 STM32F746G-DISCO 开发板(内置音频编解码器)为例,实现一个完整的异常声音检测预处理流程。
背景与目标:检测车间空压机异常振动声。目标频率范围 300 Hz - 4 kHz,环境噪声约 65 dB SPL。要求检测延迟小于 200 ms,MCU 负载低于 30%。
关键参数:
- 采样率:16 kHz(覆盖 8 kHz 带宽,满足 4 kHz 目标)
- 位深:16 bit(动态范围 96 dB,足够区分异常声与环境噪声)
- 帧长:512 点(32 ms),帧移 256 点(16 ms)
- 预加重系数:α = 0.96
- 窗函数:Hamming(512 点)
实施步骤:
- 配置 SAI 为 I2S 主接收模式,16 kHz/16 bit,DMA 双缓冲。
- 在 DMA 回调中执行预处理:去直流 → 预加重 → 分帧(指针偏移)→ 加窗(查表)。
- 对加窗后的 512 点数据执行 512 点 FFT(使用 CMSIS-DSP 库的 arm_rfft_fast_f32 函数)。
- 计算 Mel 频谱(40 个滤波器组),输出 40 维特征向量。
- 将特征向量送入 STM32Cube AI 生成的模型进行推理。
结果对比:预处理链路总耗时约 3.2 ms(80 MHz 主频),其中 FFT 占 1.8 ms,预加重+加窗占 0.6 ms,Mel 滤波占 0.8 ms。CPU 负载约 20%(每 16 ms 处理一次),满足实时性要求。相比未做预加重的方案,异常声检测准确率从 82% 提升至 91%,验证了预处理的有效性。
复盘经验:预处理参数并非一成不变,需根据实际声学环境调整。例如,若现场存在 50 Hz 工频干扰,需在预加重前增加高通滤波(截止频率 100 Hz)。建议在开发初期使用 Python 脚本(librosa 库)离线验证预处理参数,再移植到 STM32 上,可大幅减少调试时间。