共计 3121 个字符,预计需要花费 8 分钟才能阅读完成。
背景痛点
在实际的语音识别模块硬件设计中,信号完整性和低功耗是两个最常见的挑战。尤其是在嵌入式设备中,这些问题会更加突出:

- 信号干扰:麦克风采集到的微弱信号容易受到电源噪声、数字信号干扰等影响,导致信噪比下降。
- 功耗过高:语音识别模块通常需要长时间待机或低功耗运行,但 ADC 采样、DSP 处理等环节容易成为功耗瓶颈。
- EMC 问题:生产环境下,电磁兼容性(EMC)问题可能导致模块性能不稳定甚至失效。
这些问题不仅影响语音识别的准确率,还可能导致设备续航缩短或稳定性下降。因此,优化电路设计是提升语音识别模块性能的关键。
ASR-PRO 电路图解析
1. 麦克风阵列的偏置电路设计
ASR-PRO 采用了多麦克风阵列设计,每个麦克风的偏置电路需要特别注意。以下是核心设计要点:
- 偏置电压稳定性:使用 LDO(低压差线性稳压器)为麦克风提供稳定的偏置电压(通常是 1.8V 或 3.3V),避免电源噪声引入。
- 去耦电容:在麦克风偏置引脚附近放置 100nF 和 10μF 的去耦电容,滤除高频和低频噪声。
- 阻抗匹配:麦克风输出信号通过一个 RC 网络(例如 1kΩ 电阻 +100nF 电容)匹配到 ADC 输入端,减少信号反射。
电路示意图:
+3.3V
|
LDO
|
+-----+-----+
| | |
100nF 10μF Mic
| | |
+-----+-----+
|
1kΩ
|
ADC_IN
2. 模拟前端 (IA+ADC) 的噪声抑制方案
模拟前端主要包括仪表放大器(IA)和 ADC,噪声抑制是这里的重点:
- 仪表放大器选择:选用低噪声、高共模抑制比(CMRR)的 IA 芯片,例如 AD8421。
- ADC 采样率优化:根据语音信号的带宽(通常为 4kHz),选择合适的采样率(如 8kHz 或 16kHz),避免过采样引入额外噪声。
- 差分输入设计:采用差分信号输入到 ADC,减少共模噪声的影响。
3. 数字信号处理单元的时钟树优化
数字信号处理单元(DSP 或 MCU)的时钟设计对功耗和性能有很大影响:
- 动态时钟调整:根据处理需求动态调整主频,例如在待机时降低时钟频率。
- 时钟分频:对 ADC 和 DSP 的时钟进行分频,减少高频噪声。
- 低功耗模式:在空闲时切换到低功耗模式(如 STM32 的 Stop 模式)。
代码实现
1. STM32H7 与 ASR-PRO 的 I2S 接口配置
以下是一个基于 STM32H7 的 I2S 接口配置示例,支持 DMA 双缓冲:
// I2S 初始化
void I2S_Init(void) {
// 使能 I2S 时钟
__HAL_RCC_SPI2_CLK_ENABLE();
// 配置 I2S 参数
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_16K;
hi2s2.Init.CPOL = I2S_CPOL_LOW;
hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
HAL_I2S_Init(&hi2s2);
// 配置 DMA 双缓冲
hdma_spi2_rx.Instance = DMA1_Stream0;
hdma_spi2_rx.Init.Request = DMA_REQUEST_SPI2_RX;
hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_spi2_rx.Init.Mode = DMA_CIRCULAR;
hdma_spi2_rx.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&hdma_spi2_rx);
// 启动 DMA 传输
HAL_I2S_Receive_DMA(&hi2s2, buffer1, BUFFER_SIZE);
}
2. 硬件滤波器配置
通过配置 MCU 内置的硬件滤波器(如 DFSDM),可以进一步减少噪声:
// DFSDM 滤波器配置
void DFSDM_Filter_Config(void) {
hdfsdm1_filter0.Instance = DFSDM1_Filter0;
hdfsdm1_filter0.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
hdfsdm1_filter0.Init.RegularParam.FastMode = ENABLE;
hdfsdm1_filter0.Init.RegularParam.DmaMode = ENABLE;
hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
hdfsdm1_filter0.Init.FilterParam.Oversampling = 32;
HAL_DFSDM_FilterInit(&hdfsdm1_filter0);
}
3. 低功耗模式切换
在语音识别待机时,切换到低功耗模式:
// 进入低功耗模式
void Enter_Low_Power_Mode(void) {
// 关闭不必要的外设
HAL_I2S_DeInit(&hi2s2);
// 配置唤醒源(如 GPIO 中断)HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入 Stop 模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新初始化
SystemClock_Config();
I2S_Init();}
性能验证
通过优化电路设计和代码实现,ASR-PRO 的性能得到了显著提升:
- THD+N(总谐波失真加噪声):从优化前的 -60dB 降低到 -70dB。
- 功耗:待机功耗从 5mA 降低到 1mA,工作功耗从 20mA 降低到 15mA。
- 信噪比(SNR):从 80dB 提升到 90dB。
避坑指南
1. 麦克风偏置电压导致的底噪问题
- 问题现象:麦克风输出信号中有明显的底噪。
- 解决方法:检查偏置电压是否稳定,确保 LDO 的输出电容足够(建议 100nF+10μF 组合)。
2. 数字地模拟地分割不当引入的干扰
- 问题现象:ADC 采样数据中有周期性噪声。
- 解决方法:严格分割数字地和模拟地,单点连接,避免形成地环路。
3. 唤醒延迟与功耗的平衡策略
- 问题现象:低功耗模式下唤醒延迟过长,影响用户体验。
- 解决方法:根据需求调整低功耗模式(如使用 STM32 的 Sleep 模式而非 Stop 模式)。
延伸思考
本文的优化方案虽然基于 ASR-PRO 和 STM32H7,但其核心思想可以迁移到其他 DSP 平台:
- 信号链优化:无论是 TI 的 C5000 系列还是 ADI 的 SHARC 系列,都可以参考类似的模拟前端设计。
- 低功耗设计:动态时钟调整和低功耗模式切换是通用技术,适用于任何嵌入式平台。
- EMC 设计:良好的 PCB 布局和接地策略是跨平台通用的。
希望这些经验能帮助你在其他项目中快速落地语音识别模块的优化设计。
正文完
