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

📄 lpcdecode.c

📁 PA1688网络电话机全部源程序
💻 C
字号:
    
   /****************************************************************** 
    
       iLBC Speech Coder ANSI-C Source Code 
    
       LPC_decode.c  
    
       Copyright (c) 2001, 
       Global IP Sound AB. 
       All rights reserved. 
    
   ******************************************************************/ 
    
   #include <math.h> 
   #include <string.h> 
    
   #include "helpfun.h" 
   #include "lsf.h" 
   #include "iLBC_define.h" 
   #include "constants.h" 
    
   /*----------------------------------------------------------------* 
    *  interpolation of lsf coefficients for the decoder                            
    *---------------------------------------------------------------*/ 
    
   void LSFinterpolate2a_dec(  
       float *a,           /* (o) lpc coefficients for a sub frame */ 
       float *lsf1,    /* (i) first lsf coefficient vector */ 
       float *lsf2,    /* (i) second lsf coefficient vector */ 
       float coef,         /* (i) interpolation weight */ 
       int length          /* (i) length of lsf vectors */ 
   ){ 
       float  lsftmp[LPC_FILTERORDER]; 
        
       interpolate(lsftmp, lsf1, lsf2, coef, length); 
       lsf2a(a, lsftmp); 
   } 
    
   /*----------------------------------------------------------------* 
    *  obtain dequantized lsf coefficients from quantization index  
    *---------------------------------------------------------------*/ 
    
     
    
    
   void SimplelsfDEQ( 
       float *lsfdeq,      /* (o) dequantized lsf coefficients */ 
       int *index,         /* (i) quantization index */ 
       int lpc_n           /* (i) number of LPCs */ 
   ){   
       int i, j, pos, cb_pos; 
    
       /* decode first LSF */ 
        
       pos = 0; 
       cb_pos = 0; 
       for (i = 0; i < LSF_NSPLIT; i++) { 
           for (j = 0; j < dim_lsfCbTbl[i]; j++) { 
               lsfdeq[pos + j] = lsfCbTbl[cb_pos +  
                   (long)(index[i])*dim_lsfCbTbl[i] + j]; 
           }        
           pos += dim_lsfCbTbl[i]; 
           cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 
       } 
    
       if (lpc_n>1) { 
    
           /* decode last LSF */ 
    
           pos = 0; 
           cb_pos = 0; 
           for (i = 0; i < LSF_NSPLIT; i++) { 
               for (j = 0; j < dim_lsfCbTbl[i]; j++) { 
                   lsfdeq[LPC_FILTERORDER + pos + j] =  
                       lsfCbTbl[cb_pos +  
                       (long)(index[LSF_NSPLIT + i])* 
                       dim_lsfCbTbl[i] + j]; 
               }        
               pos += dim_lsfCbTbl[i]; 
               cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 
           } 
       } 
   } 
    
   /*----------------------------------------------------------------* 
    *  obtain synthesis and weighting filters form lsf coefficients  
    *---------------------------------------------------------------*/ 
    
   void DecoderInterpolateLSF(  
       float *syntdenum,   /* (o) synthesis filter coefficients */ 
       float *weightdenum, /* (o) weighting denumerator  
                                  coefficients */ 
       float *lsfdeq,      /* (i) dequantized lsf coefficients */ 
       int length,         /* (i) length of lsf coefficient vector */ 
       iLBC_Dec_Inst_t *iLBCdec_inst  
                           /* (i) the decoder state structure */ 
   ){ 
       int    i, pos, lp_length; 
     
    
    
       float  lp[LPC_FILTERORDER + 1], *lsfdeq2; 
            
       lsfdeq2 = lsfdeq + length; 
       lp_length = length + 1; 
        
       if (iLBCdec_inst->mode==30) { 
           /* subframe 1: Interpolation between old and first */ 
    
           LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,  
               lsf_weightTbl_30ms[0], length); 
           memcpy(syntdenum,lp,lp_length*sizeof(float)); 
           bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length); 
    
           /* subframes 2 to 6: interpolation between first and last  
           LSF */ 
        
           pos = lp_length; 
           for (i = 1; i < 6; i++) { 
               LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2,  
                   lsf_weightTbl_30ms[i], length); 
               memcpy(syntdenum + pos,lp,lp_length*sizeof(float)); 
               bwexpand(weightdenum + pos, lp,  
                   LPC_CHIRP_WEIGHTDENUM, lp_length); 
               pos += lp_length; 
           } 
       } 
       else { 
           pos = 0; 
           for (i = 0; i < iLBCdec_inst->nsub; i++) { 
               LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,  
                   lsf_weightTbl_20ms[i], length); 
               memcpy(syntdenum+pos,lp,lp_length*sizeof(float)); 
               bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM,  
                   lp_length); 
               pos += lp_length; 
           } 
       } 
        
       /* update memory */ 
    
       if (iLBCdec_inst->mode==30) 
           memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2,  
                       length*sizeof(float)); 
       else 
           memcpy(iLBCdec_inst->lsfdeqold, lsfdeq,  
                       length*sizeof(float)); 
    
   } 
    
    

⌨️ 快捷键说明

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