Commit 5b318766 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for 3GPP issue 1584: Accuracy of spatial metadata in ivas_mcmasa_enc_fx...

Fix for 3GPP issue 1584: Accuracy of spatial metadata in ivas_mcmasa_enc_fx compared to the floating point equivalent

Link #1584
parent 56e1de23
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4646,6 +4646,7 @@ Word16 get_min_scalefactor( Word32 x, Word32 y );
Flag is_zero_arr( Word32 *arr, Word16 size );
Flag is_zero_arr16( Word16 *arr, Word16 size );
Flag is_zero_arr64( Word64 *arr, Word16 size );
void edct2_fx_ivas(
    const Word16 n,
+12 −0
Original line number Diff line number Diff line
@@ -4738,6 +4738,18 @@ Flag is_zero_arr16( Word16 *arr, Word16 size )
    return 1;
}

Flag is_zero_arr64( Word64 *arr, Word16 size )
{
    FOR( Word16 i = 0; i < size; i++ )
    {
        IF( arr[i] != 0 )
        {
            return 0;
        }
    }
    return 1;
}

void Scale_sig64(
    Word64 x[], /* i/o: signal to scale                 Qx        */
    Word16 len, /* i  : size of x[]                     Q0        */
+72 −19
Original line number Diff line number Diff line
@@ -81,7 +81,16 @@ static void compute_cov_mtx_fx(
    CovarianceMatrix *COVls,                                /* o  : Output matrix, contains upper part of cov mtx           */
    Word16 inp_exp                                          /*Stores exponent for temp*/
);
static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], const Word16 enc_param_start_band, const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] );

static void computeIntensityVector_enc_fx(
    const Word16 *band_grouping,
    Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX],
    Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX],
    const Word16 enc_param_start_band, /* i  : first band to process */
    const Word16 num_frequency_bands,
    Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS],
    Word16 *exp_intensity_real,
    Word16 inp_q );

static void computeVerticalDiffuseness_fx(
    Word32 **buffer_intensity,     /* i  : Intensity vectors           */
@@ -737,7 +746,7 @@ void ivas_mcmasa_enc_fx(
            move32();
            hQMeta->q_direction[0].band_data[i].elevation_fx[j] = elevation_m_values_fx[j][i]; // Q22
            move32();
            hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q30
            hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q31
            move32();
            hQMeta->q_direction[0].band_data[i].distance[j] = fixedDistance;
            move16();
@@ -938,7 +947,7 @@ void ivas_mcmasa_param_est_enc_fx(
    Word32 renormalization_factor_coh_fx[MASA_FREQUENCY_BANDS]; // renormalization_factor_coh_e
    Word16 renormalization_factor_coh_e[MASA_FREQUENCY_BANDS];
    Word16 surroundingCoherence_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
    Word16 numAnalysisChannels;
    Word16 numAnalysisChannels, shift;

    FOR( i = 0; i < MCMASA_MAX_ANA_CHANS; i++ )
    {
@@ -1168,7 +1177,7 @@ void ivas_mcmasa_param_est_enc_fx(
                Foa_ImagBuffer_fx,
                0,
                num_freq_bands,
                intensity_real_fx );
                intensity_real_fx, &c_e, inp_q );

            computeDirectionVectors_fixed(
                intensity_real_fx[0],
@@ -1188,7 +1197,8 @@ void ivas_mcmasa_param_est_enc_fx(
                FoaEven_ImagBuffer_fx,
                0,
                num_freq_bands,
                intensity_even_real_fx );
                intensity_even_real_fx, &shift, inp_q );

            Word16 ref_e = 0;
            move16();
            computeReferencePower_enc_fx( hMcMasa->band_grouping,
@@ -1211,7 +1221,7 @@ void ivas_mcmasa_param_est_enc_fx(
                /* only real part needed */
                Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); // hMcMasa->buffer_intensity_real_q
            }
            hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 );
            hMcMasa->buffer_intensity_real_q[index - 1] = sub( 31, shift );
            move16();
            Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); // ref_e
            hMcMasa->buffer_energy_q[index - 1] = sub( Q31, ref_e );
@@ -1227,7 +1237,7 @@ void ivas_mcmasa_param_est_enc_fx(
            IF( !hMcMasa->isHorizontalSetup )
            {
                Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands );
                hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 );
                hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( 31, c_e );
                move16();
                computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, hMcMasa->no_col_avg_diff, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q );
                v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands );
@@ -2071,21 +2081,30 @@ static void compute_cov_mtx_fx(

    return;
}

static void computeIntensityVector_enc_fx(
    const Word16 *band_grouping,
    Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX],
    Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX],
    Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/
    Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/
    const Word16 enc_param_start_band,                            /* i  : first band to process */
    const Word16 num_frequency_bands,
    Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] )
    Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/
    Word16 *exp_intensity_real,
    Word16 inp_q )
{
    /* Reminder
     * X = a + ib; Y = c + id
     * X*Y = ac - bd + i(ad +bc)
     */
    Word16 i, j;
    Word32 real, img;
    Word16 brange[2];
    Word16 brange[2], shift = 63;
    move16();
    Flag is_zero = 0;
    move16();

    Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];

    FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
    {
        set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS );
    }

    FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; i++ )
    {
@@ -2108,17 +2127,51 @@ static void computeIntensityVector_enc_fx(
            img = Cldfb_ImagBuffer[0][j];
            move32();
            /* Intensity is XYZ order, audio is WYZX order. */
            intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q -31
            intensity_real64[0][i] = W_add( intensity_real64[0][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q
            move32();
            intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q -31
            intensity_real64[1][i] = W_add( intensity_real64[1][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q
            move32();
            intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q -31
            intensity_real64[2][i] = W_add( intensity_real64[2][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q
            move32();
        }
    }

    FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
    {
        is_zero = is_zero_arr64( intensity_real64[i], MASA_FREQUENCY_BANDS );
        IF( is_zero == 0 )
        {
            BREAK;
        }
    }
    IF( is_zero == 0 )
    {
        FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
        {
            shift = s_min( shift, W_norm_arr( intensity_real64[i], MASA_FREQUENCY_BANDS ) );
        }

        FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
        {
            FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ )
            {
                intensity_real[i][j] = W_extract_h( W_shl( intensity_real64[i][j], shift ) );
                move32();
            }
        }

        *exp_intensity_real = sub( 31, sub( add( shift, shl( inp_q, 1 ) ), 32 ) );
        move16();
    }
    ELSE
    {
        *exp_intensity_real = 0;
        move16();
    }

    return;
}

static void computeVerticalDiffuseness_fx(
    Word32 **buffer_intensity,     /* i  : Intensity vectors           */
    const Word32 *buffer_energy,   /* i  : Energy                      */