From b0864e1addb1bd7e1c6d3b93e4dddc0bbd900d0a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 28 Oct 2025 17:27:32 +0100 Subject: [PATCH 1/2] apply the optimization-prevention approach in all of DFT stereo --- lib_com/edct.c | 24 ++++++++++++++++++++++++ lib_com/options.h | 1 + lib_dec/ivas_stereo_dft_dec.c | 16 ++++++++++++++++ lib_dec/ivas_stereo_dft_plc.c | 9 +++++++++ lib_enc/ivas_stereo_dft_enc.c | 10 +++++++++- lib_enc/ivas_stereo_dft_enc_itd.c | 9 +++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) diff --git a/lib_com/edct.c b/lib_com/edct.c index c336ccdd81..09e6a99765 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 c33b9eba21..795523096a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -186,6 +186,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 */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 47f880ded3..7b86528878 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 2186aa1b1c..f311b60aff 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 index b583690cf3..8faa0c1558 100755 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -60,7 +60,7 @@ static FILE *pF = NULL; #define STEREO_DFT_NRG_PAST_MAX_BAND 9 #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4 -#define STEREO_DFT_DMX_CROSSOVER ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ +#define STEREO_DFT_DMX_CROSSOVER (int16_t) ( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ #define ITD_VAD_E_BAND_N_INIT 200000 #define ITD_SID_PREV_FRAMES 5 @@ -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 a095124f78..839cc3b104 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) */ -- GitLab From 9f89c8fe3b981384e386414ef5294c46bcd56410 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 28 Oct 2025 17:38:12 +0100 Subject: [PATCH 2/2] apply clang-format --- lib_enc/ivas_stereo_dft_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 lib_enc/ivas_stereo_dft_enc.c 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 8faa0c1558..e59dfa7c98 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -60,7 +60,7 @@ static FILE *pF = NULL; #define STEREO_DFT_NRG_PAST_MAX_BAND 9 #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4 -#define STEREO_DFT_DMX_CROSSOVER (int16_t) ( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ +#define STEREO_DFT_DMX_CROSSOVER ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */ #define ITD_VAD_E_BAND_N_INIT 200000 #define ITD_SID_PREV_FRAMES 5 -- GitLab