前一博客介绍了adpcm的原理。这篇是具体实现。看了网上的资料,大部分都是没有提供具体实现。这里免费提供(暂时先提供解码部分)
static int index_adjust[16] = {-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8};
static int 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
};
pre_sample = 0;
index = 0; 从0开始
void adpcmDecode(unsigned char * src, int len, unsigned char * des, int * pre_sample, int * index) {
int i;
int code;
int sb;
int diff;
short * tempDes = (short *)des;
for (i = 0;i < 2*len;i ++){
code = src[i >> 1] & 0x0f; ////////
if ((code & 8) != 0)
sb = 1;
else
sb = 0;
code &= 7;
diff = (step_table[* index] * code) / 4 + step_table[* index] / 8;
if (sb)
diff = -diff;
* pre_sample += diff;
if (* pre_sample > 32767)
* pre_sample = 32767;
else if (* pre_sample < -32768)
* pre_sample = -32768;
tempDes[i] = * pre_sample;
* index += index_adjust[code];
if (* index < 0)
* index = 0;
if (* index > 88)
* index = 88;
}
}