在数字设备中,信号以二进制编码,而每一帧信号都只能由有限位二进制数来表达。那么就存在一个能表达的最大范围。这个最大值,就叫做Full Scale。那么数字音频系统中能达到的其他电平,都会小于这个满刻度的电平,因此在数字音频处理中,信号的大小都为负值。
位深则影响了在0电平到最大电平之间划分的采样区间的大小。落在这样一个区间里的值在采样之后,都成为了相同的一个值。比如说如果位深为1bit,那么只有0和1两种状态。如果有这样的一个AD转换器,来采集-1V~1V范围内的信号,那么无论信号是-1V还是-0.5V还是-0.25V,经过AD转换之后都被记录为0,无论信号是1V还是0.75V还是0.5V,采样后都被记录为1。
这个误差称为量化误差(quantization error)。量化误差在信号中的表现类似于噪声,有很宽的频谱,于是可以用信噪比来衡量。并且可以由公式算得:[4]
那么为什么量化位深会影响动态范围的问题也就迎刃而解了。
量化位深会影响到可以有效记录下(也即不被量化噪声掩盖)的最小波形,所以记录下的信号的最小值会受到量化位深的影响。
浮点数
讲完动态范围,又想到了一个问题。这个问题我还不是十分明白,还希望懂的人可以指点一下。
我们在各种音频处理软件里,都可以处理到 0dB 以上电平的声音。那么软件是如何做到的呢?
搜索了一下,得到了一个叫做动态余量(Headroom)的概念。[5]
所以是否是在音频处理软件里,限制了一个0dBFS以下的值作为刻度表0dB的标准呢?从而才可以稍微允许一些超过0dB的声音出现而不导致削波失真。但是这样的话,不又浪费了一些动态范围吗?
我做了一个测试,在软件里,把音量调到0dB以上,仍然可以听到不失真的声音。然后把这个音频导出之后播放,得到的声音就是失真的。
感谢知友@Sugr宋少鹏 ,翻阅了一些资料,原来不是位深度的问题影响了超出 0dBFS 的信号的记录,而是浮点数或者非浮点数带来的影响。[6]
我做了一个实验,生成了一个大于0dBFS的信号,然后分别导出为16bit整形的wav和32bit浮点的wav,再使用软件打开查看波形,两者的差别便很明显了。
使用32bit-float格式的wav文件
使用16bit-int格式的wav文件
浮点数将