Commit 192200eb authored by Tapani Pihlajakuja's avatar Tapani Pihlajakuja
Browse files

Merge branch 'nokia/contribution-30-adaptive-regularization-param-bin' into 'main'

[non-BE] Contribution 30 - Adaptive regularization for parametric binauralization

See merge request !523
parents de6eaffe f9ce56d7
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+94 −0
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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;