
最近在做一款头戴式降噪耳机的方案选型时拿到了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规格与动态范围除了DSPADAU1787的模拟前端也很有看点。它集成了多路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这颗芯片做音频处理希望这篇文章能帮你少走些弯路。有问题欢迎在评论区交流我看到了会尽量回复。