pcm音量调节
今天有人问我pcm数据音量调节的问题。那今天就聊一聊音乐音量这个话题。
对于音乐播放器来说,音频播放器硬件分为两个大模块,一个是音频数据源pcm模块,一个是dac功放模块,两者之间通过iis信号线通信,iis信号线上传输的就是pcm数据。
对于android系统来说,音乐解码器把音乐数据解码成pcm数据,通过android的硬件抽象层调用linux的声卡,在通过声卡打包pcm数据为iis信号,发送pcm到dac端。dac端负责iis数据解析和pcm数据播放,播放出变动的电压值。但是这个电压值是一个小电压,一般只能驱动一个小欧姆的耳机,喇叭,声音会特别特别小,不能满足正常的生活需要,因此需要对这个小电压进行放大,也就是经过功放模块对声音大小进行控制。
正常的设备音量调节都在功放端进行音量调节,但是今天有大哥问我怎么在pcm端进行音量调节,我就想出了一个小方案。大哥的问题是24采样精度的pcm数据怎么通过调节pcm数据来调节音量大小。我听到这个话第一个想到的就是减呗,我特么又想了想,要是直接减了那可太傻逼了,那特么声音就失真了。第二想法就是成比例进行缩放吧!既然是24采样精度的pcm数据,我首先就要说说采样精度这个东西,我们平常见到的采样精度都是8bit,16bit。然后音乐软件上总会推出24bit采样精度的歌,说高品质等等。最后dac模块最大支持32bit采样精度。那么这个采样精度就是dac的位数,8就是2的8次方的精度,比如我的基准电压是3.3伏,那么我的最小精度电压就是3.3伏除以2的8次方,假如的我的音乐是8bit采样精度的pcm,那么这个pcm值就可以直接写到dac上。同理,我这个音乐是24bit采样精度的pcm,想往8bit位数的dac里边写,那我们就需要把pcm值进行一个比例缩小,pcm数据乘上2的8次方除以2的24次方。
溜题了溜题了!大哥问我24bit的pcm数据怎么缩小,把数据变成浮点型,然后乘上一个比例系数,分十个音量阶梯你就乘0,1/9...,9/9。然后再把浮点型数据的小数点后边去掉就完了。但是真的不建议这么整,还是在功放模块调节更好一点。
最后想告诉大家一个小秘密,一般的android手机系统内部根本就不支持24bit的音乐进行重采样。你播放的24bit音乐,经过解码器之后的pcm一般都是16bit的音乐,在经过android的音乐重采样生成32bit采样精度,但是重采样之后的32也就那样,很你解码之后的16bit的音乐数据一样,重采样的作用也就是把输入的各种格式重采样变成同一种格式,来减少声卡的功能压力。所以说用手机播放音乐,也没必要非得追求24bit的音乐,手机播放效果也没那么明显,智商税的效果更高一些。想听好的音乐就买一个专业的设备吧!