📄 my_ima.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 + -