adpcm的压缩和解压缩实现

来源:互联网 发布:网络脆弱性扫描 编辑:程序博客网 时间:2024/05/22 06:17

前一博客介绍了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(unsignedchar * 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;

elseif (* pre_sample < -32768)

* pre_sample = -32768;

tempDes[i] = * pre_sample; 

* index +=index_adjust[code];

if (* index <0)

* index =0;

if (* index >88)

* index =88;

}

}