diff --git a/lib_com/edct.c b/lib_com/edct.c index c336ccdd81ee95b8b7efac4fd5e2c94a7348081a..09e6a99765bece44267f95c674d7aae9aaa6e183 100644 --- a/lib_com/edct.c +++ b/lib_com/edct.c @@ -275,8 +275,14 @@ void edxt( { for ( k = Nm1 >> 1; k > 0; k-- ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float angle_tmp = scale * k; + const float wRe = cosf( angle_tmp ); + const float wIm = sinf( angle_tmp ); +#else const float wRe = cosf( scale * k ); const float wIm = sinf( scale * k ); +#endif y[k] /*pt 1*/ = wRe * re[k] + wIm * im[k]; y[length - k] = wIm * re[k] - wRe * im[k]; @@ -287,8 +293,14 @@ void edxt( { for ( k = Nm1 >> 1; k > 0; k-- ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float angle_tmp = scale * k; + const float wRe = cosf( angle_tmp ); + const float wIm = sinf( angle_tmp ); +#else const float wRe = cosf( scale * k ); const float wIm = sinf( scale * k ); +#endif y[Nm1 - k] = wRe * re[k] + wIm * im[k]; y[k - 1] = wIm * re[k] - wRe * im[k]; @@ -304,8 +316,14 @@ void edxt( { for ( k = Nm1 >> 1; k > 0; k-- ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float angle_tmp = scale * k; + const float wRe = cosf( angle_tmp ) * 0.5f; + const float wIm = sinf( angle_tmp ) * 0.5f; +#else const float wRe = cosf( scale * k ) * 0.5f; const float wIm = sinf( scale * k ) * 0.5f; +#endif re[k] = wRe * x[k] + wIm * x[length - k]; im[k] = wRe * x[length - k] - wIm * x[k]; @@ -316,8 +334,14 @@ void edxt( { for ( k = Nm1 >> 1; k > 0; k-- ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float angle_tmp = scale * k; + const float wRe = cosf( angle_tmp ) * 0.5f; + const float wIm = sinf( angle_tmp ) * 0.5f; +#else const float wRe = cosf( scale * k ) * 0.5f; const float wIm = sinf( scale * k ) * 0.5f; +#endif re[k] = wRe * x[Nm1 - k] + wIm * x[k - 1]; im[k] = wRe * x[k - 1] - wIm * x[Nm1 - k]; diff --git a/lib_com/options.h b/lib_com/options.h index 21047ff61d9ff3ec59acf21210a3d7ac92553f12..e455aa059df3ccdb294f55d956cd13727bf4306d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -187,6 +187,7 @@ #define NONBE_1412_AVOID_ROUNDING_AZ_ELEV /* FhG: Avoid rounding when passing azimuth and elevation to efap_determine_gains() */ #define NONBE_MDCT_ST_DTX_FIX_SUBOPT_SPATIAL_CNG /* FhG: Fix MDCT-Stereo comfort noise for certain noise types */ #define NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS /* FhG: fix non-BE in DFT stereo encoder between optimization levels */ +#define NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 /* FhG: fix even more non-BEnesses */ /*#define NONBE_1324_TC_BUFFER_MEMOERY_KEEP*/ /* VA: issue 1324: do not reset TSM memory in JBM bitrate switching */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 47f880ded31611fd68a70f86bc9a1ed0446b6854..7b86528878d457d4cbf031126a20d4a22d5082f2 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1384,8 +1384,16 @@ void stereo_dft_dec( if ( pgIpd[0] != 0.f ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float pgIpd_tmp; + + pgIpd_tmp = pgIpd[0]; + c0 = cosf( pgIpd_tmp ); + s0 = sinf( pgIpd_tmp ); +#else c0 = cosf( pgIpd[0] ); s0 = sinf( pgIpd[0] ); +#endif for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ @@ -1566,8 +1574,16 @@ void stereo_dft_dec( /* Active Upmix */ if ( pgIpd[0] != 0.f ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float pgIpd_tmp; + + pgIpd_tmp = pgIpd[0]; + c0 = cosf( pgIpd_tmp ); + s0 = sinf( pgIpd_tmp ); +#else c0 = cosf( pgIpd[0] ); s0 = sinf( pgIpd[0] ); +#endif for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ diff --git a/lib_dec/ivas_stereo_dft_plc.c b/lib_dec/ivas_stereo_dft_plc.c index 2186aa1b1cff6f5a85042535552f4d508ac74f19..f311b60affc41eef7041b45068cbe504653db20c 100644 --- a/lib_dec/ivas_stereo_dft_plc.c +++ b/lib_dec/ivas_stereo_dft_plc.c @@ -251,6 +251,9 @@ void stereo_dft_res_subst_spec( /* Apply phase adjustment of identified peaks, including Np=1 peak neighbors on each side */ for ( i = *num_plocs - 1; i >= 0; i-- ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float corr_phase_tmp; +#endif if ( k == 0 ) { /* For 1st subframe, apply reversed time ECU to get correct analysis window */ @@ -268,8 +271,14 @@ void stereo_dft_res_subst_spec( conj_sign = 1.0f; } +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + corr_phase_tmp = corr_phase; + cos_F = cosf( corr_phase_tmp ); + sin_F = sinf( corr_phase_tmp ); +#else cos_F = cosf( corr_phase ); sin_F = sinf( corr_phase ); +#endif idx = max( 0, plocs[i] - Np ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ while ( ( idx < plocs[i] + Np + 1 ) && ( idx < L_res ) ) diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c old mode 100755 new mode 100644 index b583690cf33da00c591c0489c9586a921431e3f0..e59dfa7c98607f6ac5ea789d39c12b3c6b720bee --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -1453,8 +1453,16 @@ void stereo_dft_enc_process( if ( pgIpd[0] != 0.f ) { +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float pgIpd_tmp; + + pgIpd_tmp = pgIpd[0]; + c = cosf( pgIpd_tmp ); + s = sinf( pgIpd_tmp ); +#else c = cosf( pgIpd[0] ); s = sinf( pgIpd[0] ); +#endif for ( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->band_limits_dmx[b + 1]; i++ ) { /*rotate L*/ diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index a095124f780e8606b5cb3e0deea24add3c4d157a..839cc3b104be11bc323a5c99c9e960b12bee6f9d 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -869,9 +869,18 @@ void stereo_dft_enc_compute_itd( if ( hCPE->element_mode == IVAS_CPE_DFT && ( hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) ) { float alphaD, c, s, c1, s1, ctmp, vtmp; +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + volatile float alphaD_tmp; +#endif alphaD = -2.f * EVS_PI * ( (float) hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) / hStereoDft->NFFT; +#ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 + alphaD_tmp = alphaD; + c1 = cosf( alphaD_tmp ); + s1 = sinf( alphaD_tmp ); +#else c1 = cosf( alphaD ); s1 = sinf( alphaD ); +#endif c = 1.f; /* cos(0) */ s = 0.f; /* sin(0) */