PCM以及G711编码

本文详细介绍了PCM编码的过程,包括ADC参考电压如何确定模拟量的数字值,以及数字基准电平与模拟输入电压的关系。接着,讨论了8bit分辨率下,G711的A律压缩算法,通过非均匀量化实现“压大补小”的效果,减少小信号量化误差。最后,解释了16bit PCM到8bit A-law编码的方法,涉及线性到A-law的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCM:

PCM模数转换时,具体的模拟量是如何确定为某一个数字值的?以前一直认为是这样的:比如模拟量(电压)是3V,则对应的数字量是3。其实这个形而上学的认识错了。

ADC时,存在一个参考电压,此参考电压就是用来确定模拟量对应的数字量的,详细可参考 http://wenku.baidu.com/link?url=ZnvwHHE10-0UZ8hPRvLczj56dEQlblRAkrW5_35BQVg8g_VRVXGKZNpc58m8zPm0LHJA-ERkoiNSJ2noHTIngHx5bazjUdAzkKcmHecmktu 。尤其第6、10、11、12,很能说明问题。

音频基准电平浅析 https://www.cnblogs.com/sys-engineer/archive/2012/09/18/2691001.html 这篇文章,讲的比较透彻:

我国国家标准规定,数字基准电平-20dBFS对应模拟信号的+4dBu,即当输入+4dBu幅度的sine模拟音频信号时,信号经过运算放大器调整,进入ADC采样输出的数字信号编码值应该为-20dBFS。

注:

1 : 0 dBFS 对应ADC最大量程,编码值为0x7FFF,请参考PCM编码相关标准。
2 : n dBFS = 20 * log( x / 0x7FFF ); 对于m bit采样adc,n = 20log(x / 2的(n-1)次方)
3 : n dBu = 20 * log( v / 0.775 );

实际上确定了dBu,就确定了输入电压的值,+4dBu,对应的模拟输入电压为:1.23V。而直到了dBFS,也就知道了对应的二进制编码,-20dBFS,对应的编码有2个,0x0CCD和0xF333,为什么会有两个呢?因为模拟输入电压是交流的,相同的值,如果电压极性相反,那就一个正值一个负值,数字是相同的。负值是采用补码表示的。而0xF333正好是-0x0CCD的补码表示。

有了+4dBu对应 -20dBFS这个基准,就能计算出任何一个输入信号的编码值,比如对于+5dBu的输入,则对应-19dBFS,编码为0x0E5D,当然还有一个对应的补码形式的负值。

同时一旦确定了这个基准,那么,输入端能接受的最大输入电压也就确定了:最大输入电压应该对应0dBFS,此时对应的编码时0x7FFF,也就是24dBu,可以计算出此时输入电压为12.28V。也就是说,对于一个麦克风系统,如果其输出电压超过12.28V,那么,PCM数字化后,信号就会失真。这也就是为什么我们对麦克风大吼的话,其输出在最大音量处会失真的原因。

 

G711压缩算法:

上面描述的是均匀量化(线性Linear PCM)的情况,对于16bit的分辨率,均匀量化的量化误差,哪怕是小信号,也能接受。但如果是8bit的分辨率,均匀量化效果就不好了,小信号的相对误差会比较大(参考https://www.docin.com/p-97807548.html 的描述)。这时,就采用A律或者u律进行非均匀量化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值