📄 gain_q.c
字号:
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 + -