⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my_ima.h

📁 这是一个基于TI的DSP的ADPCM的源代码,经过测试.
💻 H
字号:
extern int SavePCMTempWp;#define SavePCMTempSize1 505+220extern int LeftNum;#define FrameSize 505/* Intel ADPCM step variation table */int indexTable[16] = {    -1, -1, -1, -1, 2, 4, 6, 8,    -1, -1, -1, -1, 2, 4, 6, 8,};int stepsizeTable[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};int code_valprev,code_index;void Adpcm_init(void){ code_valprev=0; code_index=0;}void adpcm_coder(int *inp,int *outp,int len){    int val;			/* Current input sample value */    long delta;			/* Current adpcm output value */    int step;			/* Stepsize */    long valprev;		/* virtual previous output value */    int index;			/* Current step change index */    int  i=0;    int SampXCode;    int Sample0;    unsigned int outtemp[3],outindex=0;        Sample0=*(inp++);    /*the first sample*/    valprev = Sample0;    /*previous output value*/    index = code_index;          *(outp++)=Sample0;// save sample0    *(outp++)=index;    len--;    for(i=0;i<len;i++)       {	   val =*(inp++);	   step = stepsizeTable[index];  	   /* Step 1 - compute difference with previous value */	   delta = val - valprev;	   if(delta<0)	     {SampXCode=8;	      delta=-delta;}	     else SampXCode=0;	   if(delta>=step)	      {SampXCode=SampXCode|4;	       delta=delta-step;	       }     	   if(delta>=(step>>1))	      {SampXCode=SampXCode|2;	       delta=delta-(step>>1);	       }          	   if(delta>=(step>>2))SampXCode=SampXCode|1;      //预测采样值	   delta=0;   	  	   if(SampXCode&4)delta=delta+step;	   if(SampXCode&2)delta=delta+(step>>1);        	   if(SampXCode&1)delta=delta+(step>>2);	   delta=delta+(step>>3); 		   if(SampXCode&8)delta=-delta;	   	   valprev+=delta;  	   if ( valprev > 32767 )valprev = 32767;           	else if ( valprev < -32768 ) valprev = -32768;	   	   index += indexTable[SampXCode];	   if ( index < 0 ) index = 0;	   if ( index > 88 ) index = 88;        if(outindex<3)outtemp[outindex++]=SampXCode;	      else {	      *(outp++)=(SampXCode<<12)|(outtemp[2]<<8)|(outtemp[1]<<4)|outtemp[0];              outindex=0;   	         }	}     	    //code_valprev =  valprev;  code_index   =  index;}long adpcm_decoder(int *inp,int *outp,int len){    long delta,c;			/* Current adpcm output value */    int  step;			/* Stepsize */    long valprev;		/* virtual previous output value */    int  index;    int i,j;			/* Current step change index */    unsigned int SampXCode;    unsigned int temp[4];    long Energy;         *(outp+SavePCMTempWp++)=*inp;    SavePCMTempWp%=SavePCMTempSize1;    valprev =(int) *(inp++);     Energy=abs(valprev);        index = *(inp++)&0x00ff;            for(i=0;i<len;i++)       {/* Step 1 - get the delta value and compute next index */      SampXCode = *(inp++);      temp[3]= SampXCode>>12;      temp[2]= (SampXCode>>8)&0x000f;      temp[1]= (SampXCode>>4)&0x000f;      temp[0]= SampXCode&0x000f;      for(j=0;j<4;j++)         {            SampXCode = temp[j];        delta=0;        c= SampXCode&0x07;        step = stepsizeTable[index];            delta=((c+c+1)*step)>>3; 		    if(SampXCode&8)delta=-delta;	   	    valprev+=delta; 	    if ( valprev > 32767 )valprev=32767;          	else if ( valprev < -37680 )valprev-=-32768;          	        index += indexTable[SampXCode];	    if ( index < 0 ) index = 0;	    if ( index > 88 ) index = 88;    	        *(outp+SavePCMTempWp++)=(int)valprev;        SavePCMTempWp%=SavePCMTempSize1;        Energy=Energy+abs(valprev);       }     } LeftNum+=505;    return(Energy) ;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -