    
     
    
    
   /****************************************************************** 
    
       iLBC Speech Coder ANSI-C Source Code 
    
       iCBConstruct.c  
    
       Copyright (c) 2001, 
       Global IP Sound AB. 
       All rights reserved. 
    
   ******************************************************************/ 
    
   #include <math.h> 
    
   #include "iLBC_define.h" 
   #include "gainquant.h" 
   #include "getCBvec.h" 
    
   /*----------------------------------------------------------------* 
    *  Convert the codebook indexes to make the search easier 
    *---------------------------------------------------------------*/ 
    
   void index_conv_enc( 
       int *index          /* (i/o) Codebook indexes */ 
   ){ 
       int k; 
    
       for (k=1; k<CB_NSTAGES; k++) { 
            
           if ((index[k]>=108)&&(index[k]<172)) { 
               index[k]-=64; 
           } else if (index[k]>=236) { 
               index[k]-=128; 
           } else { 
               /* ERROR */ 
           } 
       } 
   } 
    
   void index_conv_dec( 
       int *index          /* (i/o) Codebook indexes */ 
   ){ 
       int k; 
    
       for (k=1; k<CB_NSTAGES; k++) { 
            
           if ((index[k]>=44)&&(index[k]<108)) { 
               index[k]+=64; 
           } else if ((index[k]>=108)&&(index[k]<128)) { 
               index[k]+=128; 
           } else { 
               /* ERROR */ 
           } 
     
    
    
       } 
   } 
    
   /*----------------------------------------------------------------* 
    *  Construct decoded vector from codebook and gains. 
    *---------------------------------------------------------------*/ 
    
   void iCBConstruct( 
       float *decvector,   /* (o) Decoded vector */ 
       int *index,         /* (i) Codebook indices */ 
       int *gain_index,/* (i) Gain quantization indices */ 
       float *mem,         /* (i) Buffer for codevector construction */ 
       int lMem,           /* (i) Length of buffer */ 
       int veclen,         /* (i) Length of vector */ 
       int nStages         /* (i) Number of codebook stages */ 
   ){ 
       int j,k; 
       float gain[CB_NSTAGES]; 
       float cbvec[SUBL]; 
    
       /* gain de-quantization */ 
    
       gain[0] = gaindequant(gain_index[0], 1.0, 32); 
       if (nStages > 1) { 
           gain[1] = gaindequant(gain_index[1],  
               (float)fabs(gain[0]), 16);   
       } 
       if (nStages > 2) { 
           gain[2] = gaindequant(gain_index[2],  
               (float)fabs(gain[1]), 8); 
       } 
    
       /* codebook vector construction and construction of  
       total vector */ 
    
       getCBvec(cbvec, mem, index[0], lMem, veclen); 
       for (j=0;j<veclen;j++){ 
           decvector[j] = gain[0]*cbvec[j]; 
       } 
       if (nStages > 1) { 
           for (k=1; k<nStages; k++) { 
               getCBvec(cbvec, mem, index[k], lMem, veclen); 
               for (j=0;j<veclen;j++) { 
                   decvector[j] += gain[k]*cbvec[j]; 
               } 
           } 
       } 
   } 
    
    
