这篇教程如何利用python处理原始音频数据写得很实用,希望能帮到您。
一、基础知识PCM(pulse code modulation) ,即脉冲编码调制,是将模拟信号转为数字信号的一种编码系统。而模数转换主要分两步,首先对连续的模拟信号进行采样,然后把采样得到的数据转化为数值,即量化。
设x xx为输入信号,F ( x ) F(x)F(x)为量化后的信号,则F ( x ) F(x)F(x)既可以是线性的,也可以是非线性的。在audioop 中,主要提供三种编码支持,分别是a-Law ,μ-Law 以及ADPCM 。 
在中国和欧洲主要实用的编码方式为A-Law,其表达式为: 
其中A AA为压缩系数,在G.726标准中建议87.56。 ADPCM(Adaptive Differential PCM) ,即自适应差分PCM。
由于模拟信号的连续性,一般来说相邻时间单位的信号往往具有较高的线性度,甚至彼此相差无几,从而可以被高效率的压缩。然而,也存在跳跃幅度较大的信号,如果完全以缓变为原则,那么必然会丢失这部分数据。为了均衡这种差异,就需要进行自适应量化。 audioop中支持的Intel/DVI ADPCM算法可以在网上找到,但是信息并不多而且都很老旧,貌似不太重要的样子,甚至知网都搜不到,所以这里就不详细解读了。
二、转换函数audioop 提供了ADPCM 、A-Law 和μ-Law 和线性采样之间的转换函数
采样 | ADPCM | A-Law | μ-Law |
---|
lin2lin | lin2adpcm | lin2alaw | lin2ulaw | | adpcm2lin | alaw2lin | ulaw2lin |
其中,与A-Law 和μ-Law 有关的转换函数的输入参数为(fragment , width ),分别代表待处理片段和位宽;adpcm 则会多一个state 元组作为第三个参数,表示编码器状态。 lin2lin 是将线性片段在1、2、3 和 4 字节格式之间转换的函数,其输入参数为(fragment , width , newwidth )。
下面新建一些数据来测试一下编码转换函数, |