|
本帖最后由 wxwxwx0 于 2024-10-2 12:59 编辑
本文目的是重新梳理以下主题,试图从一个整体视角来分析、理解它们之间的关系,并回应实践中遇到的各种问题:
jitter是什么?如何产生的、如何消除
同步与异步的传输
音频播放软件与架构;bit-perfect与实时性
“异步”是否真的解决问题?
理想与现实的指引
一、抖动
数字音频由两种成分构成:信号值(16/24bit字长)+ 时间轴(采样率)。要实现音频回放:信号值转回成电压、采样率转回成时间轴。
而抖动就是采样间隔的时间飘移,但我们关注的应该是最终回放时的抖动。
主要的抖动来源
1)时钟的固有抖动
2)数据读取产生的抖动
3)电源噪声、射频/电磁干扰引起的抖动
4)数字传输过程中的抖动
而数字传输过程中的抖动是本文的重点,又可分为以下:
1)线材本身引入的抖动
2)前端的电源噪声、电磁干扰“传导”到DAC
3)前端时钟系统的不稳定:尤其是各种同步传输方式,前端时钟的不稳定会“传导”到DAC
4)速率匹配(实时性/效率)问题:人们一般不会说这属于“抖动”,因此它的影响被低估了
关于抖动影响的误区
为什么强调 “最终回放时”的抖动?因为真正有意义的是DA转换后模拟信号的抖动。有一个很好的图解释了这一点(见参考⑤):
不是说只有DA部分存在抖动,而是无论哪一种因素,要看它如何影响了最终的模拟信号从而被听到。
ps: 也有人讲抖动时会包含DA转换时参考电压的抖动问题,这个不在本文讨论范围
抖动的类型
总体分为两种大类:随机抖动(Random Jitter) + 决定性抖动(Deterministic Jitter)。
决定性抖动下面又有一类叫相关性抖动(Data Dependant Jitter),也就是与音频数据本身有相关性的抖动。通常认为相关性抖动对声音的影响更大。
重点在于:不同因素产生的抖动,由于具有不同的(时域/频域)分布特征,对声音的影响(方面/程度)也是不同的。(但这方面研究和资料比较少,这也是为什么jitter一定程度上仍然处于玄学领域)
“但是你能听出来吗?”
应该换一种问法:jitter如果已经很小了,它还会明显影响(长时间的)听音体验吗?或者说它直接影响转盘的声音档次么?从实践中得到结论:是的
根据AES杂志的研究:16bit DAC高于120皮秒的P-P jitter,以及20bit DAC高于8皮秒的P-P jitter都是可以听到的。但实践中人们觉得这个门限应该远远更低。(见参考①)
实际中对声音的影响:通常认为会明显影响到结像(让声音失去“现场感”),以及明显影响到低频表现。
减少传输抖动的思路/技术(实际中是各种手段的组合/叠加)
0)减少电源噪声、电磁干扰的影响:既要减少本地影响,又要隔离前端到后端的串扰
1)通过PLL来重构一个(相对于音源直接提供的)“更干净”的时钟;进而可以通过级联PLL来得到更好的结果
2)通过ASRC(Asynchronous Rate Converter)处理数据,使之“重新匹配”到DAC自己的时钟域
-- 理论上一个很大的buffer就足以隔离不同的时钟域,但实际很少有这么做的
3)反过来以DAC的时钟域做主控,让前端被动地“送数据”,这就是所谓的异步(异步USB、常规的以太网方案)
二、同步与异步传输
音频传输与数字传输
首先应该区分音频传输与数字传输(尽管它们实际上都是数字):
SPDIF(光纤/同轴)、AES/EBU这种是实时的音频传输,单向协议(没有反馈通路)。接收器的时钟需要锁定在传输流上,因此前端的时钟不稳定会传导给DAC,最终可能引起jitter。
之所以说是音频传输,是因为总线的速率(基本上)就是音频采样率,因此总线不仅作为一种传输链路,它的速率本身也是要传输的信息。
而在数字传输领域,总线速率与数据完全无关,你传输的不是音频流而是数据包。
USB
USB本质上不是专用来传输音频数据的,USB的传输是以固定时间间隔形成一个帧,包含了发送给同一个Host控制器下的不同设备的若干个数据包。全速下每1ms±500μs生成一个帧;高速下每125us±0.0625μs生成一个帧。
音频传输采用了USB提供的一种专用模式:Isochronous(等时/同步传输)。这种模式一定程度上保证数据的实时性与带宽,而没有错误重传。
因为Isochronous本质上是实时传输,前端与后端的时钟需要保持一致,因而有了三种具体如何实现同步的方式:
1)同步 synchronous
2)自适应 adaptive
3)异步 asynchronous
在同步或自适应方式下,界面需要不断调节自己的时钟来跟随前端时钟。
而在异步/ASYNC方式下,USB界面要负责流控:自己决定前端的每个frame中应该发多少数据,使用一条额外的反馈通路将这个信息反馈给前端,前端以此被动“校准”自己的发送速率。
在参考②中也可以看到:对USB的驱动程序来说,异步方式唯一的区别只是 “下一个传输的数据量”的计算方法上有区别。
对数据传输来说,线材的抖动影响几乎可以忽略不计(尽管理论上线路抖动可以引起误码;这不等于线材对声音没有影响,但不是本文的重点);而“异步”的设计理论上又可以消除前端时钟的影响,让DAC完全按自己的时钟自由运行,看起来很美好?
但这里无论是同步还是异步,实际根本上都是“实时传输”。区别只在于系统的哪个环节在主导时钟,然后整个链路如何去做相应的速率匹配/流量控制。
|
|