第2章 硬件选型基础:主流低功耗MCU对比与音频ADC/DAC选型要点
各位同学,欢迎来到硬件选型这一章。说实话,很多做语音识别的朋友一上来就调算法、跑模型,结果板子打回来发现功耗压不下去,或者麦克风信号噪声大得离谱。我当年也踩过这个坑——选了个性能很强的MCU,结果电池撑不过两小时,项目直接重来。
今天咱们就聊聊,做低功耗语音识别,到底该怎么挑芯片。
2.1 主流低功耗MCU横向对比
目前市面上适合做语音识别的低功耗MCU,我重点看三款:STM32U5、ESP32-S3、nRF5340。它们各有各的脾气,咱们一个一个说。
| 参数 | STM32U5 | ESP32-S3 | nRF5340 |
|---|---|---|---|
| 核心架构 | ARM Cortex-M33 | Xtensa LX7双核 | ARM Cortex-M33 + M4F |
| 主频 | 160MHz | 240MHz | 128MHz + 64MHz |
| SRAM | 最大2.5MB | 512KB | 512KB + 64KB |
| Flash | 最大4MB | 16MB(外置) | 1MB + 256KB |
| 运行功耗 | 约19μA/MHz | 约30μA/MHz | 约23μA/MHz |
| 待机功耗 | 0.6μA | 5μA | 0.9μA |
| 硬件加速 | DSP、FPU、AES | 向量扩展、FFT加速 | DSP、FPU、AES、ARM TrustZone |
| 无线能力 | 无(需外挂) | WiFi + BLE 5.0 | BLE 5.2、NFC、Thread |
| 典型场景 | 工业级低功耗处理 | 联网语音唤醒 | 可穿戴、蓝牙音频 |
2.1.1 STM32U5——稳如老狗的工业选手
我个人习惯把STM32U5叫做「省电王」。它用的是40nm工艺,待机功耗能做到0.6μA,这在语音唤醒场景里太香了。你想想看,设备大部分时间都在等唤醒词,这时候功耗越低越好。
我在项目中遇到过一个问题:用STM32U5做关键词唤醒,跑一个轻量级DNN模型,大概需要80ms的推理时间。配合LPBAM(低功耗后台自主模式),可以在不唤醒主核的情况下,让外设自己采集音频数据。嗯,这里要注意——LPBAM的配置有点绕,建议先看AN6039应用笔记。
选型建议:如果你的产品对功耗要求极其苛刻,比如纽扣电池供电、需要连续待机半年以上,STM32U5是首选。但缺点也很明显——没有内置无线,得外挂蓝牙或WiFi模块。
2.1.2 ESP32-S3——性价比之王,但功耗你得管着点
ESP32-S3这芯片,说白了就是「啥都能干」。双核240MHz,带向量扩展指令集,跑语音算法比Cortex-M33快不少。而且自带WiFi和蓝牙,联网语音识别一条龙。
但它的坑在哪?功耗。运行功耗比STM32U5高了将近一倍。我曾经做过一个测试:同样的语音唤醒模型,ESP32-S3跑起来平均电流12mA,STM32U5只要6mA。所以如果你做电池供电设备,得好好设计休眠策略。
我的小技巧:ESP32-S3有个「ULP协处理器」,可以在主核休眠时做简单的音频检测。我一般用它做第一级唤醒——ULP检测到能量超过阈值,再唤醒主核跑完整模型。这样平均功耗能降40%左右。
2.1.3 nRF5340——蓝牙音频的天然搭档
nRF5340是双核架构,一个M33做应用处理,一个M4F做可编程外设。这设计很有意思——你可以把音频采集和预处理扔给M4F,M33专心跑语音识别。
我记得有个可穿戴项目,客户要求用蓝牙传音频流。nRF5340的BLE 5.2支持LE Audio,延迟能做到20ms以内,比ESP32-S3的经典蓝牙稳定多了。不过它的SRAM只有512KB,跑大模型有点吃力,得做量化压缩。
避坑指南:我曾经在nRF5340上跑一个2MB的语音模型,结果内存爆了。后来用TensorFlow Lite Micro做8bit量化,模型压到400KB才跑起来。所以选它之前,先算算你的模型有多大。
2.2 音频ADC/DAC选型要点
MCU选完了,接下来是音频前端。很多人觉得随便找个ADC就行,其实不然。语音识别的精度,很大程度取决于ADC的信噪比和采样质量。
2.2.1 关键参数怎么看
- 信噪比(SNR):低于80dB的ADC,我建议直接pass。环境噪声稍微大点,识别率就崩了。我一般选90dB以上的,比如AKM的AK5720。
- 采样率与位深:语音识别16kHz/16bit是底线。但如果你做远场识别,建议24bit/48kHz,动态范围更宽。
- 输入通道数:单麦克风用单通道就行。做波束成形的话,至少2通道,推荐4通道。
- 功耗:低功耗场景下,ADC的功耗不能超过1mW。像TI的TLV320ADC3101,工作功耗只有0.8mW,很适合。
2.2.2 我常用的几款ADC/DAC
| 型号 | 类型 | SNR | 采样率 | 功耗 | 接口 |
|---|---|---|---|---|---|
| AK5720 | ADC | 110dB | 192kHz | 1.2mW | I2S |
| TLV320ADC3101 | ADC | 92dB | 48kHz | 0.8mW | I2S/I2C |
| WM8960 | ADC+DAC | 98dB | 48kHz | 2.5mW | I2S |
| MAX98090 | ADC+DAC | 93dB | 96kHz | 1.5mW | I2S |
2.2.3 麦克风偏置与模拟前端设计
这里有个容易忽略的点——麦克风偏置电压。MEMS麦克风一般需要1.8V到3.3V的偏置,而且纹波要控制在10mV以内。我见过有人直接用MCU的GPIO供电,结果纹波50mV,底噪直接飙到-60dB。
我的做法:用独立的LDO给麦克风供电,比如TPS7A20,纹波只有10μV。然后在ADC输入端加一个RC低通滤波器,截止频率设在采样率的1/2左右。这样出来的音频信号干净很多。
2.2.4 I2S接口的时钟同步问题
ADC和MCU之间用I2S通信,时钟必须同步。我遇到过最头疼的问题——MCU的I2S主时钟和ADC的采样时钟不同步,导致音频数据丢帧。后来查了半天,发现是MCU的PLL配置不对。
解决办法很简单:用MCU的I2S模块做主模式,输出BCLK和LRCLK给ADC。ADC设成从模式,跟着MCU的时钟走。这样只要MCU的时钟源稳定,就不会出问题。
总结一下:硬件选型没有绝对的好坏,关键看你的场景。做超低功耗唤醒,STM32U5+AK5720是黄金组合。做联网语音助手,ESP32-S3+WM8960性价比最高。做可穿戴蓝牙音频,nRF5340+MAX98090最省心。
下一章咱们聊聊麦克风阵列的布局和音频信号调理电路,到时候我会分享一个我踩过的坑——麦克风间距算错了,波束成形效果一塌糊涂。嗯,到时候细说。