这是很无聊的研究,和各位大神做音乐没什么关系,开口教育的请点x。
之前发了一个帖子
http://www.audiobar.cn/forum.php?mod=viewthread&tid=531771关于新开一轨做平行dither的,我认为理论上dither就是叠加被截断位数的随机噪声,可是讨论结果却是从音频波形本身还原度来看,平行dither起到的效果和直接dither并不一样,而且要差一些。这让我很难理解,后来查了很多资料,果然问题不是出在平行dither的操作,而是在于宿主内部进行并轨或者其他运算时对轨道进行了预衰减。
首先必须要先说一下给定bit深度时的二进制数字运算,以24bit举例。
这一部分先说动态范围,24bit深度的动态范围是144db,这是因为电平db值每降低6db,波形点本身数值会变成2分之一,假设最大的波形数值是1的话,最小的波形数值就是2的-24次方。也就是说24bit数字音频只能用24个1或者0的小格子来记录数值。可以认为24bit的数字音频的电平为0,等于波形的数值被记录为二进制的111111111111
111111111111(24个1),这个值就是可以记录的最大值。因此当超过这个值时,就不能被记录,这个值一半情况就是0电平。如果是定点运算比0大的最小值就是000000000000000000000001,但是对于浮点运算,因为小数点可以移动,理论上这个值可以无限小,当然这个帖子讨论的东西定点浮点都一样,就不深究了。
所以说不光最后的音频不能破0,在宿主内部运算的任何一个环节,都不能允许超过0电平,也就是比24个1更大的数字产生,因为这是完全无法记录的。
但是我们可以看到,其实你在宿主内部,除了过了总线之后的结果,都是可以破0而不削波的,在一个轨道上你可以增益6db却没有削波,即使你混音的时候破0了,你都可以在总线上面把推子拉下来也不会削波。
可是宿主记录音频的方式又确定了内部任何时候都不能破真正的0,那么这是怎么产生的呢?
这就是因为,多轨宿主做了一点小小的手脚,让每个推子的0都不是真正的0,而是拉到顶时才是真正的0,这样你做的操作实际上都是不同程度的数字衰减,除非所有推子都推到顶了,不然就都被衰减了。在定点运算中,衰减直接会导致数值尾数丢失;浮点运算中,衰减本身虽然不会导致尾数丢失,但是如果不丢失尾数,重新增益时会导致溢出,也就是破0。所以为了不破0,宿主不论在定点还是浮点运算,都会舍弃尾数,来保证有增益的空间。
同理,并轨操作也是会使得数值增大的操作,因此宿主在并轨时也要对每轨数字信号进行预衰减来保证最终运算过程中不产生溢出。
可是为什么宿主进行了衰减,可是听起来响度却没变,这也很简单,因为它也偷偷做了增益。
我举一个例子,如果一个值本身是
111111111111111111111111,进行推子的运算时,宿主会把他变成011111111111111111111111{1},最后一个1被舍入了,然后再增益回来,变成111111111111111111111110,这样操作之后,音频听起来会差不多,但是其实尾数丢失变成0了。最后就回到我上次发的那个帖子产生的结果,dither时,会为音频添加被截断位数的随机数,也就是说24到16时,会添加类似于000000
00000000001011011这样的随机数(实际上就是最后8位)。但是经过宿主轨道推子的第一次衰减(如果时cubase推子从6.02到0就是衰减为原来的2分之一),这个信号会变成00000000000000001011010(丢失了一位),另外一轨的原始音频和这个dither信号一样也会丢失尾数,在并轨的时候可能也会进行同样的类似的衰减丢失了尾数。
和降bit的时候一下子丢失8位尾数比起来,宿主这样的预衰减产生的失真有可能几乎难以被人耳朵分辨,但是却可以一定程度上导致dither信号的随机性被削弱了,减弱了dither的效果,导致了之前平行dither之后产生的情况。
另外这里插一句,浮点运算有一个问题在于一些在十进制计算里面应该相减后等于0的计算结果有可能会得出一个非常小的数字而不是0,这是因为十进制有限小数用二进制来表示时可能会变成二进制循环小数进而导致截断误差,这个所以很多浮点算法里面可能会有一个修正手段,设定一个阈值来认为小于这个阈值的数值都是0,当然这个手段也会误伤到本来就很小的数据。因此相位叠加的结果是0,并不一定是真的信号完全相同,而是有可能反相叠加之后的数值小于这个阈值。不过这贴主要不是为了讨论这个,就不深究了。
最后附上自己做的实验的图,可以看到当将两个轨道的推子都推到顶的时候,平行dither的效果变得更加接近普通dither的效果了,剩下的一点区别我认为是并轨操作里面的预衰减导致的。
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x