原文:http://www.znmcu.cn/znx_51_alltest_shell_fj_adpcm1.htmlhtml
ADPCM音频解码,其实放在这里有些不太合适。算法
在编写ZN-X开发板整板测试程序的后期,振南开始转向专一于ADPCM音频的解码算法。对于音视频的编解码,振南一直是很感兴趣的。shell
VS1003录音向外输出的数据是通过ADPCM编码的,所谓ADPCM编码是一种自适应差分脉码调制技术。它能够对音频数据在毫无损失的前提下,将数据量压缩为原来的1/4,这对于音频来讲,意义是重大的。我很想深刻去研究一下ADPCM,但由于没有时间,一直被搁置。测试
ADPCM源于微软的Windows,通常的WAV文件就是使用它来编码的,WAV是Windows上的标准音频格式。ADPCM算法已经被标准化了,现行使用的是IMA-ADPCM,即IMA组织制订的ADPCM算法。这种算法比较简单,但却有较高的压缩比。编码
ADPCM编码的原理(我会尽可能说的通俗的):spa
若是咱们对一个声音信号进行采样,采用16位量化,好比采集53个点,以下图:视频
若是咱们直接存储每个点的16位的采样值,这样就须要53X16=848个位,大约是106字节。但咱们换个思路,咱们不存储采样值,而存储采样点两两之间的差值(采样值可能会很大,须要更多的位数来表达,好比16个位,可是两点之间通常来讲是比较连续的,差值不会太大,因此这个差值只须要不多的几个位便可表达,好比4个位)。这样,咱们只须要知道前一个点的值,又知道它与下一个点的差值,就能够计算获得下一个点了。这个差值就是所谓的“差分”!htm
这就是DPCM的主要思想精髓!!blog
“什么?DPCM?咱们不是说ADPCM吗?”是的,DPCM是差分脉码调制,多一个A,就是自适应!为何要自适应?开发
你有没有考虑到一个问题?若是取两点之差,这个差值超过了4个位能够表达的范围,该如何处理?音频信号虽然具备很高的连续性,可是咱们并不能保证两点之间产生突变的可能!
前面的差值多是3、5、8、12,后面忽然变成20、40,甚至更大,这时4个位还够用吗?数据量的减小,不能以数据丢失和失真做为代价!!
若是有一种方法,能够把两点之间的差值变换到固定的几个位便可表达的范围内,那就行了!并且这种变换是实时的,而且具备自适应性和预测能力的。这就是ADPCM的基本思想。它定义了一些因子,这种算法若是发现两点之间差值变大以后,就会用差值去和相应的因子做除法,从而减少了差值,让它能够减小到几个位可表达的数值范围内。而选择哪个因子来除它,这就是ADPCM编码要做的事情了。
ADPCM算法巧妙的利用了音频信号的特色,也就是音频信号上的点与它前面的若干个点是有必定的相关性的,从而能够对下一个点进行预测,从而预先估计这个差值,从而选取相应的除数因子,去把差值归化到数值范围内!!
以上就是ADPCM对音频信号进行编码大致思想和过程!!
咱们从VS1003中读取到的,就是通过ADPCM编码后的数据,也就是音频信号采样点之间的差值!(只是这些差值并不能直接用来去计算下一个采样点,而须要与因子相乘,计算获得真正的差值,这与编码是一个相逆的过程。乘数因子就是编码时用的那个除数因子,解码时要根据当前的音频信号去预判,以便取合适的因子!!)
以上是对ADPCM编码音频的解码的方法,它适用于VS1003输出的音频数据,一样适用于使用ADPCM编码的WAV文件,以及全部使用ADPCM编码的声音数据!!!
【好比一些语音产品,像数字对讲机、数字广播等等,也均可以使用ADPCM编码,这样能够很好的下降数据带宽要求!!】