www.pudn.com > AVS_M_ver10.rar > cod_ace.c


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2007  Audio Video Coding Standard, Part ¢ú 
* 
* This software module was developed by AVS Audio sub-group 
* 
* DISCLAIMER OF WARRANTY 
* 
* These software programs are available to the users without any 
* license fee or royalty on an "as is" basis. The AVS disclaims 
* any and all warranties, whether express, implied, or statutory, 
* including any implied warranties of merchantability or of fitness 
* for a particular purpose. In no event shall the contributors or  
* the AVS be liable for any incidental, punitive, or consequential 
* damages of any kind whatsoever arising from the use of this program. 
* 
* This disclaimer of warranty extends to the user of this program 
* and user's customers, employees, agents, transferees, successors, 
* and assigns. 
* 
* The AVS does not represent or warrant that the program furnished 
* hereunder are free of infringement of any third-party patents. 
* Commercial implementations of AVS, including shareware, may be 
* subject to royalty fees to patent holders. Information regarding 
* the AVS patent policy is available from the AVS Web site at 
* http://www.avs.org.cn 
* 
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY. 
************************************************************************ 
*/ 
 
#include  
#include  
#include  
#include  
#include "../include/amr_plus.h" 
 
#ifdef PW_UPDATE 
void coder_acelp( 
				 float A[],         /* input:  coefficients 4xAz[M+1]   */ 
				 float Aq[],        /* input:  coefficients 4xAz_q[M+1] */ 
				 float speech[],    /* input:  speech[-M..lg]           */ 
				 float *mem_wsp,    /* in/out: wsp memory               */ 
				 float *mem_wsyn,   /* in/out: wsyn memory              */ 
				 float synth[],     /* in/out: synth[-M..lg]            */ 
				 float exc[],       /* in/out: exc[-(PIT_MAX+L_INTERPOL)..lg+1] */ 
				 float wovlp[],     /* out: wovlp[0..128]               */ 
				 int lg,            /* input: frame length              */ 
				 int codec_mode,    /* input: AMR_WB+ mode (see cnst.h) */ 
				 float norm_corr, 
				 float norm_corr2, 
				 int T_op,          /* input: open-loop LTP             */   
				 int T_op2,         /* input: open-loop LTP             */   
				 int T_out[],       /* output: integer pitch-lag        */   
				 float p_out[],     /* output: pitch gain               */  
				 float c_out[],	 /* output: fixed codebook gain      */ 
				 int	pit_adj, 
				 int *prm,          /* output: acelp parameters         */ 
				 float *mem_formant, 
				 float *mem_tilt, 
				 float *mem_formant_zir, 
				 float *mem_tilt_zir) 
{ 
	int i, i_subfr, select; 
	int T0, T0_min, T0_max, index, pit_flag; 
	long int T0_frac; 
	float tmp, ener, max, mean_ener_code; 
	float gain_pit, gain_code, voice_fac; 
	float g_corr[5]; /*norm_corr, norm_corr2*/ 
	float *p_A, *p_Aq, Ap1[M+1],Ap2[M+1],Ap3[TILT_ORDER+1]; 
	float h1[L_SUBFR]; 
	float code[L_SUBFR]; 
	short code3GPP[L_SUBFR]; 
	float error[M+L_SUBFR]; 
	float cn[L_SUBFR]; 
	float xn[L_SUBFR]; 
	float xn2[L_SUBFR]; 
	float dn[L_SUBFR];        /* Correlation between xn and h1      */ 
	float y1[L_SUBFR];        /* Filtered adaptive excitation       */ 
	float y2[L_SUBFR];        /* Filtered adaptive excitation       */ 
	int PIT_MIN;				/* Minimum pitch lag with resolution 1/4      */ 
	int PIT_FR2;				/* Minimum pitch lag with resolution 1/2      */ 
	int PIT_FR1;				/* Minimum pitch lag with resolution 1        */ 
	int PIT_MAX;				/* Maximum pitch lag                          */ 
	float exc_origin[L_SUBFR];  /* original excitation */ 
	float exc_high[L_SUBFR];    /* high frequent of adaptive excitation */ 
	float exc_low[L_SUBFR];     /* low frequent of adaptive excitation */ 
	/* temporary var to calculate correlation */ 
	double corr_temp; 
	double ener_temp1; 
	double ener_temp2; 
 
	float mem_temp1[M],mem_temp2[TILT_ORDER]; 
 
	if(pit_adj ==0) { 
		PIT_MIN = PIT_MIN_12k8; 
		PIT_FR2 = PIT_FR2_12k8;			 
		PIT_FR1 = PIT_FR1_12k8;			 
		PIT_MAX = PIT_MAX_12k8;			 
	} 
	else { 
		i = (((pit_adj*PIT_MIN_12k8)+(FSCALE_DENOM/2))/FSCALE_DENOM)-PIT_MIN_12k8; 
		PIT_MIN = PIT_MIN_12k8 + i; 
		PIT_FR2 = PIT_FR2_12k8 - i; 
		PIT_FR1 = PIT_FR1_12k8; 
		PIT_MAX = PIT_MAX_12k8 + (6*i); 
	} 
	T_op *= OPL_DECIM; 
	T_op2 *= OPL_DECIM; 
	/* range for closed loop pitch search in 1st subframe */ 
	T0_min = T_op - 8; 
	if (T0_min < PIT_MIN) { 
		T0_min = PIT_MIN; 
	} 
	T0_max = T0_min + 15; 
	if (T0_max > PIT_MAX) { 
		T0_max = PIT_MAX; 
		T0_min = T0_max - 15; 
	} 
	/*------------------------------------------------------------------------* 
	* Find and quantize mean_ener_code for gain quantizer (q_gain2_live.c)   * 
	* This absolute reference replace the gains prediction.                  * 
	* This modification for AMR_WB+ have the following advantage:            * 
	* - better quantization on attacks (onset, drum impulse, etc.)           * 
	* - robust on packet lost.                                               * 
	* - independent of previous mode (can be TCX with alg. 7 bits quantizer).* 
	*------------------------------------------------------------------------*/ 
	max=0.0; 
	mean_ener_code = 0.0; 
	p_Aq = Aq; 
	for (i_subfr=0; i_subfr max) { 
			max = ener; 
		} 
		mean_ener_code += 0.25f*ener; 
		p_Aq += (M+1); 
	}  
	/* reduce mean energy on voiced signal */ 
	mean_ener_code -= 5.0f*norm_corr; 
	mean_ener_code -= 5.0f*norm_corr2; 
	/* quantize mean energy with 2 bits : 18, 30, 42 or 54 dB */ 
	tmp = (mean_ener_code-18.0f) / 12.0f; 
	index = (int)floor(tmp + 0.5); 
	if (index < 0) { 
		index = 0; 
	} 
	if (index > 3) { 
		index = 3; 
	} 
	mean_ener_code = (((float)index) * 12.0f) + 18.0f; 
	/* limit mean energy to be able to quantize attack (table limited to +24dB) */ 
	while ((mean_ener_code < (max-27.0)) && (index < 3)) { 
		index++; 
		mean_ener_code += 12.0; 
	} 
	*prm = index;      prm++; 
	/*------------------------------------------------------------------------* 
	*          Loop for every subframe in the analysis frame                 * 
	*------------------------------------------------------------------------* 
	*  To find the pitch and innovation parameters. The subframe size is     * 
	*  L_SUBFR and the loop is repeated L_FRAME_PLUS/L_SUBFR times.          * 
	*     - compute impulse response of weighted synthesis filter (h1[])     * 
	*     - compute the target signal for pitch search                       * 
	*     - find the closed-loop pitch parameters                            * 
	*     - encode the pitch dealy                                           * 
	*     - update the impulse response h1[] by including fixed-gain pitch   * 
	*     - find target vector for codebook search                           * 
	*     - correlation between target vector and impulse response           * 
	*     - codebook search                                                  * 
	*     - encode codebook address                                          * 
	*     - VQ of pitch and codebook gains                                   * 
	*     - find synthesis speech                                            * 
	*     - update states of weighting filter                                * 
	*------------------------------------------------------------------------*/ 
	p_A = A; 
	p_Aq = Aq; 
	for (i_subfr=0; i_subfr PIT_MAX) { 
				T0_max = PIT_MAX; 
				T0_min = T0_max - 15; 
			} 
		} 
		/*-----------------------------------------------------------------------* 
		Find the target vector for pitch search: 
		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
		|------|  res[n] 
		speech[n]---| A(z) |-------- 
		|------|       |   |-------------| 
		zero -- (-)--| 1/A(z/gamma)|----- target xn[] 
		exc          |-------------| 
		Instead of subtracting the zero-input response of filters from 
		the weighted input speech, the above configuration is used to 
		compute the target vector. 
		*-----------------------------------------------------------------------*/ 
		/* ...... TVC inter-frame smoothing module START ...... */ 
#ifdef NEW_TVC 
		if (i_subfr==192){ 
			wovlp[65]=*mem_wsp; 
			paraChoose(p_Aq,&gamma1,&gamma2,&gamma3); 
			E_LPC_a_weight(p_Aq, Ap1, gamma1, M); 
			E_LPC_a_weight(p_Aq, Ap2, gamma2, M); 
			E_LPC_a_weight(p_Aq, Ap3, gamma3, TILT_ORDER); 
			E_UTIL_residu(Ap1, &speech[i_subfr], xn, L_SUBFR); 
			E_UTIL_formant(xn,Ap2,L_SUBFR,mem_formant); 
			E_UTIL_tilt(xn,Ap3,L_SUBFR,mem_tilt); 
			mvr2r(xn, wovlp, L_SUBFR); 
			*mem_wsp=wovlp[65];			 
		}		 
#endif 
		/* ...... TVC inter-frame smoothing module END ...... */ 
		 
		//Perceptual Weighting 
		/* find WSP (normaly done for pitch ol) */ 
		paraChoose(p_Aq,&gamma1,&gamma2,&gamma3); 
		E_LPC_a_weight(p_A, Ap1, gamma1, M); 
		E_LPC_a_weight(p_A, Ap2, gamma2, M); 
		E_LPC_a_weight(p_A, Ap3, gamma3, TILT_ORDER); 
		E_UTIL_residu(Ap1, &speech[i_subfr], xn, L_SUBFR); 
		E_UTIL_formant(xn,Ap2,L_SUBFR,mem_formant); 
		E_UTIL_tilt(xn,Ap3,L_SUBFR,mem_tilt); 
		/* find ZIR in weighted domain */ 
		mvr2r(&synth[i_subfr-M], error, M); 
		set_zero(error+M, L_SUBFR); 
		E_UTIL_synthesis(p_Aq, error+M, error+M, L_SUBFR, error, 0); 
		E_UTIL_residu(Ap1, error+M, xn2, L_SUBFR);		 
		E_UTIL_formant(xn2,Ap2,L_SUBFR,mem_formant_zir); 
		E_UTIL_tilt(xn2,Ap3,L_SUBFR,mem_tilt_zir); 
		 
		/* target xn = wsp - ZIR in weighted domain */ 
		for (i=0; i cn[] */		 
		set_zero(code, M); 
		mvr2r(xn, code+M, L_SUBFR/2);		 
		//Perceptual Weighting 
		set_zero(mem_temp1,M); 
		set_zero(mem_temp2,TILT_ORDER); 
		E_UTIL_detilt(code+M,Ap3,L_SUBFR/2,mem_temp2); 
		E_UTIL_deformant(code+M,Ap2,L_SUBFR/2,mem_temp1);		 
		E_UTIL_synthesis(Ap1, code+M, code+M, L_SUBFR/2, code, 0); 
		E_UTIL_residu(p_Aq, code+M, cn, L_SUBFR/2); 
 
		/* second half: res[] --> cn[] (approximated and faster) */ 
		mvr2r(&exc[i_subfr+(L_SUBFR/2)], cn+(L_SUBFR/2), L_SUBFR/2); 
		/*---------------------------------------------------------------* 
		* Compute impulse response, h1[], of weighted synthesis filter  * 
		*---------------------------------------------------------------*/ 
		set_zero(h1, L_SUBFR); 
		mvr2r(Ap1, h1, M+1); 
		E_UTIL_synthesis(p_Aq, h1, h1, L_SUBFR, &h1[M+1], 0); 
		 
		//Perceptual Weighting 
		set_zero(mem_temp1,M); 
		set_zero(mem_temp2,TILT_ORDER); 
		E_UTIL_formant(h1,Ap2,L_SUBFR,mem_temp1); 
		E_UTIL_tilt(h1,Ap3,L_SUBFR,mem_temp2);		 
		/*----------------------------------------------------------------------* 
		*                 Closed-loop fractional pitch search                  * 
		*----------------------------------------------------------------------*/ 
		/* find closed loop fractional pitch  lag */ 
		T0 = E_GAIN_closed_loop_search(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, 
			pit_flag, PIT_FR2, PIT_FR1); 
		/* encode pitch lag */ 
		if (pit_flag == 0) {  /* if 1st/3rd subframe */ 
							  /*--------------------------------------------------------------* 
							  * The pitch range for the 1st/3rd subframe is encoded with     * 
							  * 9 bits and is divided as follows:                            * 
							  *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)   * 
							  *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)       * 
							  *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            * 
			*--------------------------------------------------------------*/ 
			if (T0 < PIT_FR2) { 
				index = T0*4 + T0_frac - (PIT_MIN*4); 
			} else if (T0 < PIT_FR1) { 
				index = T0*2 + (T0_frac>>1) - (PIT_FR2*2) + ((PIT_FR2-PIT_MIN)*4); 
			} else { 
				index = T0 - PIT_FR1 + ((PIT_FR2-PIT_MIN)*4) + ((PIT_FR1-PIT_FR2)*2); 
			} 
			/* find T0_min and T0_max for subframe 2 and 4 */ 
			T0_min = T0 - 8; 
			if (T0_min < PIT_MIN) { 
				T0_min = PIT_MIN; 
			} 
			T0_max = T0_min + 15; 
			if (T0_max > PIT_MAX) { 
				T0_max = PIT_MAX; 
				T0_min = T0_max - 15; 
			} 
		} else {     /* if subframe 2 or 4 */ 
					 /*--------------------------------------------------------------* 
					 * The pitch range for subframe 2 or 4 is encoded with 6 bits:  * 
					 *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)   * 
			*--------------------------------------------------------------*/ 
			i = T0 - T0_min; 
			index = i*4 + T0_frac; 
		} 
		/* store pitch-lag for high band coding */ 
		T_out[i_subfr/L_SUBFR] = T0; 
		*prm = index;      prm++; 
		/*----------------------------------------------------------------* 
		*   Adapted excitation search                                     * 
		* - find unity gain pitch excitation (adaptive codebook entry)    * 
		*   with fractional interpolation.                                * 
		* - decide if lowpass filter is used by compare correlation       * 
		* - find filtered pitch exc. y1[]=exc[] convolved with h1[])      * 
		*-----------------------------------------------------------------*/		 
		/* find pitch excitation */ 
		mvr2r(&exc[i_subfr], exc_origin, L_SUBFR); 
		pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR+1); 
		/* compare correlation to choose lowpass or not */	 
		corr_temp = ener_temp1 = ener_temp2= 0.0;				 
		for(i=0; i 0.19){ 
			/* use exc as adaptive excitation */ 
			select = 1;          
		} 
		else{ 
			/* use exc_low as adaptive excitation */ 
			select = 0;          
			mvr2r(exc_low,exc+i_subfr,64); 
		} 
		/* get synthetical signal with adaptive excitation */ 
		/* END_ADAPTIVE_EXCITATION_SEARCH */ 
 
		E_UTIL_f_convolve(exc+i_subfr, h1, y1); 
		/* get pitch gain */ 
		gain_pit = E_ACELP_xy1_corr(xn,y1,g_corr); 
		*prm = select;      prm++; 
		/*-----------------------------------------------------------------* 
		* - update target vector for codebook search                      * 
		*-----------------------------------------------------------------*/ 
		E_ACELP_codebook_target_update(xn, xn2, y1, gain_pit); 
		E_ACELP_codebook_target_update(cn, cn, &exc[i_subfr], gain_pit); 
		/*-----------------------------------------------------------------* 
		* - include fixed-gain pitch contribution into impulse resp. h1[] * 
		*-----------------------------------------------------------------*/ 
		tmp = 0.0; 
		//E_UTIL_f_preemph(h1, TILT_CODE, L_SUBFR, &tmp); 
		//tmp = 0.0; 
        //E_UTIL_f_preemph(cn, TILT_CODE, L_SUBFR, &tmp); 
 
		if (T0_frac > 2) { 
			T0++; 
		} 
		E_GAIN_f_pitch_sharpening(h1, T0); 
		/*-----------------------------------------------------------------* 
		* - Correlation between target xn2[] and impulse response h1[]    * 
		* - Innovative codebook search                                    * 
		*-----------------------------------------------------------------*/ 
		E_ACELP_xh_corr(xn2, dn, h1); 
		 
		if (codec_mode == MODE_9k6) { 
			E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 20, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_11k2) { 
			E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 28, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_12k8) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 36, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_14k4) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 44, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_16k) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 52, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_18k4) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 64, 0, (Word32*)prm); 
            prm += 8; 
		} else if (codec_mode == MODE_20k) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 72, 0, (Word32*)prm); 
            prm += 8; 
		} else if (codec_mode == MODE_23k2) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 88, 0, (Word32*)prm); 
            prm += 8; 
		} else { 
            printf("invalid mode for acelp frame!\n"); 
            exit(0); 
		} 
 
		{ 
			int g; 
			for(g=0;g PIT_MAX) { 
    T0_max = PIT_MAX; 
    T0_min = T0_max - 15; 
  } 
 /*------------------------------------------------------------------------* 
  * Find and quantize mean_ener_code for gain quantizer (q_gain2_live.c)   * 
  * This absolute reference replace the gains prediction.                  * 
  * This modification for AMR_WB+ have the following advantage:            * 
  * - better quantization on attacks (onset, drum impulse, etc.)           * 
  * - robust on packet lost.                                               * 
  * - independent of previous mode (can be TCX with alg. 7 bits quantizer).* 
  *------------------------------------------------------------------------*/ 
  max=0.0; 
  mean_ener_code = 0.0; 
  p_Aq = Aq; 
  for (i_subfr=0; i_subfr max) { 
      max = ener; 
    } 
    mean_ener_code += 0.25f*ener; 
    p_Aq += (M+1); 
  }  
  /* reduce mean energy on voiced signal */ 
  mean_ener_code -= 5.0f*norm_corr; 
  mean_ener_code -= 5.0f*norm_corr2; 
  /* quantize mean energy with 2 bits : 18, 30, 42 or 54 dB */ 
  tmp = (mean_ener_code-18.0f) / 12.0f; 
  index = (int)floor(tmp + 0.5); 
  if (index < 0) { 
    index = 0; 
  } 
  if (index > 3) { 
    index = 3; 
  } 
  mean_ener_code = (((float)index) * 12.0f) + 18.0f; 
  /* limit mean energy to be able to quantize attack (table limited to +24dB) */ 
  while ((mean_ener_code < (max-27.0)) && (index < 3)) { 
    index++; 
    mean_ener_code += 12.0; 
  } 
  *prm = index;      prm++; 
 /*------------------------------------------------------------------------* 
  *          Loop for every subframe in the analysis frame                 * 
  *------------------------------------------------------------------------* 
  *  To find the pitch and innovation parameters. The subframe size is     * 
  *  L_SUBFR and the loop is repeated L_FRAME_PLUS/L_SUBFR times.          * 
  *     - compute impulse response of weighted synthesis filter (h1[])     * 
  *     - compute the target signal for pitch search                       * 
  *     - find the closed-loop pitch parameters                            * 
  *     - encode the pitch dealy                                           * 
  *     - update the impulse response h1[] by including fixed-gain pitch   * 
  *     - find target vector for codebook search                           * 
  *     - correlation between target vector and impulse response           * 
  *     - codebook search                                                  * 
  *     - encode codebook address                                          * 
  *     - VQ of pitch and codebook gains                                   * 
  *     - find synthesis speech                                            * 
  *     - update states of weighting filter                                * 
  *------------------------------------------------------------------------*/ 
  p_A = A; 
  p_Aq = Aq; 
  for (i_subfr=0; i_subfr PIT_MAX) { 
        T0_max = PIT_MAX; 
        T0_min = T0_max - 15; 
      } 
    } 
    /*-----------------------------------------------------------------------* 
             Find the target vector for pitch search: 
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
                 |------|  res[n] 
     speech[n]---| A(z) |-------- 
                 |------|       |   |-------------| 
                       zero -- (-)--| 1/A(z/gamma)|----- target xn[] 
                       exc          |-------------| 
    Instead of subtracting the zero-input response of filters from 
    the weighted input speech, the above configuration is used to 
    compute the target vector. 
    *-----------------------------------------------------------------------*/ 
    /* ...... TVC inter-frame smoothing module START ...... */ 
#ifdef NEW_TVC 
    if (i_subfr==192){ 
		wovlp[65]=*mem_wsp; 
        E_LPC_a_weight(p_Aq, Ap, GAMMA1, M); 
        E_UTIL_residu(Ap, &speech[i_subfr], xn, L_SUBFR); 
        E_UTIL_deemph(xn, TILT_FAC, L_SUBFR, mem_wsp); 
        mvr2r(xn, wovlp, L_SUBFR); 
   	    *mem_wsp=wovlp[65]; 
 
    } 
#endif 
    /* ...... TVC inter-frame smoothing module END ...... */ 
	 
	/* find WSP (normaly done for pitch ol) */ 
    E_LPC_a_weight(p_A, Ap, GAMMA1, M); 
    E_UTIL_residu(Ap, &speech[i_subfr], xn, L_SUBFR); 
    E_UTIL_deemph(xn, TILT_FAC, L_SUBFR, mem_wsp); 
    
    /* find ZIR in weighted domain */ 
    mvr2r(&synth[i_subfr-M], error, M); 
    set_zero(error+M, L_SUBFR); 
    E_UTIL_synthesis(p_Aq, error+M, error+M, L_SUBFR, error, 0); 
    E_LPC_a_weight(p_A, Ap, GAMMA1, M); 
    E_UTIL_residu(Ap, error+M, xn2, L_SUBFR); 
    E_UTIL_deemph(xn2, TILT_FAC, L_SUBFR, mem_wsyn); 
    /* target xn = wsp - ZIR in weighted domain */ 
    for (i=0; i cn[] */ 
    set_zero(code, M); 
    mvr2r(xn, code+M, L_SUBFR/2); 
    tmp = 0.0; 
    E_UTIL_f_preemph(code+M, TILT_FAC, L_SUBFR/2, &tmp); 
    E_LPC_a_weight(p_A, Ap, GAMMA1, M); 
    E_UTIL_synthesis(Ap, code+M, code+M, L_SUBFR/2, code, 0); 
    E_UTIL_residu(p_Aq, code+M, cn, L_SUBFR/2); 
    /* second half: res[] --> cn[] (approximated and faster) */ 
    mvr2r(&exc[i_subfr+(L_SUBFR/2)], cn+(L_SUBFR/2), L_SUBFR/2); 
    /*---------------------------------------------------------------* 
     * Compute impulse response, h1[], of weighted synthesis filter  * 
     *---------------------------------------------------------------*/ 
    E_LPC_a_weight(p_A, Ap, GAMMA1, M); 
    set_zero(h1, L_SUBFR); 
    mvr2r(Ap, h1, M+1); 
    E_UTIL_synthesis(p_Aq, h1, h1, L_SUBFR, &h1[M+1], 0); 
    tmp = 0.0; 
    E_UTIL_deemph(h1, TILT_FAC, L_SUBFR, &tmp); 
    /*----------------------------------------------------------------------* 
     *                 Closed-loop fractional pitch search                  * 
     *----------------------------------------------------------------------*/ 
    /* find closed loop fractional pitch  lag */ 
    T0 = E_GAIN_closed_loop_search(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, 
                     pit_flag, PIT_FR2, PIT_FR1); 
      /* encode pitch lag */ 
    if (pit_flag == 0) {  /* if 1st/3rd subframe */ 
       /*--------------------------------------------------------------* 
        * The pitch range for the 1st/3rd subframe is encoded with     * 
        * 9 bits and is divided as follows:                            * 
        *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)   * 
        *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)       * 
        *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            * 
        *--------------------------------------------------------------*/ 
        if (T0 < PIT_FR2) { 
          index = T0*4 + T0_frac - (PIT_MIN*4); 
        } else if (T0 < PIT_FR1) { 
          index = T0*2 + (T0_frac>>1) - (PIT_FR2*2) + ((PIT_FR2-PIT_MIN)*4); 
        } else { 
          index = T0 - PIT_FR1 + ((PIT_FR2-PIT_MIN)*4) + ((PIT_FR1-PIT_FR2)*2); 
        } 
        /* find T0_min and T0_max for subframe 2 and 4 */ 
        T0_min = T0 - 8; 
        if (T0_min < PIT_MIN) { 
          T0_min = PIT_MIN; 
        } 
        T0_max = T0_min + 15; 
        if (T0_max > PIT_MAX) { 
          T0_max = PIT_MAX; 
          T0_min = T0_max - 15; 
        } 
      } else {     /* if subframe 2 or 4 */ 
       /*--------------------------------------------------------------* 
        * The pitch range for subframe 2 or 4 is encoded with 6 bits:  * 
        *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)   * 
        *--------------------------------------------------------------*/ 
        i = T0 - T0_min; 
        index = i*4 + T0_frac; 
      } 
	  /* store pitch-lag for high band coding */ 
      T_out[i_subfr/L_SUBFR] = T0; 
      *prm = index;      prm++; 
   /*-----------------------------------------------------------------* 
    * - find unity gain pitch excitation (adaptive codebook entry)    * 
    *   with fractional interpolation.                                * 
    * - find filtered pitch exc. y1[]=exc[] convolved with h1[])      * 
    * - compute pitch gain1                                           * 
    *-----------------------------------------------------------------*/ 
    /* find pitch exitation */ 
		mvr2r(&exc[i_subfr], exc_origin, L_SUBFR); 
		pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR+1); 
		/* compare correlation to choose lowpass or not */	 
		corr_temp = ener_temp1 = ener_temp2= 0.0;				 
		for(i=0; i 0.19){ 
			/* use exc as adaptive excitation */ 
			select = 1;          
		} 
		else{ 
			/* use exc_low as adaptive excitation */ 
			select = 0;          
			mvr2r(exc_low,exc+i_subfr,64); 
		} 
		/* get synthetical signal with adaptive excitation */ 
		/* END_ADAPTIVE_EXCITATION_SEARCH */ 
 
		E_UTIL_f_convolve(exc+i_subfr, h1, y1); 
		/* get pitch gain */ 
		gain_pit = E_ACELP_xy1_corr(xn,y1,g_corr); 
    *prm = select;      prm++; 
   /*-----------------------------------------------------------------* 
    * - update target vector for codebook search                      * 
    *-----------------------------------------------------------------*/ 
    E_ACELP_codebook_target_update(xn, xn2, y1, gain_pit); 
    E_ACELP_codebook_target_update(cn, cn, &exc[i_subfr], gain_pit); 
   /*-----------------------------------------------------------------* 
    * - include fixed-gain pitch contribution into impulse resp. h1[] * 
    *-----------------------------------------------------------------*/ 
    tmp = 0.0; 
    E_UTIL_f_preemph(h1, TILT_CODE, L_SUBFR, &tmp); 
		tmp = 0.0; 
        E_UTIL_f_preemph(cn, TILT_CODE, L_SUBFR, &tmp); 
    if (T0_frac > 2) { 
      T0++; 
    } 
    E_GAIN_f_pitch_sharpening(h1, T0); 
   /*-----------------------------------------------------------------* 
    * - Correlation between target xn2[] and impulse response h1[]    * 
    * - Innovative codebook search                                    * 
    *-----------------------------------------------------------------*/ 
    E_ACELP_xh_corr(xn2, dn, h1); 
 
		if (codec_mode == MODE_9k6) { 
			E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 20, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_11k2) { 
			E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 28, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_12k8) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 36, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_14k4) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 44, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_16k) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 52, 0, (Word32*)prm); 
            prm += 4; 
		} else if (codec_mode == MODE_18k4) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 64, 0, (Word32*)prm); 
            prm += 8; 
		} else if (codec_mode == MODE_20k) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 72, 0, (Word32*)prm); 
            prm += 8; 
		} else if (codec_mode == MODE_23k2) { 
            E_ACELP_4t_newall(dn, cn, h1, code3GPP, y2, 88, 0, (Word32*)prm); 
      prm += 8; 
    } else { 
      printf("invalid mode for acelp frame!\n"); 
      exit(0); 
    } 
    { 
      int g; 
      for(g=0;g