diff --git a/lib_com/options.h b/lib_com/options.h index 35878c7e3c3ef1175bfc82b82efb56a34fc475c7..4aecefb7dc49bca94ba4ad3d08de425a3267676d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -169,6 +169,8 @@ /* #################### Start NON-BE switches ############################ */ /* any switch which is non-be wrt. TS 26.258 V3.0 */ +#define FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION /* Dolby: issue 1465: Fix constant in create_random_vector() to allow more reliable fixed point port */ + /* ##################### End NON-BE switches ########################### */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 433c30af9ce956dd2e0d64434c629d1cf1ae7a70..b47e2592111fc59c148496fad64460b57453c218 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2685,10 +2685,13 @@ void GenShapedWBExcitation( float *mem_genSHBexc_filt_down3, /* i/o: memory */ float *state_lpc_syn, /* i/o: memory */ const int16_t coder_type, /* i : coding type */ - const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ - int16_t bwe_seed[], /* i/o: random number generator seed */ - const float voice_factors[], /* i : voicing factor */ - const int16_t uv_flag, /* i : unvoiced flag */ +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + const int16_t element_mode, /* i : element mode */ +#endif + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + const float voice_factors[], /* i : voicing factor */ + const int16_t uv_flag, /* i : unvoiced flag */ const int16_t igf_flag ); void GenWBSynth( diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 98a989d7014c7d9386736ca1c4722751a1b29a15..d83c5e17fb97d38622c911404376bdfc822d8a17 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -54,7 +54,11 @@ * Local function prototypes *-----------------------------------------------------------------*/ +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION +static void create_random_vector( float output[], const int16_t length, int16_t seed[], const int16_t element_mode ); +#else static void create_random_vector( float output[], const int16_t length, int16_t seed[] ); +#endif static void flip_spectrum( const float input[], float output[], const int16_t length ); static void Hilbert_transform( float tmp_R[], float tmp_I[], float *tmpi_R, float *tmpi_I, const int16_t length, const int16_t HB_stage_id ); static void Estimate_mix_factors( const float *shb_res, const float *exc16kWhtnd, const float *White_exc16k, const float pow1, const float pow22, float *vf_modified, int16_t *vf_ind ); @@ -366,10 +370,13 @@ void GenShapedWBExcitation( float *mem_genSHBexc_filt_down3, /* i/o: memory */ float *state_lpc_syn, /* i/o: memory */ const int16_t coder_type, /* i : coding type */ - const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ - int16_t bwe_seed[], /* i/o: random number generator seed */ - const float voice_factors[], /* i : voicing factor */ - const int16_t uv_flag, /* i : unvoiced flag */ +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + const int16_t element_mode, /* i : element mode */ +#endif + const float *bwe_exc_extended, /* i : bandwidth extended exciatation */ + int16_t bwe_seed[], /* i/o: random number generator seed */ + const float voice_factors[], /* i : voicing factor */ + const int16_t uv_flag, /* i : unvoiced flag */ const int16_t igf_flag ) { int16_t i, j, k; @@ -407,7 +414,11 @@ void GenShapedWBExcitation( if ( uv_flag ) { /* unvoiced signal */ +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + create_random_vector( exc4kWhtnd, L_FRAME16k / 4, bwe_seed, element_mode ); +#else create_random_vector( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); +#endif } else { @@ -436,7 +447,11 @@ void GenShapedWBExcitation( *mem_csfilt = -csfilt_den2[1] * excNoisyEnv[i]; } +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + create_random_vector( exc4k, L_FRAME16k / 4, bwe_seed, element_mode ); +#else create_random_vector( exc4k, L_FRAME16k / 4, bwe_seed ); +#endif /* Ensure pow22 is greater than zero when computing normalization */ for ( i = 0, pow22 = 0.00001f; i < L_FRAME16k / 4; i++ ) @@ -890,8 +905,13 @@ void GenShapedSHBExcitation( } else { +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + create_random_vector( White_exc16k, L_FRAME, bwe_seed, element_mode ); + create_random_vector( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed, element_mode ); +#else create_random_vector( White_exc16k, L_FRAME, bwe_seed ); create_random_vector( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); +#endif for ( k = 0, pow22 = 0.00001f; k < L_FRAME16k; k++ ) { @@ -1535,23 +1555,60 @@ void non_linearity( * -------------------------------------------------------------------*/ void create_random_vector( +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + float output[], /* o : output random vector */ + const int16_t length, /* i : length of random vector */ + int16_t seed[], /* i/o: start seed */ + const int16_t element_mode /* i : element mode */ +#else float output[], /* o : output random vector */ const int16_t length, /* i : length of random vector */ int16_t seed[] /* i/o: start seed */ +#endif ) { int16_t i, j, k; float scale1, scale2; +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + if ( element_mode != EVS_MONO ) + { + j = (int16_t) ( own_random( &seed[0] ) * 0.0078125f ); + j = (int16_t) min( abs( j ), 255 ); + k = (int16_t) ( own_random( &seed[1] ) * 0.0078125f ); + k = (int16_t) min( abs( k ), 255 ); + } + else + { + j = (int16_t) ( own_random( &seed[0] ) * 0.0078f ); + j = abs( j ) & 0xff; + k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); + k = abs( k ) & 0xff; + } +#else j = (int16_t) ( own_random( &seed[0] ) * 0.0078f ); j = abs( j ) & 0xff; k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); k = abs( k ) & 0xff; +#endif while ( k == j ) { +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + if ( element_mode != EVS_MONO ) + { + k = (int16_t) ( own_random( &seed[1] ) * 0.0078125f ); + k = (int16_t) min( abs( k ), 255 ); + } + else + { + k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); + k = abs( k ) & 0xff; + } +#else k = (int16_t) ( own_random( &seed[1] ) * 0.0078f ); k = abs( k ) & 0xff; +#endif } if ( own_random( &seed[0] ) < 0 ) diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 696360b68fa31b6c9e818d303bd86c9d25fe46ec..67a1e8013f5f56edd35eafc84accea61cac85c32 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -323,7 +323,11 @@ void wb_tbe_dec( /* From low band excitation, generate highband excitation */ mvr2r( hBWE_TD->state_syn_shbexc, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, st->element_mode, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); +#else GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); +#endif prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 ); diff --git a/lib_enc/swb_tbe_enc.c b/lib_enc/swb_tbe_enc.c index 6d59fc071a814665a1b26d9bd90b011803ba9c6d..9ada8d3f2e81d9f0c7e64c55137aa919d9b90781 100644 --- a/lib_enc/swb_tbe_enc.c +++ b/lib_enc/swb_tbe_enc.c @@ -378,7 +378,11 @@ void wb_tbe_enc( /* From low band excitation, generate highband excitation */ mvr2r( hBWE_TD->state_syn_shbexc, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); +#ifdef FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION + GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, st->element_mode, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); +#else GenShapedWBExcitation( shaped_wb_excitation + L_SHB_LAHEAD / 4, lpc_wb, exc4kWhtnd, hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3, hBWE_TD->state_lpc_syn, st->coder_type, bwe_exc_extended, hBWE_TD->bwe_seed, vf_modified, uv_flag, st->igf ); +#endif prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 );