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

Fix for 3GPP issue 1730: Rendering MASA LTV has severe audible distortions

Link #1730
parent 05c1b5d5
Loading
Loading
Loading
Loading
Loading
+53 −54
Original line number Diff line number Diff line
@@ -2740,14 +2740,12 @@ static void adaptTransportSignalsHeadtracked_fx(
    Word16 slot, ch, bin, louderCh;
    Word32 mono_factor_ILD, mono_factor;
    Word32 y_val, mono_factor_rotation, ene_proc, ene_target, ILD;
    Word16 ene_proc_e, ene_target_e;
    Word16 max_band;
    Word32 eqVal;
    Word16 band_idx, bin_lo, bin_hi, norm, shift = 31;
    Word16 q_chEneIIR = 0, q_procChEneIIR = 0;
    Word32 temp_div;
    Word16 e_div, tmp, is_zero, i;
    move16();
    move16();
    Word16 e_div, is_zero, i;
    move16();

#ifdef OPT_BIN_RENDERER_V1
@@ -2793,16 +2791,17 @@ static void adaptTransportSignalsHeadtracked_fx(
    shift = sub( shift, 5 );
    // 5 is gaurded bits needed//
    Word32 re, img, temp;
    Word16 q_temp = sub( imult1616( 2, add( q_inp, shift ) ), 31 );
    Word16 s, q_band_nrg, q_temp[2];
    FOR( band_idx = 0; band_idx < max_band; band_idx++ )
    {
        Word32 ch_nrg[2];   /* storage for input signal channel energies */
        Word64 W_ch_nrg[2]; /* storage for input signal channel energies */
        bin_lo = MASA_band_grouping_24[band_idx];
        bin_hi = s_min( MASA_band_grouping_24[band_idx + 1], (Word16) nBins );

        FOR( ch = 0; ch < 2; ch++ )
        {
            ch_nrg[ch] = 0;
            W_ch_nrg[ch] = 0;
            move32();
            FOR( slot = 0; slot < nSlots; slot++ )
            {
@@ -2811,24 +2810,31 @@ static void adaptTransportSignalsHeadtracked_fx(
                    re = L_shl( inRe_fx[ch][slot][bin], shift );
                    img = L_shl( inIm_fx[ch][slot][bin], shift );

                    ch_nrg[ch] = L_add( ch_nrg[ch], ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31
                    move32();
                    W_ch_nrg[ch] = W_add( W_ch_nrg[ch], ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp +shift)
                    move64();
                }
            }
            s = W_norm( W_ch_nrg[ch] );
            ch_nrg[ch] = W_extract_h( W_shl( W_ch_nrg[ch], s ) ); // Q: 2*(q_inp+shift) + s - 32
            q_temp[ch] = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 );
            move32();
            move16();

            hHeadTrackData->chEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->chEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_chEneIIR
            move32();
            temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) );
            IF( LT_16( hHeadTrackData->q_chEneIIR, q_temp ) )
            temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_temp[ch]
            IF( LT_16( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) )
            {
                hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_chEneIIR ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] );
                hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_chEneIIR[ch][band_idx] ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_chEneIIR[ch][band_idx]
            }
            ELSE
            {
                hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR, q_temp ) ), temp );
                hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch]
            }
            move32();
            hHeadTrackData->q_chEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] );
            move16();
        }
        q_chEneIIR = s_min( hHeadTrackData->q_chEneIIR, q_temp );
        /* Determine ILD */

        IF( EQ_32( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ) ) )
@@ -2839,7 +2845,7 @@ static void adaptTransportSignalsHeadtracked_fx(
        ELSE
        {
            temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ), &e_div ) );

            e_div = add( e_div, sub( hHeadTrackData->q_chEneIIR[1][band_idx], hHeadTrackData->q_chEneIIR[0][band_idx] ) );
            temp = BASOP_Util_Log2( temp_div ); // Q25
            IF( e_div > 0 )
            {
@@ -2853,7 +2859,7 @@ static void adaptTransportSignalsHeadtracked_fx(
            temp = Mpy_32_32( temp, 646462464 );       // logx base 10 = 0.30103* logx base 2//
            ILD = L_abs( Mpy_32_16_1( temp, 20480 ) ); // Q21
        }
        IF( GT_32( hHeadTrackData->chEneIIR_fx[1][band_idx], hHeadTrackData->chEneIIR_fx[0][band_idx] ) )
        IF( BASOP_Util_Cmp_Mant32Exp( hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ) ) > 0 )
        {
            louderCh = 1;
        }
@@ -2886,8 +2892,9 @@ static void adaptTransportSignalsHeadtracked_fx(
        {
            IF( NE_16( ch, louderCh ) )
            {
                Word32 band_nrg = 0;
                move32();
                Word32 band_nrg;
                Word64 W_band_nrg = 0;
                move64();

                FOR( slot = 0; slot < nSlots; slot++ )
                {
@@ -2900,22 +2907,29 @@ static void adaptTransportSignalsHeadtracked_fx(
                        move32();
                        re = L_shl( inRe_fx[ch][slot][bin], shift );  // q_inp +shift
                        img = L_shl( inIm_fx[ch][slot][bin], shift ); // q_inp +shift
                        band_nrg = L_add( band_nrg, ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31

                        W_band_nrg = W_add( W_band_nrg, ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp + shift)
                    }
                }
                hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_procChEneIIR
                s = W_norm( W_band_nrg );
                band_nrg = W_extract_h( W_shl( W_band_nrg, s ) ); // Q: 2*(q_inp+shift) + s - 32
                q_band_nrg = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 );

                hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // hHeadTrackData->q_procChEneIIR[ch][band_idx]
                move32();

                temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) );
                IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) )
                temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_band_nrg
                IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) )
                {
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] );
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_band_nrg, hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx]
                }
                ELSE
                {
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp );
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) ), temp ); // q_band_nrg
                }
                move32();
                hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg );
                move16();
            }
            ELSE
            {
@@ -2924,27 +2938,27 @@ static void adaptTransportSignalsHeadtracked_fx(
                move32();

                temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) );
                IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) )
                IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) )
                {
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] );
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx]
                }
                ELSE
                {
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp );
                    hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch]
                }
                move32();
                hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] );
                move16();
            }
        }

        q_procChEneIIR = s_min( hHeadTrackData->q_procChEneIIR, q_temp );

        /* Equalize */
        ene_target = L_add( hHeadTrackData->chEneIIR_fx[0][band_idx], hHeadTrackData->chEneIIR_fx[1][band_idx] ); // q_chEneIIR//
        ene_target = BASOP_Util_Add_Mant32Exp( hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ), hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), &ene_target_e );

        ene_proc = L_add( hHeadTrackData->procChEneIIR_fx[0][band_idx], hHeadTrackData->procChEneIIR_fx[1][band_idx] ); // q_procChEneIIR//
        ene_proc = BASOP_Util_Add_Mant32Exp( hHeadTrackData->procChEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[0][band_idx] ), hHeadTrackData->procChEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[1][band_idx] ), &ene_proc_e );

        temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( ene_target, L_max( 1, ene_proc ), &e_div ) );
        e_div = add( e_div, sub( q_procChEneIIR, q_chEneIIR ) );
        e_div = add( e_div, sub( ene_target_e, ene_proc_e ) );

        eqVal = Sqrt32( temp_div, &e_div );

@@ -2994,16 +3008,8 @@ static void adaptTransportSignalsHeadtracked_fx(
    }
    IF( is_zero )
    {
        hHeadTrackData->q_chEneIIR = 31;
        move16();
    }
    ELSE
    {
        tmp = sub( s_min( getScaleFactor32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 );
        scale_sig32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp );
        scale_sig32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp );
        hHeadTrackData->q_chEneIIR = add( q_chEneIIR, tmp );
        move16();
        set16_fx( hHeadTrackData->q_chEneIIR[0], 31, MASA_FREQUENCY_BANDS );
        set16_fx( hHeadTrackData->q_chEneIIR[1], 31, MASA_FREQUENCY_BANDS );
    }

    is_zero = 1;
@@ -3020,17 +3026,10 @@ static void adaptTransportSignalsHeadtracked_fx(
    }
    IF( is_zero )
    {
        hHeadTrackData->q_procChEneIIR = 31;
        move16();
    }
    ELSE
    {
        tmp = sub( s_min( getScaleFactor32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 );
        scale_sig32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp );
        scale_sig32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp );
        hHeadTrackData->q_procChEneIIR = add( q_procChEneIIR, tmp );
        move16();
        set16_fx( hHeadTrackData->q_procChEneIIR[0], 31, MASA_FREQUENCY_BANDS );
        set16_fx( hHeadTrackData->q_procChEneIIR[1], 31, MASA_FREQUENCY_BANDS );
    }

    return;
}

+5 −4
Original line number Diff line number Diff line
@@ -1439,10 +1439,11 @@ ivas_error ivas_combined_orientation_open(
    set_zero_fx( ( *hCombinedOrientationData )->chEneIIR_fx[1], MASA_FREQUENCY_BANDS );
    set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS );
    set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS );
    ( *hCombinedOrientationData )->q_chEneIIR = Q31;
    move16();
    ( *hCombinedOrientationData )->q_procChEneIIR = Q31;
    move16();
    set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[0], Q31, MASA_FREQUENCY_BANDS );
    set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[1], Q31, MASA_FREQUENCY_BANDS );
    set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[0], Q31, MASA_FREQUENCY_BANDS );
    set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[1], Q31, MASA_FREQUENCY_BANDS );

    ( *hCombinedOrientationData )->isExtOrientationFrozen = 0;
    move16();
    ( *hCombinedOrientationData )->isHeadRotationFrozen = 0;
+2 −2
Original line number Diff line number Diff line
@@ -837,9 +837,9 @@ typedef struct ivas_combined_orientation_struct
    Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3];                                                                                               /* Q30 */
    Word32 Rmat_prev_fx[3][3];                                                                                                                       /* Q30 */
    Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */
    Word16 q_chEneIIR;
    Word16 q_chEneIIR[2][MASA_FREQUENCY_BANDS];
    Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* Q(q_procChEneIIR) */
    Word16 q_procChEneIIR;
    Word16 q_procChEneIIR[2][MASA_FREQUENCY_BANDS];
    Word16 shd_rot_max_order;
    IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES];
    IVAS_QUATERNION Quaternion_frozen_ext;