Files
rtphone/src/libs/libevs/lib_com/hq_conf.cpp
2020-06-15 15:41:54 +03:00

207 lines
6.4 KiB
C++

/*====================================================================================
EVS Codec 3GPP TS26.443 Nov 13, 2018. Version 12.11.0 / 13.7.0 / 14.3.0 / 15.1.0
====================================================================================*/
#include <stdlib.h>
#include <math.h>
#include "options.h"
#include "cnst.h"
#include "rom_com.h"
#include "prot.h"
/*--------------------------------------------------------------------------*
* hq_configure()
*
* Configuration routine for HQ mode
*--------------------------------------------------------------------------*/
void hq_configure(
const short length, /* i : Frame length */
const short hqswb_clas, /* i : HQ SWB class */
const long core_brate, /* i : Codec bitrate */
short *num_sfm, /* o : Total number of subbands */
short *nb_sfm, /* o : Total number of coded bands */
short *start_norm, /* o : First norm to be SDE encoded */
short *num_env_bands, /* o : Number coded envelope bands */
short *numnrmibits, /* o : Number of bits in fall-back norm encoding */
short *hq_generic_offset, /* o : Freq offset for HQ GENERIC */
short const **sfmsize, /* o : Subband bandwidths */
short const **sfm_start, /* o : Subband start coefficients */
short const **sfm_end /* o : Subband end coefficients */
)
{
*start_norm = 0;
if( length == L_FRAME48k )
{
if ( hqswb_clas == HQ_GEN_FB )
{
*num_sfm = NB_SFM;
*sfmsize = band_len_HQ;
*sfm_start = band_start_HQ;
*sfm_end = band_end_HQ;
if( core_brate == HQ_32k )
{
*hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
}
else if ( core_brate == HQ_16k40 || core_brate == HQ_24k40 )
{
*hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
}
/* setting start frequency of FD BWE */
if( core_brate == HQ_32k )
{
*num_env_bands = SFM_N_STA_10k;
}
else if( core_brate == HQ_16k40 || core_brate == HQ_24k40 )
{
*num_env_bands = SFM_N_STA_8k;
}
*nb_sfm = *num_sfm;
}
else
{
if(hqswb_clas == HQ_HARMONIC)
{
*num_sfm = SFM_N_HARM_FB;
*nb_sfm = SFM_N_HARM_FB;
*num_env_bands = SFM_N_HARM_FB;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*sfm_end = band_end_harm;
}
else if(hqswb_clas == HQ_HVQ)
{
if( core_brate == HQ_24k40 )
{
*num_sfm = SFM_N_HARM_FB;
*nb_sfm = HVQ_THRES_SFM_24k;
*num_env_bands = *num_sfm - *nb_sfm;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*sfm_end = band_end_harm;
*start_norm = HVQ_THRES_SFM_24k;
}
else
{
*num_sfm = SFM_N_HARM_FB;
*nb_sfm = HVQ_THRES_SFM_32k;
*num_env_bands = *num_sfm - *nb_sfm;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*start_norm = HVQ_THRES_SFM_32k;
*sfm_end = band_end_harm;
}
}
else
{
*num_sfm = NB_SFM;
*nb_sfm = *num_sfm;
*num_env_bands = NB_SFM;
*sfmsize = band_len_HQ;
*sfm_start = band_start_HQ;
*sfm_end = band_end_HQ;
}
}
}
else if( length == L_FRAME32k )
{
if( hqswb_clas == HQ_HARMONIC )
{
*num_sfm = SFM_N_HARM;
*nb_sfm = SFM_N_HARM;
*num_env_bands = SFM_N_HARM;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*sfm_end = band_end_harm;
}
else if ( hqswb_clas == HQ_HVQ )
{
if( core_brate == HQ_24k40 )
{
*num_sfm = SFM_N_HARM;
*nb_sfm = HVQ_THRES_SFM_24k;
*num_env_bands = *num_sfm - *nb_sfm;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*sfm_end = band_end_harm;
*start_norm = HVQ_THRES_SFM_24k;
}
else
{
*num_sfm = SFM_N_HARM;
*nb_sfm = HVQ_THRES_SFM_32k;
*num_env_bands = *num_sfm - *nb_sfm;
*sfmsize = band_len_harm;
*sfm_start = band_start_harm;
*start_norm = HVQ_THRES_SFM_32k;
*sfm_end = band_end_harm;
}
}
else if ( hqswb_clas == HQ_GEN_SWB )
{
*num_sfm = SFM_N_SWB;
*sfmsize = band_len_HQ;
*sfm_start = band_start_HQ;
*sfm_end = band_end_HQ;
if( core_brate == HQ_32k )
{
*hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
}
else if ( core_brate == HQ_24k40 )
{
*hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
}
/* setting start frequency of FD BWE */
if( core_brate == HQ_32k )
{
*num_env_bands = SFM_N_STA_10k;
}
else if( core_brate == HQ_24k40 )
{
*num_env_bands = SFM_N_STA_8k;
}
*nb_sfm = *num_sfm;
}
else
{
/* HQ_NORMAL and HQ_TRANSIENT */
*num_sfm = SFM_N_SWB;
*nb_sfm = *num_sfm;
*num_env_bands = SFM_N_SWB;
*sfmsize = band_len_HQ;
*sfm_start = band_start_HQ;
*sfm_end = band_end_HQ;
}
}
else
{
*num_sfm = SFM_N_WB;
*nb_sfm = *num_sfm;
*num_env_bands = SFM_N_WB;
*sfmsize = band_len_wb;
*sfm_start = band_start_wb;
*sfm_end = band_end_wb;
}
*numnrmibits = (*num_env_bands - 1) * NORMI_BITS;
return;
}