Loading lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,8 @@ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define FIX_1764_RENORM /* NTT: update renorm for ivas_stereo_dmx_evs */ #define FIX_1764_ABS /* NTT: use abs in ivas_stereo_dmx_evs */ /* #################### End BASOP porting switches ############################ */ Loading lib_enc/ivas_stereo_dmx_evs_fx.c +78 −0 Original line number Diff line number Diff line Loading @@ -98,8 +98,13 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 #ifdef FIX_1764_RENORM #define STEREO_DMX_EVS_POC_RENORM_TH 1048576 // 65536 * 16 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 10 #else #define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 #endif #define STEREO_DMX_EVS_FAD_R 3 #define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ Loading Loading @@ -227,6 +232,12 @@ static Word32 spectral_flatness_fx( const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ const Word16 sig_length /* i : input signal length */ ); #ifdef FIX_1764_RENORM static void renorm_poc_fx( Word32 *real, /* i/o real-part*/ Word32 *imag /* i/o imaginary-part */ ); #endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * Loading Loading @@ -437,6 +448,10 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -447,6 +462,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -460,6 +476,10 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -470,6 +490,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -492,6 +513,10 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -502,6 +527,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -514,6 +540,10 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -524,6 +554,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -537,6 +568,11 @@ static void calc_poc_fx( Li = L_sub( specLi[i], Mpy_32_32_r( specRr[i], EPS ) ); Rr = L_add( specRr[i], Mpy_32_32_r( specLi[i], EPS ) ); Ri = L_sub( specRi[i], Mpy_32_32_r( specLr[i], EPS ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); Loading Loading @@ -568,7 +604,11 @@ static void calc_poc_fx( { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 #ifdef FIX_1764_ABS IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i]))) #else IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) #endif { specPOr[i] = Mpy_32_16_1( tmp1, imult1616( sign_fx( specPOr[i] ), /*0.923880f*/ s[120 * mult_angle] ) ); /* cos(PI/8) Q31*/ move32(); Loading @@ -587,9 +627,17 @@ static void calc_poc_fx( FOR( ; i < end; i++ ) /* binary search from 16 angles */ { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 #ifdef FIX_1764_ABS IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i]))) #else IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) #endif { #ifdef FIX_1764_ABS IF(GT_32(L_abs(Mpy_32_16_1(specPOr[i], 13573 /*0.414213f*/)), L_abs(specPOi[i]))) /*tan(PI/8)*/ #else IF( W_mult0_32_32( L_sub( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ), L_add( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ) ) > 0 ) /*tan(PI/8)*/ #endif { specPOr[i] = Mpy_32_16_1( tmp1 /*0.980785f */, imult1616( sign_fx( specPOr[i] ), s[140 * mult_angle] ) ); /* cos(PI/16) Q31*/ move32(); Loading @@ -606,7 +654,11 @@ static void calc_poc_fx( } ELSE { #ifdef FIX_1764_ABS IF(GT_32(L_abs(Mpy_32_16_1(specPOi[i], 13573 /*0.414213f*/)), L_abs(specPOr[i]))) /*tan(PI/8)*/ #else IF( W_mult0_32_32( L_sub( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ), L_add( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ) ) > 0 ) /*tan(PI/8)*/ #endif { specPOr[i] = Mpy_32_16_1( tmp1 /** 0.555570f*/, imult1616( sign_fx( specPOr[i] ), s[60 * mult_angle] ) ); /*cos(PI*5/16) Q31*/ move32(); Loading Loading @@ -1822,6 +1874,32 @@ static Word32 spectral_flatness_fx( return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); } #ifdef FIX_1764_RENORM /*-------------------------------------------------------------------* * renorm_poc_fx() * * two-stage renormalization of a complex number *-------------------------------------------------------------------*/ static void renorm_poc_fx( Word32 *real, /* i/o real-part*/ Word32 *imag /* i/o imaginary-part */ ) { IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) && (LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH))) { *real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT); *imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT); IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) && (LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH))) { *real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT); *imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT); } } } #endif /*-------------------------------------------------------------------* * calc_energy() * Loading Loading
lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,8 @@ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define FIX_1764_RENORM /* NTT: update renorm for ivas_stereo_dmx_evs */ #define FIX_1764_ABS /* NTT: use abs in ivas_stereo_dmx_evs */ /* #################### End BASOP porting switches ############################ */ Loading
lib_enc/ivas_stereo_dmx_evs_fx.c +78 −0 Original line number Diff line number Diff line Loading @@ -98,8 +98,13 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 #ifdef FIX_1764_RENORM #define STEREO_DMX_EVS_POC_RENORM_TH 1048576 // 65536 * 16 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 10 #else #define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 #endif #define STEREO_DMX_EVS_FAD_R 3 #define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ Loading Loading @@ -227,6 +232,12 @@ static Word32 spectral_flatness_fx( const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ const Word16 sig_length /* i : input signal length */ ); #ifdef FIX_1764_RENORM static void renorm_poc_fx( Word32 *real, /* i/o real-part*/ Word32 *imag /* i/o imaginary-part */ ); #endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * Loading Loading @@ -437,6 +448,10 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -447,6 +462,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -460,6 +476,10 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -470,6 +490,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -492,6 +513,10 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -502,6 +527,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -514,6 +540,10 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #else IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && Loading @@ -524,6 +554,7 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } #endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); Loading @@ -537,6 +568,11 @@ static void calc_poc_fx( Li = L_sub( specLi[i], Mpy_32_32_r( specRr[i], EPS ) ); Rr = L_add( specRr[i], Mpy_32_32_r( specLi[i], EPS ) ); Ri = L_sub( specRi[i], Mpy_32_32_r( specLr[i], EPS ) ); #ifdef FIX_1764_RENORM renorm_poc_fx(&Lr, &Li); renorm_poc_fx(&Rr, &Ri); #endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); Loading Loading @@ -568,7 +604,11 @@ static void calc_poc_fx( { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 #ifdef FIX_1764_ABS IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i]))) #else IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) #endif { specPOr[i] = Mpy_32_16_1( tmp1, imult1616( sign_fx( specPOr[i] ), /*0.923880f*/ s[120 * mult_angle] ) ); /* cos(PI/8) Q31*/ move32(); Loading @@ -587,9 +627,17 @@ static void calc_poc_fx( FOR( ; i < end; i++ ) /* binary search from 16 angles */ { tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31 #ifdef FIX_1764_ABS IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i]))) #else IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 ) #endif { #ifdef FIX_1764_ABS IF(GT_32(L_abs(Mpy_32_16_1(specPOr[i], 13573 /*0.414213f*/)), L_abs(specPOi[i]))) /*tan(PI/8)*/ #else IF( W_mult0_32_32( L_sub( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ), L_add( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ) ) > 0 ) /*tan(PI/8)*/ #endif { specPOr[i] = Mpy_32_16_1( tmp1 /*0.980785f */, imult1616( sign_fx( specPOr[i] ), s[140 * mult_angle] ) ); /* cos(PI/16) Q31*/ move32(); Loading @@ -606,7 +654,11 @@ static void calc_poc_fx( } ELSE { #ifdef FIX_1764_ABS IF(GT_32(L_abs(Mpy_32_16_1(specPOi[i], 13573 /*0.414213f*/)), L_abs(specPOr[i]))) /*tan(PI/8)*/ #else IF( W_mult0_32_32( L_sub( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ), L_add( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ) ) > 0 ) /*tan(PI/8)*/ #endif { specPOr[i] = Mpy_32_16_1( tmp1 /** 0.555570f*/, imult1616( sign_fx( specPOr[i] ), s[60 * mult_angle] ) ); /*cos(PI*5/16) Q31*/ move32(); Loading Loading @@ -1822,6 +1874,32 @@ static Word32 spectral_flatness_fx( return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); } #ifdef FIX_1764_RENORM /*-------------------------------------------------------------------* * renorm_poc_fx() * * two-stage renormalization of a complex number *-------------------------------------------------------------------*/ static void renorm_poc_fx( Word32 *real, /* i/o real-part*/ Word32 *imag /* i/o imaginary-part */ ) { IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) && (LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH))) { *real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT); *imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT); IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) && (LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH))) { *real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT); *imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT); } } } #endif /*-------------------------------------------------------------------* * calc_energy() * Loading