Commit 314ec5ff authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

BASOP and instrumentation changes for stereo decoder and renderer files

parent ff33a2f0
Loading
Loading
Loading
Loading
Loading
+71 −29
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ void stereo_dft_unify_dmx_fx(
        pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX );

        /* Stereo residual PLC */
        IF( GT_16( hStereoDft->res_cod_band_max, 0 ) )
        IF( hStereoDft->res_cod_band_max > 0 )
        {
            IF( !st0->bfi )
            {
@@ -192,6 +192,7 @@ void stereo_dft_unify_dmx_fx(
                {
                    Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) );
                    hStereoDft->q_res_mem = hStereoDft->q_dft;
                    move16();
                    hStereoDft->time_offs = 0;
                    move16();
                }
@@ -202,16 +203,20 @@ void stereo_dft_unify_dmx_fx(
                move16();
                pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX );
                hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX;
                move16();
                stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi );
                stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem );
                hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft;
                move16();
            }
        }


        /* Apply active DMX */
        DFT_L[0] = pDFT_DMX[0];
        move32();
        DFT_R[0] = pDFT_DMX[0];
        move32();

        /* upmix residual part */
        FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
@@ -224,12 +229,16 @@ void stereo_dft_unify_dmx_fx(
                tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g );

                DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp );
                move32();
                DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp );
                move32();

                tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g );

                DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp );
                move32();
                DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp );
                move32();
            }
        }

@@ -243,15 +252,19 @@ void stereo_dft_unify_dmx_fx(
            Word16 exp_sum_nrg_l, exp_sum_nrg_R, exp_dot_prod_abs, exp_sum_nrg_Mid;
            Word32 sum_nrg_L_32, sum_nrg_R_32, dot_prod_real_32, dot_prod_img_32;
            Word64 sum_nrg_L = 0, sum_nrg_R = 0;
            move64();
            move64();
            Word64 dot_prod_real = 0, dot_prod_img = 0;
            move64();
            move64();

            FOR( j = hStereoDft->band_limits[b]; j < hStereoDft->band_limits[b + 1]; j++ )
            {
                sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_L[2 * j + 1] ) ) );
                sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[2 * j + 1], DFT_R[2 * j + 1] ) ) );
                sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_L[add( shl( j, 1 ), 1 )] ) ) );
                sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[add( shl( j, 1 ), 1 )], DFT_R[add( shl( j, 1 ), 1 )] ) ) );

                dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j + 1] ) ) );
                dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j + 1] ) ) );
                dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[add( shl( j, 1 ), 1 )] ) ) );
                dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[add( shl( j, 1 ), 1 )] ) ) );
            }

            norm_sum_nrg_L = W_norm( sum_nrg_L );
@@ -280,28 +293,31 @@ void stereo_dft_unify_dmx_fx(
            Word32 tmp_nrg_L = Sqrt32( sum_nrg_L_32, &exp_sum_nrg_l );
            Word32 tmp_nrg_R = Sqrt32( sum_nrg_R_32, &exp_sum_nrg_R );
            Word16 exp_sum_abs = exp_sum_nrg_l;
            move16();

            IF( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) )
            if( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) )
            {
                exp_sum_abs = exp_sum_nrg_R;
                move16();
            }
            exp_sum_abs = add( exp_sum_abs, 1 );
            sum_abs = L_add( L_shr( tmp_nrg_L, exp_sum_abs - exp_sum_nrg_l ), L_shr( tmp_nrg_R, exp_sum_abs - exp_sum_nrg_R ) );
            sum_abs = L_add( L_shr( tmp_nrg_L, sub(exp_sum_abs , exp_sum_nrg_l) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) );
            dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs );
            Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, ( 31 - exp_dot_prod_abs ) - q_sum_nrg_L ) );
            Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) );
            Word16 E_num = sub( 31, q_sum_nrg_L );
            Word32 num_sqrt = Sqrt32( num, &E_num );
            Word16 exp_wR = exp_sum_abs;
            move16();

            IF( LT_16( exp_sum_abs, E_num ) )
            if( LT_16( exp_sum_abs, E_num ) )
            {
                exp_wR = E_num;
                move16();
            }
            Word16 wR_temp;
            IF( EQ_32( num_sqrt, 0 ) && EQ_32( sum_abs, 0 ) )
            test();
            test();
            IF( num_sqrt == 0 && sum_abs == 0 )
            {
                wR_temp = 6364; // 0.776887059 in Q13
                move16();
@@ -313,19 +329,22 @@ void stereo_dft_unify_dmx_fx(
            }
            ELSE
            {
                wR_temp = shr( divide3232( L_shr( num_sqrt, exp_wR - E_num ), L_shr( sum_abs, exp_wR - exp_sum_abs ) ), 2 );
                wR_temp = shr( divide3232( L_shr( num_sqrt, sub(exp_wR , E_num) ), L_shr( sum_abs, sub(exp_wR , exp_sum_abs) ) ), 2 );
            }

            Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid );

            Word16 exp_wL = exp_sum_abs;
            IF( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) )
            move16();
            if( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) )
            {
                exp_wL = exp_sum_nrg_Mid;
                move16();
            }
            Word16 wL_temp;
            IF( EQ_32( sum_nrg_Mid_sqrt, 0 ) && EQ_32( sum_abs, 0 ) )
            test();
            test();
            IF( sum_nrg_Mid_sqrt == 0 && sum_abs == 0 )
            {
                wL_temp = 6364;
                move16();
@@ -337,7 +356,7 @@ void stereo_dft_unify_dmx_fx(
            }
            ELSE
            {
                wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, exp_wL - exp_sum_nrg_Mid ), L_shr( sum_abs, exp_wL - exp_sum_abs ) ), 1 );
                wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, sub( exp_wL, exp_sum_nrg_Mid ) ), L_shr( sum_abs, sub( exp_wL, exp_sum_abs ) ) ), 1 );
            }

            wR = wR_temp; /* Q13 */
@@ -348,22 +367,28 @@ void stereo_dft_unify_dmx_fx(
            {
                /*DMX Mapping*/
                pDFT_DMX[2 * i] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i], wL ), Mpy_32_16_1( DFT_R[2 * i], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */
                move32();
                pDFT_DMX[2 * i + 1] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i + 1], wL ), Mpy_32_16_1( DFT_R[2 * i + 1], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */
                move32();
            }
        }
        Copy32( pDFT_DMX, DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ), hStereoDft->NFFT );

        /* Update DFT_past_DMX, needed for stereo filling used by stereo residual PLC */
        hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
        move16();
        Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) );
        hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft;
        test();
        IF( st0->bfi && !prev_bfi )
        {
            Word16 idx_k0, idx_k1;
            Word16 q_shift0;
            Word16 q_shift1;
            idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX;
            move16();
            idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX;
            move16();
            q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] );
            q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] );

@@ -656,6 +681,7 @@ void add_HB_to_mono_dmx_fx(
    Word32 temp_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )];

    Word32 winSlope_fx = 0;
    move32();
    Word32 alpha_fx;
    const Word16 *win_dft_fx;
    int32_t output_Fs;
@@ -674,41 +700,51 @@ void add_HB_to_mono_dmx_fx(
    memTransitionHB_fx = hCPE->hStereoDftDmx->memTransitionHB_fx;

    memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS );
    move16();

    IF( EQ_16( hCPE->hCoreCoder[0]->core, ACELP_CORE ) && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) )
    test();
    IF( hCPE->hCoreCoder[0]->core == ACELP_CORE && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) )
    {
        /* Resampled LB and HB offset */
        Copy32( outputHB, temp_fx + memOffset, output_frame - memOffset );
        Copy32( outputHB, temp_fx + memOffset, sub( output_frame, memOffset ) );

        decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS );
        move16();

        IF( NE_16( last_core, ACELP_CORE ) )
        IF( last_core != ACELP_CORE )
        {
            /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */
            icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS );
            move16();

            FOR( i = 0; i < decoderDelay; i++ )
            {
                temp_fx[i] = 0;
                move32();
            }

            assert( icbweOLASize > 0 );
            switch ( output_Fs )
            SWITCH( output_Fs )
            {
                case 48000:
                    winSlope_fx = 17895698; // Q30
                    break;
                    move32();
                    BREAK;
                case 32000:
                    winSlope_fx = 26843546;
                    break;
                    move32();
                    BREAK;
                case 16000:
                    winSlope_fx = 53687092;
                    break;
                    move32();
                    BREAK;
            }
            alpha_fx = winSlope_fx; // Q30
            FOR( ; i < decoderDelay + icbweOLASize; i++ )
            move32();
            FOR( ; i < add( decoderDelay, icbweOLASize ); i++ )
            {
                temp_fx[i] = L_shl( Mpy_32_32( temp_fx[i], alpha_fx ), 1 );
                move32();
                alpha_fx = L_add_sat( alpha_fx, winSlope_fx );
            }
        }
@@ -719,29 +755,35 @@ void add_HB_to_mono_dmx_fx(

        v_add_32( temp_fx, output, output, output_frame );

        Copy32( outputHB + output_frame - memOffset, memOutHB_fx, memOffset );
        Copy32( outputHB + sub( output_frame, memOffset ), memOutHB_fx, memOffset );

        win_dft_fx = hCPE->hStereoDft->win32ms_fx;
        dftOvlLen = hCPE->hStereoDft->dft32ms_ovl;
        move16();

        /* Preparing buffers in anticipation of an ACELP to TCX switch */
        j = 0;
        move16();
        FOR( i = 0; i < memOffset; i++ )
        {
            memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] );
            j++;
            memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] );
            move32();
            j = add( j, 1 );
        }

        FOR( i = 0; j < dftOvlLen; i++ )
        {
            memTransitionHB_fx[memOffset + i] = Mpy_32_16_1( outputHB[output_frame - i - 1], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] );
            j++;
            memTransitionHB_fx[add( memOffset, i )] = Mpy_32_16_1( outputHB[sub( output_frame, i ) - 1], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] );
            move32();
            j = add( j, 1 );
        }
    }
    ELSE
    {
        IF( EQ_16( last_core, ACELP_CORE ) )
        IF( last_core == ACELP_CORE )
        {
            test();
            test();
            /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */
            IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
            {
+436 −226

File changed.

Preview size limit exceeded, changes collapsed.

+75 −39
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ void stereo_dft_res_ecu_fx(
    Word16 trigo_step;
    Word16 q_fac;

    set_l( pDFT_RES, 0, L_FRAME8k );
    set32_fx( pDFT_RES, 0, L_FRAME8k );

    L_res = hStereoDft->band_limits[hStereoDft->res_cod_band_max];
    move16();
@@ -93,7 +93,7 @@ void stereo_dft_res_ecu_fx(
    stereo_dft_res_subst_spec_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, hStereoDft->time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, k == 0 );

    fac = BASOP_Util_Divide3232_Scale( L_FRAME8k, hStereoDft->NFFT, &q_fac );
    IF( GT_16( q_fac, 0 ) )
    IF( q_fac > 0 )
    {
        assert( 0 );
    }
@@ -102,7 +102,7 @@ void stereo_dft_res_ecu_fx(
        fac = shl( fac, q_fac );
    }

    IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) )
    IF( hStereoDft->core_hist[0] == ACELP_CORE )
    {
        fac = extract_l( L_shr( L_mult0( fac, 0x2000 ), 15 ) );
    }
@@ -111,16 +111,16 @@ void stereo_dft_res_ecu_fx(
    move16();
    FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ )
    {
        trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step];
        trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)];
        move16();
        trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step];
        trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)];
        move16();
    }
    trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[STEREO_DFT32MS_N_8k / 4 * trigo_step];
    trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult(STEREO_DFT32MS_N_8k / 4 , trigo_step)];
    move16();

    /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/
    IF( EQ_16( k, 0 ) )
    IF( k == 0 )
    {
        Copy32( pDFT_RES, res_buf, L_FRAME8k );
        stereo_dft_res_subst_spec_fx( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE );
@@ -130,6 +130,7 @@ void stereo_dft_res_ecu_fx(
        v_multc_fixed_16( res_buf, fac, res_buf, L_FRAME8k );
        Copy32( res_buf + ( OFFSET8k - ZP8k ), &hStereoDft->res_cod_mem_fx[0], STEREO_DFT_OVL_8k );
        hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft;
        move16();

        Copy32( res_buf + ZP8k, input_mem, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); /* Store memory for cross-fade to next frame, in case of good frame */
        hStereoDft->q_ip_mem = hStereoDft->q_dft;
@@ -138,7 +139,8 @@ void stereo_dft_res_ecu_fx(
    ELSE
    {
        Word16 scale_fac = getScaleFactor32( res_buf, L_FRAME8k );
        Word16 q_shift = 8 - scale_fac;
        Word16 q_shift = sub( 8, scale_fac );
        move16();
        // Copy32( pDFT_RES, res_buf, L_FRAME8k );
        v_shr_32( pDFT_RES, res_buf, L_FRAME8k, q_shift );

@@ -164,7 +166,7 @@ void stereo_dft_res_ecu_fx(
        hStereoDft->time_offs = add( hStereoDft->time_offs, L_FRAME8k );
    }

    set_l( DFT_PRED_RES, 0, 2 * L_res );
    set32_fx( DFT_PRED_RES, 0, shl( L_res, 1 ) );

    IF( prev_bfi )
    {
@@ -200,7 +202,7 @@ Word32 imax_pos_fx(
    ftmp_den2 = L_shl( L_sub( L_sub( L_shl( y2, 1 ), y1 ), y3 ), 1 );

    test();
    IF( EQ_32( ftmp_den2, 0 ) || EQ_32( ftmp_den1, 0 ) )
    IF( ( ftmp_den2 == 0 ) || ( ftmp_den1 == 0 ) )
    {
        return ( 0 ); /* early exit with left-most value */
    }
@@ -219,7 +221,7 @@ Word32 imax_pos_fx(
    }
    /* their corresponding normalized locations */
    posi = BASOP_Util_Divide3232_Scale( y3_y1, ( ftmp_den2 ), &q_div_posi );
    IF( NE_16( q_div_posi, 0 ) )
    IF( ( q_div_posi != 0 ) )
    {
        posi = L_shl( posi, q_div_posi );
        q_div_posi = 0;
@@ -229,14 +231,33 @@ Word32 imax_pos_fx(
    test();
    IF( GE_32( posi, L_shr( ONE_IN_Q15, q_div_posi ) ) || LE_32( posi, L_shr( MIN_16, q_div_posi ) ) )
    {
        posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16;
        move16();
        // posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16;
        IF( GT_32( y3, y1 ) )
        {
            posi = ONE_IN_Q15;
            move32();
        }
        ELSE
        {
            posi = MIN_16;
            move32();
        }
    }
    ELSE
    {
        IF( GE_32( L_shr( y1, q_div_2i ), y2i ) )
        {
            posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15;
            // posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15;
            IF( GT_32( y1, y3 ) )
            {
                posi = MIN_16;
                move32();
            }
            ELSE
            {
                posi = ONE_IN_Q15;
                move32();
            }
            move16();
        }
        ELSE IF( GE_32( L_shr( y3, q_div_2i ), y2i ) )
@@ -262,17 +283,18 @@ static void ivas_peakfinder_fx(
    Word32 dx0[L_PROT48k_2], x[L_PROT48k_2 + 1], peakMag[MAX_PLOCS];
    Word16 k, i, len, tempLoc = 0, foundPeak, ii, xInd;
    Word16 *ind, indarr[L_PROT48k_2 + 1], peakLoc[MAX_PLOCS];
    move16();

    ind = indarr;
    move16();

    /* Find derivative */
    v_sub_32( x0 + 1, x0, dx0, len0 - 1 );
    v_sub_32( x0 + 1, x0, dx0, sub( len0, 1 ) );

    /* This is so we find the first of repeated values */
    FOR( i = 0; i < len0 - 1; i++ )
    FOR( i = 0; i < sub( len0, 1 ); i++ )
    {
        IF( EQ_32( dx0[i], 0 ) )
        IF( dx0[i] == 0 )
        {
            dx0[i] = -EPSILON_FX;
            move32();
@@ -288,13 +310,14 @@ static void ivas_peakfinder_fx(
    {
        x[k] = x0[0];
        move32();
        ind[k++] = 0;
        ind[k] = 0;
        move16();
		k = add(k, 1);
    }

    FOR( i = 1; i < len0 - 1; i++ )
    FOR( i = 1; i < sub( len0, 1 ); i++ )
    {
        IF( LT_32( L_xor( dx0[i - 1], dx0[i] ), 0 ) )
        IF( L_xor( dx0[i - 1], dx0[i] ) < 0 )
        {
            ind[k] = i;
            move16();
@@ -307,8 +330,9 @@ static void ivas_peakfinder_fx(
    {
        ind[k] = sub( len0, 1 );
        move16();
        x[k++] = x0[len0 - 1];
        x[k] = x0[sub( len0, 1 )];
        move32();
        k = add( k, 1 );
    }
    /* x only has the peaks, valleys, and endpoints */
    len = k;
@@ -317,7 +341,7 @@ static void ivas_peakfinder_fx(

    test();
    test();
    IF( GT_16( len, 2 ) || ( !endpoints && GT_16( len, 0 ) ) )
    IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) )
    {
        /* Set initial parameters for loop */
        tempMag = minMag;
@@ -411,7 +435,7 @@ static void ivas_peakfinder_fx(
                move32();
            }

            ii++; /* Move onto the valley */
            ii = add(ii,1); /* Move onto the valley */

            /* Come down at least sel from peak */
            test();
@@ -425,7 +449,8 @@ static void ivas_peakfinder_fx(
                move16();
                peakMag[*cInd] = tempMag;
                move32();
                ( *cInd )++;
                ( *cInd ) = add(*(cInd),1);
				move16();
            }
            ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */
            {
@@ -451,7 +476,8 @@ static void ivas_peakfinder_fx(
            move16();
            peakMag[*cInd] = tempMag;
            move32();
            ( *cInd )++;
            ( *cInd ) = add( *( cInd ), 1 );
            move16();
        }

        /* Create output */
@@ -466,7 +492,17 @@ static void ivas_peakfinder_fx(
        IF( endpoints )
        {
            /* This is a monotone function where an endpoint is the only peak */
            xInd = GT_32( x[0], x[1] ) ? 0 : 1;
            // xInd = GT_32( x[0], x[1] ) ? 0 : 1;
            IF( GT_32( x[0], x[1] ) )
            {
                xInd = 0;
                move16();
            }
            ELSE
            {
                xInd = 1;
                move16();
            }
            move16();
            peakMag[0] = x[xInd];
            move32();
@@ -546,7 +582,7 @@ void stereo_dft_res_subst_spec_fx(
        FOR( i = 1; i < L_res; i++ )
        {
            Word32 r = L_shl( p_mem[2 * i], q_res );
            Word32 l = L_shl( p_mem[2 * i + 1], q_res );
            Word32 l = L_shl( p_mem[add(shl(i,1), 1)], q_res );
            abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l );
            move32();
        }
@@ -582,11 +618,11 @@ void stereo_dft_res_subst_spec_fx(
    FOR( i = 1; i < L_res; i++ )
    {
        s1 = sign_l( pDFT_RES[2 * i] );
        s2 = sign_l( pDFT_RES[2 * i + 1] );
        s2 = sign_l( pDFT_RES[add( shl( i, 1 ), 1 )] );
        abs1 = L_abs( pDFT_RES[2 * i] );
        abs2 = L_abs( pDFT_RES[2 * i + 1] );
        abs2 = L_abs( pDFT_RES[add( shl( i, 1 ), 1 )] );
        abs3 = L_abs( p_mem[2 * i] );
        abs4 = L_abs( p_mem[2 * i + 1] );
        abs4 = L_abs( p_mem[add( shl( i, 1 ), 1 )] );

        // fac = MAX_16;
        move16();
@@ -598,14 +634,14 @@ void stereo_dft_res_subst_spec_fx(
        {
            pDFT_RES[2 * i] = Mpy_32_32( s1, abs4 );
            move32();
            pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs3 );
            pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs3 );
            move32();
        }
        ELSE
        {
            pDFT_RES[2 * i] = Mpy_32_32( s1, abs3 );
            move32();
            pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs4 );
            pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs4 );
            move32();
        }
    }
@@ -658,14 +694,14 @@ void stereo_dft_res_subst_spec_fx(
        cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov );
        sin_F = getSinWord16( extract_l( corr_phase ) );

        idx = s_max( 0, plocs[i] - Np ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */
        idx = s_max( 0, sub(plocs[i] , Np) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */
        WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) )
        {
            pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[2 * idx + 1], sin_F );
            pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F );
            move32();
            pDFT_RES[2 * idx + 1] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[2 * idx + 1], cos_F ) );
            pDFT_RES[add( shl( idx, 1 ), 1 )] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[add( shl( idx, 1 ), 1 )], cos_F ) );
            move32();
            idx++;
            idx = add( idx, 1 );
        }
    }
    return;
@@ -696,7 +732,7 @@ void stereo_dft_res_ecu_burst_att_fx(
    move16();

    /* attenuation of residual; follow attenuation of DMX */
    IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) )
    IF( hStereoDft->core_hist[0] == ACELP_CORE )
    {
        fac = Mpy_32_16_1( Sqrt32( L_deposit_h( BASOP_Util_Divide3232_Scale( dmx_nrg, hStereoDft->past_dmx_nrg_fx, &q_fac ) ), &exponent ), (Word16) ( 0x0CCD ) );
    }
@@ -724,13 +760,13 @@ Word32 stereo_dft_dmx_swb_nrg_fx(
    const Word16 q0,
    const Word16 q1 )
{
    int16_t i;
    Word16 i;
    Word32 dmx_nrg;

    dmx_nrg = EPSILON_FIX;
    move32();
    test();
    IF( EQ_16( q0, 0 ) && EQ_16( q1, 0 ) )
    IF( q0 == 0 && q1 == 0 )
    {
        FOR( i = 0; i < shr( frame_length, 1 ); i++ )
        {
+18 −11
Original line number Diff line number Diff line
@@ -89,22 +89,24 @@ static Word16 arith_decode_elias_mod(
    Word16 n, n_bits, bit;

    n_bits = 0;
    move16();

    bit = rc_uni_dec_read_bit( rc_st_dec );

    WHILE( EQ_16( bit, 0 ) )
    WHILE( bit == 0 )
    {
        bit = rc_uni_dec_read_bit( rc_st_dec );
        ++n_bits;
        n_bits = add( n_bits, 1 );
        IF( EQ_16( n_bits, 17 ) )
        {
            /* bitstream error encountered */
            rc_st_dec->bit_error_detected = 1;
            move16();
            return 0;
        }
    }

    IF( EQ_16( n_bits, 0 ) )
    IF( n_bits == 0 )
    {
        /* code for 0 is 10 and code for 1 is 11 */
        n = rc_uni_dec_read_bit( rc_st_dec );
@@ -316,9 +318,9 @@ void ECSQ_decode(
            {
                sym = arith_decode_prob_escape( rc_st_dec, tab_vals_cum_freq, tab_vals_sym_freq, ECSQ_TAB_VALS_SIZE );

                IF( NE_16( shift, 0 ) )
                IF( shift != 0 )
                {
                    IF( GT_16( sym, 0 ) || GT_16( shift, 4 ) )
                    IF( ( sym > 0 ) || ( shift > 4 ) )
                    {
                        lsbs = rc_uni_dec_read_bits( rc_st_dec, shift );
                    }
@@ -329,7 +331,7 @@ void ECSQ_decode(
                    sym = s_or( shl( sym, shift ), lsbs );
                }

                IF( NE_16( sym, 0 ) )
                IF( sym != 0 )
                {
                    /* map the sign bit to +1 or -1 and then multiply */
                    IF( rc_uni_dec_read_bit( rc_st_dec ) )
@@ -339,6 +341,7 @@ void ECSQ_decode(
                }

                output[i] = sym;
                move16();
            }
        }
        ELSE
@@ -347,17 +350,20 @@ void ECSQ_decode(
            nonzero = rc_uni_dec_read_bits( rc_st_dec, 2 );

            left1 = nonzero;
            move16();
            left0 = sub( add( sub( seg_stop, seg_start ), 1 ), nonzero );

            FOR( i = seg_start; i <= seg_stop; ++i )
            {
                IF( EQ_16( left1, 0 ) )
                IF( left1 == 0 )
                {
                    sym = 0;
                    move16();
                }
                ELSE IF( EQ_16( left0, 0 ) )
                ELSE IF( left0 == 0 )
                {
                    sym = 1;
                    move16();
                }
                ELSE
                {
@@ -365,21 +371,22 @@ void ECSQ_decode(
                    sym = rc_uni_dec_read_bit_prob_fast( rc_st_dec, count0, ECSQ_PROB_BITS );
                }

                IF( NE_16( sym, 0 ) )
                IF( sym != 0 )
                {
                    /* map the sign bit to +1 or -1 and then multiply */
                    IF( rc_uni_dec_read_bit( rc_st_dec ) )
                    {
                        sym = negate( sym );
                    }
                    --left1;
                    left1 = sub( left1, 1 );
                }
                ELSE
                {
                    --left0;
                    left0 = sub( left0, 1 );
                }

                output[i] = sym;
                move16();
            }
        }
    }
+32 −12
Original line number Diff line number Diff line
@@ -142,7 +142,16 @@ void stereo_tca_dec_fx(
        IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
        {
            hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( hCPE->hStereoDft->itd_fx[1], Q15 ) ) );
            hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX );
            // hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX );
            IF( hCPE->hStereoDft->itd_fx[1] >= 0 )
            {
                hStereoTCA->refChanIndx = ( L_CH_INDX );
            }
            ELSE
            {
                hStereoTCA->refChanIndx = ( R_CH_INDX );
            }
            move16();
            move16();
        }
        ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
@@ -152,12 +161,20 @@ void stereo_tca_dec_fx(
            itd = hCPE->hStereoMdct->itd_fx;
            move32();
            hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( itd, Q15 ) ) );
            hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX );
            // hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX );
            IF( GE_32( itd, 0 ) )
            {
                hStereoTCA->refChanIndx = ( L_CH_INDX );
            }
            ELSE
            {
                hStereoTCA->refChanIndx = ( R_CH_INDX );
            }
            move16();
        }

        test();
        IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && NE_16( hStereoTCA->corrLagStats, 0 ) )
        IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && ( hStereoTCA->corrLagStats != 0 ) )
        {
            bothChannelShift = 1;
            move16();
@@ -182,7 +199,7 @@ void stereo_tca_dec_fx(
            move16();
        }

        IF( NE_16( currentNCShift, 0 ) )
        IF( currentNCShift != 0 )
        {
            currentNCShift = add( mult( 19660 /* 0.6 in Q15 */, prevNCShift ), mult( 13106 /* 0.4 in Q15 */, currentNCShift ) );
        }
@@ -207,8 +224,7 @@ void stereo_tca_dec_fx(
    /* identify target signal to adjust for shift variations */
    test();
    test();
    test();
    IF( ( EQ_16( prevNCShift, 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) )
    IF( ( ( prevNCShift == 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) )
    {
        ref_fx = ptrChanR_fx;
        target_fx = ptrChanL_fx;
@@ -645,8 +661,9 @@ void stereo_tca_scale_R_channel_fx(
        {
            Word16 temp_a = (Word16) L_shr( hCPE->hStereoDftDmx->targetGain_fx, (Word16) 16 );
            Word16 temp_a_q = 2;
            move16();
            tempF1_fx = Inv16( temp_a, &temp_a_q );
            tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) );
            tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) );
        }

        IF( EQ_32( hCPE->hStereoDftDmx->prevTargetGain_fx, ONE_IN_Q29 ) )
@@ -658,8 +675,9 @@ void stereo_tca_scale_R_channel_fx(
        {
            Word16 temp_b = (Word16) L_shr( hCPE->hStereoDftDmx->prevTargetGain_fx, 16 );
            Word16 temp_b_q = 2;
            move16();
            tempF_fx = Inv16( temp_b, &temp_b_q );
            tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) );
            tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) );
        }
    }
    ELSE
@@ -674,8 +692,9 @@ void stereo_tca_scale_R_channel_fx(
        {
            Word16 temp_a = (Word16) L_shr( hStereoTCA->targetGain_fx, (Word16) 16 );
            Word16 temp_a_q = 2;
            move16();
            tempF1_fx = Inv16( temp_a, &temp_a_q );
            tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) );
            tempF1_fx = L_shl( tempF1_fx, sub(( 31 - 4 ) , sub( 15 , temp_a_q )) );
        }


@@ -688,8 +707,9 @@ void stereo_tca_scale_R_channel_fx(
        {
            Word16 temp_b = (Word16) L_shr( hStereoTCA->prevTargetGain_fx, (Word16) 16 );
            Word16 temp_b_q = 2;
            move16();
            tempF_fx = Inv16( temp_b, &temp_b_q );
            tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) );
            tempF_fx = L_shl( tempF_fx, sub(( 31 - 4 ) , sub( 15 , temp_b_q )) );
        }
    }
    SWITCH( output_Fs )
@@ -734,7 +754,7 @@ void stereo_tca_scale_R_channel_fx(
            Word32 slope_gain_ascend = ( j * winSlope_fx );
            Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] );
            Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] );
            output_fx[i_fx] = left_res + right_res;
            output_fx[i_fx] = L_add( left_res, right_res );
            move32();
        }
    }
@@ -743,7 +763,7 @@ void stereo_tca_scale_R_channel_fx(
        FOR( j = 0; i_fx < flat_old + l_ica_ovl; ( i_fx++, j++ ) )
        {
            Word32 slope_gain_decend = L_sub( ONE_IN_Q31, j * winSlope_fx );
            Word32 slope_gain_ascend = ( j * winSlope_fx );
            Word32 slope_gain_ascend = imult3216( winSlope_fx, j );
            Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] );
            Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] );
            output_fx[i_fx] = L_add_sat( L_shl_sat( Mpy_32_32( tempF_fx, left_res ), 4 ), L_shl_sat( Mpy_32_32( right_res, tempF1_fx ), 4 ) );
Loading