4596|2

2

帖子

0

资源

一粒金砂(初级)

ADPCM编码中步长索引表是怎么来的? [复制链接]

        求大神解疑,刚学语音编码的新手,找到了ADPCM编码的程序,但是不知道步长索引表是怎么得来的,为什么可以通过查表的方式得出量化步长?预测值的计算方式也不理解,以下是代码:
#include"adpcm.h"
/* Intel ADPCM step variation table */
staticintindexTable[16]={
    -1,-1,-1,-1,2,4,6,8,
    -1,-1,-1,-1,2,4,6,8,
};
staticintstepsizeTable[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
};
voidadpcm_decoder(char*inbuff,char*outbuff,intlen_of_in,structadpcm_state *state )
{
int  i=0,j=0;
    chartmp_data;
    structadpcm_state *tmp_state =state;
    longstep;/* Quantizer step size */
    signedlongpredsample;/* Output of ADPCM predictor */
    signedlongdiffq;/* Dequantized predicted difference */
    intindex;/* Index into step size table */
    intSamp;
    unsignedcharSampH,SampL;
    unsignedcharinCode;

    /* Restore previous values of predicted sample and quantizer step
    size index
    */
    predsample =state->valprev;
    index =state->index;

    for(i=0;i {
  tmp_data=inbuff[i/2];  
  if(i%2)
   inCode=(tmp_data&0xf0)>>4;
  else
   inCode=tmp_data &0x0f;
   
  step =stepsizeTable[index];
   /* Inverse quantize the ADPCM code into a predicted difference
    using the quantizer step size
   */
   
  diffq =step >>3;
  if(inCode &4)
   diffq +=step;
  if(inCode &2)
   diffq +=step >>1;
  if(inCode &1)
   diffq +=step >>2;
    /* Fixed predictor computes new predicted sample by adding the
    old predicted sample to predicted difference
    */
  if(inCode &8)
   predsample -=diffq;
  else
   predsample +=diffq;
    /* Check for overflow of the new predicted sample
    */
   if(predsample >32767)
   predsample =32767;
   elseif(predsample <-32768)
   predsample =-32768;
    /* Find new quantizer stepsize index by adding the old index
    to a table lookup using the ADPCM code
    */
   index +=indexTable[inCode];
    /* Check for overflow of the new quantizer step size index
    */
  if(index <0)
   index =0;
  if(index >88)
   index =88;
    /* Return the new ADPCM code */
  Samp=predsample;
  if(Samp>=0)
  {
   SampH=Samp/256;
   SampL=Samp-256*SampH;
  }
  else
  {
   Samp=32768+Samp;
   SampH=Samp/256;
   SampL=Samp-256*SampH;
   SampH+=0x80;
  }
  outbuff[j++]=SampL;
  outbuff[j++]=SampH;   
}

/* Save the predicted sample and quantizer step size index for
next iteration
*/
state->valprev =(short)predsample;
state->index =(char)index;
}

此帖出自ARM技术论坛

回复

235

帖子

0

资源

一粒金砂(中级)

这个应该是有固定的格式的吧。
那个步长应该是依据数据表中的数据排列来设置的,
原理应该就是要依据解码原理,反正就是要在正确的时候,获取正确的数据咯

回复

2

帖子

0

资源

禁止发言

索引表数据是设计算法的人实验出来的。意思就是只要用这组数据就能达到算法宣称的效果。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表