Commit ff1ecd87 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Manuel Jander
Browse files

Q mismatch fix in stereo_icBWE_enc_ivas_fx stack

parent 2a61e20f
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -41,26 +41,23 @@


void deemph_fx_32(
    Word16 shift,    /*scaled output*/
    Word32 *signal,  /* i/o: signal            Qx*/
    const Word16 mu, /* i  : deemphasis factor Q15*/
    const Word16 L,  /* i  : vector size         */
    Word32 *mem      /* i/o: memory (y[-1])    Qx+shift*/
    Word32 *mem      /* i/o: memory (y[-1])    Qx*/
)
{
    Word16 i;

    signal[0] = L_add( signal[0], Mpy_32_16_1( ( *mem ), mu ) ); /*Qx*/
    signal[0] = Madd_32_16( signal[0], *mem, mu ); // Qx
    move32();
    FOR( i = 1; i < L; i++ )
    {
        signal[i] = L_add( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /*Qx*/
        signal[i] = L_shl( signal[i], shift );                            /*Qx+shift*/
        move32();
        signal[i] = Madd_32_16( signal[i], signal[i - 1], mu ); // Qx
        move32();
    }

    *mem = signal[L - 1]; /*Qx+shift*/
    *mem = signal[L - 1]; // Qx
    move32();

    return;
+0 −1
Original line number Diff line number Diff line
@@ -1651,7 +1651,6 @@ void deemph_fx(
void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, Word16 *mem );
void deemph_fx_32(
    Word16 shift,    /* i : scaled output      */
    Word32 *signal,  /* i/o: signal            */
    const Word16 mu, /* i  : deemphasis factor */
    const Word16 L,  /* i  : vector size       */
+1 −1
Original line number Diff line number Diff line
@@ -611,7 +611,7 @@ void stereo_icBWE_dec_fx(
        Q_syn_shb = tmp;
        move16();

        deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) );
        deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) );
        hStereoICBWE->prev_Q_memshbspec = Q_syn_shb;
        move16();
        Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */
+4 −4
Original line number Diff line number Diff line
@@ -408,8 +408,8 @@ static void deEmphResample_fx(

    /* De-emphasis, 1/(1-mu z^-1), and resample, stage 1 */

    deemph_fx_32( 0, buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] );
    deemph_fx_32( 0, buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] );
    deemph_fx_32( buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] );
    deemph_fx_32( buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] );

    FOR( i = 0; i < ( input_frame / dsFac1 ); i++ )
    {
@@ -420,8 +420,8 @@ static void deEmphResample_fx(
    }

    /* De-emphasis, 1/(1-mu z^-1), and resample, stage 2 */
    deemph_fx_32( 0, tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] );
    deemph_fx_32( 0, tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] );
    deemph_fx_32( tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] );
    deemph_fx_32( tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] );

    FOR( i = 0; i < ( input_frame / dsFactor ); i++ )
    {
+40 −24
Original line number Diff line number Diff line
@@ -102,14 +102,15 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx(
    const Word32 *shb_frame_target_fx, /* i  : target shb                   Q31-shb_frame_target_e*/
    Word16 shb_frame_target_e,
    Word32 *shb_synth_nonref_fx, /* o  : non-ref shb synth                   Q31-shb_synth_nonref_e*/
    Word16 shb_synth_nonref_e,
    Word16 *shb_synth_nonref_e,
    Word32 *specMapping_fx,       /* i/o: current frame's mapping             Qx*/
    Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping             Qx*/
    Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping             Q31-memShbSpecMapping_e*/
    Word16 *memShbSpecMapping_e,
    Word32 *memShbSpecXcorr_fx, /* i/o: ic bwe spec mapping scorr memory    Q31-memShbSpecXcorr_e*/
    Word16 *memShbSpecXcorr_e )
{
    Word16 idx;

    Word16 max_exp;
    Word16 Txx1_fx = 0, Txx2_fx = 0, Txx3_fx = 0, T_desired_fx = 0;
    Word16 Txx1_e = 0, Txx2_e = 0, Txx3_e = 0, T_desired_e = 0;
    Word16 T_nonref_target_fx, temp_fx;
@@ -136,10 +137,10 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx(
    temp11_fx = dotp_fixed_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx + 1, shb_frame_target_e, L_FRAME16k - 1, &temp11_exp ); /* Q31-temp1_exp */

    /* Calculate rxx(1)/rxx(0) of the non ref synth */
    temp0_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp );     /* Q31-temp0_exp */
    temp1_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 1, shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */
    temp2_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 2, shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */
    temp3_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 3, shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */
    temp0_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx, *shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp );     /* Q31-temp0_exp */
    temp1_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 1, *shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */
    temp2_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 2, *shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */
    temp3_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 3, *shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */

    exp = s_max( *memShbSpecXcorr_e, s_max( s_max( s_max( temp00_exp, temp11_exp ), s_max( temp0_exp, temp1_exp ) ), s_max( temp2_exp, temp3_exp ) ) );

@@ -291,8 +292,19 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx(
    *specMapping_fx = L_deposit_h( specMapping16 );
    move32();

    max_exp = s_max( sub( *memShbSpecMapping_e, norm_l( *memShbSpecMapping_fx ) ), *shb_synth_nonref_e );

    *memShbSpecMapping_fx = L_shl( *memShbSpecMapping_fx, sub( *memShbSpecMapping_e, max_exp ) ); // max_exp
    move32();
    *memShbSpecMapping_e = max_exp;
    move16();

    scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) ); // max_exp
    *shb_synth_nonref_e = max_exp;
    move16();

    /* IC-BWE spec mapping */
    deemph_fx_32( 0, shb_synth_nonref_fx, extract_h( *specMapping_fx ), L_FRAME16k, memShbSpecMapping_fx );
    deemph_fx_32( shb_synth_nonref_fx, specMapping16, L_FRAME16k, memShbSpecMapping_fx ); // shb_synth_nonref_e

    return idx;
}
@@ -429,7 +441,7 @@ static void icbwe_dft_stereo_param_ivas_fx(
    STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : */
    Encoder_State *st,                     /* i/o: */
    Word32 *shb_synth_nonref_fx,           /* i/o: Q31-shb_synth_nonref_e*/
    Word16 shb_synth_nonref_e              /* i/o: */
    Word16 *shb_synth_nonref_e             /* i/o: */
)
{
    Word16 slopeILD_fx;
@@ -439,7 +451,7 @@ static void icbwe_dft_stereo_param_ivas_fx(
    Word32 *nrg_L_fx, *nrg_R_fx, *nrg_DMX_fx;
    Word32 sum_nrg_L_fx, sum_nrg_R_fx, sum_nrg_DMX_fx;
    const Word32 spec_table_fx[4] = { -1288490189, -858993459, -429496730, 0 }; // Q31
    const Word16 slope_table_fx16[4] = { -17788, -10577, -4822, 0 };            // Q13
    const Word16 slope_table_fx16[4] = { -278, -165, -75, 0 };                  // Q7

    BSTR_ENC_HANDLE hBstr = st->hBstr;
    normFac_fx = 1342177280; /* 1000 * (10/((14400+10400)/2 - (6400+10400)/2)) */ // Q29
@@ -505,6 +517,7 @@ static void icbwe_dft_stereo_param_ivas_fx(
    IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) )
    {
        /* Spec Mapping Estimate */
        Word16 max_exp;
        Word16 tmp1, exp1;
        Word32 L_tmp, L_tmp1;
        L_tmp = Mpy_32_32( hStereoICBWE->mem_nrg_L_fx[1], hStereoICBWE->mem_nrg_R_fx[0] );  // hStereoICBWE->mem_nrg_L_fx_e[1] + hStereoICBWE->mem_nrg_R_fx_e[1]
@@ -527,10 +540,20 @@ static void icbwe_dft_stereo_param_ivas_fx(
        }

        hStereoICBWE->prevSpecMapping_fx = spec_table_fx[spIndx]; // q31
        /* ic bwe spec mapping application */
        deemph_fx_32( 0, shb_synth_nonref_fx, extract_l( L_shr( hStereoICBWE->prevSpecMapping_fx, 16 ) ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e
        hStereoICBWE->memShbSpecMapping_e = shb_synth_nonref_e;

        max_exp = s_max( *shb_synth_nonref_e, sub( hStereoICBWE->memShbSpecMapping_e, norm_l( hStereoICBWE->memShbSpecMapping_fx ) ) );

        hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( hStereoICBWE->memShbSpecMapping_e, max_exp ) ); // max_exp
        move32();
        hStereoICBWE->memShbSpecMapping_e = max_exp;
        move16();

        scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) );
        *shb_synth_nonref_e = max_exp;
        move16();

        /* ic bwe spec mapping application */
        deemph_fx_32( shb_synth_nonref_fx, extract_h( hStereoICBWE->prevSpecMapping_fx ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e
    }
    ELSE
    {
@@ -572,7 +595,7 @@ static void icbwe_dft_stereo_param_ivas_fx(
    move32();
    move16();

    gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */
    gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */

    hStereoICBWE->gDes_pastFrame_fx = L_deposit_h( gDes_fx ); /* Q31-exp */
    hStereoICBWE->gDes_pastFrame_e = exp;
@@ -800,7 +823,7 @@ void stereo_icBWE_enc_ivas_fx(
            move16();
        }

        icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, shb_synth_nonref_e );
        icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, &shb_synth_nonref_e );
    }
    ELSE
    {
@@ -1020,14 +1043,7 @@ void stereo_icBWE_enc_ivas_fx(
        IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) )
        {
            /* IC BWE spectral mapping */
            Word32 max_abs_val;
            maximum_abs_32_fx( shb_synth_nonref_fx, L_FRAME16k, &max_abs_val );
            IF( max_abs_val > 0 )
            {
                scale_sig32( shb_synth_nonref_fx, L_FRAME16k, -1 );
                shb_synth_nonref_e = sub( shb_synth_nonref_e, -1 );
            }
            spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */
            spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_e ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */
        }
        ELSE
        {