From a05a94b2ebf2f0fd43e17183d1b06280dcc84cdf Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:01:35 +0100 Subject: [PATCH 1/6] fixed total lack of precision when calculating power spectrum in run_min_stats_fx() --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 79b88b88c..249ae5360 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1042,26 +1042,31 @@ static void run_min_stats_fx( computed only once (for ch == 0) and not again in the second run sive the outcome will be the same anyway */ IF( ( EQ_16( will_estimate_noise_on_channel[0], will_estimate_noise_on_channel[1] ) ) || EQ_16( ch, 0 ) ) { - Word16 tmp16 = getScaleFactor32( spec_in, L_FRAME16k ); - + Word16 tmp16 = getScaleFactor32(spec_in, L_FRAME16k); + Word64 spec_power; Word32 power_spec_scale_fac; /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ - power_spec_scale_fac = 20792; // 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 - move32(); - power_spec[0] = Mpy_32_32( W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), sub( tmp16, 4 ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec_scale_fac = 20792; /* 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 */ + + spec_power = W_shl( W_mult_32_32(spec_in[0], spec_in[0]), 2 * tmp16 ); + power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac) , 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); - power_spec[L_FRAME16k - 1] = Mpy_32_32( W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), sub( tmp16, 4 ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + + spec_power = W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), 2 * tmp16 ); + power_spec[L_FRAME16k - 1] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ), 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); + FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ - - power_spec[i] = Mpy_32_32( L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + spec_power = W_shl( W_add( W_mult_32_32( spec_in[i], spec_in[i] ), W_mult_32_32( mdst, mdst ) ), 2 * tmp16 ); + power_spec[i] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ), 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); } - power_spec_e = sub( add( 4, shl( spec_e, 1 ) ), tmp16 ); + power_spec_e = 2 * ( 31 - spec_e + tmp16 ) + 1 - 16; + } } @@ -1091,7 +1096,7 @@ static void run_min_stats_fx( { arr_tmp = power_spec; } - ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, power_spec_e, NULL, NULL, NULL, st, st->bfi, 0 ); /*=================================================*/ } -- GitLab From c7244626498b4d68034e7c5b2297dbee41ad8139 Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:01:35 +0100 Subject: [PATCH 2/6] fixed total lack of precision when calculating power spectrum in run_min_stats_fx() --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 79b88b88c..249ae5360 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1042,26 +1042,31 @@ static void run_min_stats_fx( computed only once (for ch == 0) and not again in the second run sive the outcome will be the same anyway */ IF( ( EQ_16( will_estimate_noise_on_channel[0], will_estimate_noise_on_channel[1] ) ) || EQ_16( ch, 0 ) ) { - Word16 tmp16 = getScaleFactor32( spec_in, L_FRAME16k ); - + Word16 tmp16 = getScaleFactor32(spec_in, L_FRAME16k); + Word64 spec_power; Word32 power_spec_scale_fac; /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ - power_spec_scale_fac = 20792; // 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 - move32(); - power_spec[0] = Mpy_32_32( W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), sub( tmp16, 4 ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec_scale_fac = 20792; /* 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 */ + + spec_power = W_shl( W_mult_32_32(spec_in[0], spec_in[0]), 2 * tmp16 ); + power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac) , 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); - power_spec[L_FRAME16k - 1] = Mpy_32_32( W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), sub( tmp16, 4 ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + + spec_power = W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), 2 * tmp16 ); + power_spec[L_FRAME16k - 1] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ), 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); + FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ - - power_spec[i] = Mpy_32_32( L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ), power_spec_scale_fac ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + spec_power = W_shl( W_add( W_mult_32_32( spec_in[i], spec_in[i] ), W_mult_32_32( mdst, mdst ) ), 2 * tmp16 ); + power_spec[i] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ), 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); } - power_spec_e = sub( add( 4, shl( spec_e, 1 ) ), tmp16 ); + power_spec_e = 2 * ( 31 - spec_e + tmp16 ) + 1 - 16; + } } @@ -1091,7 +1096,7 @@ static void run_min_stats_fx( { arr_tmp = power_spec; } - ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, power_spec_e, NULL, NULL, NULL, st, st->bfi, 0 ); /*=================================================*/ } -- GitLab From 1d8ae4abdfa530c8e9767fbe4f3d6f4616ade346 Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Tue, 17 Dec 2024 07:49:48 +0100 Subject: [PATCH 3/6] clang format --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 249ae5360..7cb8ed464 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1042,7 +1042,7 @@ static void run_min_stats_fx( computed only once (for ch == 0) and not again in the second run sive the outcome will be the same anyway */ IF( ( EQ_16( will_estimate_noise_on_channel[0], will_estimate_noise_on_channel[1] ) ) || EQ_16( ch, 0 ) ) { - Word16 tmp16 = getScaleFactor32(spec_in, L_FRAME16k); + Word16 tmp16 = getScaleFactor32( spec_in, L_FRAME16k ); Word64 spec_power; Word32 power_spec_scale_fac; -- GitLab From ff21754ca51bcd2a1d1214464edb7a9087658727 Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Tue, 17 Dec 2024 07:56:20 +0100 Subject: [PATCH 4/6] clang format --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 7cb8ed464..9dff1a887 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1049,8 +1049,8 @@ static void run_min_stats_fx( /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ power_spec_scale_fac = 20792; /* 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 */ - spec_power = W_shl( W_mult_32_32(spec_in[0], spec_in[0]), 2 * tmp16 ); - power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac) , 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ + spec_power = W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), 2 * tmp16 ); + power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ) , 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); spec_power = W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), 2 * tmp16 ); -- GitLab From e06db4eade724b6b71c4a4b811984c05304bd448 Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Tue, 17 Dec 2024 08:59:22 +0100 Subject: [PATCH 5/6] clang format --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 9dff1a887..36032c0c9 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1050,7 +1050,7 @@ static void run_min_stats_fx( power_spec_scale_fac = 20792; /* 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 */ spec_power = W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), 2 * tmp16 ); - power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ) , 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ + power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ) ,16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); spec_power = W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), 2 * tmp16 ); @@ -1066,7 +1066,6 @@ static void run_min_stats_fx( move32(); } power_spec_e = 2 * ( 31 - spec_e + tmp16 ) + 1 - 16; - } } -- GitLab From 878040fa6a2242394770dceb2d89392771bebe99 Mon Sep 17 00:00:00 2001 From: mave2802 <59919483+mave2802@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:05:35 +0100 Subject: [PATCH 6/6] clang format --- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 36032c0c9..afcc6ab60 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1050,7 +1050,7 @@ static void run_min_stats_fx( power_spec_scale_fac = 20792; /* 1.f / ( L_FRAME16k * L_FRAME16k ) in Q31 */ spec_power = W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), 2 * tmp16 ); - power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ) ,16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ + power_spec[0] = W_extract_l( W_shr( W_mult_32_32( W_extract_h( spec_power ), power_spec_scale_fac ), 16 ) ); /* 2 * (Q31 - x_e + tmp16) + 1 - Q16 */ move32(); spec_power = W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), 2 * tmp16 ); -- GitLab