标签:算法
在信号处理领域,增益分为数字增益和模拟增益,数字增益用于操作离散的数字化的采样值,模拟增益直接操作连续的模拟的信号波形。对于目前大多数高端音响,都是采用模拟增益调整音量的,原因就在于数字增益有一些局限性。
数字30, 003在16bit DAC中是这么表达的:
0111010100110011 = 30,003
对数字增益来说,调低音量是直接减少这个数字:比如调低-10db,
而若20log(x)=-10,则x=0.3162,则降低10db就是把原音量值乘以0.3162。
于是,结果就是30003*0.3162=9488
0010010100010000 = 9,488
但是。。注意,其实不是应该是这样的吗?
30,003 * 0.3162 = 9487.7817
这个四舍五入造成的误差,虽然很小,但确实存在。
如果我们想更大幅度的降低音量,比如-35db,那么
-35db是0.0177828 ,最终得到结果:
0000001000010110 = 534
但实际上精确的结果是
30,003 * 0.3162 = 533.5372
这样的误差就是866PPM(parts per million),略有点大了。
所以,这样的误差,看上去不起眼,但是音量越低,就越难以忽视。
由此得到结论:数字增益无法处理分数会产生精度误差。
那么,怎么处理这个问题呢?
如果我们用32位定点小数表示一个16位的采样的话,30,003在32 bit DAC里是这么表示的:
0111010100110011.0000000000000000 = 30,003
当-35db音量时:
-35db is 0.0177828,因此结果是:
0000001000010110.1000100110000100 =533.5372
所以拓宽处理通路可以很有效得降低精度的丧失。
目前音频处理领域很多采用32位float采样来进行信号处理,其实原理是一样的。
标签:算法
原文地址:http://blog.csdn.net/ffmpeg4976/article/details/45600447