www.pudn.com > g729a.rar > PITCH_A.C, change:2005-05-27,size:3407b


/*---------------------------------------------------------------------------* 
 * Pitch related functions                                                   * 
 * ~~~~~~~~~~~~~~~~~~~~~~~                                                   * 
 *---------------------------------------------------------------------------*/ 
 
#include "typedef.h" 
#include "basic_op.h" 
#include "oper_32b.h" 
#include "ld8a.h" 
#include "tab_ld8a.h" 
 
/*--------------------------------------------------------------------------* 
 *  Function  Pitch_fr3_fast()                                              * 
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~                                              * 
 * Fast version of the pitch close loop.                                    * 
 *--------------------------------------------------------------------------*/ 
extern  Word32 Dot_Product(Word16 x[],Word16 y[], Word16 lg); 
Word16 Pitch_fr3_fast(/* (o)     : pitch period.                          */ 
  Word16 exc[],       /* (i)     : excitation buffer                      */ 
  Word16 xn[],        /* (i)     : target vector                          */ 
  Word16 h[],         /* (i) Q12 : impulse response of filters.           */ 
  Word16 L_subfr,     /* (i)     : Length of subframe                     */ 
  Word16 t0_min,      /* (i)     : minimum value in the searched range.   */ 
  Word16 t0_max,      /* (i)     : maximum value in the searched range.   */ 
  Word16 i_subfr,     /* (i)     : indicator for first subframe.          */ 
  Word16 *pit_frac    /* (o)     : chosen fraction.                       */ 
) 
{ 
  Word16 t, t0; 
  Word16 Dn[L_SUBFR]; 
  Word16 exc_tmp[L_SUBFR]; 
  Word32 max, corr, L_temp; 
 
 /*-----------------------------------------------------------------* 
  * Compute correlation of target vector with impulse response.     * 
  *-----------------------------------------------------------------*/ 
 
  Cor_h_X(h, xn, Dn); 
 
 /*-----------------------------------------------------------------* 
  * Find maximum integer delay.                                     * 
  *-----------------------------------------------------------------*/ 
 
  max = MIN_32; 
  t0 = t0_min; /* Only to remove warning from some compilers */ 
 
  for(t=t0_min; t<=t0_max; t++) 
  { 
    corr = Dot_Product(Dn, &exc[-t], L_subfr); 
    L_temp = L_sub(corr, max); 
    if(L_temp > 0) {max = corr; t0 = t;  } 
  } 
 
 /*-----------------------------------------------------------------* 
  * Test fractions.                                                 * 
  *-----------------------------------------------------------------*/ 
 
  /* Fraction 0 */ 
 
  Pred_lt_3(exc, t0, 0, L_subfr); 
  max = Dot_Product(Dn, exc, L_subfr); 
  *pit_frac = 0; 
 
  /* If first subframe and lag > 84 do not search fractional pitch */ 
 
  if( (i_subfr == 0) && (sub(t0, 84) > 0) ) 
    return t0; 
 
  Copy(exc, exc_tmp, L_subfr); 
 
  /* Fraction -1/3 */ 
 
  Pred_lt_3(exc, t0, -1, L_subfr); 
  corr = Dot_Product(Dn, exc, L_subfr); 
  L_temp = L_sub(corr, max); 
  if(L_temp > 0) { 
     max = corr; 
     *pit_frac = -1; 
     Copy(exc, exc_tmp, L_subfr); 
  } 
 
  /* Fraction +1/3 */ 
 
  Pred_lt_3(exc, t0, 1, L_subfr); 
  corr = Dot_Product(Dn, exc, L_subfr); 
  L_temp = L_sub(corr, max); 
  if(L_temp > 0) { 
     max = corr; 
     *pit_frac =  1; 
  } 
  else 
    Copy(exc_tmp, exc, L_subfr); 
  return t0; 
}