diff --git a/lib_com/options.h b/lib_com/options.h index c09e1ff3d56e7459bd22070d9bf45b84d1830eb0..443faafc7de94106fb78c71abd4a63f6c128c3f5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,6 +94,11 @@ #define FIX_FLOAT_1539_G192_FORMAT_SWITCH /* VA/Nokia: reintroduce format switching for g192 bitstreams */ #define HARMONIZE_2499_CONFIGUREFDCNGDEC /* FhG: basop issue 2499: harmonoize configureFdCngDec */ #define FIX_BASOP_2530_IVAS_DECISION_MAT /* VA: Fix ambiguous usage of extract_l() */ +#define HARMONIZE_2539_cng_energy /* FhG: basop issue 2499: harmonoize cng_energy */ +#ifdef HARMONIZE_2539_cng_energy +#define HARMONIZE_2539_cng_energy_msu0 +//#define HARMONIZE_2539_cng_energy_mac +#endif /* #################### End BE switches ################################## */ diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index 21f740c665aaaf2f8260af2064841e8eb3f8cff6..31137b565a28f8b39f0fc00be6077af093b6af5e 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -1185,6 +1185,15 @@ Word16 cng_energy_fx( Word16 hi, lo, enr, tmp16, att; const Word16 *pt_res; Word32 L_ener, L_tmp; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + Word64 W_ener = W_shr( W_neg( W_deposit32_h( 1 ) ), 1 ); +#endif +#ifdef HARMONIZE_2539_cng_energy_mac + Word64 W_ener = W_deposit32_h( 1 ); +#endif + move64(); +#endif maxv = 0; move16(); @@ -1205,7 +1214,16 @@ Word16 cng_energy_fx( tmp16 = shl( *pt_res, scale ); L_tmp = L_mac0_sat( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */ pt_res++; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + W_ener = W_msu0_32_32( W_ener, L_tmp, L_shr( 0x40000000, 7 - 1 ) ); /* 2*(Q_new+scale)+1, divide by L_frame done here */ +#endif +#ifdef HARMONIZE_2539_cng_energy_mac + W_ener = W_mac_32_32( W_ener, L_tmp, L_shr( 0x40000000, 7 - 1 ) ); /* 2*(Q_new+scale)+1, divide by L_frame done here */ +#endif +#else L_ener = L_add( L_ener, L_shr( L_tmp, 7 ) ); /* 2*(Q_new+scale)+1, divide by L_frame done here */ +#endif } } ELSE /* L_FRAME16k */ @@ -1218,10 +1236,26 @@ Word16 cng_energy_fx( tmp16 = shl( *pt_res, scale ); L_tmp = L_mac0_sat( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */ pt_res++; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + W_ener = W_msu0_32_32( W_ener, Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), L_shr( 0x40000000, 7 - 1 ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ +#endif +#ifdef HARMONIZE_2539_cng_energy_mac + W_ener = W_mac_32_32( W_ener, Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), L_shr( 0x40000000, 7 - 1 ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ +#endif +#else L_ener = L_add( L_ener, L_shr( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ +#endif } } - +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + L_ener = L_shl( L_negate( W_extract_h( W_ener ) ), 1 ); +#endif +#ifdef HARMONIZE_2539_cng_energy_mac + L_ener = W_extract_h( W_ener ); +#endif +#endif hi = norm_l( L_ener ); lo = Log2_norm_lc( L_shl( L_ener, hi ) ); hi = sub( 30, add( hi, shl( add( Q_new, scale ), 1 ) ) ); /* log2 exp in Q2*(Q_new+scale) */ @@ -1281,6 +1315,15 @@ Word16 cng_energy_ivas_fx( Word16 hi, lo, enr, tmp16, att; const Word16 *pt_res; Word32 L_ener, L_tmp; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + Word64 W_ener = W_shr( W_deposit32_h( 1 ), 1 ); +#endif +#ifdef HARMONIZE_2539_cng_energy_mac + Word64 W_ener = W_deposit32_h( 1 ); +#endif + move64(); +#endif maxv = 0; move16(); @@ -1301,7 +1344,13 @@ Word16 cng_energy_ivas_fx( tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4 L_tmp = L_mac0( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) + 7 */ pt_res++; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + W_ener = W_msu0_32_32( W_ener, L_tmp, 0x80000000 ); /* 2*(Q_new+scale)+1, divide by L_frame done here */ +#endif +#else L_ener = L_add( L_ener, L_tmp ); /* 2*(Q_new+scale)+1, divide by L_frame done here */ +#endif } } ELSE /* L_FRAME16k */ @@ -1309,15 +1358,37 @@ Word16 cng_energy_ivas_fx( FOR( i = 0; i < 160; i++ ) { tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4 +#ifdef HARMONIZE_2539_cng_energy + L_tmp = L_mult0( tmp16, tmp16 ); +#else L_tmp = L_mult( tmp16, tmp16 ); +#endif pt_res++; tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4 - L_tmp = L_mac( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) - 7 */ +#ifdef HARMONIZE_2539_cng_energy + L_tmp = L_mac0_sat( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) - 7 */ +#else + L_tmp = L_mac( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) - 7 */ +#endif pt_res++; +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + W_ener = W_msu0_32_32( W_ener, Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 0x80000000 ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ +#endif +#else L_ener = L_add( L_ener, Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */ +#endif } } - +#ifdef HARMONIZE_2539_cng_energy +#ifdef HARMONIZE_2539_cng_energy_msu0 + L_ener = L_shl( W_extract_h( W_neg( W_ener ) ), 1 ); + if ( NE_16( len, L_FRAME ) ) + { + L_ener = L_shl( L_ener, 1 ); + } +#endif +#endif hi = norm_l( L_ener ); lo = Log2_norm_lc( L_shl( L_ener, hi ) ); hi = sub( 30, add( hi, shl( add( Q_new, scale ), 1 ) ) ); /* log2 exp in Q2*(Q_new+scale) */