www.pudn.com > g729a.rar > DEC_GAIN.C, change:1996-10-01,size:4866b


/* 
   ITU-T G.729A Speech Coder    ANSI-C Source Code 
   Version 1.1    Last modified: September 1996 
 
   Copyright (c) 1996, 
   AT&T, France Telecom, NTT, Universite de Sherbrooke 
   All rights reserved. 
*/ 
 
#include "typedef.h" 
#include "basic_op.h" 
#include "ld8a.h" 
#include "tab_ld8a.h" 
 
/*---------------------------------------------------------------------------* 
 * Function  Dec_gain                                                        * 
 * ~~~~~~~~~~~~~~~~~~                                                        * 
 * Decode the pitch and codebook gains                                       * 
 *                                                                           * 
 *---------------------------------------------------------------------------* 
 * input arguments:                                                          * 
 *                                                                           * 
 *   index      :Quantization index                                          * 
 *   code[]     :Innovative code vector                                      * 
 *   L_subfr    :Subframe size                                               * 
 *   bfi        :Bad frame indicator                                         * 
 *                                                                           * 
 * output arguments:                                                         * 
 *                                                                           * 
 *   gain_pit   :Quantized pitch gain                                        * 
 *   gain_cod   :Quantized codebook gain                                     * 
 *                                                                           * 
 *---------------------------------------------------------------------------*/ 
void Dec_gain( 
   Word16 index,        /* (i)     :Index of quantization.         */ 
   Word16 code[],       /* (i) Q13 :Innovative vector.             */ 
   Word16 L_subfr,      /* (i)     :Subframe length.               */ 
   Word16 bfi,          /* (i)     :Bad frame indicator            */ 
   Word16 *gain_pit,    /* (o) Q14 :Pitch gain.                    */ 
   Word16 *gain_cod     /* (o) Q1  :Code gain.                     */ 
) 
{ 
   Word16  index1, index2, tmp; 
   Word16  gcode0, exp_gcode0; 
   Word32  L_gbk12, L_acc, L_accb; 
   void    Gain_predict( Word16 past_qua_en[], Word16 code[], Word16 L_subfr, 
                        Word16 *gcode0, Word16 *exp_gcode0 ); 
   void    Gain_update( Word16 past_qua_en[], Word32 L_gbk12 ); 
   void    Gain_update_erasure( Word16 past_qua_en[] ); 
 
        /* Gain predictor, Past quantized energies = -14.0 in Q10 */ 
 
   static Word16 past_qua_en[4] = { -14336, -14336, -14336, -14336 }; 
 
 
   /*-------------- Case of erasure. ---------------*/ 
 
   if(bfi != 0){ 
      *gain_pit = mult( *gain_pit, 29491 );      /* *0.9 in Q15 */ 
      if (sub( *gain_pit, 29491) > 0) *gain_pit = 29491; 
      *gain_cod = mult( *gain_cod, 32111 );      /* *0.98 in Q15 */ 
 
     /*----------------------------------------------* 
      * update table of past quantized energies      * 
      *                              (frame erasure) * 
      *----------------------------------------------*/ 
      Gain_update_erasure(past_qua_en); 
 
      return; 
   } 
 
   /*-------------- Decode pitch gain ---------------*/ 
 
   index1 = imap1[ shr(index,NCODE2_B) ] ; 
   index2 = imap2[ index & (NCODE2-1) ] ; 
   *gain_pit = add( gbk1[index1][0], gbk2[index2][0] ); 
 
   /*-------------- Decode codebook gain ---------------*/ 
 
  /*---------------------------------------------------* 
   *-  energy due to innovation                       -* 
   *-  predicted energy                               -* 
   *-  predicted codebook gain => gcode0[exp_gcode0]  -* 
   *---------------------------------------------------*/ 
 
   Gain_predict( past_qua_en, code, L_subfr, &gcode0, &exp_gcode0 ); 
 
  /*-----------------------------------------------------------------* 
   * *gain_code = (gbk1[indice1][1]+gbk2[indice2][1]) * gcode0;      * 
   *-----------------------------------------------------------------*/ 
 
   L_acc = L_deposit_l( gbk1[index1][1] ); 
   L_accb = L_deposit_l( gbk2[index2][1] ); 
   L_gbk12 = L_add( L_acc, L_accb );                       /* Q13 */ 
   tmp = extract_l( L_shr( L_gbk12,1 ) );                  /* Q12 */ 
   L_acc = L_mult(tmp, gcode0);             /* Q[exp_gcode0+12+1] */ 
 
   L_acc = L_shl(L_acc, add( negate(exp_gcode0),(-12-1+1+16) )); 
   *gain_cod = extract_h( L_acc );                          /* Q1 */ 
 
  /*----------------------------------------------* 
   * update table of past quantized energies      * 
   *----------------------------------------------*/ 
   Gain_update( past_qua_en, L_gbk12 ); 
 
   return; 
 
}