在语音交互系统中,清晰的声音采集是后续一切处理的基础。如果前端麦克风采集的信号充满噪声或失真,再强大的后端算法也难以施展。本次实测聚焦于一套高性价比的双麦克风拾音方案:采用国产ADC芯片ES7210搭配模拟MEMS麦克风组成的阵列。我们将通过实际的硬件设计、寄存器调试与算法实现,评估其在真实场景下的表现。
为何单麦克风在远场场景中力不从心?
设想一个放置在客厅的语音助手,用户可能在数米外发出指令。此时设备面临的挑战包括:
- 目标语音因距离而严重衰减。
- 背景中存在电视声、电器运行声等多种干扰。
- 房间混响导致声音模糊。
- 设备自身扬声器的回放声音可能被麦克风拾取(需要回声消除)。
单个全向麦克风对所有方向的声音“一视同仁”,难以从混合信号中分离出有效人声。解决方案是利用空间信息来区分声源,即采用多麦克风阵列。最简单的双麦克风阵列,在合理设计和算法支持下,即可实现定向拾音、噪声抑制和粗略声源定位,其前提是两路信号必须高保真、低延迟且严格同步。
主角ES7210:为语音前端而生的ADC
ES7210是Everest Semiconductor推出的一款四通道音频ADC芯片,专为语音前端采集优化。我们本次使用其两个通道构建双麦系统。它的几个关键设计值得关注:
- 高信噪比 (SNR ≥ 94dB A-weighted):这意味着它能在极低的声压下依然清晰地捕捉信号,对于远场轻声语音的拾取至关重要。
- 差分输入与内置PGA:差分输入抗共模干扰能力强,而内置的可编程增益放大器(PGA,0–35.5 dB增益)省去了外置运放,并允许通过I²C动态调节增益以应对环境变化。
- 灵活的I²S/TDM输出:最高支持192kHz采样率,我们实测使用16kHz/24bit模式以满足大多数ASR(自动语音识别)需求。其主模式MCLK输出便于系统扩展。
- 紧凑的QFN-24L封装:尺寸仅4x4mm,非常适合TWS耳机、智能音箱等紧凑型设备。
- 完善的本地化支持:作为国产芯片,其中文文档、参考设计以及及时的本地FAE支持,极大地降低了开发者的学习和调试门槛。
实战:ES7210初始化与寄存器配置
让芯片正常工作需要正确的寄存器配置序列。以下是一段基于STM32H7 HAL库的精简初始化代码示例:
void es7210_init_dual_channel(void) {
uint8_t reg;
// 步骤1: 软复位
reg = 0x01;
i2c_write(ES7210_ADDR, 0x00, ®, 1);
HAL_Delay(10);
// 步骤2: 设置为主模式(MCLK来自外部晶振)
reg = 0x02;
i2c_write(ES7210_ADDR, 0x41, ®, 1);
// 步骤3: 设置采样率为16kHz (OSR=64)
reg = 0x13;
i2c_write(ES7210_ADDR, 0x42, ®, 1);
// 步骤4: 使能CH1 & CH2通道
reg = 0x03;
i2c_write(ES7210_ADDR, 0x48, ®, 1);
// 步骤5: 设置CH1和CH2的PGA增益(例如24dB)
reg = 0x18;
i2c_write(ES7210_ADDR, 0x49, ®, 1); // CH1
i2c_write(ES7210_ADDR, 0x4A, ®, 1); // CH2
// 步骤6: 上电ADC
reg = 0x03;
i2c_write(ES7210_ADDR, 0x40, ®, 1);
}
关键点:
- 通道使能寄存器
0x48的值0x03代表同时开启CH1和CH2。
- 两个通道的增益寄存器(
0x49和0x4A)必须设置为相同值,否则会破坏信号相位一致性,严重影响后续波束成形效果。
- 采样率配置寄存器
0x42需根据主时钟(MCLK)频率进行选择。
为便于管理和调试,可以将初始化序列定义为数组:
const struct { uint8_t reg; uint8_t val; } init_seq[] = {
{0x00, 0x01}, // 复位
{0x41, 0x02}, // 主模式
{0x42, 0x13}, // 16k@12.288M MCLK
{0x48, 0x03}, // 使能双通道
{0x49, 0x18}, // CH1增益
{0x4A, 0x18}, // CH2增益
{0x40, 0x03}, // 上电
};
双麦克风阵列的硬件布局与PCB设计要点
阵列性能一半取决于算法,另一半则由硬件设计决定。我们测试了多种布局,最终选定线性对称布局,中心距6cm,这符合远场拾音的理论最优间距范围。
PCB设计核心要点:
- 模拟信号走线:麦克风差分对走线应等长,并严格遵循3W原则(线间距至少3倍线宽),远离数字信号线,且避免跨越电源平面分割区。
- 电源处理:为模拟部分(AVDD)使用独立的LDO供电,并在电源引脚附近放置足够的去耦电容(如0.1μF陶瓷电容+10μF钽电容)。使用磁珠进行电源隔离是好的实践。
- 接地:保持完整的地平面,数字地和模拟地在芯片下方单点连接。麦克风下方的敷铜应良好接地并打过孔。
- 麦克风开孔:外壳开孔直径建议1.5~2mm,并添加防尘网。开孔位置应远离扬声器、按键等振动源。
焊接完成后,务必仔细检查,避免虚焊导致通道无声。
真实环境录音效果测试
我们在不同距离和噪声环境下进行了测试:
- 1米安静环境:双麦原始信号一致性高,经过基础波束成形后,语音更为突出,底噪得到抑制。
- 2米有空调噪声环境:单麦克风识别率下降明显。双麦阵列结合固定方向的波束成形,能有效提升语音信噪比,识别成功率大幅改善。空调作为稳态噪声,其空间特性与人声不同,易于被区分。
- 3米远场多人交谈干扰:这是最复杂的场景,因为干扰也是语音。此时,可以利用双通道信号的相干性进行辅助判断——来自目标方向的语音信号在两路麦克风上的相关性通常远高于来自其他方向的干扰语音。结合此特征进行预处理,能有效降低词错误率(WER)。
基础波束成形算法:Delay-and-Sum实现
“延时求和”是波束成形的基础算法,其原理是根据声源方向计算两路信号的相对延时,对齐后再相加,从而增强目标方向的信号。以下是一个适用于嵌入式平台(如Cortex-M7)的简化实现:
#define FRAME_LEN 256 // 16ms帧长 @16kHz
#define MIC_DISTANCE 0.06f // 麦克风间距,单位:米
#define SOUND_SPEED 340.0f // 声速,单位:米/秒
void beamform_delay_sum(const int16_t *left, const int16_t *right,
int16_t *out, float angle_deg) {
float angle_rad = angle_deg * M_PI / 180.0f;
// 计算理论时延差
float delta_t = (MIC_DISTANCE * sinf(angle_rad)) / SOUND_SPEED;
int delay_samples = (int)(delta_t * 16000.0f); // 转换为采样点数
int start_idx = (delay_samples > 0) ? delay_samples : 0;
int len = FRAME_LEN - start_idx;
// 对齐并求和
for (int i = 0; i < len; i++) {
int sum = left[i] + right[i - delay_samples];
out[i] = (int16_t)(sum >> 1); // 防止溢出,取平均
}
// 处理帧尾部
for (int i = len; i < FRAME_LEN; i++) {
out[i] = 0; // 或进行插值处理
}
}
优化方向:
- 使用定点数运算替代浮点数以提高效率。
- 预先计算并存储角度到延时样本数的查找表(LUT),避免实时计算三角函数。
- 对输出信号施加自动增益控制(AGC)。
对于更复杂的场景,可以研究自适应波束成形(如GSC)或基于深度学习的掩码估计等高级算法。但对于许多嵌入式设备上的语音交互应用,固定方向的延时求和算法已能带来显著提升。
开发过程中遇到的典型问题与解决方案
- I²S数据错位或声道反相:现象是算法输出方向错误。根源在于主控(如STM32)与ES7210的I²S帧格式(如WS极性、数据对齐方式)不匹配。务必仔细对照双方数据手册中的时序图进行配置,通常在CubeMX中调整I2S的“数据格式”或“WS极性”即可解决。
- 双通道增益不一致导致波束偏移:如果两个通道的PGA增益设置不同,即使声源在正前方,波束主瓣也会发生偏移。必须保证两个采集通道的增益设置绝对一致。麦克风本身的灵敏度差异应在软件校准环节进行补偿。
- 电源噪声干扰:不当的电源布局或滤波会导致底噪升高。解决方案包括为模拟电源使用高性能LDO、增加π型滤波电路、确保电源走线远离数字噪声源(如DC-DC模块),并保持完整的地平面。
ES7210与竞品对比及选型建议
我们将ES7210与市场主流方案进行了简单对比:
| 特性 |
ES7210 (国产) |
TLV320ADC3100 (TI) |
ADMP441 + ADAU7002 (ADI) |
| 成本 |
较低 (约8-10元) |
中等 |
较高 (需两颗芯片) |
| 集成度 |
高 (含PGA) |
高 |
低 (需外置编解码器) |
| 接口 |
I²C + I²S |
SPI + I²S |
PDM + I²S (需转换) |
| 支持 |
中文文档与本地FAE |
英文为主 |
英文为主 |
| 易用性 |
高 |
中 |
中 |
ES7210的核心优势在于良好的性能与成本平衡,以及出色的易用性和本地化支持。对于消费级语音产品(智能音箱、会议麦克风、语音遥控器等)的开发,尤其是在快速原型验证阶段,它是一个非常高效的选择。
你的项目是否适合选择ES7210双麦方案?可以从以下几点判断:
- 需求:是否需要远场(>1米)拾音或在嘈杂环境中定向拾音?
- 主控资源:主控是否具备I²S接口和足够的算力(如Cortex-M4及以上)运行处理算法?
- 开发速度:是否追求快速迭代和验证?其开箱即用的SDK能节省大量时间。
- 供应链:是否关注供货稳定性和本土化支持?
总结
经过从硬件设计、驱动调试到算法实现的完整实测,ES7210在双麦克风语音采集前端展现出了可靠的性能。它标志着国产音频芯片正从“可用”向“好用”迈进。对于面临技术栈选型的工程师而言,在满足项目需求的前提下,ES7210提供了一个在成本、性能和开发效率上都具有竞争力的选择。正如调试底层驱动时需要关注时序细节一样,选择合适的核心组件是项目成功的重要基石。