本帖最后由 wxleasyland 于 2017-9-16 16:36 编辑
一、USB的isochronous“等时传输模式”
USB音频声卡采用isochronous“等时传输模式”(有人也叫同步传输、实时传输),能保证实时传输数据,但错误容忍,出错不重传。
它是实时传输,所以USB电脑端发出多少速率的数据,USB接收端(USB声卡)就得接收多少速率。
比如电脑发送44.1KHZ的,声卡就接收44.1KHZ。
二、关于时钟同步
电脑内有一个晶振,可分频出一个44.1KHZ,进行音乐播放。
USB声卡自己得有一个晶振才能工作,它也可分频出一个44.1KHZ,供给I2S信号或DAC。
问题来了,晶振是有误差的,这两个44.1KHZ不可能完全一模一样,电脑可能是44.100KHZ,USB声卡可能是44.098KHZ,误差约50ppm,很正常的情况。
虽然声卡晶振分频出来是44.098KHZ,但声卡认为它就是工作在44.100KHZ下。
好吧,如果二者时钟独立运行,那么1个小时会误差0.2秒,会出现不同步! 即电脑播了1个小时的数据,USB声卡实际是无法播完的,要多0.2秒才能播完。 如果声卡也要1小时播完,那这1小时就需要丢掉0.2秒的数据。
所以二者的时钟必须要同步一致才行,因此USB音频规定了一是采用“等时传输模式”,二是设备需要指定为3种同步方式之一:同步(synchronous),适应(adaptive),异步(asynchronous)。(摘自USB2.0规范)
1. Synchronous同步方式 发送端Fs locked to SOF, Uses implicit feedback(SOF) 使用隐式反馈,数据速率Fs与SOF同步 接收端Fs locked to SOF, Uses implicit feedback(SOF) 使用隐式反馈,数据速率Fs与SOF同步
二种设备的时钟都需要通过PLL与USB的SOF时钟同步(1ms一个)。这样数据速率就同步了。
可以工作在一个固定速率、数量有限的速率、或可编程速率。
2. Adaptive自适应方式
发送端Fs locked to sink, Uses explicit feedback(isochronous pipe) 使用显式反馈,数据速率Fs与接收端同步 接收端Fs locked to data flow, Uses implicitfeedforward (data stream) 使用隐式前馈,数据速率Fs与数据流同步
自适应发送端,它产生数据的速率由接收端控制,接收端提供反馈给发送端,发送端就知道目标数据速率。
自适应接收端,数据速率信息是嵌入在接收到的数据流里的,即根据一段时间内接收到的样本数量来知道当前速率值。 可工作在一个速率附近、在多个速率间选择、或多个速率段内。
发送端必须要从HOST接收明确的反馈信息,这样它才能准确生成HOST需要的样本数量。
3. Asynchronous异步方式
发送端Free running Fs, Provides implicitfeedforward (data stream) 提供隐式前馈,数据速率Fs自由运行 接收端Free running Fs, Provides explicit feedback(isochronous pipe) 提供显式反馈,数据速率Fs自由运行 (注意“提供”与“使用”的区别。“提供”是要提供东西出去,“使用”是接收东西来用)
异步发送端发送样本数据,一个帧内发送的数据量就隐性指出了数据速率。
异步接收端则必须提供明确的反馈信息给驱动程序。
注意,这里的发送端、接收端均是指USB设备,即发送端→USB HOST-电脑CPU-USB HOST→接收端。比如发送端是一个USB麦克风,接收端是一个USB声卡。
当我们用电脑给USB声卡播放音乐时,只有声卡这个接收端(设备),是没有发送端(设备)的!! 所以可以忽略上面的发送端说明。
三、分析
电脑播放器播放音乐时:是按一个固定的速率,比如44.1KHZ,发给USB的数据流速率固定。
如果USB声卡是Synchronous方式:那它的时钟将通过PLL直接与SOF时钟同步,即与电脑就同步了。
如果USB声卡是Adaptive方式:那么数据速率Fs是与来的数据流同步,即根据一段时间内的接收到的样本数量来知道当前速率值。因为电脑播放的数据速率是固定的,所以声卡的时钟就和电脑同步了,即与电脑的44.1KHZ实际时钟频率同步,把自己的44.098KHZ时钟通过PLL纠正成44.1KHZ时钟了。 如果电脑时钟是44.102KHZ,那就纠正成44.102KHZ,电脑发多快,它就收多快。
如果USB声卡是Asynchronous方式:那么Fs根据声卡自己的频率运行(名义上是44.1KHZ,但实际频率有误差,比如44.098KHZ),声卡必须反馈告诉电脑想接收的数据量,以进行流控。但电脑播放的数据速率是固定的,是按电脑自己的时钟的,不会改变,因此声卡要的数据总会偏多或偏少,时间久了都会造成缓冲区清空或溢出,从而影响播放,要重新同步下。所以用Asynchronous方式是不合适的。除非电脑的驱动程序单独编制,想一个办法以处理这种数据流不同步的情况。 这也许就是XMOS子卡需要单独安装驱动的原因。
网友文章《基于USB异步技术的高保真音频回放真相》说:
“ 同步模式:USB声卡的时钟直接来自PC的Usb控制器时钟,所以这个时钟质量非常低,也受传输介质质量的影响,所以很少使用
自适应模式:声卡不断调节的时钟(调节周期是10ms)造成了很大的jitter,给声音造成了可闻的影响,所以这个方法的局限在于时钟变动引入的时钟抖动,而不在于音频数据流没有错误或再处理
异步模式:USB声卡的时钟频率固定不变,所以(时钟)质量相当好。但USB控制器时钟是固定的,频率不可调,也不会受USB声卡控制。(二者不同步)解决方法只有一个:(驱动程序)启用速率匹配器,合并一部分数据或对数据插值来减少或增加数据,间接地放慢或加快传数速度,这就意味着原始音频数据已被修改。所以,这个方法保证了时钟的质量却牺牲了原始音频数据的保真
如果采用USB“块传输模式”,市面上还没有这种产品。
”
我觉得有道理,和我分析的一致。
另外,USB传输的所有数据包内都有带有CRC校验,声卡能知道“等时传输模式”时数据是否有错,但是是没有出错重传的。
我觉得采用正规USB屏蔽线,长度缩短些,一般不会出现数据传输错误,主要还是时钟抖动jitter的问题。这是USB音频的硬伤了。
以上为个人观点。
|