2.58 美元 HDMI 转 VGA 适配器模拟音频问题修复全揭秘!
nyanpasu64 的博客
跨性别者的权利就是人权。
修复 2.58 美元 HDMI 转 VGA 适配器的模拟音频问题
作者为 nyanpasu64,日期是 2026 年 7 月 4 日。最近,其买了一个超便宜的 HDMI 转 VGA DAC,想把任天堂 Switch 连接到 CRT 显示器和外接音箱上,可惜它的音频输出接口在音频混音器以及电脑的麦克风接口上都产生了严重的噪音问题。其花了好几天时间来诊断阻抗问题,为 delta - sigma 音频 DAC 设计滤波方案,还对 PCB 元件进行了重新改造,力求用现有的硬件实现最佳音质。
前传:修复旧 HDMI DAC
在购买这个音频 DAC 之前,最初的视频连接方案是把 Switch 底座插入 ICY - Box HDMI 转 VGA DAC。在改造 I2C 线路时,不小心损坏了电路板上的几根走线,还弄丢了一些元件,只好通过在 GIMP 里追踪 I2C 线路来了解其功能,进而重新修复它们。(这款 DAC 的 HDMI 输入是一个 I2C 从设备/外设,SDA/SCL 线路有高阻抗上拉电阻连接到 5V,之前忽略了这一点,同时还有低阻抗电阻连接到芯片,把总线拉到地。)这让其有机会用磁线和 3 秒焊锡掩膜练习微焊接技术,为之后安装 Switch 破解芯片做准备。36 号线规的磁线很有用,它的瓷漆绝缘层比 Kynar 更不容易熔化,而且线的粗细适中,既不容易折断,又能避免轻易扯掉焊盘。焊锡掩膜可以覆盖不想焊接的裸露焊盘;还在处理附近线路时用它固定“完成”的焊点和电线,不过它对 PCB 的附着力不太好。也许需要更彻底地清洁和打磨表面,或者试试 YCS 的 3 秒焊锡掩膜,而不是 Relife 的产品。在照片里追踪 PCB 线路时,好几次因为在正反两面切换查看时看错了 PCB 的方向而搞砸。下次可能会用 KiCad 的参考照片功能来对 PCB 进行符号化建模,而不是用 GIMP 的铅笔工具手动追踪线路。
将 Switch 连接到音频混音器
出人意料的是,整个设置过程中最困难的部分是把游戏机连接到外接音箱。ICY - Box DAC 没有音频输出(ITE IT6892FN 芯片不输出模拟音频),而 Switch 的耳机插孔会给音频混音器和音箱带来恼人的干扰。经过几个小时的故障排查,不断插拔和更换各种电缆与元件,最终得出结论:当 Switch 连接到接地环路且不处于睡眠模式时,其音频电路会拾取 60Hz 的嗡嗡声,并将其放大到输出中。在网上寻求建议,得到了一大堆不同可行性的方案:接地环路隔离器利用变压器在具有独立接地的电路段之间传递电压偏移,但小型的接地环路隔离器往往会衰减低音和其他低频信号,而大型的又很昂贵;将音频设备转换为平衡差分音频可以避免接地环路问题,专业音频混音控制台就是采用这种方法,然而相关设备价格似乎很贵,而且 DI 盒通常会将电压降低到麦克风电平;另一个选择是 HDMI 音频提取器,但 chaos 试过的每一个来自速卖通的 HDMI 转 3.5mm 或 TOSLINK 提取器质量都很差,而发烧友级别的产品又很贵;负反馈音频光隔离器有两个接收器,LED 驱动使得两个接收器的电压与输入电压匹配,但 1BitSquared Discord 服务器劝阻使用它们;研究过将接地和两个音频信号作为差分放大器的输入进行处理,但放弃了这个想法,因为不知道如何让它在输入超出放大器电源轨的情况下工作,而且它的共模噪声抑制能力可能较差。找到的最简单的解决办法是把 Switch 的音量旋钮调到最大(关闭耳机音量限制器),这样游戏音频就会比接地环路的嗡嗡声更响亮,然后再在混音器里调低音量。但每次把游戏机放进或拿出底座时,都得插拔耳机插孔,而且还担心这会对游戏机的音频放大器造成长期损坏。也测试了苹果的 USB - C 音频转接头,但没有得到音频输出。(还发现,把一个“朋友的”Switch 2 连接到混音器时也出现了同样的音频嗡嗡声,当时以为是第三方 HDMI 转接头的问题。顺便说一句,任天堂起诉 Switch 模拟器开发者后,再也不会买他们的新游戏机了。他们滥用公司的法律预算,以个人破产威胁独立开发者进行受法律保护的活动,以此来充实公司的金库,还继续对 GitHub 上的分支发出下架通知。)
HDMI 转 VGA 音频提取器
/crt/ Discord 服务器推荐了一款速卖通的 VGA 转接头,带有 3.5mm 音频输出,售价 2.58 美元外加运费。(价格会随时间略有波动,目前不包括临时的 7 月 4 日促销价,为 2.71 美元。)一周后转接头到货,把 VGA 输出插到视频切换器上,将 HDMI 输入连接到 Switch 的视频输出,把音频输出接到音频混音器,结果听到了从 Switch 上听过的最糟糕的噼啪声。很困惑,于是把它连接到电脑上,通过主板的麦克风插孔录制音频。发现当把瑞昱音频的麦克风增益关闭时,噪音几乎听不见,但当把它调到 +30 dB 时,噪音就会盖过正常声音。这时怀疑音频转接头要么是在输出超声波谐波,要么是当改变麦克风增益导致麦克风插孔的输入阻抗变化时,其放大器发生了失真。当按下 Switch 控制器的主页按钮,音频逐渐消失时,随着音量衰减到静音,会出现一个下降的噪声扫描。为了验证阻抗理论,用示波器测量了主板音频输入和地之间的电阻。恼人的是,输入引脚有超过 2 伏的恒定直流偏移,短路到地时这个偏移会消失,但移除短路后不久又会重新出现。这使得无法正确测量阻抗。但没有气馁,还是从两个方向测量了电阻,发现一个方向显示开路,另一个方向显示 300 欧姆。重要的是,这个测量结果不会因切换麦克风增益水平而改变。这时,得用示波器检查信号问题了。
用示波器探测音频
把音频输出插到一个分线电缆上,用示波器探测暴露的导线。结果发现音频上覆盖着惊人的 500 - 600 mV 噪声,谐波频率高达 50 MHz。sigma - delta DAC 的原始输出峰峰值振幅超过 600 mV,周期约为 80 ns,但充满了周期低至 20 ns 的子振荡。这里无法分辨出原始比特。这是捕捉到的几乎无声的音乐渐弱过程,但仍能看到 500 mV 的噪声,以及 sigma - delta 比特流不同区域之间的不稳定过渡。这样就确认了音频问题确实是 MHz 范围内的超声波 DAC 开关噪声,被非线性放大器调制为可听的失真。这时打开转接头,看看里面是什么芯片。一张照片显示芯片是 NX3303X;找不到任何数据手册,但一个中文网站有该芯片的框图和引脚图。在网上搜索使用这款芯片的其他用户,发现了 c0pperdragon 的 HDMI2SCART 项目。这块 PCB 上的芯片大多是从像这样的速卖通 DAC 上拆下来的,而且它直接把音频输出连接到音箱。后来得知,他也遇到了和一样的音频问题,不得不在芯片输出和地之间添加电容。浏览该项目的问题跟踪器时,看到了问题“哪里可以买到 NX3303X?”。这个帖子显示,MX9291 是另一种带有集成音频输出的 HDMI 转 VGA DAC 芯片。在网上搜索 NX3303X 时,还找到了 MX9291 的手册,说这款芯片可以替代 NX3303X,并且有一个 sigma - delta DAC,这表明 NX3303X 可能也有。不过 MX9292 的引脚图与手上的芯片不同,所以没有进一步研究它。
构建低通滤波器
为了修复音频播放问题,得设计一个低通滤波器来消除开关噪声。设计信号滤波器时,通常建议绘制波特图来展示滤波器的频率响应。找到了一个波特图生成器,它通过在频率扫描中评估滤波器的复传递函数来绘制精确的曲线。为了模拟一个截止频率为 50 kHz 的一阶 LPF,从频率 10 MHz 到 10 kHz 绘制了 1/(1 + s/50000) 的曲线。然后可以检查在 20 kHz 处损失了多少高音,以及在 5 - 10 MHz 处抑制了多少开关噪声。确定了 50 KHz 的截止频率后,开始寻找合适的电阻和电容值来实现这个截止频率。要找到 RC 滤波器的截止频率,可以使用公式 f = 1 / (2π RC)。把数值代入 qalc 计算,得出可以串联一个 31 欧姆的电阻,然后接一个 100 nF 的 MLCC 到地。不过这里有个问题,X7R 陶瓷电容会把振动转化为信号,但玩游戏时大家对音质也没那么高要求,而且还得考虑时钟抖动的问题。把发现报告到了 HDMI2SCART 项目仓库的一个问题中。作者很快回复说,他需要添加滤波电容来阻挡 DAC 噪声。有趣的是,他发现不使用滤波电阻时,10 nF 甚至 1 nF 的电容就足以阻挡开关噪声。
旁注:音频时钟抖动
用示波器探测滤波后的波形时,注意到波形周期有明显的抖动。这意味着 DAC 的音频输出存在明显的采样时钟抖动,相对于“真实”的采样率,采样时间会前后偏移。这本该是一个稳定的锯齿波,但不同部分的播放速度不同。位移带似乎从右向左移动。出现抖动可能有几种原因:它会把每个消隐期的音频样本拉伸到下一行扫描中,即使样本数量不固定;DAC 使用了不稳定的振荡器或 PLL 来控制采样输出的时间;DAC 会根据从 HDMI 接收到但尚未播放的样本数量不断调整音频播放速率,这可以解释偶尔听到的音频间隙。据了解,要减少抖动,最好是重新生成一个稳定的音频时钟,并使其与通过 TMDS 消隐期到达的音频大致同步。不过怀疑其中很多都是噱头。无论如何,抖动对于测试音调或游戏音频并没有产生任何可听的问题,整体音频输出对于游戏来说“足够好”,不过它也存在音量低和偶尔出现音频间隙的问题。毕竟,3 美元的 HDMI DAC 也就这样了。
确定开关频率
出于好奇,想了解一下滤波后音频信号的特性。先从确定开关噪声的频率入手,这样能更好地了解 delta - sigma DAC,并选择最佳的滤波器截止频率。让 DAC 播放静音,测量了 RC 滤波器前后的信号。芯片输出符号 10,产生一个周期为 76.8 ns、振幅为 175 mV 的方波。滤波器把振荡衰减为一个安静的类似三角形的波。安装滤波器后,实际上可以看到 sigma - delta DAC 输出的单个比特。输入静音信号时,会输出一串 10 和 1100 符号。通过测量 delta - sigma 信号中每个高或低脉冲的周期,估计每个符号长 37 ns。10 符号产生的方波频率约为 13.5 MHz,根据示波器,频率约为 13.02 MHz。记得启动时,DAC 会输出一串 1100 符号,产生一个更长的周期 151 ns。1100 符号产生的方波频率约为 6.76 MHz,根据示波器,频率约为 6.62 MHz。有趣的是,这些频率比之前注意到的 50 MHz 低很多。也许快速边缘是信号反射,现在被 RC 滤波器隐藏了。如果向 DAC 发送非静音音频,它会输出不均匀的符号混合。这会产生一个具有中间频谱能量分布的非周期性信号。根据这些数据,必须在 5 - 10 MHz 处实现最大衰减,同时在 20 KHz 处保留可听的高音。在探测电路时,还记录了 DAC 输出和滤波后音频信号的电压/振幅。音频 DAC 的输出中心电压为 1.675 V,这意味着它在 3.35 V 的电源轨上输出 50% 的占空比。播放最大音量的音频信号时,电压摆动限制在接近地或 3.35 V 的 50% 左右。这与在网上读到的关于 delta - sigma DAC 在失真变得过大之前实际调制深度为 50% 的说法一致。这意味着 DAC 相对于静音状态只能输出最高 ±0.8375 伏的信号。对于响亮的音频源来说,这个范围足够了,但任天堂 Switch 的授权游戏音频往往比较安静,可能需要调高音箱或混音器的音量来补偿,或者使用 MasterVolume 自制软件来提高 Switch 游戏的音量。可惜的是,MasterVolume 不能在开机时运行,每次在 emuMMC 和 sysMMC 之间重启游戏机时,都得重新设置音频音量。正如预期的那样,输出中的开关噪声消失了,但令人惊讶的是,在滤波电阻之前它就已经被大幅衰减了。探测 DAC 芯片进入滤波器的输出时,开关噪声被降低到了 175 mV!难道是滤波器干扰了 DAC?
内部电阻
决定进一步探究这个音频异常现象,用 Audacity 生成方波和锯齿波输入到 DAC 中。开始注意到一些意外的阶跃响应。向 DAC 输入一个方波,但得到的是电平之间的曲线过渡。这意味着波形被低通滤波了。向 DAC 输入一个上升的锯齿波,得到的是曲线下降而不是阶跃。了解到 HDMI 设备通常更喜欢 48 kHz,设备的 EDID 声称支持 32、44.1 和 48 kHz,但为了简单起见,使用了 48 kHz。怀疑 DAC 无法提供足够的电流来驱动全尺寸波形通过滤波器。尝试在 Audacity 中将增益降低到 -16 dB,但仍然看到同样的低通滤波后的锯齿波,波谷被削平。这表明问题不是削波,而是一个线性时不变低通滤波器,其效果比预期的要强得多。这时仍然认为游戏声音听起来正常,问题肯定出在合成测试用例或 Windows 音频处理效果上。于是把 Switch 启动到 L4T Ubuntu 24.04 系统,在实际的游戏机硬件上测试 DAC,但捕获的方波和锯齿波结果还是一样错误。作为最后一个测试,在笔记本电脑和 HDMI DAC 上都播放了《塞尔达传说:风之杖》中 Molgera 主题音乐,并将两者都输入到音频混音器中。结果发现,Switch 音频输出中的打击乐完全无法辨认,与参考音频相比,几乎被闷得听不见了。意识到设计的低通滤波器有问题。DAC 能提供的电流非常有限,以至于滤波电容的充电速率被 DAC 的内部电阻而不是滤波电阻所限制!
通过电压和电流计算内部电阻
惊讶地发现,芯片的输出引脚会朝着预期的平滑电压呈指数曲线变化,这表明存在欧姆内部电阻。之前一直以为,只要芯片驱动的电流小于最大电流,它就能将 DAC 输出强制到标称电压,之后会在电阻上保持特定的 ΔV 以提供最大电流。既然可以将芯片建模为一个电阻,尝试用两种方法测量内部电阻。电压分压器法:滤波电阻之前的电压实际上是芯片理想“电压源”和相对固定的滤波电容电压之间的电压分压器的中点。这个电压分压器由芯片的“内部电阻”和外部滤波电阻组成。通过测量芯片输出电压的摆动幅度,相对于理想 DAC 的电压摆动幅度,可以将外部滤波电阻与总电阻(包括内部电阻)进行比较。看到一个标称 3.3V 电源(实际电压 3.35V)的 PWM 输出有 175 mV 的摆动,中点电压为 1.675 V。将电压分压器公式输入 qalc 计算,得出内部电阻约为 598.7142857 Ω。RC 滤波器时间常数法:在 B550M DS3H 主板音频接口上以 192 kHz 的采样率捕获了有问题的音频输出。以 192 kHz 采样率录制的 HDMI DAC 播放方波的情况显示,滤波后的方波从一个极端移动到 0 伏需要 8 个采样,因此 LPF 的半衰期约为 41.667 μs。可以用一些复杂的代数运算将半衰期转换为时间常数,时间常数约为 60.11 μs。可以将时间常数转换为截止频率,约为 2.647 kHz。事后看来,玩了几个小时游戏怎么都没注意到 2.6 kHz 的低通滤波器呢?确实注意到《喷射战士 3》在 Switch 音箱上的声音比在 DAC 上更清脆,但以为是 Switch 音箱音质单薄的问题,而不是音频接口有问题。现在知道电容为 100 nF,将时间常数转换为内部电阻,得出内部电阻约为 570.1229337 Ω。哎呀,真是不容易。用两种不同的方法计算了音频 DAC 芯片的内部电阻,结果相差在 5% 以内。而且内部电阻远远大于为 RC 滤波器设定的电阻。把发现报告到了问题报告线程中。
利用内部电阻进行滤波
发现芯片有很大的内部电阻。为滤波器添加额外的电阻会进一步降低它驱动音频负载的能力。所知道的设计低通滤波器的最佳方法是将 R 设为内部电阻,然后选择一个能产生所需截止频率的 C 值。这也解释了为什么 PCB 在接地电容之前没有串联电阻;PCB 设计师利用内部电阻进行滤波,然后制造商为了降低成本而省略了安装滤波电容!低通滤波器的理想 C 值是多少呢?可以计算如何实现 50 kHz 的截止频率,得出约为 5.395082817 nF。看起来 5.1 nF 是个不错的选择。电容值越大,滤波效果越好,截止频率越低。PCB 上已经有一个未安装元件的滤波电容焊盘,用于连接 DAC 输出和地。焊盘尺寸是 0402;可以勉强安装一个 0603 的电容,但会很拥挤,焊接也更困难,而 0402 的元件更小,更难操作。还没在未改动的电路板上尝试安装过这两种电容,不知道哪种更容易操作。已经对 PCB 进行了大量改造,安装了滤波电阻。由于手头没有 5 nF 的电容,用两个 10 nF 的电容串联来凑合。当电容串联时,它们的泄漏电流可能不同,会导致中间的电压漂移。在这种情况下,漂移不应超过 DAC 的 1.675 V 直流偏移,实际中不会造成问题。需要注意的是,廉价的 X7R 陶瓷电容具有微音效应和压电效应,会将环境振动转化为电压变化,产生可听噪声。C0G 电容是非压电的,更适合音频电路,但体积大,大容量的生产成本高。幸运的是,需要的 5 nF 电容值较小,LCSC 有售价极低的 0402 C0G 陶瓷电容。
隔直电容呢?
还注意到,每当把音频电缆插入其他设备或拔出时,DAC 都会产生“噗”的一声。这是因为制造商为了降低成本,用 0 欧姆跳线代替了隔直电容,选择依靠接收音频的设备的隔直电容。觉得添加隔直电容不是件容易的事。假设负载为 10 千欧,要在 20 Hz 下较好地通过低音,大约需要 1 μF 的电容。这么大的电容值很难找到 C0G 类型的。常见的 X7R MLCC 电容具有压电效应,受到撞击时电压会发生变化,可能会给音频带来干扰。电解电容是一个选择,但不适合安装在为 0402 陶瓷电容设计的焊盘上。此外,如果你没有在隔直电容“外部”安装一个高值电阻接地,音频源和接收器的隔直电容之间的电压可能会因为电容泄漏而再次漂移。曾读到这可能会导致音频失真,半小时后才会显现出来,但找不到读到这个内容的网站了。要解决这个问题,需要在电容输出和地之间添加额外的电阻,这需要对 PCB 进行改造,因为设计师没有预留焊盘。总之,为了这个最终效果,要做很多改造工作,而且可能还不如之前不安装隔直电容。
交换立体声通道
又玩了一会儿《喷射战士 3》,开始注意到一些声音位置不合理的情况,开始怀疑音频 DAC 交换了音频通道,通过把训练敌人放在左边,让它开枪,然后听到枪声从右边传来,证实了这个想法。为了纠正音频位置,得在耳机插孔的引脚之间交换模拟音频通道。如果是设计 PCB,会交换连接电路板正反面音频信号的过孔。但由于只能在现有的电路板布局上操作,决定在音频线平行穿过电路板时将它们交叉。用一个从速卖通买的便宜数码显微镜观察