⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gain_q.c

📁 AMR-NB 的编码实现,纯C, VC下建立工程即可用.
💻 C
📖 第 1 页 / 共 4 页
字号:
	pgc_predUnqState->past_qua_en[1] = 
	pgc_predUnqState->past_qua_en[2] = 
	pgc_predUnqState->past_qua_en[3] = -14336;

	pgc_predUnqState->past_qua_en_MR122[0] = 
	pgc_predUnqState->past_qua_en_MR122[1] = 
	pgc_predUnqState->past_qua_en_MR122[2] =
	pgc_predUnqState->past_qua_en_MR122[3] = -2381;

	pgainQuantState->gc_predUnqSt = pgc_predUnqState;

	/////////////
	//gain_adapt_init(&pgainQuantState->adaptSt);


	if (&pgainQuantState->adaptSt == (GainAdaptState **) NULL)
	{
		fprintf(stderr, "gain_adapt_init: invalid parameter\n");
		return -1;
	}

	pgainQuantState->adaptSt = NULL;

	/* allocate memory */
	if ((pGainAdaptState = (GainAdaptState *) malloc(sizeof(GainAdaptState))) == NULL)
	{
		fprintf(stderr, "gain_adapt_init: can't malloc state structure\n");
		return -1;
	}

	//	gain_adapt_reset(pGainAdaptState);
	pGainAdaptState->onset = 0;
	pGainAdaptState->prev_alpha = 0;
	pGainAdaptState->prev_gc = 0;


	pGainAdaptState->ltpg_mem[0] = 0;
	pGainAdaptState->ltpg_mem[1] = 0;
	pGainAdaptState->ltpg_mem[2] = 0;
	pGainAdaptState->ltpg_mem[3] = 0;
	pGainAdaptState->ltpg_mem[4] = 0;

	pgainQuantState->adaptSt = pGainAdaptState;

	//  gainQuant_reset(pgainQuantState);

	pgainQuantState->sf0_exp_gcode0 = 0;
	pgainQuantState->sf0_frac_gcode0 = 0;
	pgainQuantState->sf0_exp_target_en = 0;
	pgainQuantState->sf0_frac_target_en = 0;

	//Set_zero (pgainQuantState->sf0_exp_coeff, 5);
	pgainQuantState->sf0_exp_coeff[0]= 0;
	pgainQuantState->sf0_exp_coeff[1]= 0;
	pgainQuantState->sf0_exp_coeff[2]= 0;
	pgainQuantState->sf0_exp_coeff[3]= 0;
	pgainQuantState->sf0_exp_coeff[4]= 0;

	//Set_zero (pgainQuantState->sf0_frac_coeff, 5);
	pgainQuantState->sf0_frac_coeff[0] = 0;
	pgainQuantState->sf0_frac_coeff[1] = 0;
	pgainQuantState->sf0_frac_coeff[2] = 0;
	pgainQuantState->sf0_frac_coeff[3] = 0;
	pgainQuantState->sf0_frac_coeff[4] = 0;

	pgainQuantState->gain_idx_ptr = NULL;

	//  gc_pred_reset(pgainQuantState->gc_predSt);
	pgainQuantState->gc_predSt->past_qua_en[0] = 
	pgainQuantState->gc_predSt->past_qua_en[1] = 
	pgainQuantState->gc_predSt->past_qua_en[2] = 
	pgainQuantState->gc_predSt->past_qua_en[3] = -14336;

	pgainQuantState->gc_predSt->past_qua_en_MR122[0] = 
	pgainQuantState->gc_predSt->past_qua_en_MR122[1] = 
	pgainQuantState->gc_predSt->past_qua_en_MR122[2] =
	pgainQuantState->gc_predSt->past_qua_en_MR122[3] = -2381;

	// gc_pred_reset(pgainQuantState->gc_predUnqSt);
	pgainQuantState->gc_predUnqSt->past_qua_en[0] = 
	pgainQuantState->gc_predUnqSt->past_qua_en[1] = 
	pgainQuantState->gc_predUnqSt->past_qua_en[2] = 
	pgainQuantState->gc_predUnqSt->past_qua_en[3] = -14336;

	pgainQuantState->gc_predUnqSt->past_qua_en_MR122[0] = 
	pgainQuantState->gc_predUnqSt->past_qua_en_MR122[1] = 
	pgainQuantState->gc_predUnqSt->past_qua_en_MR122[2] =
	pgainQuantState->gc_predUnqSt->past_qua_en_MR122[3] = -2381;

	///gain_adapt_reset(pgainQuantState->adaptSt);

	pgainQuantState->adaptSt->onset = 0;
	pgainQuantState->adaptSt->prev_alpha = 0;
	pgainQuantState->adaptSt->prev_gc = 0;

	pgainQuantState->adaptSt->ltpg_mem[0] = 0;
	pgainQuantState->adaptSt->ltpg_mem[1] = 0;
	pgainQuantState->adaptSt->ltpg_mem[2] = 0;
	pgainQuantState->adaptSt->ltpg_mem[3] = 0;
	pgainQuantState->adaptSt->ltpg_mem[4] = 0;

	*state = pgainQuantState;

	return 0;
}

/***********************************************************
Function     : gainQuant
Description: 

Input           :
		st            : State struct                   
		mode      : coder mode                     
		res[]       : LP residual,                 Q0  
		exc[]       : LTP excitation (unfiltered), Q0 
		code[]     : CB innovation (unfiltered),  Q13 
		xn[]         : Target vector.                    
		xn2[]       : Target vector.                   
		y1[]         : Adaptive codebook.                
		Y2[]         : Filtered innovative vector.    
		g_coeff[] : Correlations <xn y1> <y1 y1>   
		even_subframe  : even subframe indicator flag   
		gp_limit              : pitch gain limit                

Output         :
		sf0_gain_pit   : Pitch gain sf 0.   MR475       
		sf0_gain_cod : Code gain sf 0.    MR475         
		gain_pit          : Pitch gain.                     
		gain_cod        : Code gain.    
		anap               : Index of quantization    
		
Return         :
*************************************************************/

int gainQuant( gainQuantState *st,     Mode mode, Word16 res[], Word16 exc[],Word16 code[],    
    Word16 xn[],   Word16 xn2[], Word16 y1[], Word16 Y2[],Word16 g_coeff[], Word16 even_subframe,
    Word16 gp_limit, Word16 *sf0_gain_pit,Word16 *sf0_gain_cod, Word16 *gain_pit, Word16 *gain_cod, Word16 **anap )
{
    Word16 exp_gcode0,exp;
    Word16 frac_gcode0;    Word16 qua_ener_MR122;    Word16 qua_ener;    Word16 frac_coeff[5];    Word16 exp_coeff[5];    Word16 exp_en, frac_en;    Word16 cod_gain_exp, cod_gain_frac;    
     Word32 i, s ;
     gainQuantState *pst = st;
     Word16 *pxn = xn,*pres = res, *pexc = exc, *pcode = code, *pxn2 = xn2, *py1 = y1, *pgain_cod = gain_cod;
     Word16 *pY2 = Y2, *pg_coeff = g_coeff,*psf0_gain_pit = sf0_gain_pit, *psf0_gain_cod = sf0_gain_cod,*pgain_pit =gain_pit;
       if ( mode == MR475)    {          if (even_subframe != 0)        {            /* save position in output parameter stream and current               state of codebook gain predictor */            pst->gain_idx_ptr = (*anap)++;
			          //  gc_pred_copy(st->gc_predSt, st->gc_predUnqSt);          memcpy (pst->gc_predUnqSt->past_qua_en, pst->gc_predSt->past_qua_en,  8);
          memcpy (pst->gc_predUnqSt->past_qua_en_MR122, pst->gc_predSt->past_qua_en_MR122,  8);
                        /* predict codebook gain (using "unquantized" predictor)*/            /* (note that code[] is unsharpened in MR475)           */			            gc_pred(pst->gc_predUnqSt, mode, pcode,
                    &pst->sf0_exp_gcode0, &pst->sf0_frac_gcode0,
                    &exp_en, &frac_en);                        /* calculate energy coefficients for quantization               and store them in state structure (will be used               in next subframe when real quantizer is run) */            calc_filt_energies(mode, pxn, pxn2, py1, pY2, pg_coeff,
                               pst->sf0_frac_coeff, pst->sf0_exp_coeff,
                               &cod_gain_frac, &cod_gain_exp);            /* store optimum codebook gain (Q1) */
             *pgain_cod = (cod_gain_exp + 1) <= 0 ?  cod_gain_frac >> -(cod_gain_exp + 1) : (cod_gain_frac >= (0x7fff >>(cod_gain_exp + 1)) ? 0x7fff :  cod_gain_frac << (cod_gain_exp + 1)  ) ;
			       //  calc_target_energy(xn,&st->sf0_exp_target_en, &st->sf0_frac_target_en);
	s = 0;
       for (i = 0; i < L_SUBFR; i++)
    	{	        s +=  pxn[i]*pxn[i]<<1;
		 if(s<0)
		 {
			   s=MAX_32; break;
		 }
    	}
      exp = norm_l(s);
      pst->sf0_frac_target_en = (Word16)((s<<exp)>>16);
      pst->sf0_exp_target_en = 16 - exp; 
            /* calculate optimum codebook gain and update               "unquantized" predictor                    */            MR475_update_unq_pred(pst->gc_predUnqSt, pst->sf0_exp_gcode0, pst->sf0_frac_gcode0,
                                                       cod_gain_exp, cod_gain_frac);                        /* the real quantizer is not run here... */        }        else        {            /* predict codebook gain (using "unquantized" predictor) */            /* (note that code[] is unsharpened in MR475)            */            gc_pred(pst->gc_predUnqSt, mode, pcode,
                    &exp_gcode0, &frac_gcode0,                    &exp_en, &frac_en);                        /* calculate energy coefficients for quantization */            calc_filt_energies(mode, pxn, pxn2,py1, pY2, pg_coeff,
                                           frac_coeff, exp_coeff, &cod_gain_frac, &cod_gain_exp);    		s = 0;

		for (i = 0; i < L_SUBFR; i++)
		{
			s +=  pxn[i]*pxn[i]<<1;
			if(s<0)
			{
				s=MAX_32; break;
			}
		}
		exp = norm_l(s);
		frac_en = (Word16)((s<<exp)>>16);
		exp_en = 16 - exp; 
            /* run real (4-dim) quantizer and update real gain predictor */            *pst->gain_idx_ptr = MR475_gain_quant(
                pst->gc_predSt,
                pst->sf0_exp_gcode0, pst->sf0_frac_gcode0, 
                pst->sf0_exp_coeff,  pst->sf0_frac_coeff,
                pst->sf0_exp_target_en, pst->sf0_frac_target_en,
                code,                exp_gcode0, frac_gcode0,                 exp_coeff, frac_coeff,                exp_en, frac_en,                gp_limit,                psf0_gain_pit, psf0_gain_cod,   
                pgain_pit, pgain_cod);
        }    }    else    {        /*-------------------------------------------------------------------*         *  predict codebook gain and quantize                               *         *  (also compute normalized CB innovation energy for MR795)         *         *-------------------------------------------------------------------*/        gc_pred(pst->gc_predSt, mode, pcode, &exp_gcode0, &frac_gcode0,
                &exp_en, &frac_en);                     if ( mode ==  MR122)        {            *pgain_cod   = G_code (pxn2, pY2);
            *(*anap)++ = q_gain_code (mode, exp_gcode0, frac_gcode0,                                      pgain_cod, &qua_ener_MR122, &qua_ener);
                  }        else        {            /* calculate energy coefficients for quantization */            calc_filt_energies(mode, pxn, pxn2, py1, pY2, pg_coeff,
                               frac_coeff, exp_coeff,                               &cod_gain_frac, &cod_gain_exp);                                    if ( mode ==  MR795)            {                MR795_gain_quant(pst->adaptSt, pres, pexc, pcode,
                                 frac_coeff, exp_coeff,                                 exp_en, frac_en,                                 exp_gcode0, frac_gcode0, L_SUBFR,                                 cod_gain_frac, cod_gain_exp,                                 gp_limit, pgain_pit, pgain_cod,
                                 &qua_ener_MR122, &qua_ener,                                 anap);            }            else            {                *(*anap)++ = Qua_gain(mode,                                      exp_gcode0, frac_gcode0,                                      frac_coeff, exp_coeff, gp_limit,
                                      pgain_pit, pgain_cod,
                                      &qua_ener_MR122, &qua_ener);                          }        }                /*------------------------------------------------------------------*         *  update table of past quantized energies                         *         *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                         *         *  st->past_qua_en(Q10) = 20 * Log10(qua_gain_code) / constant     *         *                       = Log2(qua_gain_code)                      *         *                       = qua_ener                                 *         *                                           constant = 20*Log10(2) *         *------------------------------------------------------------------*/     //   gc_pred_update(pst->gc_predSt, qua_ener_MR122, qua_ener);

	pst->gc_predSt->past_qua_en[3] = pst->gc_predSt->past_qua_en[2];           
	pst->gc_predSt->past_qua_en_MR122[3] = pst->gc_predSt->past_qua_en_MR122[2]; 

	pst->gc_predSt->past_qua_en[2] = pst->gc_predSt->past_qua_en[1];           
	pst->gc_predSt->past_qua_en_MR122[2] = pst->gc_predSt->past_qua_en_MR122[1]; 

	pst->gc_predSt->past_qua_en[1] = pst->gc_predSt->past_qua_en[0];           
	pst->gc_predSt->past_qua_en_MR122[1] = pst->gc_predSt->past_qua_en_MR122[0]; 


	pst->gc_predSt->past_qua_en_MR122[0] = qua_ener_MR122;  /*    log2 (qua_err), Q10 */	                                                    
	pst->gc_predSt->past_qua_en[0] = qua_ener;              /* 20*log10(qua_err), Q10 */
	   
    }
    return 0;}


/************************************************************************* Function        :  gc_pred() 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -