最近在做一款头戴式降噪耳机的方案选型时,拿到了ADAU1787BCBZRL这颗料。一开始我以为是颗普通的音频Codec,直到翻完数据手册才发现,这玩意把双DSP核心、ADC/DAC和ANC加速逻辑全塞进了一颗芯片里,延迟指标还压到了让人有点意外的水平。如果你正在做TWS耳机、头戴降噪、车载麦克风阵列或者需要对延迟极其敏感的音频处理链路,这颗芯片值得你花点时间认真看看。
我先说结论:ADAU1787并不是一颗“通用型”Codec,它更像是一颗为主动降噪和实时音频处理量身定制的SoC。它最大的价值在于,把数字信号处理能力和模拟前端整合在一起,让你不需要在外部再挂一颗独立的DSP或者MCU去跑降噪算法,从而缩短信号路径,从根源上压低延迟。这篇文章我会从架构思路、ANC实现原理、实际开发流程到踩坑经验,完整拆一遍这颗芯片。
1. 为什么我盯上这颗芯片:ADAU1787的定位与核心思路
1.1 双DSP架构到底解决了什么
ADAU1787内部集成了两个DSP核心,这是它区别于普通音频Codec最核心的一点。传统方案里,一颗Codec只负责模拟信号和数字信号之间的转换,音频处理算法要么跑在外挂DSP上,要么跑在主控MCU里。数据流的路径是麦克风 -> Codec的ADC -> I2S总线 -> 外部DSP -> I2S总线 -> Codec的DAC -> 耳机,每一段传输都在消耗时间。
而ADAU1787把两个DSP核放在ADC和DAC之间,模拟信号从麦克风进来,经过ADC变成数字信号后,直接进入DSP处理链,处理完再交给DAC输出。整个过程中音频数据不需要离开芯片,省掉了I2S接口的串行传输开销和外部芯片的调度等待。我实测下来,纯信号链路的延迟可以做到微秒级,这在主动降噪的场景里几乎是必须的。
两个DSP核的使用方式也很灵活。你可以把其中一个核专门跑前馈ANC滤波器,另一个核跑反馈ANC滤波器,互不干扰;也可以用一个核处理降噪,另一个核做EQ、动态范围压缩或者环境音透传。这种分工方式在调试的时候特别舒服,因为你不需要担心两个算法模块抢算力,每个核的负载率可以在SigmaStudio里单独查看。
1.2 超低延迟从哪来:数据通路和时钟设计
这颗芯片能做到超低延迟,除了DSP集成在内部之外,时钟架构也功不可没。ADAU1787的ADC和DAC共用一套主时钟体系,通过内部的PLL把外部输入的MCLK转换成各模块需要的时钟。因为是同一个时钟源,模拟前端和数字处理链路之间不存在异步采样率转换的问题,省掉了ASRC带来的额外延迟。
另外,ADAU1787支持单通道和双通道的ADC/DAC配置。在某些只需要单麦克风输入的ANC方案里,你可以把不必要的通道关掉,让数据通路更短,延迟也能再降一点。我调试的时候习惯把未使用的ADC通道全部mute掉,一方面是降低底噪,另一方面也让DSP的负载更干净。
这里要说一个容易踩坑的点:外部MCLK的频率稳定性会直接影响PLL的输出质量,进而影响ADC/DAC的时钟抖动。抖动大的时候,声音会变得“脏”,底噪明显上浮。所以PCB布局时,MCLK的走线要尽量短,远离开关电源和数字信号线。我第一版板子就是因为MCLK走线绕了一圈,导致底噪大了大概3dB,后面重新布线才解决。
1.3 这颗Codec和其他方案的对比
市面上做ANC的芯片方案大致分两类:一类是纯模拟电路降噪,另一类是数字降噪。模拟电路ANC响应快,但滤波器的灵活性极低,只能通过调整电阻电容值来改变降噪曲线,而且温度漂移问题比较明显。数字降噪灵活,可以通过改DSP程序来适配不同耳机的声学特性,但延迟是最大的敌人,一旦延迟超标,降噪效果会大打折扣甚至产生啸叫。
ADAU1787走的是数字降噪路线,但它把延迟做的很短,这就兼顾了数字方案的灵活性和模拟方案的实时性。对比我之前用过的另一颗DSP加Codec分体方案,信号链路至少少了两次I2S传输,延迟大概降低了三分之一。对于头戴式耳机这种声学腔体相对较大的产品,反馈麦克风采集到的信号和扬声器输出之间的相位差要求很高,延迟每降低一点,可设计的降噪带宽就宽一点,调试的余量也大一些。
2. 核心细节拆解:ANC、DSP资源和Codec信号链
2.1 数字ANC和模拟电路ANC怎么选
在选择ANC方案时,很多工程师会纠结于数字ANC和模拟电路降噪的取舍。模拟电路ANC的核心是一个模拟滤波器,把参考麦克风的信号经过反向放大后直接叠加到扬声器驱动信号上。优点是几乎没有数字延迟,反应速度快,成本也低。缺点也很明显:滤波器参数是固定的,一旦耳机结构变了或者佩戴方式不同,降噪效果波动很大,而且无法做自适应。
数字ANC则是把麦克风信号采样成数字信号,在DSP里做滤波处理,再经过DAC输出。ADAU1787的方案就是典型的数字ANC,但它和普通数字ANC不一样的地方在于,ADC、DSP、DAC三者集成在一颗芯片内,省掉了外围传输延迟,所以它的效果远比传统分体数字ANC方案要接近模拟电路的水平。
我在实际调测中感受最深的一点是,模拟ANC很难做宽频段的降噪,通常只能在100Hz到300Hz这段低频内取得比较好的效果。而数字ANC配合自适应算法,可以把有效降噪频段扩展到几百赫兹甚至1kHz附近。对于地铁、飞机这类低频噪声为主的场景,数字ANC明显更实用。
2.2 算法层面:ANC的信号流程和滤波器设计
ADAU1787内部的DSP是图形化编程的,通过SigmaStudio这个工具可以拖拽滤波器和算法模块。ANC的基本思路是:参考麦克风拾取环境噪声,经过滤波器后生成一个反相信号,叠加到扬声器的音频信号上,从而抵消传入耳朵的噪声。
这里的核心是滤波器设计。前馈ANC通常使用FIR滤波器,因为FIR是线性相位的,不会对信号造成相位畸变。反馈ANC则常使用IIR滤波器,因为IIR可以用较少的阶数实现较陡的滤波曲线,但IIR的稳定性需要特别关注。
我在调试ADAU1787时,习惯先在SigmaStudio里用一个简单的自适应滤波器模块跑起来,观察收敛情况和残余噪声。自适应模块最大的好处是它会根据参考信号自动调整滤波器系数,不用手动计算每个频点的增益。但它也不能乱用,如果在噪声源不稳定的场景下(比如风吹麦克风),自适应滤波器容易发散,所以产品化的时候还是需要固化一组经过充分验证的固定系数。
2.3 Codec信号链:ADC/DAC规格与动态范围
除了DSP,ADAU1787的模拟前端也很有看点。它集成了多路ADC和DAC,采样率最高支持到192kHz,动态范围指标在业内属于比较高的水平。对于ANC应用而言,ADC的动态范围决定了能处理的最大噪声级,DAC的动态范围则影响输出信号的保真度。
实际调试时需要注意输入端的增益设置。如果参考麦克风的灵敏度比较低,需要把ADC的PGA增益调高一些,但增益过高会放大底噪。我常用的做法是先用示波器看麦克风输出的信号幅度,然后反推合适的PGA增益,保证在最大噪声环境下信号不削波,同时留出6dB左右的余量。
DAC的输出端则要注意负载阻抗。ADAU1787的DAC输出可以直接驱动耳机,但耳机阻抗不同,输出功率和失真表现也会不同。如果驱动低阻抗耳机,建议加一级缓冲放大器,否则低频段容易失真。如果驱动高阻抗耳机或者后续再接功放,直连反而更干净。
2.4 DSP开发工具的选择和使用方法
ADAU1787的开发工具是ADI的SigmaStudio。这是一个图形化的音频DSP设计工具,和写代码完全是两种体验。你在里面通过拖拽模块来搭建信号链,比如把ADC输入拖到滤波器的输入端,再把滤波器输出连到DAC输出端,编译之后生成配置文件,通过I2C写入芯片。
这个工具的好处是上手快,直观,特别适合做音频信号链的原型验证。但也有它的局限性:它不是万能的,比如一些自定义的信号处理算法还是需要通过写DSP汇编或者C代码来实现。SigmaStudio里的模块是ADI预先封装好的,如果你需要做非常特殊的处理,比如自定义的啸叫抑制算法、个性化的降噪曲线,那就得在底层做二次开发。
如果你是第一次接触SigmaStudio,我的建议是先从官方的例程开始,不要一上来就自己搭信号链。官方例程里已经配置好了基本的时钟、采样率和I2C地址,你可以在此基础上修改,比自己从头配置省力得多。
3. 实操过程:从零搭建一个ANC音频方案
3.1 硬件准备与电源、时钟设计
硬件设计这块,ADAU1787的外围电路并不复杂,核心要关注的是电源、时钟和I2C配置接口。
电源方面,这颗芯片有多个供电引脚,模拟部分和数字部分是分开供电的。模拟供电建议用低噪声LDO,数字供电可以使用开关电源加大面积滤波,但要确保开关噪声不要串到模拟部分。我在布局时把模拟地和数字地做了单点连接,电源走线也尽量用了星形拓扑,实测底噪比第一版降低了不少。
时钟方面,ADAU1787需要外部提供MCLK,常见的是12.288MHz或者24.576MHz,这些频率可以同时整除48kHz和44.1kHz采样率,方便系统扩展。MCLK的幅度和波形质量很重要,推荐使用有源晶振而不是无源晶振,有源晶振的输出驱动能力强,信号边沿更干净,能减少时钟抖动对音质的劣化。
I2C接口是芯片配置的主要通道,地址由ADDR0和ADDR1引脚的电平决定。如果系统中有多颗ADAU1787,可以通过设置不同的地址来区分。I2C的速率建议不要太高,标准模式100kHz就行了,配置数据量不大,没有必要跑400kHz。
3.2 SigmaStudio下搭建ANC信号链
打开SigmaStudio之后,新建一个工程,选择ADAU1787作为目标芯片。在原理图编辑界面里,左侧有一个器件库,里面包含了ADC、DAC、滤波器、增益控制、混音器等模块。
搭建前馈ANC的基本步骤是:从器件库拖出ADC模块,选择参考麦克风对应的通道,接一个自适应滤波器模块,再拖出DAC模块,把滤波器输出连接到耳机通道。注意参考麦克风和误差麦克风的通道要区分开,前馈ANC只有一个参考麦克风,反馈ANC则需要另外一路ADC输入作为误差信号。
连接完成后,需要设置采样率。ADAU1787支持多种采样率,ANC应用一般选用48kHz,因为人耳关注的降噪频段在20Hz到1kHz之间,48kHz采样率已经完全够用,过高的采样率反而会浪费DSP算力。
编译工程后,SigmaStudio会生成一个配置文件,通过USBi调试器写入芯片。写入成功后,你就可以实时调整滤波器参数,听到降噪效果的变化。这一步是整个开发过程中最耗时也最关键的部分,因为需要反复试听和测量来确定最优参数。
3.3 参数计算与实测调试:以反馈ANC为例
反馈ANC的信号流程相对复杂一些:扬声器输出的信号会被误差麦克风重新采集,经过反馈滤波器后反相加回输入端,形成一个闭环系统。闭环系统的稳定性是一个大问题,如果反馈滤波器的增益和相位处理不当,很容易振荡,表现为持续的高频啸叫。
调试反馈ANC时,我习惯先把反馈滤波器全部置零,让系统工作在纯开环状态。然后逐步增加反馈增益,同时观察频率响应曲线。可以用音频分析仪或者AP测试设备测量耳机的频响,也可以简单地用正弦波扫频,听有没有异常的峰起。
一个比较实用的经验是:反馈ANC的增益不需要太大,过大反而会在某个频段上形成正反馈。理想的状态是,反馈路径在目标降噪频段内提供最大的相位裕度,同时在其他频段尽量衰减。我的做法是把目标降噪频段设定在100Hz到500Hz之间,然后在1kHz以上降低滤波器的响应幅度,避免高频振荡。
3.4 配置固化与启动方式:EEPROM引导和JTAG
芯片配置有两种加载方式:一种是每次上电后由主控通过I2C写入配置,另一种是把配置烧录到外部EEPROM中,ADAU1787上电后自动从EEPROM加载配置。
在开发调试阶段,我都是用USBi调试器通过I2C直接写入配置,方便实时修改。到了量产阶段,就需要把最终确认的配置烧录到EEPROM里。EEPROM的型号和容量需要在SigmaStudio里指定,烧录完成后,芯片上电时它的自举程序会去读取EEPROM,大约几十毫秒就能完成配置加载。
这里有一个非常容易踩的坑:如果你只烧录了配置到芯片的内部RAM,没有烧录到EEPROM,那么断电重启后配置就丢失了,芯片会处于默认的未配置状态。这一点在开发中一定要记住,否则你调好的参数一断电就全没了,容易误以为芯片出了问题。
JTAG接口在开发中的作用是调试和程序烧录。如果你使用的是芯片内部RAM运行的配置,通常不需要JTAG。但如果你需要调试DSP的运行状态,比如查看某个中间节点的信号值,或者单步执行DSP程序,JTAG是必要的。
4. 常见问题与排查技巧实录
4.1 DSP固化后必须接JTAG才能启动程序怎么办
这个问题在论坛上被问过很多次:为什么我把程序固化好了,断电重启后不工作,但只要接上JTAG调试器就能正常运行?
原因其实不复杂:芯片上电后,默认会从EEPROM加载配置。如果你的配置写到了内部RAM而不是EEPROM,或者EEPROM的I2C地址配置不对,芯片就加载不到配置,处于空跑状态。JTAG调试器连接后,调试软件会主动把配置写入芯片,所以看起来就是“接了JTAG就能跑”。
解决方法是确认EEPROM的型号和I2C地址在SigmaStudio里配置正确。ADAU1787的EEPROM地址通常是0xA0或者0xA2,具体看硬件连接。烧录完成后,建议断电等待几秒再重新上电,用示波器检查一下I2C总线上有没有读取EEPROM的波形。如果完全没有I2C活动,说明自举流程就没启动,需要检查自举配置。
4.2 底噪偏大和信号抖动问题
如果你发现ANC开启后底噪反而变大了,大概率不是算法的问题,而是模拟前端的噪声被放大。这时候需要分模块排查:第一步先把DSP的处理链旁路,也就是让ADC直接连接到DAC,看本底噪声是多少。如果本底噪声已经偏高,说明问题在模拟前端,重点检查电源、接地和PGA增益设置。
我今天调试时遇到过一个比较隐蔽的问题:麦克风的偏置电压纹波过大。麦克风通常需要一个2V左右的偏置电压,如果这个电压的纹波很大,麦克风输出的信号就会带有电源噪声。解决方法是加一级RC滤波,把偏置电压的纹波降到1mV以内。这个细节看起来不起眼,但对整体信噪比的影响非常大。
还有时钟抖动问题。前面说了MCLK很重要,但即使MCLK本身质量很好,PCB走线如果跨越了分割的地平面,也会引入额外抖动。实测中这种抖动在高频段表现为“发毛”的听感,不像底噪那种持续的“嘶嘶声”。
4.3 高频啸叫和系统不稳定的原因
高频啸叫是ANC调试中比较常见的问题,尤其是反馈ANC。啸叫的本质是系统在某个频点发生了正反馈,信号不断被加强,最终超过了系统的稳定边界。
排查啸叫的第一步是确定啸叫的频率。可以用频谱分析仪或者手机上的频谱App看,知道了频率才能对症下药。如果啸叫频率在2kHz以上,通常是反馈滤波器的高频增益太高了,把它压下来就行。如果啸叫频率很低,比如500Hz以下,可能需要检查扬声器的相位响应或者是麦克风的安装位置是否合理。
另外还要注意麦克风通道的延时。ADAU1787的ADC本身有群延迟,如果把滤波器设计成在某个频段接近180度相移,再加上ADC的固有延迟,很容易凑成正反馈条件。因此,调试反馈ANC时不要只盯着幅度响应,相位裕度才是更关键的指标。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 上电后芯片不工作 | EEPROM配置未烧录或地址错误 | 检查EEPROM型号、I2C地址、自举波形 |
| ANC底噪增大 | PGA增益过高、电源纹波、接地不良 | 旁路DSP查本底噪声,分模块排查 |
| 高频啸叫 | 反馈滤波器高频增益过高 | 频谱分析确定啸叫频点,压低高频增益 |
| 声音发毛、高频不干净 | MCLK抖动、走线跨分割地平面 | 检查MCLK走线,优化PCB布局 |
| 配置丢失 | 只写了内部RAM未写EEPROM | 烧录时选择EEPROM作为目标 |
| I2C通信不稳定 | 上拉电阻过小、线缆过长 | 调整上拉电阻到2.2k-4.7k,缩短线缆 |
5. 一些调试心得和最后的建议
芯片本身集成度很高,外围电路不复杂,但这颗料真正难的地方不在硬件,而在DSP算法的调校。ANC是一个典型的“看起来容易、实调起来要命”的领域,因为它涉及到声学、电学和数字信号处理的交叉。你需要在整机装配完成后,测真实的频响曲线,然后一遍遍调整滤波器参数。这个过程没有捷径,唯一的效率提升方式就是建立一套可重复的测量流程。
还有一点建议是,如果条件允许,尽量购置一套音频分析仪,比如AP或者至少是高质量的USB声卡加测量麦克风。ANC调试靠耳朵听虽然能找到大方向,但精细到每个频段的降噪深度,还是需要客观数据支撑。耳朵会疲劳,仪器不会。
开发过程中我也踩过不少坑,最想提醒你的是EEPROM烧录那一步,一定确认配置存储的目标是EEPROM而不是RAM。另外,硬件上麦克风偏置电路的处理也值得多花点心思,很多时候所谓的“底噪大”,根源就在这。
如果你也在做ANC相关的项目,或者准备用ADAU1787这颗芯片做音频处理,希望这篇文章能帮你少走些弯路。有问题欢迎在评论区交流,我看到了会尽量回复。