From 9d5a2ea07efd4e7a88127a66a055cbf77676971e Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 22 Jul 2024 14:47:21 +0200 Subject: [PATCH 1/2] [fix] add an energy equalization for FastConv MC rendering --- lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal.c | 38 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 12a2924643..772fcf0fbf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -173,6 +173,7 @@ #define NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING /* VA: Add fix point bit allocation for special GSC mode such that float and fixed point have the same final bit allocation */ #define NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE /* VA: issue 1132: prevent division by extremely low energy value in SWB TBE */ +#define NONBE_FIX_1134_FASTCONV_MC_LOUDNESS /* FhG: issue 1134: fix output loudness for multichannel binaural rendering with FastConv */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index f4e3e39fdd..a534021006 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -76,6 +76,9 @@ static void ivas_binRenderer_filterModule( ) { int16_t bandIdx, k, chIdx, tapIdx; +#ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS + float eq, in_nrg, out_nrg; +#endif float *filterStatesLeftRealPtr, *filterStatesLeftImagPtr; const float *filterTapsLeftRealPtr, *filterTapsLeftImagPtr, *filterTapsRightRealPtr, *filterTapsRightImagPtr; @@ -123,6 +126,41 @@ static void ivas_binRenderer_filterModule( } } } +#ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS + if ( hBinRenderer->ivas_format == MC_FORMAT ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + in_nrg = 0.f; + out_nrg = 0.f; + + /* total input energy */ + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + in_nrg += CLDFB_real[chIdx][k][bandIdx] * CLDFB_real[chIdx][k][bandIdx]; + in_nrg += CLDFB_imag[chIdx][k][bandIdx] * CLDFB_imag[chIdx][k][bandIdx]; + } + + /* total output energy */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + out_nrg += out_Conv_CLDFB_real[chIdx][k][bandIdx] * out_Conv_CLDFB_real[chIdx][k][bandIdx]; + out_nrg += out_Conv_CLDFB_imag[chIdx][k][bandIdx] * out_Conv_CLDFB_imag[chIdx][k][bandIdx]; + } + + /* EQ factor */ + eq = sqrtf( in_nrg / ( out_nrg + EPSILON ) ); + + out_Conv_CLDFB_real[0][k][bandIdx] *= eq; + out_Conv_CLDFB_imag[0][k][bandIdx] *= eq; + out_Conv_CLDFB_real[1][k][bandIdx] *= eq; + out_Conv_CLDFB_imag[1][k][bandIdx] *= eq; + } + } + } +#endif return; } -- GitLab From fcdd4e3b46444ffe56d95cdbb5d54a3bda6ccb35 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 23 Jul 2024 14:00:32 +0200 Subject: [PATCH 2/2] [fix] change to constant scaling factor --- lib_dec/ivas_binRenderer_internal.c | 49 ++++++++++------------------- 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index a534021006..45496d61c7 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -77,11 +77,19 @@ static void ivas_binRenderer_filterModule( { int16_t bandIdx, k, chIdx, tapIdx; #ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS - float eq, in_nrg, out_nrg; + float gain; #endif float *filterStatesLeftRealPtr, *filterStatesLeftImagPtr; const float *filterTapsLeftRealPtr, *filterTapsLeftImagPtr, *filterTapsRightRealPtr, *filterTapsRightImagPtr; +#ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS + gain = 1.f; + + if ( hBinRenderer->ivas_format == MC_FORMAT ) + { + gain = 1.f / sqrtf( hBinRenderer->nInChannels ); + } +#endif for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) @@ -123,44 +131,21 @@ static void ivas_binRenderer_filterModule( /* Right Real and Imag */ out_Conv_CLDFB_real[1][k][bandIdx] += outRealRight + ( filterStatesLeftRealPtr[0] * filterTapsRightRealPtr[0] ) - ( filterStatesLeftImagPtr[0] * filterTapsRightImagPtr[0] ); out_Conv_CLDFB_imag[1][k][bandIdx] += outImagRight + ( filterStatesLeftRealPtr[0] * filterTapsRightImagPtr[0] ) + ( filterStatesLeftImagPtr[0] * filterTapsRightRealPtr[0] ); - } - } - } #ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS - if ( hBinRenderer->ivas_format == MC_FORMAT ) - { - for ( k = 0; k < numTimeSlots; k++ ) - { - for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - in_nrg = 0.f; - out_nrg = 0.f; - - /* total input energy */ - for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - in_nrg += CLDFB_real[chIdx][k][bandIdx] * CLDFB_real[chIdx][k][bandIdx]; - in_nrg += CLDFB_imag[chIdx][k][bandIdx] * CLDFB_imag[chIdx][k][bandIdx]; - } - /* total output energy */ - for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + if ( hBinRenderer->ivas_format == MC_FORMAT ) { - out_nrg += out_Conv_CLDFB_real[chIdx][k][bandIdx] * out_Conv_CLDFB_real[chIdx][k][bandIdx]; - out_nrg += out_Conv_CLDFB_imag[chIdx][k][bandIdx] * out_Conv_CLDFB_imag[chIdx][k][bandIdx]; + /* equalization gain for multichannel */ + out_Conv_CLDFB_real[0][k][bandIdx] *= gain; + out_Conv_CLDFB_imag[0][k][bandIdx] *= gain; + out_Conv_CLDFB_real[1][k][bandIdx] *= gain; + out_Conv_CLDFB_imag[1][k][bandIdx] *= gain; } - - /* EQ factor */ - eq = sqrtf( in_nrg / ( out_nrg + EPSILON ) ); - - out_Conv_CLDFB_real[0][k][bandIdx] *= eq; - out_Conv_CLDFB_imag[0][k][bandIdx] *= eq; - out_Conv_CLDFB_real[1][k][bandIdx] *= eq; - out_Conv_CLDFB_imag[1][k][bandIdx] *= eq; +#endif } } } -#endif + return; } -- GitLab