diff --git a/lib_com/options.h b/lib_com/options.h index 42a41806b2b0252798aaffbb5b635199f7a136b0..b50fe79f03055ef157151e9b31245cd248d0319b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,6 +172,7 @@ /* 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 */ +#define FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE /* Nokia: float issue 1493: Improves float decision stability in MASA encoding by adjusting reduction code */ #define FIX_1500_ISM_MD_DTX /* VA: float issue 1500: fix ISM elevation metadata smoothing in DTX */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 5efcea91f7028ff4974f14440a55b1fc79b410ab..eb091bcbf00589daf987c5f2dbd159f039cd5f16 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -82,6 +82,9 @@ static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); #define LOWBITRATE_ONSET_BETA 0.92f #define LOWBITRATE_ONSET_GAIN 1.4f #define LOWBITRATE_NUM_BANDS 5 +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE +#define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ +#endif /*-----------------------------------------------------------------------* @@ -979,7 +982,11 @@ static void combine_freqbands_and_subframes( MASA_ENCODER_HANDLE hMasa ) { int16_t i, j, k, m; +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + volatile float aziRad, eleRad; /* Using volatile to reduce numerically unstable optimization */ +#else float aziRad, eleRad; +#endif float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1065,8 +1072,14 @@ static void combine_freqbands_and_subframes( energySum += hMasa->data.energy[j][m]; } +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + /* Using atan2 instead of atan2f to reduce platform difference */ + aziRad = (float) atan2( ySum, xSum ); + eleRad = (float) atan2( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); +#else aziRad = atan2f( ySum, xSum ); eleRad = atan2f( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); +#endif hMeta->directional_meta[i].azimuth[j][k] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = eleRad / EVS_PI * 180.0f; @@ -1174,8 +1187,13 @@ void ivas_masa_combine_directions( uint8_t computeCoherence; MASA_METADATA_HANDLE hMeta; +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + volatile float aziRad; /* Using volatile to reduce numerically unstable optimization */ + volatile float eleRad; +#else float aziRad; float eleRad; +#endif float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1247,6 +1265,13 @@ void ivas_masa_combine_directions( } importance[i] /= (float) numSf; importance[i] *= hMasa->data.importanceWeight[i]; +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + /* Setting close to zero values to zero to reduce decision differences */ + if ( importance[i] < IMPORTANCE_MIN_STEP ) + { + importance[i] = 0.0f; + } +#endif } /* Determine bands where to use two directions */ @@ -1272,8 +1297,14 @@ void ivas_masa_combine_directions( { for ( j = 0; j < numSf; j++ ) { +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + /* Using atan2 instead of atan2f to reduce platform difference */ + aziRad = (float) atan2( ySum[j][i], xSum[j][i] ); + eleRad = (float) atan2( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); +#else aziRad = atan2f( ySum[j][i], xSum[j][i] ); eleRad = atan2f( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); +#endif hMeta->directional_meta[0].azimuth[j][i] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[0].elevation[j][i] = eleRad / EVS_PI * 180.0f;