Commit 91ba8cfd authored by Manuel Jander's avatar Manuel Jander
Browse files

Improve precision of proto power. Reduces hight frequency noise for...

Improve precision of proto power. Reduces hight frequency noise for MASA_1dir_2TC_at_96_kbps_48kHz_in_48kHz_out_MONO test case.
parent 526d6f05
Loading
Loading
Loading
Loading

diff

deleted100644 → 0
+0 −1068

File deleted.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@
#endif

#define FIX_867_CLDFB_NRG_SCALE

#define FIX_867_CLDFB_NRG_SCALE_PROTO_NORESCALE

#define FIX_1378_ACELP_OUT_OF_BOUNDS

+15 −12
Original line number Diff line number Diff line
@@ -3727,6 +3727,20 @@ void ivas_dirac_dec_render_sf_fx(
        }
        hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], exp );
        move16();
        exp = 31;
        move16();
        FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
        {
            exp = s_min( exp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) );
        }
        FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
        {
            scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp)
        }
        hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], exp );
        move16();

#ifndef FIX_867_CLDFB_NRG_SCALE_PROTO_NORESCALE
        IF( LT_16( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ) )
        {
            FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
@@ -3745,18 +3759,6 @@ void ivas_dirac_dec_render_sf_fx(
            hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0];
            move16();
        }
        exp = 31;
        move16();
        FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
        {
            exp = s_min( exp, L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ) ) );
        }
        FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
        {
            scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp)
        }
        hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = add( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], exp );
        move16();
        IF( LT_16( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) )
        {
            FOR( i = 0; proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) )
@@ -3775,6 +3777,7 @@ void ivas_dirac_dec_render_sf_fx(
            hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1];
            move16();
        }
#endif
#else
        exp = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, proto_power_smooth_len );
        scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, proto_power_smooth_len, exp ); // Q(hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q + exp)
+55 −6
Original line number Diff line number Diff line
@@ -2247,6 +2247,53 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx(
    p_power_smooth = h_dirac_output_synthesis_state->proto_power_smooth_fx;
    set16_fx( exp_arr, 0, i_mult( num_protos_dir, num_freq_bands ) );

#ifdef FIX_867_CLDFB_NRG_SCALE_PROTO_NORESCALE
    Word16 shift_prev0, shift_curr0, shift_prev1, shift_curr1;
    shift_prev0 = s_max( 0 , sub( h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0], h_dirac_output_synthesis_state->proto_power_smooth_q[0] ) );
    shift_curr0 = s_max( 0 , sub( h_dirac_output_synthesis_state->proto_power_smooth_q[0], h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] ) );
    shift_prev1 = s_max( 0 , sub( h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1], h_dirac_output_synthesis_state->proto_power_smooth_q[1] ) );
    shift_curr1 = s_max( 0 , sub( h_dirac_output_synthesis_state->proto_power_smooth_q[1], h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] ) );

    FOR( k = 0; k < num_protos_dir; k++ )
    {
        FOR( l = 0; l < s_min( CLDFB_NO_CHANNELS_HALF, num_freq_bands ); l++ )
        {
            g1 = alpha[l]; // Q31
            move32();
            g2 = L_sub( ONE_IN_Q31, g1 );                                                          // Q31
            *p_power_smooth_prev = L_add( EPSILON_FX, Mpy_32_32( g2, L_shr( *p_power_smooth_prev, shift_prev0 ) ) ); //(Q31, proto_power_smooth_q) -> proto_power_smooth_q
            move32();
            *( p_power_smooth_prev ) = L_add( *( p_power_smooth_prev ),
                                              L_shr( Mpy_32_32( g1, ( *p_power_smooth ) ), shift_curr0 ) ); //(Q31, proto_power_smooth_q) -> min(proto_power_smooth_q, proto_power_smooth_prev_q)
            move32();

            L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-min(proto_power_smooth_q, proto_power_smooth_prev_q)))*/
            exp_arr[k * num_freq_bands + l] = exp;
            move16();

            *( p_power_smooth++ ) = L_tmp; /*Q=31-(exp-(31-min(proto_power_smooth_q, proto_power_smooth_prev_q)))*/
            move32();
        }
        FOR( l = CLDFB_NO_CHANNELS_HALF; l < num_freq_bands; l++ )
        {
            g1 = alpha[l]; // Q31
            move32();
            g2 = L_sub( ONE_IN_Q31, g1 );                                                          // Q31
            *p_power_smooth_prev = L_add( EPSILON_FX, Mpy_32_32( g2, L_shr( *p_power_smooth_prev, shift_prev1 ) ) ); //(Q31, q_proto_power_smooth) -> q_proto_power_smooth
            move32();
            *( p_power_smooth_prev ) = L_add(  *( p_power_smooth_prev  ),
                                              L_shr( Mpy_32_32( g1, ( *p_power_smooth ) ), shift_curr1 ) ); //(Q31, q_proto_power_smooth) -> q_proto_power_smooth
            move32();

            L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-h_dirac_output_synthesis_state->proto_power_smooth_prev_q))*/
            exp_arr[k * num_freq_bands + l] = exp;
            move16();

            *( p_power_smooth++ ) = L_tmp; /*Q=31-(exp-(31-h_dirac_output_synthesis_state->proto_power_smooth_prev_q))*/
            move32();
        }
    }
#else
    FOR( k = 0; k < num_protos_dir; k++ )
    {
        FOR( l = 0; l < num_freq_bands; l++ )
@@ -2286,6 +2333,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx(
            }
        }
    }
#endif

    // Move proto_power_smooth_fx to common Q-factor

@@ -2328,14 +2376,15 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx(
            p_power_smooth++;
        }
    }
    q_tmp = add( sub( Q31, min_exp ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_q[0] ) );
    q_tmp2 = add( sub( Q31, min_exp2 ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_q[1] ) );

    // Update the Q-factor
    h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] = h_dirac_output_synthesis_state->proto_power_smooth_q[0];
    h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] = h_dirac_output_synthesis_state->proto_power_smooth_q[1];
    move16();
    move16();
    h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] = s_min( h_dirac_output_synthesis_state->proto_power_smooth_q[0], h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] );
    h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] = s_min( h_dirac_output_synthesis_state->proto_power_smooth_q[1],  h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] );
    move16(); move16();

    q_tmp = add( sub( Q31, min_exp ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_prev_q[0] ) );
    q_tmp2 = add( sub( Q31, min_exp2 ), sub( Q31, h_dirac_output_synthesis_state->proto_power_smooth_prev_q[1] ) );

    h_dirac_output_synthesis_state->proto_power_smooth_q[0] = q_tmp;
    h_dirac_output_synthesis_state->proto_power_smooth_q[1] = q_tmp2;
    move16();
+113 −134

File changed.

Preview size limit exceeded, changes collapsed.