ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的。
8bits采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。
以上文字摘自http://blog.youkuaiyun.com/lxc1014/article/details/9316381
自己写该算法时参考了上述博客中的内容。但后来才知道STM32官方也有该算法的文档和程序,于是自己基于上面两份资料写了关于该算法的代码。当然还有很多不懂的,不对处望博友指正。我用的是STM32的ADC、DAC,它是12Bit采样,所以我稍微将传统的ADPCM给改了下。
typedef __packed struct
{
int16_t valprev;
int8_t index;
}_s_ADPCM;
int8_t index_adjust[16] = {-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8};
uint16_t step_table[89] =
{
7,8,9,10,11,12,13,14,16,17,19,21,23,25,28,31,34,37,41,45,
50,55,60,66,73,80,88,97,107,118,130,143,157,173,190,209,230,253,279,307,337,371,
408,449,494,544,598,658,724,796,876,963,1060,1166,1282,1411,1552,1707,1878,2066,
2272,2499,2749,3024,3327,3660,4026,4428,4871,5358,5894,6484,7132,7845,8630,9493,
10442,11487,12635,13899,15289,16818,18500,20350,22385,24623,27086,29794,32767
};