嵌入式 ADPCM压缩算法

原创 2013年12月02日 14:56:33
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 (delta<0) delta=-delta,sb=8;      //取绝对值
      else sb = 0 ;               // sb 保存的是符号位
      code = 4*delta / step_table[index];    // 根据 steptable[]得到一个0-7 的值
      if (code>7) code=7;            //它描述了声音强度的变化量
      index += index_adjust[code] ;       // 根据声音强度调整下次取steptable的序号
      if (index<0) index=0;           //便于下次得到更精确的变化量的描述
      else if (index>88) 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_sample>32767)output_sample(32767);
        else if (cur_sample<-32768)output_sample(-32768);
        else output_sample(cur_sample);
        index+=index_adjust[code];
        if (index<0) index=0;
        if (index>88) index=88;
     }
附表
     int index_adjust[8] = {-1,-1,-1,-1,2,4,6,8};
     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
     }

相关文章推荐

基于ADPCM的语音压缩算法研究

  • 2010年05月23日 10:53
  • 346KB
  • 下载

ADPCM 音频压缩算法

ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每...

ADPCM压缩算法

 ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中...
  • nolatin
  • nolatin
  • 2011年06月11日 14:44
  • 2960

ADPCM压缩算法

  • 2015年09月29日 16:46
  • 1.29MB
  • 下载

ADPCM压缩算法.doc

  • 2008年04月20日 16:53
  • 17KB
  • 下载

JPEG图像压缩算法流程详解(转)

原文请见:http://blog.csdn.net/carson2005/article/details/7753499     JPEG是Joint Photographic Exports ...
  • lnlh21
  • lnlh21
  • 2015年01月14日 00:56
  • 731

常用数据无损压缩算法分析

  • 2014年03月31日 14:55
  • 212KB
  • 下载

BMP文件格式及RlE压缩算法

6.1 BMP文件格式 6.1.1 简介 位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Wi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 ADPCM压缩算法
举报原因:
原因补充:

(最多只允许输入30个字)