音频的一个采样用几个bit来表示,叫采样精度,又叫位深(bit-depth)。我们常用的位深是16bit,也就是16bit表达一个采样,这样,最高信噪比可以表示为20log(2^16)=96db,而用24bit位深的话,最高信噪比可以到达20log(2^24)=144db。
专业的数字音频处理软件内部其实都是用float型来表示一个采样,也就是32bit,那么最高信噪比可以达到193db,这个信噪比已经非常高了。
我们需要达到的目标,比如达到业界vivo的codec cs4398信噪比120db,这个只需要24bit就能在理论上提供了可行性。
对于MP3等有损格式,无论压缩前的pcm数据是24bit还是16bit的,压缩过程中都会尽量使用最小bit-depth来存储数据,因此解码时的bit-depth理论上时没有意义的。但是工程上讲,使用24bit解码器的mp3,解码时进行加减乘除运算的精度变大,从而能提高一些信噪比。
为了方便处理,通常会把24bit放入一个32bit int,怎么放呢?跟容器类型和机器大小端有关系。
比如WAV容器,它存储是小端的,这样,存储0xAABBCC这个24bit的采样就需要存成:
CC BB AA (---地址从低到高--->)
为了转化为 int32_t 进行处理,需要把它的高位填充到一个 int32_t 型数中的高位,而最低 8位补零,最终得到 0xAABBCC00 。由于arm 也是小端的,内存中应该是这样的布局:
00 CC BB AA (---地址从低到高--->)