UID576236
威望2
金钱13902
交易诚信度0
主题8
帖子259
注册时间2009-3-15
最后登录2025-7-17
初级会员
 
交易诚信度0
注册时间2009-3-15
|
原帖由 yxiao 于 2010-3-22 12:00 发表 
“再有碎片、再多寻道的硬盘也可以保证讲数据正确读出”你一定知道 JITTER 这个词吧,碎片、寻道不会产生误码,但会导致 JITTER 。
“在期间还有多层软件对数据进行各种转换,最后通过外设(如声卡)将数据以spdif格式输出”CD机也有完全相同的过程,事实上上述过程也是产生 JITTER 的原因之一。当然硬盘会面临一个额外的问题,文件系统。
“与cd转盘不同,在这个过程中,是不可能有任何误码的。”不幸与 CD 完全相同,硬盘的数据读取同样会有原始误码,同样会有分层次的纠错技术。纠错技术的使用,也是产生 JITTER 的原因之一。
转一篇文章《Jitter可以在CD,内存,硬盘和网络之间传递吗?》
http://www.av199.com/viewthread.php?tid=178902&extra=pageD1&page=78
看到这里有好多关于完全一样的wav文件会不会有听感不同的讨论,觉得很有意思。所以特地注册一个帐号,向各位朋友汇报一点我了解的关于Jitter传递的粗浅认识,想跟有兴趣的朋友一起讨论。
先简单看看CD音轨是怎么变成硬盘文件的过程,以及Jitter在整个过程中是如何转变的吧。看看抓轨软件怎么做的,如果有兴趣,将来还可以看看其它方式比如CD对录是怎么做的。
1. CD读取:抓轨软件会对操作系统发出请求要求读取CD,光驱驱动软件会被调用,光驱控制器转动光盘按照抓轨软件要求读取一个个扇区上的音轨数据(这个过程的细节有兴趣以后可以展开谈)。这时候的读取速度一般是10到20倍于CD播放速度,也就是1.5-3M byte每秒。这时的bit time在10-100纳秒数量级上,所以Jitter也是大致这个数量级上。注意如果用1倍速读取的话,bit time就10倍20倍地增加,Jitter也会随bit time一起增加到100-1000纳秒级。光驱会把读盘得到的数据先暂存在内部缓存上,攒满一次请求的数据量,就用DMA从光驱缓存上把音轨数据读出来,通过IDE(或者SATA、SCSI)接口传送到主机内存里。这次光驱缓存对主机内存的传输速度就是IDE接口的速度,几十兆到一百多兆byte每秒的速度。
2. 内存中转:内存的访问速度以800M DDR2内存算,是800Mo每秒或者最高6.4Gbyte每秒,每个内存字之间写入的速度是跳变的,或者说写内存时有非常明显的人工制造的 Jitter。当光驱完成一次DMA传输把一块CD音轨数据拷贝到内存,操作系统会通知抓轨软件“你的快递到了”。抓轨软件一次又一次地发出读光盘请求,把读到内存的音轨数据做一些检查和简单处理,攒到一定数量的音轨数据,等自己申请的内存快堆满了,就会把检查完的音轨弄成一批往硬盘写,然后继续请求读 CD直到完成抓轨。写硬盘的工作,对于抓轨软件来说,要做的就是请求操作系统中的文件系统创建和打开一个硬盘文件,然后一次一次不定时地通过DMA请求把指定内存位置上的音轨数据拷贝到硬盘。其中在音轨暂存在内存里的这段时间,每过几十毫秒整个内存还会被重写一次,因为内存里每个bit就是一个爱漏电的小电容,不赶紧重写等电容充电漏光了,就不知道是0还是1了。
3.硬盘写入:硬盘驱动程序每次接到操作系统写盘请求,就会通过DMA从内存指定位置读取音轨数据,写到硬盘内的缓存上。然后硬盘控制器会根据磁头调度算法寻找合适的时机把内部缓存上的数据写到磁盘上。硬盘磁头读写盘的速度在1Gbit每秒左右,bit time是1纳秒左右,如果要讲Jitter也是这个数量级的。
上面过程我们看到了一路上Jitter的转变,从CD读出时的10-100 纳秒级或者很多毫秒级(不同扇区),到内存读写的纳秒或者很多秒级(不同次读写之间),到硬盘写入的纳秒级或者很多秒级甚至分钟级,这整个过程能不能忠实地或者不太忠实地传递最初CD读盘的Jitter?
这个过程中,大家会注意到各个步骤的存取速度(或者说时钟频率)是相差很大的,有的很快有的很慢,而且那些钟是走走停停的并不连续,那么这样的操作怎么能完成的呢?这中间需要缓存和等待,很多次的缓存和等待。实际上,如果从CD 上的一段音轨的角度来看:它被从碟片上读出来写入光驱缓存,然后在缓存上歇了一会儿等等后面的兄弟;等凑齐一批兄弟,就一起坐上一辆叫IDE的地铁进入主机内存继续等着;等轮到抓轨软件干活了,从内存把音轨读到CPU看看有没有问题,没什么问题就继续在内存里等着;又等了不知多少毫秒或几秒,突然跟内存里的一大批兄弟一起被写到硬盘缓存,接在又一次开始了无聊的等待;等磁头有空了闲着没事做了,或者有足够多兄弟要求去磁盘上同一个地方了,才被写入到磁盘上变成磁翻转。如果换个角度,从磁盘上写完了的一条音轨来看,它其实是被分尸成好多段,写在磁盘的不同位置上。每一段写入的时间间隔可能是连着的,也经常可能差了几百毫秒,甚至可能差了很多秒或很多分钟。
回过头来我们现在看看磁盘上一条音轨的“写入Jitter”。同一区段上的bit之间,写入jitter是1纳秒以下,不同段之间的是几毫秒到几百毫秒到很多秒不等,最气人的是,写入的顺序不一定是按音轨内容的顺序,最后一段可能是最先写入的。你说这么个乱七八糟的“磁盘写入Jitter”怎么能反映当年的CD读盘Jitter啊?其实就是当年那个CD读盘Jitter,因为是20倍速读取的,如果条件差不多,Jitter也只有1倍速读取时的20分之一左右,就算是出了奇迹带入磁盘了,也不见得比天价CD机的Jitter大。真要拿硬盘跟CD比jitter,硬盘的读写速率是1Gbps级的,CD机是1Mbps 级的,硬盘的Jitter是CDjitter的千分之一(串行操作,时钟频率越高,jitter的绝对值就越小)。不过jitter是只讲相对值,不讲绝对值的,就是用UI(单位时钟间隔)做单位,不用秒做单位。换句话说不同时钟频率的信号,它们的jitter没有比较意义,也不可能传递。
实际上,Jitter只有在带有(严格或不严格的)时钟同步的操作步骤之间才能传递,比如说CD机1倍速读碟,解调解码分离出PCM数据,通过SPDIF或I2S 或任何机制向DAC传递,DAC锁定并接收信号,送入DA芯片,这样一路共享或分享同一个时钟,各步骤之间存在时钟锁定,这种情况下Jitter才能传递。ASRC则是一种不严格的时钟同步,虽然每个bit可以不同步,但是宏观上是同步锁定的,如果不断线,一千年后DAC和转盘的时钟还是锁定的。
如果信号传递过程中根本没有(哪怕是不严格的)全程时钟同步,就不存在Jitter传递的命题了。比如说用低速从A传到B,歇了一会儿,又高速从B传到C,又歇了几天或几年,又高速从C传到D,最后低速从D传到E,在E点看到的Jitter,就完全是D点到E点之间产生的,跟前面的A、B、C一点关系都没有。有人要问CD上的坑的长短怎么回事,它不是能存很多年吗?其实CD上的坑的长度抖动在写入时就并不体现(或者说记录)前端信号的Jitter,而是写入过程中的各种因素影响的产物,在读出时既不唯一决定也不直接决定读出信号的Jitter特征(也就是说不同转盘或者同一转盘不同次读取,得到的Jitter 特征不同),它只是众多Jitter成因中的一个,但并不是一个Jitter传递者,也不是Jitter能够在两个离线传输操作中传递的证明。
如果我们要找一次回放过程中的Jitter的话,要从回放时钟的源头开始算起,在回放时钟产生之前的步骤跟回放Jitter是没有关系的(跟读硬盘之类的操作无关的,除非你用 44.1khz的时钟读硬盘再同步传输到DAC)。如果是44.1khz的音轨,我们要找44.1khz时钟的来源,是CD读取时钟,还是CD缓存后的串行化时钟,还是声卡时钟,还是操作系统软件模拟时钟,还是外部独立时钟?总之它一定要是一个44.1k或者被用于获取44.1k脉冲的时钟,而不会是内存总线时钟,不会是硬盘读写时钟,不会是墙上挂着的那个钟,因为它们都跟最终回放时钟(DA时钟)的产生没有任何关系。说到底,有时钟才有Jitter,没有时钟就没有Jitter,不相关的时钟之间不传递Jitter。
最后顺便提一下“Jitter记录”的问题吧,Jitter能被记录吗?能,但是只有傻瓜才去记录Jitter。为什么?因为记录jitter 就跟记录误差一样,你说我这个电压是2.55V,误差是+0.003V,或者你说我身高是2米,误差是-20公分,这叫做记录误差。但是你为什么不说这个电压是2.553V或者你身高1.80米呢?Jitter的记录是同样的道理,如果我们知道Jitter是多少,为什么不干脆去除它,记下来当饭吃啊?如果我们要测量和记录jitter的数值来修正PCM信号的Jitter,我们就需要比主信号脉冲高得多的信号频率(比如192khz)来记录 Jitter,结果是你存下了一条44.1k的音轨信号,外加一条192khz的Jitter修正信号流,你说这有趣吗,好玩吗?再说了,真要是用 192khz数据流记录Jitter,对于改善44.1k的Jitter帮助也不大,只能修正1/4脉冲宽度的Jitter而已,修正后的Jitter还是可能很大,1/4UI的jitter其实在好的系统里算是大的了。如果我们脱裤子放屁用一个比主信号更高级的信号载体来记录Jitter,我们为什么不直接用这个高级信号载体记录音频信号本身啊,直接弄一条192k的音轨不好吗?就好像说,你故意用一把很不准的尺测量长度,然后再拿一把很准的尺去测量前次测量的误差,然后把不准的测量值和精准的误差值一起记录下来,你说有这么干的吗?Jitter就跟误差一样,我们知道有误差,我们甚至知道误差的可能范围(比如+/-1V什么的),但是我们不知道(条件不允许知道)具体每次误差是多少,如果我们知道的话,当初就不会记录有误差的数据了。
再加一个,PCM或者wav里面有没有记录时钟和Jitter?都有!有时钟,隐含时钟,就是说它通过控制信息告诉你,我是44.1k的或者96k的,你要用44.1k或者96k的时钟来给我作DA转换。但是它没告诉你(也没法告诉你)怎么产生一个44.1k或者96k的时钟,它也不知道你给它做DA时候加的44.1k的时钟准不准,更不知道你的时钟有没有Jitter了。那PCM信号里有记录Jitter吗?也有,也是隐含的,不过这次隐含得更彻底,根本就没写。就是0嘛,写个啥呀,你要用0的jitter来播放我。这个跟一张琴谱一样的,琴谱上也有时钟,也有Jitter,它说,我是4/4拍的,Jitter是 0,你要用稳定的4/4拍来演奏。至于你怎么找到4/4拍的感觉(时钟脉冲),怎么保证节奏稳定(0的Jitter),那是你的事,琴谱(或者PCM)才不管呢。有没有琴谱上不写多少拍的呢?有。怎么办?你一定知道,猜呗!同理,也有PCM不写时钟的,但是播放它的设备能猜出来。Jitter为什么没写?因为它估计你一定猜得出来(它认为)是0啊!要是它知道当年AD时的Jitter不是0而是具体什么数值,该是多少它早就调整好了。 |
|