From d0ec34f40e5351c3bc7964974a3470cadb09bb16 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jan 2024 15:14:46 +0530 Subject: [PATCH] Few functions in ivas_filters.c file converted to fixed point. --- lib_com/ivas_cnst.h | 2 + lib_com/ivas_filters.c | 204 ++++++++++++++++++++++++++++++++++- lib_com/ivas_lfe_com.c | 88 +++++++++++++-- lib_com/ivas_prot.h | 30 +++++- lib_com/ivas_rom_com.c | 69 ++++++++++++ lib_com/ivas_rom_com.h | 17 +++ lib_com/ivas_stat_com.h | 11 ++ lib_com/ivas_transient_det.c | 161 +++++++++++++++++++++------ 8 files changed, 539 insertions(+), 43 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 40c781089..f71a41183 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1463,6 +1463,8 @@ typedef enum #define IVAS_LFE_ABS_SUM_FLT_THR (0.000001f) #define IVAS_ZERO_PAD_LEN_MULT_FAC (0.5f) +#define IVAS_ZERO_PAD_LEN_MULT_FAC_fx 16384 //0.5*Q15 + /* LFE PLC */ #define LFE_PLC_BUFLEN 240 #define LFE_PLC_FS 1600 diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index 8344fe33f..39ef95839 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -36,7 +36,9 @@ #include "ivas_cnst.h" #include "ivas_stat_com.h" #include "wmc_auto.h" - +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com.h" +#endif /*------------------------------------------------------------------------------------------* * Local functions declaration @@ -44,6 +46,7 @@ static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, const int16_t length, const int16_t stage ); +static void ivas_iir_2_filter_fx(ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage, Word16 q_fcator); /*-----------------------------------------------------------------------------------------* * Function ivas_filters_init() @@ -96,6 +99,74 @@ void ivas_filters_init( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_filters_init_fx( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const Word32 *filt_coeff_fx, /* i : filter coefficients */ + const Word16 order) /* i : filter order */ +{ + Word16 i; + filter_state->order = order; + + IF(EQ_16(order, IVAS_FILTER_ORDER_2) || EQ_16(order, IVAS_FILTER_ORDER_1)) + { + filter_state->filt_len = add(order, 1); + + FOR(i = 0; i < IVAS_BIQUAD_FILT_LEN; i++) + { + filter_state->num_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i]; + filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[add(i, IVAS_BIQUAD_FILT_LEN)]; + + filter_state->num[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_0][i], 1); + filter_state->den[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_0][i], 1); + } + + filter_state->state_fx[0][0] = 0; + filter_state->state_fx[0][1] = 0; + filter_state->state_fx[0][2] = 0; + + filter_state->state[0][0] = WORD322FL_SCALE(filter_state->state_fx[0][0], 1); + filter_state->state[0][1] = WORD322FL_SCALE(filter_state->state_fx[0][1], 1); + filter_state->state[0][2] = WORD322FL_SCALE(filter_state->state_fx[0][2], 1); + } + ELSE + { + filter_state->filt_len = IVAS_BIQUAD_FILT_LEN; + + FOR(i = 0; i < IVAS_BIQUAD_FILT_LEN; i++) + { + + filter_state->num_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i]; + filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[add(i, IVAS_BIQUAD_FILT_LEN)]; + filter_state->num_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[add(i, i_mult(IVAS_BIQUAD_FILT_LEN,2))]; + filter_state->den_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[add(i, i_mult(IVAS_BIQUAD_FILT_LEN, 3))]; + + filter_state->num[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_0][i], 1); + filter_state->den[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_0][i], 1); + filter_state->num[IVAS_FILTER_STAGE_1][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_1][i], 1); + filter_state->den[IVAS_FILTER_STAGE_1][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_1][i], 1); + } + + filter_state->state_fx[0][0] = 0; + filter_state->state_fx[0][1] = 0; + filter_state->state_fx[0][2] = 0; + filter_state->state_fx[1][0] = 0; + filter_state->state_fx[1][1] = 0; + filter_state->state_fx[1][2] = 0; + + filter_state->state[0][0] = WORD322FL_SCALE(filter_state->state_fx[0][0], 1); + filter_state->state[0][1] = WORD322FL_SCALE(filter_state->state_fx[0][1], 1); + filter_state->state[0][2] = WORD322FL_SCALE(filter_state->state_fx[0][2], 1); + filter_state->state[1][0] = WORD322FL_SCALE(filter_state->state_fx[1][0], 1); + filter_state->state[1][1] = WORD322FL_SCALE(filter_state->state_fx[1][1], 1); + filter_state->state[1][2] = WORD322FL_SCALE(filter_state->state_fx[1][2], 1); + } + + return; +} +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_filter_process() @@ -129,6 +200,35 @@ void ivas_filter_process( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_filter_process_fx( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + Word32 *pIn_Out_fx, /* i/o: signal subject to filtering */ + const Word16 length, /* i : filter order */ + Word16 q_factor +) +{ + SWITCH(filter_state->order) + { + case IVAS_FILTER_ORDER_1: + case IVAS_FILTER_ORDER_2: + ivas_iir_2_filter_fx(filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0, q_factor); + BREAK; + case IVAS_FILTER_ORDER_4: + /* biquad-1 */ + ivas_iir_2_filter_fx(filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0, q_factor); + /* biquad-2 */ + ivas_iir_2_filter_fx(filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_1, q_factor); + BREAK; + default: + BREAK; + } + + return; +} +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_iir_2_filter() @@ -158,6 +258,106 @@ static void ivas_iir_2_filter( filter_state->den[stage][j] * pOut[i]; } } - return; } + +#ifdef IVAS_FLOAT_FIXED +static void ivas_iir_2_filter_fx( + ivas_filters_process_state_t *filter_state, + Word32 *pIn_Out_fx, + const Word16 length, + const Word16 stage, + Word16 q_factor) +{ + Word16 i, j; + + Word32 *pIn_fx = pIn_Out_fx; + Word32 *pOut_fx = pIn_Out_fx; + Word32 tmp_pIn_buf_i_fx; + + Word32 L_tmp, L_tmp_1; + Word64 L_tmp_2; + Word16 L_tmp_q_factor, L_tmp_2_q_factor, L_tmp_3_q_factor, L_tmp_4_q_factor, L_tmp_5_q_factor, L_tmp_6_q_factor; + + Word16 q_factor_diff; + + Word16 q_factor_filter_num = 30; + Word16 q_factor_filter_den = 30; + + FOR(i = 0; i < length; i++) + { + tmp_pIn_buf_i_fx = pIn_fx[i]; + + /*L_tmp = Mpy_32_32(pIn_fx[i], filter_state->num_fx[stage][0]);*/ + + L_tmp_q_factor = sub(add(q_factor, q_factor_filter_num), 31); + + IF(GE_16(L_tmp_q_factor, q_factor)) { + q_factor_diff = sub(L_tmp_q_factor, q_factor); + pOut_fx[i] = L_add((filter_state->state_fx[stage][0]), L_shr(Mpy_32_32(filter_state->num_fx[stage][0], pIn_fx[i]), q_factor_diff)); + L_tmp_2_q_factor = q_factor; + } + ELSE{ + q_factor_diff = sub(q_factor, L_tmp_q_factor); + pOut_fx[i] = L_add(L_shr(filter_state->state_fx[stage][0], q_factor_diff), (Mpy_32_32(filter_state->num_fx[stage][0], pIn_fx[i]))); + pOut_fx[i] = L_shl(pOut_fx[i], q_factor_diff); + L_tmp_2_q_factor = q_factor; + + } + + + FOR(j = 1; j < filter_state->filt_len; j++) + { + /*L_tmp_1 = filter_state->num_fx[stage][j] * tmp_pIn_buf_i_fx;*/ + + L_tmp_3_q_factor = sub(add(q_factor_filter_num, q_factor), 31); + + IF(GE_16(L_tmp_3_q_factor, q_factor)) { + q_factor_diff = sub(L_tmp_3_q_factor, q_factor); + L_tmp = L_add((filter_state->state_fx[stage][j]), L_shr(Mpy_32_32(filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx), q_factor_diff)); + L_tmp_4_q_factor = q_factor; + } + ELSE{ + q_factor_diff = sub(q_factor, L_tmp_3_q_factor); + L_tmp = L_add(L_shr(filter_state->state_fx[stage][j], q_factor_diff), (Mpy_32_32(filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx))); + L_tmp_4_q_factor = L_tmp_3_q_factor; + + } + + /*L_tmp_3 = filter_state->den_fx[stage][j] * pOut_fx[i];*/ + + L_tmp_5_q_factor = sub(add(q_factor_filter_den, L_tmp_2_q_factor), 31); + + + IF(GE_16(L_tmp_5_q_factor, L_tmp_4_q_factor)) { + q_factor_diff = sub(L_tmp_5_q_factor, L_tmp_4_q_factor); + L_tmp_1 = L_sub(L_tmp, L_shr(Mpy_32_32(filter_state->den_fx[stage][j], pOut_fx[i]), q_factor_diff)); + L_tmp_6_q_factor = L_tmp_4_q_factor; + + } + ELSE{ + q_factor_diff = sub(L_tmp_4_q_factor, L_tmp_5_q_factor); + L_tmp_1 = L_sub(L_shr(L_tmp, q_factor_diff), Mpy_32_32(filter_state->den_fx[stage][j], pOut_fx[i])); + L_tmp_6_q_factor = L_tmp_5_q_factor; + } + + IF(GE_16(L_tmp_6_q_factor, q_factor)) { + q_factor_diff = sub(L_tmp_6_q_factor, q_factor); + L_tmp_2 = W_shr((Word64)L_tmp_1, q_factor_diff); + } + ELSE{ + q_factor_diff = sub(q_factor, L_tmp_6_q_factor); + L_tmp_2 = W_shl((Word64)L_tmp_1, q_factor_diff); + } + + + filter_state->state_fx[stage][j - 1] = W_extract_l(L_tmp_2); + + filter_state->state[stage][j - 1] = WORD322FL_SCALE(filter_state->state_fx[stage][j - 1], sub(31, q_factor)); + } + + } + +} +#endif + diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 6b323a13c..194168c61 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -96,6 +96,56 @@ void ivas_lfe_lpf_select_filt_coeff( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_lfe_lpf_select_filt_coeff_fx( + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 order, /* i : filter order */ + const Word32 **ppFilt_coeff_fx /* o : filter coefficients */ +) +{ + SWITCH(order) + { + case IVAS_FILTER_ORDER_2: + SWITCH(sampling_rate) + { + case 16000: + *ppFilt_coeff_fx = ivas_lpf_2_butter_16k_fx; + BREAK; + case 32000: + *ppFilt_coeff_fx = ivas_lpf_2_butter_32k_fx; + BREAK; + case 48000: + *ppFilt_coeff_fx = ivas_lpf_2_butter_48k_fx; + BREAK; + default: + BREAK; + } + BREAK; + case IVAS_FILTER_ORDER_4: + SWITCH(sampling_rate) + { + case 16000: + *ppFilt_coeff_fx = ivas_lpf_4_butter_16k_sos_fx; + BREAK; + case 32000: + *ppFilt_coeff_fx = ivas_lpf_4_butter_32k_sos_fx; + BREAK; + case 48000: + *ppFilt_coeff_fx = ivas_lpf_4_butter_48k_sos_fx; + BREAK; + default: + BREAK; + } + BREAK; + default: + assert(!"Unsupported LFE Filter order"); + } + + return; +} +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_window_init() @@ -105,35 +155,55 @@ void ivas_lfe_lpf_select_filt_coeff( void ivas_lfe_window_init( LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ - const int32_t sampling_rate, /* i : sampling rate */ - const int16_t frame_len /* i : frame length in samples */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 frame_len /* i : frame length in samples */ ) { /* Set window coefficients */ - if ( sampling_rate == 48000 ) + IF ( EQ_32(sampling_rate, 48000 )) { hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_48k; +#ifdef IVAS_FLOAT_FIXED + hLFEWindow->pWindow_coeffs_fx = ivas_lfe_window_coeff_48k_fx; +#endif + } - else if ( sampling_rate == 32000 ) + ELSE IF ( EQ_32(sampling_rate, 32000) ) { hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_32k; +#ifdef IVAS_FLOAT_FIXED + hLFEWindow->pWindow_coeffs_fx = ivas_lfe_window_coeff_32k_fx; +#endif + } - else if ( sampling_rate == 16000 ) + ELSE IF ( EQ_32(sampling_rate, 16000) ) { hLFEWindow->pWindow_coeffs = ivas_lfe_window_coeff_16k; +#ifdef IVAS_FLOAT_FIXED + hLFEWindow->pWindow_coeffs_fx = ivas_lfe_window_coeff_16k_fx; +#endif + } - else + ELSE { assert( !"8kHz LFE Window not supported" ); } /* 10ms stride, MDCT will be done in two iterations */ - hLFEWindow->dct_len = frame_len >> 1; + hLFEWindow->dct_len = shr(frame_len, 1); + hLFEWindow->fade_len = NS2SA(sampling_rate, IVAS_LFE_FADE_NS); + +#ifdef IVAS_FLOAT_FIXED /* 8ms of latency */ - hLFEWindow->fade_len = NS2SA( sampling_rate, IVAS_LFE_FADE_NS ); - hLFEWindow->zero_pad_len = (int16_t) ( IVAS_ZERO_PAD_LEN_MULT_FAC * ( hLFEWindow->dct_len - hLFEWindow->fade_len ) ); + hLFEWindow->zero_pad_len = (mult(IVAS_ZERO_PAD_LEN_MULT_FAC_fx, sub(hLFEWindow->dct_len, hLFEWindow->fade_len))); + hLFEWindow->full_len = add(add(hLFEWindow->zero_pad_len, hLFEWindow->fade_len), hLFEWindow->dct_len); +#else + hLFEWindow->zero_pad_len = (int16_t)(IVAS_ZERO_PAD_LEN_MULT_FAC * (hLFEWindow->dct_len - hLFEWindow->fade_len)); hLFEWindow->full_len = hLFEWindow->zero_pad_len + hLFEWindow->fade_len + hLFEWindow->dct_len; +#endif + + return; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 54b681adb..c16e1fd0b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5718,8 +5718,8 @@ void ivas_lfe_tdplc( void ivas_lfe_window_init( LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ - const int32_t sampling_rate, /* i : sampling rate */ - const int16_t frame_len /* i : frame length in samples */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 frame_len /* i : frame length in samples */ ); void ivas_lfe_lpf_select_filt_coeff( @@ -5728,18 +5728,44 @@ void ivas_lfe_lpf_select_filt_coeff( const float **ppFilt_coeff /* o : filter coefficients */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_lfe_lpf_select_filt_coeff_fx( + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 order, /* i : filter order */ + const Word32 **ppFilt_coeff_fx /* o : filter coefficients */ +); +#endif + + void ivas_filters_init( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ const float *filt_coeff, /* i : filter coefficients */ const int16_t order /* i : filter order */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_filters_init_fx( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + const Word32 *filt_coeff, /* i : filter coefficients */ + const Word16 order /* i : filter order */ +); +#endif + + void ivas_filter_process( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ float *pIn_Out, /* i : signal subject to filtering */ const int16_t length /* i : filter order */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_filter_process_fx( + ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ + Word32 *pIn_Out_fx, /* i : signal subject to filtering */ + const Word16 length, /* i : filter order */ + Word16 q_factor +); +#endif /*----------------------------------------------------------------------------------* * OSBA prototypes diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 97a3b2f77..d472f79aa 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -3239,6 +3239,11 @@ const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K] = 0.999999941142332f, 0.999999966087832f, 0.999999983040042f, 0.999999993835372f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K] = { 0x0003a373, 0x000608f6, 0x000888a7, 0x000b3e1b, 0x000e34f1, 0x001174a2, 0x00150328, 0x0018e5e1, 0x001d21eb, 0x0021bc4d, 0x0026ba09, 0x002c202f, 0x0031f3dc, 0x00383a43, 0x003ef8ad, 0x0046347b, 0x004df325, 0x00563a3f, 0x005f0f74, 0x00687888, 0x00727b59, 0x007d1ddb, 0x0088661c, 0x00945a41, 0x00a10087, 0x00ae5f3d, 0x00bc7ccd, 0x00cb5fb3, 0x00db0e7d, 0x00eb8fd0, 0x00fcea61, 0x010f24f8, 0x0122466a, 0x013655a0, 0x014b598e, 0x01615936, 0x01785ba8, 0x01906800, 0x01a9855e, 0x01c3baf0, 0x01df0fee, 0x01fb8b90, 0x02193514, 0x023813c4, 0x02582ee4, 0x02798db8, 0x029c378c, 0x02c033a4, 0x02e58944, 0x030c3fa8, 0x03345e0c, 0x035deba0, 0x0388ef8c, 0x03b570f0, 0x03e376dc, 0x04130858, 0x04442c58, 0x0476e9b8, 0x04ab4760, 0x04e14c00, 0x0518fe48, 0x055264c8, 0x058d8600, 0x05ca6850, 0x06091200, 0x06498930, 0x068bd3f0, 0x06cff830, 0x0715fba8, 0x075de408, 0x07a7b6c8, 0x07f37940, 0x084130a0, 0x0890e200, 0x08e29220, 0x093645c0, 0x098c0150, 0x09e3c940, 0x0a3da180, 0x0a998e30, 0x0af792e0, 0x0b57b320, 0x0bb9f240, 0x0c1e5360, 0x0c84d940, 0x0ced8690, 0x0d585dc0, 0x0dc560f0, 0x0e349200, 0x0ea5f2b0, 0x0f198450, 0x0f8f4820, 0x10073f00, 0x10816980, 0x10fdc840, 0x117c5b00, 0x11fd21e0, 0x12801c60, 0x130549a0, 0x138ca8c0, 0x14163880, 0x14a1f740, 0x152fe320, 0x15bffa00, 0x16523980, 0x16e69ee0, 0x177d2700, 0x1815cec0, 0x18b09260, 0x194d6e00, 0x19ec5d60, 0x1a8d5c20, 0x1b306580, 0x1bd57440, 0x1c7c8300, 0x1d258c40, 0x1dd08a00, 0x1e7d7600, 0x1f2c49a0, 0x1fdcfe20, 0x208f8c40, 0x2143ed00, 0x21fa1840, 0x22b20680, 0x236baf40, 0x24270a00, 0x24e40e00, 0x25a2b280, 0x2662ee00, 0x2724b700, 0x27e80400, 0x28acca80, 0x297300c0, 0x2a3a9c00, 0x2b039180, 0x2bcdd680, 0x2c995fc0, 0x2d6621c0, 0x2e341140, 0x2f032240, 0x2fd34900, 0x30a47900, 0x3176a640, 0x3249c440, 0x331dc600, 0x33f29f40, 0x34c842c0, 0x359ea340, 0x3675b3c0, 0x374d66c0, 0x3825af00, 0x38fe7ec0, 0x39d7c880, 0x3ab17e40, 0x3b8b9240, 0x3c65f6c0, 0x3d409d80, 0x3e1b7880, 0x3ef679c0, 0x3fd19340, 0x40acb680, 0x4187d580, 0x4262e280, 0x433dce80, 0x44188c00, 0x44f30c80, 0x45cd4180, 0x46a71e00, 0x47809300, 0x48599300, 0x49320f80, 0x4a09fb80, 0x4ae14880, 0x4bb7e900, 0x4c8dcf80, 0x4d62ee80, 0x4e373880, 0x4f0aa080, 0x4fdd1900, 0x50ae9600, 0x517f0980, 0x524e6780, 0x531ca380, 0x53e9b100, 0x54b58400, 0x55801080, 0x56494b00, 0x57112800, 0x57d79c00, 0x589c9c00, 0x59601d00, 0x5a221480, 0x5ae27880, 0x5ba13e00, 0x5c5e5c00, 0x5d19c880, 0x5dd37a80, 0x5e8b6800, 0x5f418980, 0x5ff5d580, 0x60a84480, 0x6158ce00, 0x62076a80, 0x62b41280, 0x635ebf80, 0x64076a80, 0x64ae0d00, 0x6552a100, 0x65f52080, 0x66958680, 0x6733cd00, 0x67cff000, 0x6869ea80, 0x6901b880, 0x69975600, 0x6a2abf80, 0x6abbf200, 0x6b4aea80, 0x6bd7a680, 0x6c622300, 0x6cea5f80, 0x6d705900, 0x6df40f00, 0x6e758080, 0x6ef4ac80, 0x6f719300, 0x6fec3380, 0x70648f00, 0x70daa580, 0x714e7880, 0x71c00880, 0x722f5780, 0x729c6700, 0x73073980, 0x736fd100, 0x73d62f80, 0x743a5900, 0x749c5080, 0x74fc1880, 0x7559b600, 0x75b52b80, 0x760e7e80, 0x7665b280, 0x76bacc80, 0x770dd180, 0x775ec600, 0x77adb000, 0x77fa9480, 0x78457900, 0x788e6400, 0x78d55b80, 0x791a6500, 0x795d8780, 0x799ec900, 0x79de3100, 0x7a1bc580, 0x7a578d80, 0x7a919100, 0x7ac9d600, 0x7b006500, 0x7b354400, 0x7b687b80, 0x7b9a1300, 0x7bca1180, 0x7bf87f80, 0x7c256400, 0x7c50c780, 0x7c7ab180, 0x7ca32a00, 0x7cca3900, 0x7cefe600, 0x7d143900, 0x7d373a80, 0x7d58f280, 0x7d796800, 0x7d98a380, 0x7db6ad00, 0x7dd38c80, 0x7def4900, 0x7e09eb00, 0x7e237a00, 0x7e3bfd80, 0x7e537d80, 0x7e6a0180, 0x7e7f9080, 0x7e943200, 0x7ea7ed80, 0x7ebaca00, 0x7ecccf00, 0x7ede0300, 0x7eee6d00, 0x7efe1400, 0x7f0cfe80, 0x7f1b3380, 0x7f28b900, 0x7f359500, 0x7f41ce80, 0x7f4d6b80, 0x7f587180, 0x7f62e680, 0x7f6cd000, 0x7f763400, 0x7f7f1780, 0x7f878080, 0x7f8f7380, 0x7f96f580, 0x7f9e0b80, 0x7fa4bb00, 0x7fab0780, 0x7fb0f600, 0x7fb68b00, 0x7fbbca00, 0x7fc0b800, 0x7fc55880, 0x7fc9af80, 0x7fcdc080, 0x7fd18f00, 0x7fd51e80, 0x7fd87280, 0x7fdb8d80, 0x7fde7380, 0x7fe12700, 0x7fe3aa80, 0x7fe60100, 0x7fe82d00, 0x7fea3180, 0x7fec1000, 0x7fedcb00, 0x7fef6500, 0x7ff0e000, 0x7ff23e00, 0x7ff38080, 0x7ff4a980, 0x7ff5ba80, 0x7ff6b580, 0x7ff79c00, 0x7ff86e80, 0x7ff92f80, 0x7ff9e000, 0x7ffa8100, 0x7ffb1380, 0x7ffb9880, 0x7ffc1180, 0x7ffc7f80, 0x7ffce300, 0x7ffd3c80, 0x7ffd8d80, 0x7ffdd680, 0x7ffe1880, 0x7ffe5300, 0x7ffe8800, 0x7ffeb700, 0x7ffee100, 0x7fff0600, 0x7fff2700, 0x7fff4480, 0x7fff5e80, 0x7fff7500, 0x7fff8900, 0x7fff9a80, 0x7fffaa00, 0x7fffb780, 0x7fffc300, 0x7fffcd00, 0x7fffd580, 0x7fffdc80, 0x7fffe300, 0x7fffe880, 0x7fffec80, 0x7ffff080, 0x7ffff380, 0x7ffff680, 0x7ffff880, 0x7ffffa00, 0x7ffffb80, 0x7ffffc80, 0x7ffffd80, 0x7ffffe80, 0x7fffff00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7fffffff, 0x7fffffff }; +#endif + + const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K] = { 0.000135992220705702f, 0.000243900754874608f, 0.000366502488193403f, 0.000507754555407233f, @@ -3307,6 +3312,11 @@ const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K] = 0.999999871092647f, 0.999999932837961f, 0.999999970256211f, 0.999999990753058f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K] = { 0x000474c9, 0x0007fdfd, 0x000c0272, 0x0010a35b, 0x0015f4ae, 0x001c079e, 0x0022ecc2, 0x002ab4c6, 0x003370ac, 0x003d31e5, 0x00480a5f, 0x00540c87, 0x00614b4e, 0x006fda25, 0x007fccfb, 0x0091383a, 0x00a430c2, 0x00b8cbe7, 0x00cf1f67, 0x00e74167, 0x0101486c, 0x011d4b52, 0x013b614e, 0x015ba1d8, 0x017e24ae, 0x01a301c8, 0x01ca514e, 0x01f42b90, 0x0220a900, 0x024fe224, 0x0281ef88, 0x02b6e9c0, 0x02eee954, 0x032a06b4, 0x03685a34, 0x03a9fc00, 0x03ef0408, 0x043789f8, 0x0483a538, 0x04d36cd0, 0x0526f760, 0x057e5b20, 0x05d9adc0, 0x06390470, 0x069c73c0, 0x07040fa8, 0x076feb68, 0x07e01990, 0x0854abe0, 0x08cdb350, 0x094b4000, 0x09cd6120, 0x0a5424d0, 0x0adf9870, 0x0b6fc830, 0x0c04bf20, 0x0c9e8760, 0x0d3d29c0, 0x0de0ade0, 0x0e891a50, 0x0f367440, 0x0fe8bfa0, 0x109fff00, 0x115c33a0, 0x121d5d80, 0x12e37b00, 0x13ae8960, 0x147e8440, 0x155365c0, 0x162d26c0, 0x170bbe80, 0x17ef22e0, 0x18d74820, 0x19c42100, 0x1ab59f20, 0x1babb200, 0x1ca64840, 0x1da54e80, 0x1ea8b080, 0x1fb057e0, 0x20bc2d80, 0x21cc1800, 0x22dffd40, 0x23f7c1c0, 0x25134800, 0x26327200, 0x27552000, 0x287b30c0, 0x29a48280, 0x2ad0f180, 0x2c005940, 0x2d329440, 0x2e677c00, 0x2f9ee880, 0x30d8b100, 0x3214ac40, 0x3352afc0, 0x34929040, 0x35d421c0, 0x37173780, 0x385ba480, 0x39a13b00, 0x3ae7cc40, 0x3c2f2a00, 0x3d7724c0, 0x3ebf8d80, 0x40083400, 0x4150e980, 0x42997d80, 0x43e1c000, 0x45298180, 0x46709200, 0x47b6c280, 0x48fbe380, 0x4a3fc600, 0x4b823b80, 0x4cc31600, 0x4e022800, 0x4f3f4500, 0x507a4080, 0x51b2ee80, 0x52e92580, 0x541cba80, 0x554d8580, 0x567b5e00, 0x57a61d80, 0x58cd9e00, 0x59f1bb80, 0x5b125200, 0x5c2f3f00, 0x5d486280, 0x5e5d9d00, 0x5f6ecf80, 0x607bde00, 0x6184ad00, 0x62892280, 0x63892680, 0x6484a280, 0x657b8100, 0x666daf00, 0x675b1980, 0x6843b100, 0x69276680, 0x6a062d00, 0x6adff980, 0x6bb4c180, 0x6c847d80, 0x6d4f2680, 0x6e14b800, 0x6ed52e80, 0x6f908900, 0x7046c680, 0x70f7e880, 0x71a3f300, 0x724aea00, 0x72ecd300, 0x7389b680, 0x74219c80, 0x74b48f80, 0x75429b80, 0x75cbcc80, 0x76503100, 0x76cfd800, 0x774ad280, 0x77c13180, 0x78330780, 0x78a06880, 0x79096800, 0x796e1b80, 0x79ce9980, 0x7a2af880, 0x7a835000, 0x7ad7b800, 0x7b284980, 0x7b751c80, 0x7bbe4c00, 0x7c03f080, 0x7c462580, 0x7c850480, 0x7cc0a880, 0x7cf92c00, 0x7d2eaa80, 0x7d613e00, 0x7d910180, 0x7dbe0f80, 0x7de88300, 0x7e107600, 0x7e360300, 0x7e594280, 0x7e7a4f80, 0x7e994200, 0x7eb63280, 0x7ed13a00, 0x7eea6f00, 0x7f01e980, 0x7f17c000, 0x7f2c0800, 0x7f3ed780, 0x7f504280, 0x7f605d80, 0x7f6f3c00, 0x7f7cf100, 0x7f898e00, 0x7f952500, 0x7f9fc600, 0x7fa98200, 0x7fb26800, 0x7fba8680, 0x7fc1eb80, 0x7fc8a400, 0x7fcebd80, 0x7fd44380, 0x7fd94100, 0x7fddc180, 0x7fe1ce80, 0x7fe57180, 0x7fe8b400, 0x7feb9d80, 0x7fee3680, 0x7ff08600, 0x7ff29280, 0x7ff46300, 0x7ff5fc80, 0x7ff76500, 0x7ff8a180, 0x7ff9b600, 0x7ffaa780, 0x7ffb7900, 0x7ffc2e80, 0x7ffccb80, 0x7ffd5200, 0x7ffdc580, 0x7ffe2800, 0x7ffe7b80, 0x7ffec200, 0x7ffefd80, 0x7fff2f00, 0x7fff5880, 0x7fff7a80, 0x7fff9680, 0x7fffad80, 0x7fffc000, 0x7fffcf00, 0x7fffdb00, 0x7fffe480, 0x7fffeb80, 0x7ffff180, 0x7ffff580, 0x7ffff900, 0x7ffffb00, 0x7ffffd00, 0x7ffffe00, 0x7fffff00, 0x7fffff80, 0x7fffffff, 0x7fffffff }; +#endif + + const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K] = { 0.000192322041967661f, 0.000432042541451336f, 0.000754275578824202f, 0.00117365342860051f, @@ -3343,6 +3353,11 @@ const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K] = 0.999999311268578f, 0.999999715534135f, 0.999999906669617f, 0.999999981506116f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K] = { 0x00064d50, 0x000e283c, 0x0018b753, 0x00267552, 0x0037e397, 0x004d8c2b, 0x006801d2, 0x0087dfb9, 0x00adc8fc, 0x00da680b, 0x010e6df8, 0x014a91a0, 0x018f8ecc, 0x01de252a, 0x02371734, 0x029b2908, 0x030b1f1c, 0x0387bd00, 0x0411c3e8, 0x04a9f148, 0x0550fd60, 0x060799b0, 0x06ce6f88, 0x07a61e78, 0x088f3ad0, 0x098a4c30, 0x0a97cc00, 0x0bb82430, 0x0cebadd0, 0x0e32afe0, 0x0f8d5df0, 0x10fbd760, 0x127e2680, 0x14143f40, 0x15bdff00, 0x177b2bc0, 0x194b7440, 0x1b2e6f00, 0x1d239ae0, 0x1f2a5ee0, 0x21420ac0, 0x2369d700, 0x25a0e640, 0x27e64500, 0x2a38ebc0, 0x2c97bfc0, 0x2f019400, 0x31752b00, 0x33f13800, 0x36746180, 0x38fd42c0, 0x3b8a6cc0, 0x3e1a6a80, 0x40abc080, 0x433cf080, 0x45cc7c80, 0x4858e600, 0x4ae0b400, 0x4d627280, 0x4fdcb500, 0x524e1b00, 0x54b54e80, 0x57110880, 0x59601300, 0x5ba14800, 0x5dd39780, 0x5ff60500, 0x6207aa80, 0x6407ba80, 0x65f57e80, 0x67d05b00, 0x6997cc80, 0x6b4b6b00, 0x6ceae880, 0x6e761080, 0x6fecc980, 0x714f1280, 0x729d0480, 0x73d6ce80, 0x74fcb800, 0x760f1d80, 0x770e6e80, 0x77fb2f00, 0x78d5f280, 0x799f5b80, 0x7a581b80, 0x7b00ec80, 0x7b9a9480, 0x7c25df80, 0x7ca39e80, 0x7d14a680, 0x7d79ce00, 0x7dd3eb00, 0x7e23d180, 0x7e6a5180, 0x7ea83680, 0x7ede4580, 0x7f0d3a80, 0x7f35cb00, 0x7f58a180, 0x7f765e80, 0x7f8f9880, 0x7fa4db80, 0x7fb6a700, 0x7fc57100, 0x7fd1a400, 0x7fdb9f80, 0x7fe3b980, 0x7fea3e00, 0x7fef6f80, 0x7ff38900, 0x7ff6bc80, 0x7ff93500, 0x7ffb1780, 0x7ffc8300, 0x7ffd9080, 0x7ffe5500, 0x7ffee280, 0x7fff4580, 0x7fff8a00, 0x7fffb800, 0x7fffd580, 0x7fffe880, 0x7ffff400, 0x7ffffa00, 0x7ffffd80, 0x7fffff00, 0x7fffffff }; +#endif + + const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 3.97464794223146e-07f, 7.94929601777927e-07f, 3.97464788468481e-07f, 1.f, @@ -3350,6 +3365,16 @@ const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000001447843f, 1.f, -1.95913666348268f, 0.961692382252710f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 0x1ab, 0x356, 0x1ab, 0x40000000, + 0x85ec0b80, 0x3a3cb940, 0x40000000, 0x7fffffff, + 0x40000000, 0x40000000, 0x829d8180, 0x3d8c5e40 +}; +#endif + + const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 2.56674586654460e-08f, 5.13349181918215e-08f, 2.56674582938215e-08f, 1, @@ -3357,6 +3382,16 @@ const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000001447843f, 1, -1.98000953138860f, 0.980654742275836f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 0x1c, 0x37, 0x1c, 0x40000000, + 0x82fd4b80, 0x3d0d2280, 0x40000000, 0x7fffffff, + 0x40000000, 0x40000000, 0x81478600, 0x3ec30c00 +}; +#endif + + const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 5.12617881476274e-09f, 1.02523584294987e-08f, 5.12617879059970e-09f, @@ -3364,21 +3399,55 @@ const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000000471366f, 1.f , -1.98677297369091f, 0.987060670205863f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = +{ + 0x6, 0xb, 0x6, 0x40000000, + 0x81ffd700, 0x3e04d500, 0x40000000, 0x7fffff80, + 0x40000000, 0x40000000, 0x80d8b600, 0x3f2c0080 +}; +#endif + + const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000628720643081143f, 0.00125744128616229f, 0.000628720643081143f, 1.f, -1.92783286977036f, 0.930347752342683f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 +}; +#endif + + const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000159990787823749f, 0.000319981575647499f, 0.000159990787823749f, 1.f, -1.96390539174033f, 0.964545354891623f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d +}; +#endif + + const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = { 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 +}; +#endif + + const ivas_lfe_freq_models ivas_str_lfe_freq_models = { { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 70495f00c..8473de40f 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -378,10 +378,27 @@ extern const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1]; +#ifdef IVAS_FLOAT_FIXED +extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +#endif + + extern const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K]; extern const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K]; extern const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K]; +#ifdef IVAS_FLOAT_FIXED +extern const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K]; +extern const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K]; +extern const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K]; +#endif + + extern const int16_t ivas_lfe_num_ele_in_coder_models[2][4]; extern const int16_t ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; extern const int16_t ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 2e2c90437..d096e39c5 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -662,6 +662,10 @@ typedef struct ivas_lfe_window int16_t zero_pad_len; int16_t full_len; const float *pWindow_coeffs; +#ifdef IVAS_FLOAT_FIXED + const Word32 *pWindow_coeffs_fx; +#endif + } LFE_WINDOW_DATA, *LFE_WINDOW_HANDLE; @@ -685,6 +689,13 @@ typedef struct ivas_filters_process_state_t float num[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; float den[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; float state[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; +#ifdef IVAS_FLOAT_FIXED + Word32 num_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + Word32 den_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + Word32 state_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + Word32 state_fx_q_factor[IVAS_FILTER_MAX_STAGES]; +#endif + } ivas_filters_process_state_t; diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c index 1729865c4..bd350bda4 100644 --- a/lib_com/ivas_transient_det.c +++ b/lib_com/ivas_transient_det.c @@ -39,6 +39,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" #endif #include "ivas_stat_com.h" @@ -47,10 +48,15 @@ *------------------------------------------------------------------------------------------*/ #define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) +#ifdef IVAS_FLOAT_FIXED +#define IVAS_TDET_PARM_ENV_EPS_fx 21474 //Q31 +#endif + #ifdef IVAS_FLOAT_FIXED #define IVAS_TDET_DUCK_MULT_FAC ( 590558003 ) // Q29 #define IVAS_TDET_PARM_TRANS_THR ( 107374182 ) // Q30 #define IVAS_POINT_ONE_ONE_IN_Q30 ( 118111601 ) // Q30 + #else #define IVAS_TDET_DUCK_MULT_FAC ( 1.1f ) #define IVAS_TDET_PARM_TRANS_THR ( 0.1f ) @@ -62,26 +68,44 @@ #define IVAS_C_HPF_32k ( 0.554854910159853f ) #define IVAS_C_HPF_16k ( 0.307863971328499f ) +#ifdef IVAS_FLOAT_FIXED +#define IVAS_C_HPF_48k_fx ( 0x2b370000 ) +#define IVAS_C_HPF_32k_fx ( 0x2382be40 ) +#define IVAS_C_HPF_16k_fx ( 0x13b40b20 ) +#endif + /*env_fast*/ #define IVAS_C_FAST_48k ( 0.995842001845110f ) #define IVAS_C_FAST_32k ( 0.993769490623395f ) #define IVAS_C_FAST_16k ( 0.987577800493881f ) +#ifdef IVAS_FLOAT_FIXED +#define IVAS_C_FAST_48k_fx ( 0x3fbbe000 ) +#define IVAS_C_FAST_32k_fx ( 0x3f99eb40 ) +#define IVAS_C_FAST_16k_fx ( 0x3f347980 ) +#endif + /*env_slow*/ #define IVAS_C_SLOW_48k ( 0.999739617238810f ) #define IVAS_C_SLOW_32k ( 0.999609451284012f ) #define IVAS_C_SLOW_16k ( 0.999219055096324f ) +#ifdef IVAS_FLOAT_FIXED +#define IVAS_C_SLOW_48k_fx ( 0x3ffbbc00 ) +#define IVAS_C_SLOW_32k_fx ( 0x3ff99a00 ) +#define IVAS_C_SLOW_16k_fx ( 0x3ff33480 ) +#endif + #ifdef IVAS_FLOAT_FIXED /*induck*/ -#define IVAS_C_IN_DUCK_48k ( 1073294525 ) // Q30 -#define IVAS_C_IN_DUCK_32k ( 1073070945 ) // Q30 -#define IVAS_C_IN_DUCK_16k ( 1072400485 ) // Q30 +#define IVAS_C_IN_DUCK_48k_fx ( 1073294525 ) // Q30 +#define IVAS_C_IN_DUCK_32k_fx ( 1073070945 ) // Q30 +#define IVAS_C_IN_DUCK_16k_fx ( 1072400485 ) // Q30 /*outduck*/ -#define IVAS_C_OUT_DUCK_48k ( 1073294525 ) // Q30 -#define IVAS_C_OUT_DUCK_32k ( 1073070945 ) // Q30 -#define IVAS_C_OUT_DUCK_16k ( 1072400485 ) // Q30 +#define IVAS_C_OUT_DUCK_48k_fx ( 1073294525 ) // Q30 +#define IVAS_C_OUT_DUCK_32k_fx ( 1073070945 ) // Q30 +#define IVAS_C_OUT_DUCK_16k_fx ( 1072400485 ) // Q30 #else /*induck*/ #define IVAS_C_IN_DUCK_48k ( 0.999583420126834f ) @@ -106,7 +130,11 @@ static void ivas_transient_det_init( ) { int16_t i; +#ifndef IVAS_FLOAT_FIXED float filt_coeff_arr[3][IVAS_BIQUAD_FILT_LEN << 1]; +#else + Word32 filt_coeff_arr_fx[3][IVAS_BIQUAD_FILT_LEN << 1]; +#endif #ifdef IVAS_FLOAT_FIXED hTranDet->in_duck_gain = 1073741824; // Q30 @@ -115,13 +143,19 @@ static void ivas_transient_det_init( hTranDet->in_duck_gain = 1.0f; hTranDet->out_duck_gain = 1.0f; #endif - for ( i = 0; i < 3; i++ ) + + FOR ( i = 0; i < 3; i++ ) { +#ifndef IVAS_FLOAT_FIXED set_zero( filt_coeff_arr[i], IVAS_BIQUAD_FILT_LEN << 1 ); +#else + set32_fx(filt_coeff_arr_fx[i], 0, IVAS_BIQUAD_FILT_LEN << 1); +#endif } - switch ( sampling_rate ) + SWITCH ( sampling_rate ) { +#ifndef IVAS_FLOAT_FIXED case 48000: /*env_hpf*/ filt_coeff_arr[0][0] = IVAS_C_HPF_48k; @@ -173,11 +207,88 @@ static void ivas_transient_det_init( hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_16k; hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_16k; break; +#else + case 48000: + /*env_hpf*/ + filt_coeff_arr_fx[0][0] = IVAS_C_HPF_48k_fx; + filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_48k_fx; + filt_coeff_arr_fx[0][3] = ONE_IN_Q30; + filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_48k_fx; + + /*env_fast*/ + filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_48k_fx; + filt_coeff_arr_fx[1][3] = ONE_IN_Q30; + filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_48k_fx; + + /*env_slow*/ + filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_48k_fx; + filt_coeff_arr_fx[2][3] = ONE_IN_Q30; + filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_48k_fx; + + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_48k_fx; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_48k_fx; + + + BREAK; + case 32000: + /*env_hpf*/ + filt_coeff_arr_fx[0][0] = IVAS_C_HPF_32k_fx; + filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_32k_fx; + filt_coeff_arr_fx[0][3] = ONE_IN_Q30; + filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_32k_fx; + + /*env_fast*/ + filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_32k_fx; + filt_coeff_arr_fx[1][3] = ONE_IN_Q30; + filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_32k_fx; + + + /*env_slow*/ + filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_32k_fx; + filt_coeff_arr_fx[2][3] = ONE_IN_Q30; + filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_32k_fx; + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_32k_fx; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_32k_fx; + + + BREAK; + case 16000: + /*env_hpf*/ + filt_coeff_arr_fx[0][0] = IVAS_C_HPF_16k_fx; + filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_16k_fx; + filt_coeff_arr_fx[0][3] = ONE_IN_Q30; + filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_16k_fx; + + + /*env_fast*/ + filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_16k_fx; + filt_coeff_arr_fx[1][3] = ONE_IN_Q30; + filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_16k_fx; + + + /*env_slow*/ + filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_16k_fx; + filt_coeff_arr_fx[2][3] = ONE_IN_Q30; + filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_16k_fx; + + hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_16k_fx; + hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_16k_fx; + + + BREAK; +#endif } +#ifndef IVAS_FLOAT_FIXED ivas_filters_init( &hTranDet->env_hpf, (const float *) filt_coeff_arr[0], IVAS_FILTER_ORDER_1 ); ivas_filters_init( &hTranDet->env_fast, (const float *) filt_coeff_arr[1], IVAS_FILTER_ORDER_1 ); ivas_filters_init( &hTranDet->env_slow, (const float *) filt_coeff_arr[2], IVAS_FILTER_ORDER_1 ); +#else + ivas_filters_init_fx(&hTranDet->env_hpf, (const Word32 *)filt_coeff_arr_fx[0], IVAS_FILTER_ORDER_1); + ivas_filters_init_fx(&hTranDet->env_fast, (const Word32 *)filt_coeff_arr_fx[1], IVAS_FILTER_ORDER_1); + ivas_filters_init_fx(&hTranDet->env_slow, (const Word32 *)filt_coeff_arr_fx[2], IVAS_FILTER_ORDER_1); +#endif + hTranDet->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC; @@ -454,7 +565,6 @@ void ivas_td_decorr_get_ducking_gains_fx( const Word16 tdet_flag ) { Word16 i, q = Q14; - float e_fast[L_FRAME48k], e_slow[L_FRAME48k]; Word32 e_fast_fx[L_FRAME48k], e_slow_fx[L_FRAME48k]; Word32 in_duck_gain = hTranDet->in_duck_gain; Word32 out_duck_gain = hTranDet->out_duck_gain; @@ -464,43 +574,34 @@ void ivas_td_decorr_get_ducking_gains_fx( mvl2l( pIn_pcm, e_fast_fx, frame_len ); - for ( i = 0; i < frame_len; i++ ) - { - e_fast[i] = ( e_fast_fx[i] / (float) ( 1 << q ) ); - } - /* env hpf */ - ivas_filter_process( &hTranDet->env_hpf, e_fast, frame_len ); + ivas_filter_process_fx( &hTranDet->env_hpf, e_fast_fx, frame_len, q); - for ( i = 0; i < frame_len; i++ ) - { - e_fast[i] = (float) fabs( e_fast[i] ) + IVAS_TDET_PARM_ENV_EPS; - e_slow[i] = e_fast[i]; + Word16 q_factor_diff = sub(31, q); + + FOR (i = 0; i < frame_len; i++) { + e_fast_fx[i] = L_add(L_abs(e_fast_fx[i]), L_shr(IVAS_TDET_PARM_ENV_EPS_fx, q_factor_diff)); + e_slow_fx[i] = e_fast_fx[i]; } /* env fast*/ - ivas_filter_process( &hTranDet->env_fast, e_fast, frame_len ); + ivas_filter_process_fx(&hTranDet->env_fast, e_fast_fx, frame_len, q); /* env slow */ - ivas_filter_process( &hTranDet->env_slow, e_slow, frame_len ); + ivas_filter_process_fx(&hTranDet->env_slow, e_slow_fx, frame_len, q); - for ( i = 0; i < frame_len; i++ ) + IF ( tdet_flag ) { - e_fast_fx[i] = (Word32) ( e_fast[i] * ( 1 << q ) ); - e_slow_fx[i] = (Word32) ( e_slow[i] * ( 1 << q ) ); - } - if ( tdet_flag ) - { - for ( i = 0; i < frame_len; i++ ) + FOR ( i = 0; i < frame_len; i++ ) { in_duck_gain = ivas_calc_duck_gain_fx( in_duck_gain, in_duck_coeff, e_slow_fx[i], e_fast_fx[i], duck_mult_fac ); pIn_duck_gains[i] = in_duck_gain; } hTranDet->in_duck_gain = in_duck_gain; } - else + ELSE { - for ( i = 0; i < frame_len; i++ ) + FOR ( i = 0; i < frame_len; i++ ) { in_duck_gain = ivas_calc_duck_gain_fx( in_duck_gain, in_duck_coeff, e_slow_fx[i], e_fast_fx[i], duck_mult_fac ); pIn_duck_gains[i] = in_duck_gain; -- GitLab