diff --git a/lib_com/options.h b/lib_com/options.h index 5ae3f1416d01b10433a41592db19a035298b07b7..00890af09671c508a38d82a250b3aee6bf4bf21a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,6 +81,8 @@ #define FIX_1970_SBA_CRASH /* Dlb: Fix for issue 1970, SBA crash */ #define FIX_1978_SAT_MISSING_IN_GAIN_ENC /* VA: Fix add saturation missing that lead to a crash in P800-10 */ +#define FIX_1981_MAXIMUM_EXP_FX /* FhG: Fix bug in function to find maximum value in vector */ +#define FIX_1981_MAXIMUM_EXP_FX_ZEROMANTISSA /* FhG: Fix bug in function to find maximum value in vector:zero-mantissa fix*/ #define FIX_1979_SAT_MISSING_IN_LSF_ENC /* VA: Proposal to fix 1979, saturation in lsf_enc, NOkia to review */ #define FIX_1946_CRASH_JBM_PROCESSING /* FhG: Increased guard bits of DFT_fx */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index f9761167a92a221ba2f8a754266ceb11ce080b9a..0d60446b361124bfa23f30695332afbbe1dad29d 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -2176,6 +2176,32 @@ Word16 maximum_exp_fx( const Word16 *exp_vec, /* i : exponents of input vector */ const Word16 lvec_fx /* i : length of input vector */ ) +#ifdef FIX_1981_MAXIMUM_EXP_FX +{ + Word16 j, ind; + ind = 0; + move16(); + + FOR( j = 1; j < lvec_fx; j++ ) + { + Word16 scale = sub( exp_vec[j], exp_vec[ind] ); +#ifdef FIX_1981_MAXIMUM_EXP_FX_ZEROMANTISSA + test(); + if ( vec_fx[j] == 0 || vec_fx[ind] == 0 ) + { + scale = 0; + move16(); + } +#endif + if ( L_mac0_sat( L_shl_sat( L_deposit_l( vec_fx[j] ), scale ), vec_fx[ind], -0x0001 ) > 0 ) + { + ind = j; + move16(); + } + } + return ind; +} +#else { Word16 j, ind; Word16 tmp, exp; @@ -2201,6 +2227,7 @@ Word16 maximum_exp_fx( return ind; } +#endif /*---------------------------------------------------------------------*