From 093fd8d203753dc15f5ceda0c925f7230fc453e4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 19 Jun 2024 09:24:42 +0530 Subject: [PATCH] Removal of scale of CLDFB_FILTER_BANK from decoder [x] Removed dependency of "scale" in CLDFB_FILTER_BANK in decoder [x] Removed dependency of q_scale from CLDFB_FILTER_BANK [x] Aligned scale of CLDFB_FILTER_BANK to be in Q8 --- lib_com/cldfb.c | 42 +++++++------------- lib_com/cnst.h | 14 +++++++ lib_com/stat_com.h | 5 +-- lib_dec/fd_cng_dec.c | 6 +-- lib_dec/ivas_cpe_dec_fx.c | 6 --- lib_rend/ivas_dirac_dec_binaural_functions.c | 5 --- 6 files changed, 33 insertions(+), 45 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index f7c03a8f9..b2022f725 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -2043,8 +2043,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17036; hs->p_filter = CLDFB80_10_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_10_SCALE ); - hs->scale = (Word16) ( CLDFB80_10_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_10_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2064,8 +2063,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15388; hs->p_filter = LDQMF_10_fx; - hs->q_scale = norm_s( (Word16) LDQMF_10_SCALE ); - hs->scale = (Word16) ( LDQMF_10_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_10_SCALE_FX_Q8; #endif } break; @@ -2098,8 +2096,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17051; hs->p_filter = CLDFB80_16_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_16_SCALE ); - hs->scale = (Word16) ( CLDFB80_16_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_16_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2119,8 +2116,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15388; hs->p_filter = LDQMF_16_fx; - hs->q_scale = norm_s( (Word16) LDQMF_16_SCALE ); - hs->scale = (Word16) ( LDQMF_16_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_16_SCALE_FX_Q8; #endif } break; @@ -2153,8 +2149,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17050; hs->p_filter = CLDFB80_20_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_20_SCALE ); - hs->scale = (Word16) ( CLDFB80_20_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_20_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2174,8 +2169,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15390; hs->p_filter = LDQMF_20_fx; - hs->q_scale = norm_s( (Word16) LDQMF_20_SCALE ); - hs->scale = (Word16) ( LDQMF_20_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_20_SCALE_FX_Q8; #endif } break; @@ -2208,8 +2202,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17051; hs->p_filter = CLDFB80_30_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_30_SCALE ); - hs->scale = (Word16) ( CLDFB80_30_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_30_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2229,8 +2222,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15388; hs->p_filter = LDQMF_30_fx; - hs->q_scale = norm_s( (Word16) LDQMF_30_SCALE ); - hs->scale = (Word16) ( LDQMF_30_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_30_SCALE_FX_Q8; #endif } break; @@ -2263,8 +2255,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17050; hs->p_filter = CLDFB80_32_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_32_SCALE ); - hs->scale = (Word16) ( CLDFB80_32_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_32_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2284,8 +2275,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15392; hs->p_filter = LDQMF_32_fx; - hs->q_scale = norm_s( (Word16) LDQMF_32_SCALE ); - hs->scale = (Word16) ( LDQMF_32_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_32_SCALE_FX_Q8; #endif } break; @@ -2318,8 +2308,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_re_fx = NULL; hs->p_filter_sf = (Word16) 17051; hs->p_filter = CLDFB80_40_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_40_SCALE ); - hs->scale = (Word16) ( CLDFB80_40_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_40_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2339,8 +2328,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15391; hs->p_filter = LDQMF_40_fx; - hs->q_scale = norm_s( (Word16) LDQMF_40_SCALE ); - hs->scale = (Word16) ( LDQMF_40_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_40_SCALE_FX_Q8; #endif } break; @@ -2373,8 +2361,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = NULL; hs->p_filter_sf = (Word16) 17051; hs->p_filter = CLDFB80_60_fx; - hs->q_scale = norm_s( (Word16) CLDFB80_60_SCALE ); - hs->scale = (Word16) ( CLDFB80_60_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = CLDFB80_60_SCALE_FX_Q8; #endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -2394,8 +2381,7 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->p_filter_sf = (Word16) 15391; hs->p_filter = LDQMF_60_fx; - hs->q_scale = norm_s( (Word16) LDQMF_60_SCALE ); - hs->scale = (Word16) ( LDQMF_60_SCALE * ( 1 << hs->q_scale ) ); + hs->scale = LDQMF_60_SCALE_FX_Q8; #endif } break; diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 8b0f44383..890f1b017 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -794,6 +794,13 @@ typedef enum #define CLDFB80_32_SCALE 88.303848f #define CLDFB80_40_SCALE 88.304726f #define CLDFB80_60_SCALE 88.028412f +#define CLDFB80_10_SCALE_FX_Q8 ( 22603 ) +#define CLDFB80_16_SCALE_FX_Q8 ( 22605 ) +#define CLDFB80_20_SCALE_FX_Q8 ( 22605 ) +#define CLDFB80_30_SCALE_FX_Q8 ( 22588 ) +#define CLDFB80_32_SCALE_FX_Q8 ( 22606 ) +#define CLDFB80_40_SCALE_FX_Q8 ( 22606 ) +#define CLDFB80_60_SCALE_FX_Q8 ( 22535 ) #define LDQMF_10_SCALE 84.567841f #define LDQMF_16_SCALE 84.567932f @@ -802,6 +809,13 @@ typedef enum #define LDQMF_32_SCALE 84.568001f #define LDQMF_40_SCALE 84.567986f #define LDQMF_60_SCALE 84.303284f +#define LDQMF_10_SCALE_FX_Q8 ( 21649 ) +#define LDQMF_16_SCALE_FX_Q8 ( 21649 ) +#define LDQMF_20_SCALE_FX_Q8 ( 21649 ) +#define LDQMF_30_SCALE_FX_Q8 ( 21632 ) +#define LDQMF_32_SCALE_FX_Q8 ( 21649 ) +#define LDQMF_40_SCALE_FX_Q8 ( 21649 ) +#define LDQMF_60_SCALE_FX_Q8 ( 21582 ) #define L_FFT 256 /* Spectral analysis - length of the FFT */ #define LOG2_L_FFT 8 /* Spectral analysis - log2 of L_FFT */ diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index 4b07886f7..05fd4b643 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -780,9 +780,8 @@ typedef struct cldfb_filter_bank_struct int16_t nab; /* number of active bands */ Word16 filtermode; - float scale_flt; /* scaling of frequency domain */ - Word16 scale; - Word16 q_scale; + float scale_flt; /* scaling of frequency domain */ + Word16 scale; /* scaling of frequency domain */ /* Q8 */ } CLDFB_FILTER_BANK, *HANDLE_CLDFB_FILTER_BANK; diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 7ad0bd0a0..5ee55a3a7 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -3029,8 +3029,8 @@ void generate_masking_noise_dirac_ivas_fx( q_shift = norm_l( scale_fx ); scale_fx = L_shl( scale_fx, q_shift ); q_scale = add( q_scale, q_shift ); - scale_fx = Mpy_32_32( scale_fx, Mpy_32_16_1( L_mult( h_cldfb->scale, h_cldfb->scale ), CLDFB_SCALING ) ); // Q = q_scale + 2q -34 - q_scale = sub( add( q_scale, i_mult( 2, h_cldfb->q_scale ) ), 34 ); + scale_fx = Mpy_32_32( scale_fx, Mpy_32_16_1( L_mult( h_cldfb->scale, h_cldfb->scale ), CLDFB_SCALING ) ); // Q = q_scale + 2 * Q8 -34 + q_scale = sub( add( q_scale, 2 * Q8 ), 31 ); ptr_level_fx = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; q_ptr_level = 31 - hFdCngCom->cngNoiseLevelExp; move16(); @@ -3043,7 +3043,7 @@ void generate_masking_noise_dirac_ivas_fx( scale_fx = L_shl( scale_fx, q_shift ); q_scale = add( q_scale, q_shift ); num = Mpy_32_32( scale_fx, *ptr_level_fx ); - q_num = sub( add( q_scale, q_ptr_level ), 30 ); + q_num = sub( add( q_scale, q_ptr_level ), 31 ); exp = sub( 31, q_num ); num = Sqrt32( num, &exp ); /* Real part in CLDFB band */ diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index a7d4daaae..713bf6841 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -141,12 +141,6 @@ ivas_error ivas_cpe_dec_fx( hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = q_old_out_LB; } } - // q_tcxltp_mem_in_float = 11; - FOR( Word16 ind2 = 0; ind2 < 2; ind2++ ) - { - IF( hCPE->hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->cldfbSyn ) - hCPE->hCoreCoder[ind2]->cldfbSyn->scale = (Word16) ( hCPE->hCoreCoder[ind2]->cldfbSyn->scale_flt * ( 1u << norm_s( (Word16) hCPE->hCoreCoder[0]->cldfbSyn->scale_flt ) ) ); - } #endif // Float to fix conversions IF( ( error = stereo_memory_dec_fx( ivas_total_brate, hCPE, nb_bits_metadata, st_ivas->hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index c429f551e..1e7c7dedf 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1234,11 +1234,6 @@ static void ivas_dirac_dec_binaural_internal_fx( } nchan_tc = add( nchan_tc, ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); #endif - - st_ivas->cldfbAnaDec[1]->q_scale = 15; - IF( abs_s( (Word16) st_ivas->cldfbAnaDec[1]->scale_flt ) != 0 ) - st_ivas->cldfbAnaDec[1]->q_scale = norm_s( (Word16) st_ivas->cldfbAnaDec[1]->scale_flt ); - st_ivas->cldfbAnaDec[1]->scale = (Word16) ( st_ivas->cldfbAnaDec[1]->scale_flt * ( 1 << st_ivas->cldfbAnaDec[1]->q_scale ) ); IF( st_ivas->hSCE[0] ) { Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); -- GitLab