Commit b77708ca authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'bugfix/issue929' into 'main'

increased accuracy of mixing matrix calculation [allow regression]

See merge request !1010
parents 447f224e 3b013480
Loading
Loading
Loading
Loading
Loading
+38 −70
Original line number Diff line number Diff line
@@ -176,26 +176,16 @@ static void ivas_param_ism_collect_slot_fx(
    Word32 *Cldfb_ImagBuffer_in_fx, /*Q(31-exp_imag)*/
    Word16 exp_imag,
    const Word16 ch,
    Word32 ref_power_fx[], /*Q(31-exp_ref_power)*/
    Word16 *exp_ref_power,
    Word32 cx_diag_fx[][PARAM_ISM_MAX_DMX], /*Q(31-exp_cx_diag)*/
    Word16 *exp_cx_diag )
    Word16 exp_cx_diag[][PARAM_ISM_MAX_DMX] )
{
    Word16 band_idx, bin_idx;
    Word16 brange[2];
    Word32 tmp_fx;
    Word16 exp_tmp;
    Word16 i, j;

    /* loop over parameter bands to collect transport channel energies */

    Word16 exp_ref_power_buf[CLDFB_NO_CHANNELS_MAX];
    Word16 exp_cx_diag_buf[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX];
    set16_fx( exp_ref_power_buf, *exp_ref_power, CLDFB_NO_CHANNELS_MAX );
    FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
    {
        set16_fx( exp_cx_diag_buf[i], *exp_cx_diag, PARAM_ISM_MAX_DMX );
    }
    FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ )
    {
        brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx];
@@ -213,53 +203,18 @@ static void ivas_param_ism_collect_slot_fx(
            tmp_fx = BASOP_Util_Add_Mant32Exp( tmp_fx, exp_tmp, var1, add( exp_real, exp_real ), &exp_tmp );
            tmp_fx = BASOP_Util_Add_Mant32Exp( tmp_fx, exp_tmp, var2, add( exp_imag, exp_imag ), &exp_tmp );

            Word16 exp_cx_diag_new = 0, exp_ref_power_new = 0;
            Word16 exp_cx_diag_new;
            move16();
            move16();
            cx_diag_fx[bin_idx][ch] = BASOP_Util_Add_Mant32Exp( cx_diag_fx[bin_idx][ch], exp_cx_diag_buf[bin_idx][ch], tmp_fx, exp_tmp, &exp_cx_diag_new );
            move32();
            ref_power_fx[bin_idx] = BASOP_Util_Add_Mant32Exp( ref_power_fx[bin_idx], exp_ref_power_buf[bin_idx], tmp_fx, exp_tmp, &exp_ref_power_new );
            cx_diag_fx[bin_idx][ch] = BASOP_Util_Add_Mant32Exp( cx_diag_fx[bin_idx][ch], exp_cx_diag[bin_idx][ch], tmp_fx, exp_tmp, &exp_cx_diag_new );
            move32();
            exp_cx_diag_buf[bin_idx][ch] = exp_cx_diag_new;
            exp_cx_diag[bin_idx][ch] = exp_cx_diag_new;
            move16();
            exp_ref_power_buf[bin_idx] = exp_ref_power_new;
            move16();
        }
        }

    /*make common exponent*/
    Word16 max_exp_cx_diag = exp_cx_diag_buf[0][0], max_exp_ref_power = exp_ref_power_buf[0];
    move16();
    move16();
    FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
    {
        FOR( j = 0; j < PARAM_ISM_MAX_DMX; j++ )
        {
            max_exp_cx_diag = s_max( max_exp_cx_diag, exp_cx_diag_buf[i][j] );
    }
        max_exp_ref_power = s_max( max_exp_ref_power, exp_ref_power_buf[i] );
    }

    FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
    {
        FOR( j = 0; j < PARAM_ISM_MAX_DMX; j++ )
        {
            cx_diag_fx[i][j] = L_shr_r( cx_diag_fx[i][j], sub( max_exp_cx_diag, exp_cx_diag_buf[i][j] ) ); // Q(31-max_exp_cx_diag)
            move32();
        }
        ref_power_fx[i] = L_shr_r( ref_power_fx[i], sub( max_exp_ref_power, exp_ref_power_buf[i] ) ); // Q(31-max_exp_ref_power)
        move16();
    }

    *exp_cx_diag = max_exp_cx_diag;
    move16();
    *exp_ref_power = max_exp_ref_power;
    move16();

    return;
}


static void ivas_param_ism_compute_mixing_matrix_fx(
    const Word16 nchan_ism,                                         /* i  : number of ISM channels       */
    PARAM_ISM_DEC_HANDLE hParamIsmDec,                              /* i/o: decoder ParamISM handle */
@@ -268,9 +223,7 @@ static void ivas_param_ism_compute_mixing_matrix_fx(
    const Word16 nchan_transport,
    const Word16 nchan_out_woLFE,
    Word32 cx_diag_fx[][PARAM_ISM_MAX_DMX], /*Q(31-cx_diag_e)*/
    Word16 cx_diag_e,
    Word32 ref_power_fx[], /*Q(31-ref_power_e)*/
    Word16 ref_power_e,
    Word16 cx_diag_e[][PARAM_ISM_MAX_DMX],
    Word32 mixing_matrix_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], /*Q(31-mixing_matrix_e)*/
    Word16 mixing_matrix_e[CLDFB_NO_CHANNELS_MAX] )
{
@@ -343,6 +296,27 @@ static void ivas_param_ism_compute_mixing_matrix_fx(

            set32_fx( cy_diag_fx, 0, nchan_out_woLFE );
            set16_fx( cy_diag_e_arr, 0, nchan_out_woLFE );

            /* equal cx diag exponents, compute ref power from cx_diag*/
            Word16 max_exp_cx_diag;
            Word32 cx_diag_eq_exp_fx[PARAM_ISM_MAX_DMX];
            Word32 ref_power_fx;
            Word16 ref_power_e, ref_power_e_new;
            ref_power_fx = cx_diag_fx[bin_idx][0];
            ref_power_e = cx_diag_e[bin_idx][0];

            FOR( i = 1; i < PARAM_ISM_MAX_DMX; i++ )
            {
                ref_power_fx = BASOP_Util_Add_Mant32Exp( ref_power_fx, ref_power_e, cx_diag_fx[bin_idx][i], cx_diag_e[bin_idx][i], &ref_power_e_new );
                ref_power_e = ref_power_e_new;
            }
            max_exp_cx_diag = ref_power_e;
            FOR( i = 0; i < PARAM_ISM_MAX_DMX; i++ )
            {
                cx_diag_eq_exp_fx[i] = L_shr_r( cx_diag_fx[bin_idx][i], sub( max_exp_cx_diag, cx_diag_e[bin_idx][i] ) ); // Q(31-max_exp_cx_diag)
            }


            FOR( w = 0; w < num_wave; w++ )
            {
                test();
@@ -352,24 +326,25 @@ static void ivas_param_ism_compute_mixing_matrix_fx(
                    SWITCH( nchan_ism )
                    {
                        case 2:
                            direct_power_fx[w] = L_shr_r( ref_power_fx[bin_idx], 1 );
                            direct_power_fx[w] = L_shr_r( ref_power_fx, 1 );
                            move32();
                            BREAK;
                        case 3:
                            direct_power_fx[w] = Mpy_32_16_1( ref_power_fx[bin_idx], 10923 ); // 10923 = 1/3f in Q15
                            direct_power_fx[w] = Mpy_32_16_1( ref_power_fx, 10923 ); // 10923 = 1/3f in Q15
                            move32();
                            BREAK;
                        case 4:
                            direct_power_fx[w] = L_shr_r( ref_power_fx[bin_idx], 2 );
                            direct_power_fx[w] = L_shr_r( ref_power_fx, 2 );
                            move32();
                            BREAK;
                    }
                }
                ELSE
                {
                    direct_power_fx[w] = Mpy_32_16_1( ref_power_fx[bin_idx], hParamIsmDec->power_ratios_fx[band_idx][0][w] ); // Q(31-ref_power_e)
                    direct_power_fx[w] = Mpy_32_16_1( ref_power_fx, hParamIsmDec->power_ratios_fx[band_idx][0][w] ); // Q(31-ref_power_e[bin_idx])
                    move32();
                }
                // direct_power_e = ref_power_e[bin_idx];
                direct_power_e = ref_power_e;
                move16();
                IF( direct_power_fx[w] != 0 )
@@ -410,7 +385,7 @@ static void ivas_param_ism_compute_mixing_matrix_fx(
            }

            /* Compute mixing matrix */
            computeMixingMatricesISM_fx( nchan_transport, num_wave, nchan_out_woLFE, response_matrix_fx, response_matrix_e, direct_power_fx, direct_power_e, cx_diag_fx[bin_idx], cx_diag_e, cy_diag_fx, cy_diag_e, proto_matrix_fx, 1,
            computeMixingMatricesISM_fx( nchan_transport, num_wave, nchan_out_woLFE, response_matrix_fx, response_matrix_e, direct_power_fx, direct_power_e, cx_diag_eq_exp_fx, max_exp_cx_diag, cy_diag_fx, cy_diag_e, proto_matrix_fx, 1,
                                         PARAM_MC_REG_SX_FX, PARAM_MC_REG_GHAT_FX, mixing_matrix_fx[bin_idx], &mixing_matrix_e[bin_idx] );
        }
    }
@@ -1070,14 +1045,14 @@ void ivas_param_ism_dec_digest_tc_fx(
    Word32 *transport_channels[], /* i  : synthesized core-coder transport channels/DirAC output  q_tc_in*/
    Word16 q_tc_in )
{
    Word16 exp_ref_power = 31, exp_cx_diag = 31;
    Word16 exp_real_tmp = 0, exp_imag_tmp = 0;
    move16();
    move16();
    move16();
    move16();
    Word32 ref_power_fx[CLDFB_NO_CHANNELS_MAX];
    Word32 cx_diag_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX];
    Word16 exp_cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX];

    Word16 q_tc = q_tc_in;
    move16();
    Word16 ch, nchan_transport, nchan_out, nchan_out_woLFE, i;
@@ -1132,15 +1107,8 @@ void ivas_param_ism_dec_digest_tc_fx(
    ivas_dirac_dec_set_md_map_fx( st_ivas, nCldfbSlots );
    /* set buffers to zero */

    FOR( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ )
    {
        set_zero_fx( cx_diag_fx[bin_idx], PARAM_ISM_MAX_DMX );
    }
    exp_cx_diag = 0;
    move16();
    set_zero_fx( ref_power_fx, CLDFB_NO_CHANNELS_MAX );
    exp_ref_power = 0;
    move16();
    set_zero_fx( &cx_diag_fx[0][0], CLDFB_NO_CHANNELS_MAX * PARAM_ISM_MAX_DMX );
    set16_zero_fx( &exp_cx_diag[0][0], CLDFB_NO_CHANNELS_MAX * PARAM_ISM_MAX_DMX );

    /* Frame-level Processing */
    /* De-quantization */
@@ -1269,7 +1237,7 @@ void ivas_param_ism_dec_digest_tc_fx(
                                            &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx],
                                            exp_imag_tmp,
                                            ch,
                                            ref_power_fx, &exp_ref_power, cx_diag_fx, &exp_cx_diag );
                                            cx_diag_fx, exp_cx_diag );

            exp_real_tmp = add( exp_real_tmp, scale_factor_real );
            exp_imag_tmp = add( exp_imag_tmp, scale_factor_imag );
@@ -1284,7 +1252,7 @@ void ivas_param_ism_dec_digest_tc_fx(
    }

    /* Compute mixing matrix */
    ivas_param_ism_compute_mixing_matrix_fx( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response_fx, nchan_transport, nchan_out_woLFE, cx_diag_fx, exp_cx_diag, ref_power_fx, exp_ref_power,
    ivas_param_ism_compute_mixing_matrix_fx( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response_fx, nchan_transport, nchan_out_woLFE, cx_diag_fx, exp_cx_diag,
                                             hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_fx, hParamIsmDec->hParamIsmRendering->exp_mixing_matrix_lin_fx );

    pop_wmops();