www.pudn.com > 200411301125332697.rar > qsidlsf.c


/* 
   ITU-T G.729 Annex B     ANSI-C Source Code 
   Version 1.3    Last modified: August 1997 
 
   Copyright (c) 1996, France Telecom, Rockwell International, 
                       Universite de Sherbrooke. 
   All rights reserved. 
*/ 
 
 
#include  
 
#include "typedef.h" 
#include "basic_op.h" 
#include "ld8k.h" 
#include "tab_ld8k.h" 
#include "sid.h" 
#include "vad.h" 
#include "dtx.h" 
#include "tab_dtx.h" 
 
/* local functions */ 
static void Qnt_e(Word16 *errlsf,    /* (i)  : error lsf vector             */ 
                  Word16 *weight,    /* (i)  : weighting vector             */ 
                  Word16 DIn,        /* (i)  : number of input candidates   */ 
                  Word16 *qlsf,      /* (o)  : quantized error lsf vector   */ 
                  Word16 *Pptr,      /* (o)  : predictor index              */ 
                  Word16 DOut,       /* (i)  : number of quantized vectors  */ 
                  Word16 *cluster,   /* (o)  : quantizer indices            */ 
                  Word16 *MS         /* (i)  : size of the quantizers       */ 
                  ); 
 
static void New_ML_search_1(Word16 *d_data,    /* (i) : error vector             */ 
                            Word16 J,          /* (i) : number of input vectors  */ 
                            Word16 *new_d_data,/* (o) : output vector            */ 
                            Word16 K,          /* (i) : number of candidates     */ 
                            Word16 *best_indx, /* (o) : best indices             */ 
                            Word16 *ptr_back,  /* (o) : pointer for backtracking */ 
                            Word16 *PtrTab,    /* (i) : quantizer table          */ 
                            Word16 MQ          /* (i) : size of quantizer        */ 
                            ); 
 
static void New_ML_search_2(Word16 *d_data,    /* (i) : error vector             */ 
                            Word16 *weight,    /* (i) : weighting vector         */ 
                            Word16 J,          /* (i) : number of input vectors  */ 
                            Word16 *new_d_data,/* (o) : output vector            */ 
                            Word16 K,          /* (i) : number of candidates     */ 
                            Word16 *best_indx, /* (o) : best indices             */ 
                            Word16 *ptr_prd,   /* (i) : pointer for backtracking */ 
                            Word16 *ptr_back,  /* (o) : pointer for backtracking */ 
                            Word16 PtrTab[2][16],/* (i) : quantizer table        */ 
                            Word16 MQ          /* (i) : size of quantizer        */ 
                            ); 
 
 
/*-----------------------------------------------------------------* 
 * Functions lsfq_noise                                            * 
 *           ~~~~~~~~~~                                            * 
 * Input:                                                          * 
 *   lsp[]         : unquantized lsp vector                        * 
 *   freq_prev[][] : memory of the lsf predictor                   * 
 *                                                                 * 
 * Output:                                                         * 
 *                                                                 * 
 *   lspq[]        : quantized lsp vector                          *  
 *   ana[]         : indices                                       * 
 *                                                                 * 
 *-----------------------------------------------------------------*/ 
void lsfq_noise(Word16 *lsp,  
                Word16 *lspq,  
                Word16 freq_prev[MA_NP][M],  
                Word16 *ana 
                ) 
{ 
  Word16 i, lsf[M], lsfq[M], weight[M], tmpbuf[M]; 
  Word16 MS[MODE]={32, 16}, Clust[MODE], mode, errlsf[M*MODE]; 
 
  /* convert lsp to lsf */ 
  Lsp_lsf2(lsp, lsf, M); 
 
  /* spacing to ~100Hz */ 
  if (lsf[0] < L_LIMIT) 
    lsf[0] = L_LIMIT; 
  for (i=0 ; i < M-1 ; i++) 
    if (sub(lsf[i+1], lsf[i]) < 2*GAP3)  
      lsf[i+1] = add(lsf[i], 2*GAP3); 
  if (lsf[M-1] > M_LIMIT) 
    lsf[M-1] = M_LIMIT; 
  if (lsf[M-1] < lsf[M-2])  
    lsf[M-2] = sub(lsf[M-1], GAP3); 
 
  /* get the lsf weighting */ 
  Get_wegt(lsf, weight); 
   
  /**********************/ 
  /* quantize the lsf's */ 
  /**********************/ 
   
  /* get the prediction error vector */ 
  for (mode=0; mode