Commit e00fb215 authored by Devansh Kandpal's avatar Devansh Kandpal
Browse files

mid stage updates - solved logical error

parent bbb30d91
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1099,6 +1099,7 @@ ivas_error ivas_reverb_prepare_cldfb_params(
    const int32_t output_Fs,
    Word32 *pOutput_t60,
    Word32 *pOutput_ene );

void ivas_reverb_interpolate_acoustic_data_fx(
  const Word16 input_table_size,
  const Word32 *pInput_fc, //input in Q16
@@ -1107,9 +1108,7 @@ void ivas_reverb_interpolate_acoustic_data_fx(
  const Word16 output_table_size,
  const Word32 *pOutput_fc,
  Word32 *pOutput_t60,
  Word32 *pOutput_dsr,
  Word16 *pOutput_t60_e, //output e
  Word16 *pOutput_dsr_e  //output e
  Word32 *pOutput_dsr
);
#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT
void ivas_reverb_interpolate_energies_fx(
+27 −20
Original line number Diff line number Diff line
@@ -853,16 +853,16 @@ void ivas_reverb_interpolate_acoustic_data_fx(
    const Word32 *pInput_dsr, // input in Q30
    const Word16 output_table_size,
    const Word32 *pOutput_fc, // Q16
    Word32 *pOutput_t60,      // pOutput_t60_e
    Word32 *pOutput_dsr,      // pOutput_dsr_e
    Word16 *pOutput_t60_e,    // output e
    Word16 *pOutput_dsr_e     // output e
    Word32 *pOutput_t60,      // pOutput_t60_e // output t60 in Q26
    Word32 *pOutput_dsr      // pOutput_dsr_e // output dsr in Q 30
)
{
    Word16 input_idx, output_idx;
    Word16 input_idx, input_idx_next, output_idx;
    Word32 rel_offset;
    Word16 rel_offset_e;
    input_idx = 0;
    input_idx_next = 0;
    move16();
    move16();

    FOR( output_idx = 0; output_idx < output_table_size; output_idx++ )
@@ -872,6 +872,8 @@ void ivas_reverb_interpolate_acoustic_data_fx(
        {
            input_idx = 0;
            move16();
            input_idx_next = 0;
            move16();
            rel_offset = 0;
            move32();
            rel_offset_e = 0;
@@ -883,7 +885,8 @@ void ivas_reverb_interpolate_acoustic_data_fx(
            IF( GT_32( pOutput_fc[output_idx], pInput_fc[input_table_size - 1] ) )
            {
                input_idx = sub( input_table_size, 2 );
                rel_offset = ONE_IN_Q30; // Q30;
                input_idx_next = add( input_idx, 1 );
                rel_offset = ONE_IN_Q15;
                move32();
                rel_offset_e = 1;
                move16();
@@ -895,26 +898,30 @@ void ivas_reverb_interpolate_acoustic_data_fx(
                {
                    input_idx = add( input_idx, 1 );
                }
                rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // q15
                input_idx_next = add( input_idx, 1 );
                rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // Q15
                rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) );
                rel_offset_e = 0;
                move16();
            }
        }
        Word32 mult1;
        Word16 mult_e = 0;
        move16();
        mult1 = Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx + 1], pInput_t60[input_idx] ) );
        pOutput_t60[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_t60[input_idx], 5, mult1, add( 5, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31)
        move32();
        pOutput_t60_e[output_idx] = mult_e;
        move16();

        mult1 = Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx + 1], pInput_dsr[input_idx] ) );
        pOutput_dsr[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_dsr[input_idx], 1, mult1, add( 1, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31)
        move32();
        pOutput_dsr_e[output_idx] = mult_e;
        move16();
        pOutput_t60[output_idx] = L_add( pInput_t60[input_idx], Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx_next], pInput_t60[input_idx] ) ) );
        pOutput_dsr[output_idx] = L_add( pInput_dsr[input_idx], Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx_next], pInput_dsr[input_idx] ) ) );
        //Word32 mult1;
        //Word16 mult_e = 0;
        //move16();
        //mult1 = Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx + 1], pInput_t60[input_idx] ) );
        //pOutput_t60[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_t60[input_idx], 5, mult1, add( 5, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31)
        //move32();
        ////pOutput_t60_e[output_idx] = mult_e;
        //move16();

        //mult1 = Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx + 1], pInput_dsr[input_idx] ) );
        //pOutput_dsr[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_dsr[input_idx], 1, mult1, add( 1, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) // If DSR is in Q30 -> Should this not be 31 - (31 - rel_offset_e + 30 - 31)??
        //move32();
        ////pOutput_dsr_e[output_idx] = mult_e;
        //move16();
    }

    return;
+1 −1
Original line number Diff line number Diff line
@@ -1293,7 +1293,7 @@ static void set_reverb_acoustic_data_fx(

    /* interpolate input table data for T60 and DSR to the FFT filter grid */
    ivas_reverb_interpolate_acoustic_data_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, pAcoustic_dsr_fx,
                                              nr_fc_fft_filter, pFc_fx, pRt60_fx, pDsr_fx, pRt60_e, pDsr_e );
                                              nr_fc_fft_filter, pFc_fx, pRt60_fx, pDsr_fx );

    /* adjust DSR for the delay difference */

+33 −27
Original line number Diff line number Diff line
@@ -89,9 +89,7 @@ ivas_error ivas_reverb_prepare_cldfb_params(

    Word32 output_fc_fx[CLDFB_NO_CHANNELS_MAX];
    Word32 output_t60_fx[CLDFB_NO_CHANNELS_MAX];
    Word16 output_t60_e[CLDFB_NO_CHANNELS_MAX];
    Word32 output_ene_fx[CLDFB_NO_CHANNELS_MAX];
    Word16 output_ene_e[CLDFB_NO_CHANNELS_MAX];

    Word32 delay_diff_fx, ln_1e6_inverted_fx, L_tmp;
    const Word32 dmx_gain_2_fx = 1852986624; // Q16
@@ -106,35 +104,23 @@ ivas_error ivas_reverb_prepare_cldfb_params(
        output_fc_fx[idx] = (Word32) ( ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ) ) * ONE_IN_Q16;
    }

    ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx,
                                              CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx, output_ene_fx, output_t60_e, output_ene_e );

    /*ivas_reverb_interpolate_energies_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx,
                                              CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx, output_ene_fx );*/

    //Return  T60 in fixed-point
    for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
    {
        pOutput_t60[i] = L_shl( output_t60_fx[i], sub( output_t60_e, 5 ) );
        //pOutput_t60[i] = output_t60_fx[i] * ( 1 << output_t60_e[i] ); // Will not work - mantissa is 16 bit
    }
    // TODO: Replace all these dedicated interpolate functions with just one taking a single input vector and map it to a single output vector. Period.
    // ivas_interpolate_on_freq_grids_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx );

    /*for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) //Should not be required in fixed-point
    {
        pOutput_t60[i] = (float) fabs( me2f( output_t60_fx[i], output_t60_e[i] ) ); -->This operation must be recreated in fixed-point to return T60
        pOutput_ene[i] = (float) fabs( me2f( output_ene_fx[i], output_ene_e[i] ) );
    }*/
    ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx,
                                              CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx, output_ene_fx );

    /* adjust DSR for the delay difference */

    delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx );

    ln_1e6_inverted_fx = 155440049; // Q31 /* 1.0f / logf( 1e06f ) */

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
        L_tmp = Mpy_32_32( output_t60_fx[idx], ln_1e6_inverted_fx );
        L_tmp = Mpy_32_32( output_t60_fx[idx], ln_1e6_inverted_fx );    // Q26
        exp_argument_fx = BASOP_Util_Divide3232_Scale( delay_diff_fx, L_tmp, &exp_argument_e );
        exp_argument_e = add( exp_argument_e, sub( 4, output_t60_e[idx] ) ); // Q27 -> e4 (from other function). However, t60 is in Q26. This should be handled appropriately
        exp_argument_e = add( exp_argument_e, sub( 4, L_tmp ) ); // Q27 -> e4 (from other function). However, t60 is in Q26. This should be handled appropriately

        /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */
        // 23 in Q26
@@ -162,19 +148,39 @@ ivas_error ivas_reverb_prepare_cldfb_params(

        Word16 tmp_exp;
        /* expf(exp_argument) -> pow(2, log2(e) * exp_argument) */
        tmp = mult( 23637, exp_argument_fx ); // exp_argument_e + 1
        tmp_exp = add( exp_argument_e, 1 );
        tmp = mult( 23637, exp_argument_fx );
        tmp_exp = add( exp_argument_e, 1 ); // exp_argument_e + 1
        L_tmp = BASOP_util_Pow2( L_deposit_h( tmp ), tmp_exp, &pow_exp );
        L_tmp = Mpy_32_32( L_tmp, output_ene_fx[idx] );
        tmp_exp = add( pow_exp, output_ene_e[idx] );
//        tmp_exp = add( pow_exp, output_ene_e[idx] );

        output_ene_fx[idx] = L_tmp;
        move32();
        output_ene_e[idx] = tmp_exp;
//        output_ene_e[idx] = tmp_exp;
        move16();

    }

    // interpolate_acoustic_data() is returning t60 values in Q31.
    // Return  T60 in fixed-point
    //The below loop is not needed once interpolate_data() returns only fx values. 
    for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
    {
        // Assign t60 to output variable
        //pOutput_t60[i] = L_shl( output_t60_fx[i], sub( output_t60_e[i], 5 ) );
        // Assign energy to output variable
        //pOutput_ene[i] = L_shl( output_ene_fx[i], sub( output_ene_e[i], 0 ) );
        // pOutput_t60[i] = L_shl( output_t60_fx[i], output_t60_e[i] );
        // pOutput_t60[i] = output_t60_fx[i] * ( 1 << output_t60_e[i] ); // Will not work - mantissa is 16 bit
     }


    /*for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) //Should not be required in fixed-point
    {
        pOutput_t60[i] = (float) fabs( me2f( output_t60_fx[i], output_t60_e[i] ) ); -->This operation must be recreated in fixed-point to return T60
        pOutput_ene[i] = (float) fabs( me2f( output_ene_fx[i], output_ene_e[i] ) );
    }*/

    ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_fx, avg_pwr_right_fx );

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
@@ -193,8 +199,8 @@ ivas_error ivas_reverb_prepare_cldfb_params(
        tmp_ene = Mpy_32_32( tmp_ene, dmx_gain_2_fx ); // Mpy_32_32_ss multiplies two 32 bit numberrs in 64-bit with saturation or L_mult -> outputs word16
        // incomplete implentation

        // Step 4 : multiply step 3 result with output energy variable
        pOutput_ene[idx] = tmp_ene;
        // Step 4 : multiply step 3 result with output energy
        pOutput_ene[idx] =Mpy_32_32(pOutput_ene[idx] ,tmp_ene);


        /*floating-point