diff --git a/lib_com/options.h b/lib_com/options.h index 6d97909f18b4173d46f2b1a00701f1fd7613292e..1ef054819594d418c3deae10230ce406356608fc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,6 +153,8 @@ #define SBA2MONO /* FhG: Issue 365: Adapt processing of SBA mono output to be in line with stereo output (less delay, lower complexity) */ +#define NOKIA_PARAMBIN_REQULARIZATION /* Nokia: Contribution - Configured reqularization factor for parametric binauralizer. */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 58de4819e8f1eb2453dc194dad8ed08edb1ff247..b27462d649c10dd186579b1df38858e971beba27 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -80,6 +80,9 @@ static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Ai static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); +#ifdef NOKIA_PARAMBIN_REQULARIZATION +static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, const int32_t ivas_brate ); +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() @@ -268,6 +271,10 @@ ivas_error ivas_dirac_dec_init_binaural_data( ivas_td_decorr_dec_close( &( hBinaural->hTdDecorr ) ); } +#ifdef NOKIA_PARAMBIN_REQULARIZATION + hBinaural->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif + st_ivas->hDiracDecBin = hBinaural; return IVAS_ERR_OK; @@ -1064,11 +1071,19 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( CrEneR = 0.0f; /* Formulate main processing matrix M */ +#ifdef NOKIA_PARAMBIN_REQULARIZATION + formulate2x2MixingMatrix( h->ChEne[0][bin], h->ChEne[1][bin], + h->ChCrossRe[bin], h->ChCrossIm[bin], + h->ChEneOut[0][bin], h->ChEneOut[1][bin], + h->ChCrossReOut[bin], h->ChCrossImOut[bin], + prototypeMtx, Mre, Mim, h->reqularizationFactor ); +#else formulate2x2MixingMatrix( h->ChEne[0][bin], h->ChEne[1][bin], h->ChCrossRe[bin], h->ChCrossIm[bin], h->ChEneOut[0][bin], h->ChEneOut[1][bin], h->ChCrossReOut[bin], h->ChCrossImOut[bin], prototypeMtx, Mre, Mim, 1.0f ); +#endif /* Load estimated covariance matrix to the [2][2] matrix form */ CxRe[0][0] = h->ChEne[0][bin]; @@ -1854,3 +1869,82 @@ static void hrtfShGetHrtf( return; } + + +#ifdef NOKIA_PARAMBIN_REQULARIZATION +/*------------------------------------------------------------------------- + * configure_reqularization_factor() + * + * Configure regularization factor for the mixing matrix generation of the + * parametric binauralizer using IVAS codec format and current bitrate. + *------------------------------------------------------------------------*/ + +/*! r: Configured reqularization factor value to be set. */ +static float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i: IVAS codec format in use */ + const int32_t ivas_brate ) /* i: Current IVAS bitrate */ +{ + float reqularizationFactor; + reqularizationFactor = 1.0f; /* Default value */ + + if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_brate >= IVAS_256k ) + { + reqularizationFactor = 0.2f; + } + else if ( ivas_brate == IVAS_192k ) + { + reqularizationFactor = 0.3f; + } + else if ( ivas_brate == IVAS_160k ) + { + reqularizationFactor = 0.4f; + } + else if ( ivas_brate == IVAS_128k ) + { + reqularizationFactor = 0.5f; + } + else if ( ivas_brate == IVAS_96k ) + { + reqularizationFactor = 0.6f; + } + else if ( ivas_brate >= IVAS_64k ) + { + reqularizationFactor = 0.8f; + } + else + { + reqularizationFactor = 1.0f; + } + } + + if ( ivas_format == MC_FORMAT ) /* This is always McMASA for parametric binauralizer. */ + { + if ( ivas_brate >= IVAS_96k ) + { + reqularizationFactor = 0.3f; + } + else if ( ivas_brate >= IVAS_80k ) + { + reqularizationFactor = 0.5f; + } + else if ( ivas_brate >= IVAS_64k ) + { + reqularizationFactor = 0.7f; + } + else if ( ivas_brate >= IVAS_48k ) + { + reqularizationFactor = 0.8f; + } + else + { + reqularizationFactor = 1.0f; + } + } + + /* For SBA and parametric ISM, currently in default value of 1.0f. */ + + return reqularizationFactor; +} +#endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 226b9fcd32e81717d22e647ec988414b5495e3de..c94b55f3ccb921afee07d304115ca69bc8067927 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -140,6 +140,9 @@ typedef struct ivas_dirac_dec_binaural_data_structure uint16_t useSubframeMode; /* 0 = process in 20 ms frames, 1 = process in 5 ms subframes */ uint16_t useTdDecorr; ivas_td_decorr_state_t *hTdDecorr; +#ifdef NOKIA_PARAMBIN_REQULARIZATION + float reqularizationFactor; +#endif } DIRAC_DEC_BIN_DATA, *DIRAC_DEC_BIN_HANDLE;