Commit 9dfd5456 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_1787_1788_fix_1' into 'main'

Precision improvement changes for 3GPP Issues #1787 and #1788

See merge request !1883
parents a00cb1a4 dd858bd3
Loading
Loading
Loading
Loading
+54 −10
Original line number Diff line number Diff line
@@ -293,6 +293,7 @@ static void ivas_dirac_param_est_ana_fx(
    Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX];
    Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX];
    Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
    Word16 intensity_real_q[MASA_FREQUENCY_BANDS];
    Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
    Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS];
    Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS];
@@ -308,6 +309,10 @@ static void ivas_dirac_param_est_ana_fx(
    Word16 numAnalysisChannels;
    Word16 inp_q;
    Word16 intensity_q, reference_power_q;
    Word16 temp_e, sf, scaled_data_q, s, shift = 31;
    move16();
    Word32 temp;
    Word64 W_temp;
    num_freq_bands = hDirAC->nbands;
    /* l_ts = input_frame / CLDFB_NO_COL_MAX; */
    l_ts = shr( input_frame, 4 );
@@ -320,6 +325,16 @@ static void ivas_dirac_param_est_ana_fx(
    move16();
    move16();
    move16();
    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) );
    }
    shift = sub( shift, find_guarded_bits_fx( l_ts ) );
    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        scale_sig32( data_fx[i], input_frame, shift );
    }
    scaled_data_q = add( data_q, shift );

    /* do processing over all CLDFB time slots */
    FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ )
@@ -356,14 +371,14 @@ static void ivas_dirac_param_est_ana_fx(

        FOR( ts = mrange[0]; ts < mrange[1]; ts++ )
        {
            Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e;
            inp_q = data_q; // Input Q of data_fx
            Word16 cr_q = MAX_16, ci_q = MAX_16, c_e;
            inp_q = scaled_data_q; // Q of data_fx after scaling
            move16();
            move16();
            move16();
            FOR( i = 0; i < numAnalysisChannels; i++ )
            {
                inp_q = data_q;
                inp_q = scaled_data_q;
                move16();
                cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q );
                cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], l_ts ) );
@@ -386,19 +401,38 @@ static void ivas_dirac_param_est_ana_fx(
                move16();
                FOR( j = brange[0]; j < brange[1]; j++ )
                {
                    Word32 temp = L_add( Mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mult_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e
                    hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hDirAC->energy_e[block_m_idx][band_m_idx] );
                    W_temp = W_mac_32_32( W_mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ); // Q-> 2*inp_q + 1
                    sf = W_norm( W_temp );
                    temp = W_extract_h( W_shl( W_temp, sf ) );          // 2*inp_q + 1 + sf - 32
                    temp_e = sub( 63 - 1, add( shl( inp_q, 1 ), sf ) ); // 31 - ( 2 * inp_q + 1 + sf - 32 )
                    hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hDirAC->energy_e[block_m_idx][band_m_idx] );
                    move32();
                }
            }
            /* Direction estimation */
            computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */
            intensity_q = sub( 31, shl( c_e, 1 ) );
            computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q );

            computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q );

            computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL );
            /* Power estimation for diffuseness */
            computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 );                                                                                                                               // computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands );
            computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 );
            reference_power_q = sub( shl( inp_q, 1 ), 30 );

            /* Aligning intensity_real to a common Q-factor */
            minimum_fx( intensity_real_q, num_freq_bands, &intensity_q );

            Word16 tmp;
            FOR( i = 0; i < num_freq_bands; i++ )
            {
                tmp = sub( intensity_q, intensity_real_q[i] );
                intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp );
                move32();
                intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp );
                move32();
                intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp );
                move32();
            }

            /* Fill buffers of length "averaging_length" time slots for intensity and energy */
            hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */
            move16();
@@ -426,7 +460,13 @@ static void ivas_dirac_param_est_ana_fx(
                move32();
                hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] );
                move32();
                diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] );

                W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] );
                s = W_norm( W_temp );
                temp = W_extract_h( W_shl( W_temp, s ) );
                temp_e = sub( 63, add( add( reference_power_q, diffuseness_q ), s ) ); // 31 - ( reference_power_q + diffuseness_q + s - 32 )

                diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] );
                move32();

                renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] );
@@ -479,6 +519,10 @@ static void ivas_dirac_param_est_ana_fx(
        }
    }

    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        scale_sig32( data_fx[i], input_frame, negate( shift ) );
    }
    return;
}

+83 −21
Original line number Diff line number Diff line
@@ -529,7 +529,10 @@ void ivas_mcmasa_param_est_ana_fx(
    Word32 FoaEven_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX];
    Word32 FoaEven_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX];
    Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
    Word16 intensity_real_q[MASA_FREQUENCY_BANDS];
    Word32 intensity_even_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
    Word16 intensity_even_real_q[MASA_FREQUENCY_BANDS];
    Word16 intensity_q, intensity_even_q;
    Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
    Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS];
    Word32 vertical_diffuseness_vector_fx[MASA_FREQUENCY_BANDS];
@@ -571,6 +574,11 @@ void ivas_mcmasa_param_est_ana_fx(
    Word16 i1, i2, i3;
    Word16 numAnalysisChannels;
    Word16 spreadCoh_e;
    Word64 W_temp;
    Word32 temp;
    Word16 temp_e;
    Word16 sf, scaled_data_q, s, shift = 31;
    move16();
    num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels;
    move16();
    num_freq_bands = hMcMasa->nbands;
@@ -580,6 +588,18 @@ void ivas_mcmasa_param_est_ana_fx(

    set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS );
    set16_fx( out_exp, 30, MASA_FREQUENCY_BANDS );

    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) );
    }
    shift = sub( shift, find_guarded_bits_fx( l_ts ) );
    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        scale_sig32( data_fx[i], input_frame, shift );
    }
    scaled_data_q = add( q_data, shift );

    /* do processing over all CLDFB time slots */
    FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ )
    {
@@ -625,14 +645,14 @@ void ivas_mcmasa_param_est_ana_fx(

        FOR( ts = mrange[0]; ts < mrange[1]; ts++ )
        {
            Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e;
            Word16 cr_q = MAX_16, ci_q = MAX_16, c_e;
            move16();
            move16();
            Word16 inp_q = q_data;
            Word16 inp_q = scaled_data_q;
            move16();
            FOR( i = 0; i < numAnalysisChannels; i++ )
            {
                inp_q = q_data;
                inp_q = scaled_data_q;
                move16();
                cldfbAnalysis_ts_fx_var_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q );
                cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], l_ts ) );
@@ -659,8 +679,12 @@ void ivas_mcmasa_param_est_ana_fx(
                {
                    FOR( i = 0; i < numAnalysisChannels; i++ )
                    {
                        Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e
                        hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hMcMasa->energy_e[block_m_idx][band_m_idx] );
                        W_temp = W_mac_32_32( W_mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ); // Q-> 2*inp_q + 1
                        sf = W_norm( W_temp );
                        temp = W_extract_h( W_shl( W_temp, sf ) );           // 2 * inp_q + 1 + sf - 32
                        temp_e = sub( 31 + 31, add( shl( inp_q, 1 ), sf ) ); // e = 31 - (2 * inp_q + 1 + sf - 32)

                        hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hMcMasa->energy_e[block_m_idx][band_m_idx] );
                        move32();
                    }
                }
@@ -751,15 +775,40 @@ void ivas_mcmasa_param_est_ana_fx(
            }

            /* Direction estimation */
            computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */
            computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q );

            computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ),
                                           NULL ); /* Q direction_vector_fx = Q30*/
            computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0,
                                           intensity_real_q ); /* Q direction_vector_fx = Q30*/

            /* Power and intensity estimation for diffuseness */
            computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx ); /*2*inp_q-31*/
            computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx, intensity_even_real_q, inp_q );

            computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*inp_q-30*/

            /* Aligning intensity_real and intensity_even_real to a common Q-factor */
            minimum_fx( intensity_real_q, num_freq_bands, &intensity_q );
            minimum_fx( intensity_even_real_q, num_freq_bands, &intensity_even_q );

            Word16 tmp;
            FOR( i = 0; i < num_freq_bands; i++ )
            {
                tmp = sub( intensity_q, intensity_real_q[i] );
                intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp );
                move32();
                intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp );
                move32();
                intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp );
                move32();

                tmp = sub( intensity_even_q, intensity_even_real_q[i] );
                intensity_even_real_fx[0][i] = L_shl( intensity_even_real_fx[0][i], tmp );
                move32();
                intensity_even_real_fx[1][i] = L_shl( intensity_even_real_fx[1][i], tmp );
                move32();
                intensity_even_real_fx[2][i] = L_shl( intensity_even_real_fx[2][i], tmp );
                move32();
            }

            /* Fill buffers of length "averaging_length" time slots for intensity and energy */
            hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */
            index = hMcMasa->index_buffer_intensity;
@@ -769,7 +818,7 @@ void ivas_mcmasa_param_est_ana_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[index - 1] = sub( shl( inp_q, 1 ), 31 );
            hMcMasa->buffer_intensity_real_q[index - 1] = intensity_even_q;
            move16();
            Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[i_mult( index - 1, num_freq_bands )] ), num_freq_bands );
            hMcMasa->buffer_energy_q[index - 1] = sub( shl( inp_q, 1 ), 30 );
@@ -779,7 +828,7 @@ void ivas_mcmasa_param_est_ana_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] = intensity_q;
                move16();
                computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); // Q vertical_diffuseness_vector_fx = 31
                v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands );
@@ -790,7 +839,14 @@ void ivas_mcmasa_param_est_ana_fx(
                hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] );
                hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] );
                hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] );
                diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] );

                W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] );
                s = W_norm( W_temp );
                temp = W_extract_h( W_shl( W_temp, s ) );
                temp_e = sub( 32, add( sub( Q30, sub( shl( c_e, 1 ), 1 ) ), s ) ); // 31 - ( (31 - sub( shl( c_e, 1 ), 1 )) + diffuseness_q + s - 32 )

                diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] );

                renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] );
                move32();
                move32();
@@ -827,7 +883,7 @@ void ivas_mcmasa_param_est_ana_fx(
            {
                FOR( j = i; j < numAnalysisChannels; j++ )
                {
                    Word32 temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] );
                    temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] );
                    absCOVls_fx[i][j] = Sqrt32( temp, &absCOVls_e[i][j] );
                    move32();
                }
@@ -880,7 +936,7 @@ void ivas_mcmasa_param_est_ana_fx(
                        move16();
                    }
                    Word16 temp_exp = add( lsEnergy_e[i1], lsEnergy_e[i2] );
                    Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp );
                    temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp );
                    tempCoh_e = 0;
                    move16();
                    tempCoh_fx = L_shl( BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], temp, &tempCoh_e ), 16 );
@@ -932,8 +988,8 @@ void ivas_mcmasa_param_est_ana_fx(
                move16();
                i3 = hMcMasa->rightNearest[i1];
                move16();
                Word16 temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] );
                Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e );
                temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] );
                temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e );
                IF( LT_16( i2, i3 ) )
                {
                    stereoCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i3], temp, &stereoCoh_e );
@@ -1190,6 +1246,12 @@ void ivas_mcmasa_param_est_ana_fx(
            }
        }
    }

    FOR( i = 0; i < numAnalysisChannels; i++ )
    {
        scale_sig32( data_fx[i], input_frame, negate( shift ) );
    }

    return;
}

@@ -1611,7 +1673,7 @@ void ivas_create_masa_out_meta_fx(
        /* Direct-to-total ratio */
        FOR( band = 0; band < numFrequencyBands; band++ )
        {
            extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ); // Q8
            extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ); // Q0
            move16();
            extOutMeta->directToTotalRatio[1][sf][band] = 0;
            move16();
@@ -1620,7 +1682,7 @@ void ivas_create_masa_out_meta_fx(
        /* Spread coherence */
        FOR( band = 0; band < numFrequencyBands; band++ )
        {
            extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( spreadCoherence[sf][band], sub( spreadCoherence_q, 8 ) ); // Q8
            extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( spreadCoherence[sf][band], UINT8_MAX ), sub( spreadCoherence_q, 15 ) ); // Q0
            move16();
            extOutMeta->spreadCoherence[1][sf][band] = 0;
            move16();
@@ -1629,14 +1691,14 @@ void ivas_create_masa_out_meta_fx(
        /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */
        FOR( band = 0; band < numFrequencyBands; band++ )
        {
            extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ) ); // Q8
            extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ) ); // Q0
            move16();
        }

        /* Surround coherence */
        FOR( band = 0; band < numFrequencyBands; band++ )
        {
            extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( surroundingCoherence[sf][band], sub( surroundingCoherence_q, 8 ) ); // Q8
            extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( Mpy_32_16_1( surroundingCoherence[sf][band], UINT8_MAX ), sub( surroundingCoherence_q, 15 ) ); // Q0
            move16();
        }
    }
+68 −19

File changed.

Preview size limit exceeded, changes collapsed.

+7 −6
Original line number Diff line number Diff line
@@ -1430,10 +1430,11 @@ void ivas_omasa_ana_close(
void computeIntensityVector_ana_fx(
    const Word16 *band_grouping,                                  /* i  : Band grouping for estimation   */
    Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i  : Real part of input signal   Qx */
    Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i  : Imag part of input signal    Qx           */
    Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i  : Imag part of input sig      Qx */
    const Word16 num_frequency_bands,                             /* i  : Number of frequency bands      */
    Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]   /* o  : Intensity vector             2 * Qx -31   */
);
    Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS],   /* o  : Intensity           */
    Word16 q_intensity_real[MASA_FREQUENCY_BANDS],
    Word16 inp_q );

void computeReferencePower_ana_fx(
    const Word16 *band_grouping,                                /* i  : Band grouping for estimation                 */