Commit 9d5a2ea0 authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

[fix] add an energy equalization for FastConv MC rendering

parent 23bfe4db
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 ########################### */

+38 −0
Original line number Diff line number Diff line
@@ -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;
}