www.pudn.com > p_voice.rar > QSIDGAIN.C
/*
ITU-T G.729 Annex C+ - Reference C code for floating point
implementation of G.729 Annex C+
(integration of Annexes B, D and E)
Version 2.1 of October 1999
*/
/*
File : QSIDGAIN.C
*/
/* Quantize SID gain */
#include
#include
#include
#include "typedef.h"
#include "ld8k.h"
#include "vad.h"
#include "dtx.h"
#include "sid.h"
#include "tab_dtx.h"
/* Local function */
static int quant_Energy(
FLOAT ener, /* (i) : Energy */
FLOAT *enerq /* (o) : quantized energy in dB */
);
/*-------------------------------------------------------------------*
* Function Qua_Sidgain *
* ~~~~~~~~~~~ *
*-------------------------------------------------------------------*/
void qua_Sidgain(
FLOAT *ener, /* (i) array of energies */
int nb_ener, /* (i) number of energies or */
FLOAT *enerq, /* (o) decoded energies in dB */
int *idx /* (o) SID gain quantization index */
)
{
int i;
FLOAT avr_ener;
if(nb_ener == 0) {
/* Quantize energy saved for frame erasure case */
avr_ener = (*ener) * fact[0];
}
else {
/*
* Compute weighted average of energies
* avr_ener = fact[nb_ener] x SUM(i=0->nb_ener-1) ener[i]
* with fact[nb_ener] = fact_ener / nb_ener x L_FRAME x nbAcf
*/
avr_ener = (F)0.;
for(i=0; i -8dB */
*enerq = (F)-12.;
return(0);
}
ener_dB = (F)10. * (FLOAT)log10(ener);
if(ener_dB <= (F)-8.) {
*enerq = (F)-12.;
return(0);
}
if(ener_dB >= (F)65.) {
*enerq = (F)66.;
return(31);
}
if(ener_dB <= (F)14.) {
index = (int)((ener_dB + (F)10.) * 0.25);
if (index < 1) index = 1;
*enerq = (F)4. * (FLOAT)index - (F)8.;
return(index);
}
index = (int)((ener_dB - (F)3.) * 0.5);
if (index < 6) index = 6;
*enerq = (F)2. * (FLOAT)index + (F)4.;
return(index);
}