Commit 1533c6e8 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_1214_fix' into 'main'

Fix for 3GPP issue 1214: Energy leakage in IGF tiles for MDCT-stereo @64kbps SWB

See merge request !1074
parents e6334462 692b63b8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -149,4 +149,5 @@
#define FIX_11_1_IVAS_SPAR_DEC_UPMIXER_SF_RND_COEFFS            /* FhG  ivas_spar_com.c: Zeroes very small negative coeffs via L_shr_r (was L_shr) */
#define FIX_ISSUE_1237                          /* VA: replacement of Copy_Scale_sig_16_32_DEPREC() that are doing 16 bits left shift by Copy_Scale_sig_16_32_no_sat() */
#define FIX_ISSUE_1237_KEEP_EVS_BE              /* VA: Fix to keep EVS bitexactness to 26.444 */
#define FIX_ISSUE_1214                          /* Ittiam: Fix for issue 1214: Energy leakage in IGF tiles for MDCT-stereo @64kbps SWB*/
#endif
+25 −4
Original line number Diff line number Diff line
@@ -718,8 +718,13 @@ static void IGF_CalculateEnvelope_ivas_fx(
                            Word32 mean_y_fx_tmp = 0;
                            move32();
                            mean_xy_fx = mean_x2_fx = 0;
#ifdef FIX_ISSUE_1214
                            mean_x_e = 15;
                            mean_xy_e = mean_y_e = mean_x2_e = 31;
#else
                            mean_x_e = mean_y_e = 15;
                            mean_xy_e = mean_x2_e = 31;
#endif
                            move16();
                            move16();
                            move16();
@@ -736,12 +741,20 @@ static void IGF_CalculateEnvelope_ivas_fx(
                                mean_x_fx = add( mean_x_fx, x );                   /*Q0*/
                                mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/

                                test();
#ifdef FIX_ISSUE_1214
                                /*y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );*/
                                IF( LE_64( W_deposit32_l( pPowerSpectrum_fx[sb] ), W_shl( 1, ( sub( 31, e_ps[sb] ) ) ) ) )
                                {
                                    y = 0;
                                    move16();
                                }
#else
                                /*y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/
                                IF( LT_32( pPowerSpectrum_fx[sb], 1 ) )
                                {
                                    y = imult1616( 20, ( -18 /* log10f(1e-018f) */ ) );
                                }
#endif
                                ELSE
                                {
                                    y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ) ), INV_Log2_10_Q15 ), Q25 ) ) ); /*Q0*/
@@ -1246,13 +1259,21 @@ static void IGF_CalculateStereoEnvelope_fx(
                            move16();
                        }
                    }
#ifdef FIX_ISSUE_1214
                    tmp_tb_fx = shr_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) );                                                                                                                                                                                                           /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    tmp_sb_fx = shr_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) );                                                                                                                                                                                                           /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_TB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_TB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] );                                                                                                                                                                       /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/
                    hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_SB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_SB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] );                                                                                                                                                                       /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/
#else
                    tmp_tb_fx = shl_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) );                                                                                                                                                     /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    tmp_sb_fx = shl_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) );                                                                                                                                                     /* Since we're limiting max value to 2.7f we can saturate to Q13 */

                    hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, tmp_tb_e ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, tmp_tb_e ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] );                                                                                                                 /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/
                    hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, tmp_sb_e ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, tmp_sb_e ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
                    hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] );                                                                                                                 /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/
#endif
                    hPrivateData->sfb_sb_e[sfb] = 2;
                    hPrivateData->sfb_tb_e[sfb] = 2;
                    move16();