diff --git a/lib_com/options.h b/lib_com/options.h index 12a2924643a2f3740388df2358cc9ab663171f23..772fcf0fbf9709dbca32413acd1362731e85536e 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 f4e3e39fddddbb7128e7fdc1b4c5f7a7e2ba6db1..45496d61c7d192fa1675710ac71a04972411578f 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -76,9 +76,20 @@ static void ivas_binRenderer_filterModule( ) { int16_t bandIdx, k, chIdx, tapIdx; +#ifdef NONBE_FIX_1134_FASTCONV_MC_LOUDNESS + 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++ ) @@ -120,10 +131,22 @@ 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 ) + { + /* 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; + } +#endif } } } + return; }