ADPCM压缩算法.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ADPCM压缩算法  ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的 16bit 数据以 4bit 存储,所以压缩比 1:4. 而且压缩/解压缩算法非常简单,所以是一种低空间消耗,高质量高效率声音获得的好途径。保存声音的数据文件后缀名为 .AUD 的大多用ADPCM 压缩。  ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的,由于它的编码和解码的过程却很简洁,列在后面,相信大家能够看懂。  8bits采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。 ADPCM 压缩过程   首先我们认为声音信号都是从零开始的,那么需要初始化两个变量     int index=0,prev_sample=0;   下面的循环将依次处理声音数据流,注意其中的 getnextsample() 应该得到一个 16bit 的采样数据,而 outputdata() 可以将计算出来的数据保存起来,程序中用到的 step_table[],index_adjust[] 附在后面:     int index=0,prev_sample:=0;     while (还有数据要处理)     {       cur_sample=getnextsample();        // 得到当前的采样数据       delta=cur_sample-prev_sample;       // 计算出和上一个的增量       if (delta0) delta=-delta,sb=8;      // 取绝对值       else sb = 0 ;               // sb 保存的是符号位       code = 4*delta / step_table[index];    // 根据 steptable[]得到一个 0-7 的值       if (code7) code=7;            // 它描述了声音强度的变化量       index += index_adjust[code] ;       // 根据声音强度调整下次取steptable 的序号       if (index0) index=0;           // 便于下次得到更精确的变化量的描述       else if (index88) index=88;       prev_sample=cur_sample;       outputode(code|sb);            // 加上符号位保存起来     }   ADPCM 解压缩过程   接压缩实际是压缩的一个逆过程,同样其中的 getnextcode() 应该得到一个编码,,而 outputsample() 可以将解码出来的声音信号保存起来。这段代码同样使用了同一个的 setp_table[] 和 index_adjust() 附在后面:     int index=0,cur_sample=0;     while (还有数据要处理)     {         code=getnextcode();                       // 得到下一个数据         if ((code 8) != 0) sb=1 else sb=0;         code=7;                            // 将 code 分离为数据和符号         delta = (step_table[index]*code)/4+step_table[index]/8;     // 后面加的一项是为了减少误差         if (sb==1) delta=-delta;         cur_sample+=delta;                        // 计算出当前的波形数据         if (cur_sample32767) output_sample(32767);         else if (cur_sample-32768) output_sample(-32768);         else output_sample(cur_sample);         index+=index_ad

文档评论(0)

rovend + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档