adpcm的压缩和解压缩实现

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

}

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值