Commit 09b441b3 authored by Mohammadreza Naghibzadeh's avatar Mohammadreza Naghibzadeh
Browse files

increase CldfbHB_fx calculation precision

parent 2e471cbd
Loading
Loading
Loading
Loading
Loading
+15 −18
Original line number Diff line number Diff line
@@ -698,29 +698,26 @@ ivas_error ivas_core_enc_fx(
            /* Common pre-processing for SWB(FB) TBE and SWB(FB) BWE */
            /* Scaling cldfb_state_fx */
#ifdef FIX_2021_BANDWIDTH_EXTENSION_PROBLEM
            Word16 shift, scf_cldfb;
            Word16 q_shift, scf_cldfb;
            scf_cldfb = L_norm_arr( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length );

            IF( NE_32( scf_cldfb, 31 ) )
            {
            scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, scf_cldfb );
            st->cldfbSynTd->Q_cldfb_state = add( st->cldfbSynTd->Q_cldfb_state, scf_cldfb );

                shift = sub( st->cldfbSynTd->Q_cldfb_state, sub( q_re_im_buf[n], 1 ) );
                IF( GT_32( sub( q_re_im_buf[n], 1 ), st->cldfbSynTd->Q_cldfb_state ) )
            q_shift = sub( sub( q_re_im_buf[n], 1 ), st->cldfbSynTd->Q_cldfb_state ); // cldfb_state_fx will be used in cldfbSynthesis_ivas_fx and has to be aligned with (q_re_im_buf[n] - 1)
            IF( GT_32( q_shift, 0 ) )
            {
                FOR( int i = 0; i < CLDFB_NO_COL_MAX; i++ )
                {
                        scale_sig32( realBuffer_fx[n][i], CLDFB_NO_CHANNELS_MAX, shift );
                        scale_sig32( imagBuffer_fx[n][i], CLDFB_NO_CHANNELS_MAX, shift );
                    scale_sig32( realBuffer_fx[n][i], CLDFB_NO_CHANNELS_MAX, negate( q_shift ) );
                    scale_sig32( imagBuffer_fx[n][i], CLDFB_NO_CHANNELS_MAX, negate( q_shift ) );
                }
                q_re_im_buf[n] = add( st->cldfbSynTd->Q_cldfb_state, 1 );
            }
            ELSE
            {
                    scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, negate( shift ) ); // st->cldfbSynTd->Q_cldfb_state -> q_realImagBuffer
                    st->cldfbSynTd->Q_cldfb_state = q_re_im_buf[n];
                }
                scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, q_shift ); // st->cldfbSynTd->Q_cldfb_state -> q_realImagBuffer
                st->cldfbSynTd->Q_cldfb_state = sub( q_re_im_buf[n], 1 );
            }
#else
            scale_sig32( st->cldfbSynTd->cldfb_state_fx, st->cldfbSynTd->p_filter_length, sub( q_re_im_buf[n], st->cldfbSynTd->Q_cldfb_state ) ); // st->cldfbSynTd->Q_cldfb_state -> q_realImagBuffer
+17 −1
Original line number Diff line number Diff line
@@ -1104,6 +1104,10 @@ void swb_pre_proc_ivas_fx(
    IF( ( ( st->core == ACELP_CORE ) && NE_16( st->extl, SWB_BWE_HIGHRATE ) && NE_16( st->extl, FB_BWE_HIGHRATE ) ) ||
        ( ( EQ_32( st->total_brate, ACELP_9k60 ) || st->rf_mode ) && EQ_16( st->bwidth, SWB ) && ( st->element_mode == EVS_MONO ) ) )
    {
#ifdef FIX_2021_BANDWIDTH_EXTENSION_PROBLEM
        Word64 CldfbHB64_fx = 0;
        move64();
#endif
        Word32 CldfbHB_fx = 0;   // fixed counterpart
        Word16 CldfbHB_fx_e = 0; // fixed counterpart
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
@@ -1214,16 +1218,28 @@ void swb_pre_proc_ivas_fx(
            {
                FOR( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ )
                {
#ifdef FIX_2021_BANDWIDTH_EXTENSION_PROBLEM
                    CldfbHB64_fx = W_mac_32_32( CldfbHB64_fx, realBufferFlipped[ts][nB], realBufferFlipped[ts][nB] );
                    CldfbHB64_fx = W_mac_32_32( CldfbHB64_fx, imagBufferFlipped[ts][nB], imagBufferFlipped[ts][nB] );
#else
                    realQ_neg1 = extract_l( L_shr( realBufferFlipped[ts][nB], 16 ) );
                    imagQ_neg1 = extract_l( L_shr( imagBufferFlipped[ts][nB], 16 ) ); /* Q(-1), headroom needed */

                    CldfbHB_fx = L_mac0_o( CldfbHB_fx, realQ_neg1, realQ_neg1, &Overflow );
                    CldfbHB_fx = L_mac0_o( CldfbHB_fx, imagQ_neg1, imagQ_neg1, &Overflow ); /* Q(-2) */
#endif
                }
            }
#ifdef FIX_2021_BANDWIDTH_EXTENSION_PROBLEM
            Word16 scf = W_norm( CldfbHB64_fx );
            CldfbHB64_fx = W_shl( CldfbHB64_fx, scf );
            CldfbHB_fx = W_extract_h( CldfbHB64_fx );
            CldfbHB_fx_e = sub( Q31, add( shl( q_reImBuffer, 1 ), sub( scf, Q31 ) ) );
#else
            CldfbHB_fx_e = sub( Q31, shl( sub( q_reImBuffer, Q16 ), 1 ) );
            exp = norm_l( CldfbHB_fx );
            CldfbHB_fx = L_shl( CldfbHB_fx, exp ); /* CldfbHB_ener = CldfbHB_fl*2^(exp) */
#endif
            Cldfbtemp1 = Log2_norm_lc( CldfbHB_fx ); /* Log2_norm_lc(t) = 2^15*(log2(t/2^30)) */
            Cldfbtemp1 = sub( shr( Cldfbtemp1, 6 ), shl( add( sub( Q31 - Q30, CldfbHB_fx_e ), exp ), 9 ) );
            CldfbHB_fx = L_mult( Cldfbtemp1, 9864 ); /* Q9 + Q15 + Q1 = Q25 */