adpcm自适应差分脉冲编码调制-FPGA开源项目社区-FPGA CPLD-ChipDebug

adpcm自适应差分脉冲编码调制

因为声音一般是连续的,也就是频率足够快的情况下,前后两个采样值之间的差异会比较小。
我们就利用这个特性来对数据进行压缩,也就是对两次采样值的差再做一次量化,由于这个差值比较小,因此我们可以使用更少的bit来存储,这样就实现了压缩的结果。
如上图所示,直接存储的方式中,我们存储的数据是ABC三个16bit的数据,如果按照ADPCM压缩算法,我们存储的将是相对值,也就是B-A,C-B这样的更小的值,当然重新播放的时候,我们要有一个初值。
其实初值就是0,声音怎么也得是慢慢变大的,不然喇叭受得了,你耳朵也受不了。
接下来,我们看如何二次量化。
如果我们想压缩为4bit,那么也就是一共16个等级,你可以平均分配,但显然这样做很不明智,有大神发明了两种重新量化的定律,叫A Law和u Law。其实就是非线性量化,至于做成什么样的非线性,这得研究人耳朵对音乐的敏感性了,不在我们讨论范围内。
我们来看一个图,大致了解下两个Law的不同。
乍一看其实没太大区别,所以这种非线性量化其实也挺随意的。
由于信号量噪比的不恒定而影响信号质量,为了对不同的信号强度保持信号量噪比恒定,在理论上要求压缩特性为对数特性。
为了使信号量噪比保持恒定,引入A压缩律与μ压缩律以及相应的近似算法-13折线法和15折线法。一般来说,U律的15折线比A律的13折线,各个段落的斜率都相差2倍,所以小信号的信号量噪比也比A律大一倍,但是对于大信号来说,u律比a律差。
无论哪个折线法,到我们写程序的时候都变成了一个数组而已,我们就根据采样值的差值落到那个区间内来定义他的编码值。
请登录后发表评论

    没有回复内容