Commit ed1d0909 authored by multrus's avatar multrus
Browse files

[cleanup] accept OPT_2182_MATRIX_SCALE_OPS

parent d3143b03
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -118,7 +118,6 @@

/* #################### Start BASOP optimization switches ############################ */

#define OPT_2182_MATRIX_SCALE_OPS           /* Dolby: Issue 2181, move matrix scale operations outside mul operations. */
#define OPT_2185_MATRIX_OUT_SCALING         /* Dolby: Issue 2185, optimize matrix-mul output-format. */
#define NONBE_OPT_2239_IVAS_FILTER_PROCESS  /* Dolby: Issue 2239, optimize ivas_filter_process_fx. */
#define NONBE_OPT_2193_EIG2X2               /* Dolby: Issue 2193, optimize eig2x2_fx. */
+0 −100
Original line number Diff line number Diff line
@@ -117,17 +117,11 @@ static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaE

static void formulate2x2MixingMatrix_fx( Word32 Ein1_fx /*q_Ein*/, Word32 Ein2_fx /*q_Ein*/, Word16 q_Ein, Word32 CinRe_fx /*q_Cin*/, Word32 CinIm_fx /*q_Cin*/, Word16 q_Cin, Word32 Eout1_fx /*q_Eout*/, Word32 Eout2_fx /*q_Eout*/, Word16 q_Eout, Word32 CoutRe_fx /*q_Cout*/, Word32 CoutIm_fx /*q_Cout*/, Word16 q_Cout, Word32 Q_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*Q31*/, Word32 Mre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word32 Mim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word16 *q_M, const Word16 regularizationFactor_fx /*Q14*/ );

#ifdef OPT_2182_MATRIX_SCALE_OPS
static void matrixScale_fx( Word32 Are_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A );
#endif

static void matrixMul_fx( Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A, Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word16 *q_B, Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word16 *q_out );

#ifdef OPT_2182_MATRIX_SCALE_OPS
static void matrixTransp2Mul_fx( Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A, Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word16 *q_B, Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word16 *q_out );
#else
static void matrixTransp2Mul_fx( Word32 Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word32 Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_A*/, Word16 *q_A, Word32 Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word32 Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_B*/, Word16 *q_B, Word32 Ascale, Word32 Bscale, Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_out*/, Word16 *q_out );
#endif


/*-------------------------------------------------------------------------
@@ -2235,24 +2229,14 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx(
        }

        /* Make matrix multiplication M*Cx*M' to determine resulting covariance matrix of processing input with M */
#ifdef OPT_2182_MATRIX_SCALE_OPS
        matrixScale_fx( Mre_fx, Mim_fx, &q_M );
        matrixScale_fx( CxRe_fx, CxIm_fx, &q_Cx );
#endif
        matrixMul_fx( Mre_fx, Mim_fx, &q_M, CxRe_fx, CxIm_fx, &q_Cx, tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp );
#ifdef OPT_2182_MATRIX_SCALE_OPS
        matrixScale_fx( tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp );
        matrixTransp2Mul_fx(
            tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp,
            Mre_fx, Mim_fx, &q_M,
            resultMtxRe_fx, resultMtxIm_fx, &q_res );
#else
        matrixTransp2Mul_fx(
            tmpMtxRe_fx, tmpMtxIm_fx, &q_tmp, Mre_fx, Mim_fx, &q_M,
            1 /*int Ascale*/,
            0 /*int Bscale*/,
            resultMtxRe_fx, resultMtxIm_fx, &q_res );
#endif

        /* When below the frequency limit where decorrelation is applied, we inject the decorrelated
         * residual (or missing) signal component. The procedure is active when there are not enough independent
@@ -4240,7 +4224,6 @@ static void matrixDiagMul_fx(
    return;
}

#ifdef OPT_2182_MATRIX_SCALE_OPS
static void matrixScale_fx(
    Word32 Are_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
    Word32 Aim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
@@ -4254,7 +4237,6 @@ static void matrixScale_fx(
    *q_A = add( *q_A, shift );
    move16();
}
#endif

static void matrixMul_fx(
    Word32 Are_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
@@ -4267,26 +4249,7 @@ static void matrixMul_fx(
    Word32 outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/
    Word16 *q_out )
{
#ifdef OPT_2182_MATRIX_SCALE_OPS
    Word16 chA, chB;
#else
    Word16 chA, chB;
    Word16 min_q_shift1, min_q_shift2;
    Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS );

    min_q_shift1 = sub( s_min( L_norm_arr( Are_fx[0], size ), L_norm_arr( Aim_fx[0], size ) ), 1 );
    min_q_shift2 = sub( s_min( L_norm_arr( Bre_fx[0], size ), L_norm_arr( Bim_fx[0], size ) ), 1 );

    scale_sig32( Are_fx[0], size, min_q_shift1 );
    scale_sig32( Aim_fx[0], size, min_q_shift1 );
    scale_sig32( Bre_fx[0], size, min_q_shift2 );
    scale_sig32( Bim_fx[0], size, min_q_shift2 );

    *q_A = add( *q_A, min_q_shift1 );
    *q_B = add( *q_B, min_q_shift2 );
    move16();
    move16();
#endif
#ifdef OPT_2185_MATRIX_OUT_SCALING
    Word32 not_zero = 0;
#endif
@@ -4332,9 +4295,7 @@ static void matrixMul_fx(
        move16();
    }
#else
#ifdef OPT_2182_MATRIX_SCALE_OPS
    Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS;
#endif
    if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) )
    {
        *q_out = Q31;
@@ -4422,7 +4383,6 @@ static void matrixTransp1Mul_fx(
    return;
}

#ifdef OPT_2182_MATRIX_SCALE_OPS
static void matrixTransp2Mul_fx(
    Word32 Are_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
    Word32 Aim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
@@ -4433,47 +4393,9 @@ static void matrixTransp2Mul_fx(
    Word32 outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/
    Word32 outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/
    Word16 *q_out )
#else
static void matrixTransp2Mul_fx(
    Word32 Are_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
    Word32 Aim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_A*/
    Word16 *q_A,
    Word32 Bre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_B*/
    Word32 Bim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_B*/
    Word16 *q_B,
    Word32 Ascale,
    Word32 Bscale,
    Word32 outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/
    Word32 outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], /*q_out*/
    Word16 *q_out )
#endif
{
#ifdef OPT_2182_MATRIX_SCALE_OPS
    Word16 chA, chB;
    // Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS;
#else
    Word16 chA, chB;
    Word16 min_q_shift;
    Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS;

    IF( Ascale == 1 )
    {
        min_q_shift = sub( s_min( L_norm_arr( Are_fx[0], size ), L_norm_arr( Aim_fx[0], size ) ), 1 );
        scale_sig32( Are_fx[0], size, min_q_shift );
        scale_sig32( Aim_fx[0], size, min_q_shift );
        *q_A = add( *q_A, min_q_shift );
        move16();
    }

    IF( Bscale == 1 )
    {
        min_q_shift = sub( s_min( L_norm_arr( Bre_fx[0], size ), L_norm_arr( Bim_fx[0], size ) ), 1 );
        scale_sig32( Bre_fx[0], size, min_q_shift );
        scale_sig32( Bim_fx[0], size, min_q_shift );
        *q_B = add( *q_B, min_q_shift );
        move16();
    }
#endif
#ifdef OPT_2185_MATRIX_OUT_SCALING
    Word32 not_zero = 0;
#endif
@@ -4518,9 +4440,7 @@ static void matrixTransp2Mul_fx(
        move16();
    }
#else
#ifdef OPT_2182_MATRIX_SCALE_OPS
    Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS;
#endif
    if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) )
    {
        *q_out = Q31;
@@ -5029,10 +4949,8 @@ static void formulate2x2MixingMatrix_fx(
    q_temp = sub( add( q_ky, q_GhatQ ), 31 );

    /* A = Ky' * G_hat * Q * Kx (see publication) */
#ifdef OPT_2182_MATRIX_SCALE_OPS
    matrixScale_fx( tmpRe_fx, tmpIm_fx, &q_temp );
    matrixScale_fx( Kxre_fx, Kxim_fx, &q_Kx );
#endif
    matrixMul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Kxre_fx, Kxim_fx, &q_Kx, Are_fx, Aim_fx, &q_A );

    /* Find nearest orthonormal matrix P to A = Ky' * G_hat * Q * Kx
@@ -5090,10 +5008,8 @@ static void formulate2x2MixingMatrix_fx(
    div_fx[0] = L_min( div_fx[0], thresh );                     // q_div
    div_fx[1] = L_min( div_fx[1], thresh );                     // q_div

#ifdef OPT_2182_MATRIX_SCALE_OPS
    matrixScale_fx( Are_fx, Aim_fx, &q_A );
    matrixScale_fx( Ure_fx, Uim_fx, &q_U );
#endif
    matrixMul_fx( Are_fx, Aim_fx, &q_A, Ure_fx, Uim_fx, &q_U, tmpRe_fx, tmpIm_fx, &q_temp );

    exp = L_norm_arr( div_fx, BINAURAL_CHANNELS );
@@ -5157,17 +5073,10 @@ static void formulate2x2MixingMatrix_fx(
        }
    }

#ifdef OPT_2182_MATRIX_SCALE_OPS
    matrixTransp2Mul_fx(
        tmpRe_fx, tmpIm_fx, &q_temp,
        Ure_fx, Uim_fx, &q_U,
        Pre_fx, Pim_fx, &q_P ); /* Nearest orthonormal matrix P to matrix A formulated */
#else
    matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Ure_fx, Uim_fx, &q_U,
                         0 /*int Ascale*/,
                         0 /*int Bscale*/,
                         Pre_fx, Pim_fx, &q_P ); /* Nearest orthonormal matrix P to matrix A formulated */
#endif

    /* These are the final formulas of the JAES publication M = Ky P Kx^(-1) */
#if ( BINAURAL_CHANNELS != 2 )
@@ -5298,23 +5207,14 @@ static void formulate2x2MixingMatrix_fx(
        }
    }

#ifdef OPT_2182_MATRIX_SCALE_OPS
    matrixScale_fx( KyRe_fx, KyIm_fx, &q_ky );
    matrixScale_fx( Pre_fx, Pim_fx, &q_P );
#endif
    matrixMul_fx( KyRe_fx, KyIm_fx, &q_ky, Pre_fx, Pim_fx, &q_P, tmpRe_fx, tmpIm_fx, &q_temp );
#ifdef OPT_2182_MATRIX_SCALE_OPS
    matrixScale_fx( tmpRe_fx, tmpIm_fx, &q_temp );
    matrixTransp2Mul_fx(
        tmpRe_fx, tmpIm_fx, &q_temp,
        Uxre_fx, Uxim_fx, &q_Ux,
        Mre_fx, Mim_fx, q_M );
#else
    matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Uxre_fx, Uxim_fx, &q_Ux,
                         1 /*int Ascale*/,
                         0 /*int Bscale*/,
                         Mre_fx, Mim_fx, q_M );
#endif

    return;
}