From 1f2737ad7e8a6784e042f4be79db777d42deddd6 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Thu, 5 Oct 2023 15:41:49 +0200 Subject: [PATCH 01/14] Add flag --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index c1dcf8ed15..3438b3e25d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,7 @@ #define FIX_812_DOUBLE_PREC_MCT /* FhG: Issue 812: Avoid double precision in MCT */ #define FIX_807_VARIABLE_SPEED_DECODING /* FhG: Issue 807: Resolve "Variable Speed Decoding broken" */ #define FIX_818_DOUBLE_PREC_KERNEN_SW /* FhG: Issue 818: Avoid double precision in kernel switching */ +#define FIX_814_DOUBLE_PREC_IN_REVERB /* Philips: Issue 814: Replace double precision arithmetic in reverb */ /* #################### End BE switches ################################## */ -- GitLab From 5f945a04eeb070fc30a3322d6287b8aa06acf89d Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Thu, 5 Oct 2023 16:03:05 +0200 Subject: [PATCH 02/14] Replace ceil, floor and round calls --- lib_dec/ivas_binRenderer_internal.c | 19 +++++++++++++++++++ lib_rend/ivas_reverb.c | 6 ++++++ lib_rend/ivas_reverb_filter_design.c | 8 ++++++++ 3 files changed, 33 insertions(+) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 6c79c87842..354c3974ec 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -182,6 +182,24 @@ static ivas_error ivas_binRenderer_convModuleOpen( { hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; } +#ifdef FIX_814_DOUBLE_PREC_IN_REVERB + for ( ; bandIdx < 10; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < 20; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < 30; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); + } + for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); + } +#else for ( ; bandIdx < 10; bandIdx++ ) { hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.6f * hBinRenConvModule->numTaps ); @@ -198,6 +216,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( { hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceil( 0.3f * hBinRenConvModule->numTaps ); } +#endif } else { diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 6489460a1c..62e2f0f35d 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1200,8 +1200,14 @@ ivas_error ivas_reverb_open( /* Defining appropriate windowing parameters for FFT filters to prevent aliasing */ fft_hist_size = pState->fft_size - pState->fft_subblock_size; + +#ifdef FIX_814_DOUBLE_PREC_IN_REVERB + transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); + transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); +#else transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); +#endif /* Compute the window used for FFT filters */ ivas_reverb_define_window_fft( pTime_window, transition_start, transition_length, nr_fc_fft_filter ); diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 78bf588246..256b0772a0 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -587,7 +587,11 @@ void ivas_reverb_calc_color_levels( /* Limiting the frequency response gradients Find frequency band closest to chosen pivot frequency. */ +#ifdef FIX_814_DOUBLE_PREC_IN_REVERB + idx_pivot = (int16_t) roundf( STEP_LIMIT_PIVOT_FREQ / freq_step ); +#else idx_pivot = (int16_t) round( STEP_LIMIT_PIVOT_FREQ / freq_step ); +#endif /* Perform step limiting */ response_step_limit( pTarget_color_L, freq_count, RESPONSE_STEP_LIMIT_LF, RESPONSE_STEP_LIMIT_HF, idx_pivot ); @@ -723,7 +727,11 @@ void ivas_reverb_get_hrtf_set_properties( } else { +#ifdef FIX_814_DOUBLE_PREC_IN_REVERB + base_idx = (int16_t) floorf( tbl_index ); +#else base_idx = (int16_t) floor( tbl_index ); +#endif relative_pos = tbl_index - base_idx; if ( base_idx > ( in_freq_count - 2 ) ) /* In case of extrapolation (above last bin), choose nearest */ { -- GitLab From af8a1cf1931130fafa244f1be59ca8dd3bcf6c17 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:40:36 +0200 Subject: [PATCH 03/14] Review comments --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- lib_rend/ivas_reverb.c | 4 ++-- lib_rend/ivas_reverb_filter_design.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 354c3974ec..76c526c14b 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); } #else for ( ; bandIdx < 10; bandIdx++ ) diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 62e2f0f35d..dde6065d82 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1202,8 +1202,8 @@ ivas_error ivas_reverb_open( fft_hist_size = pState->fft_size - pState->fft_subblock_size; #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); - transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); + transition_start = (int16_t) ( FFT_FILTER_WND_FLAT_REGION * fft_hist_size + 0.5f ); + transition_length = (int16_t) ( FFT_FILTER_WND_TRANS_REGION * fft_hist_size + 0.5f ); #else transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 256b0772a0..6d38a7ec53 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -728,7 +728,7 @@ void ivas_reverb_get_hrtf_set_properties( else { #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - base_idx = (int16_t) floorf( tbl_index ); + base_idx = (int16_t) tbl_index; #else base_idx = (int16_t) floor( tbl_index ); #endif -- GitLab From 29b5eccc9fbea6fc4068930c92a9d0359537d21b Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:17:47 +0200 Subject: [PATCH 04/14] Revert "Review comments" This reverts commit af8a1cf1931130fafa244f1be59ca8dd3bcf6c17. --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- lib_rend/ivas_reverb.c | 4 ++-- lib_rend/ivas_reverb_filter_design.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 76c526c14b..354c3974ec 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); } #else for ( ; bandIdx < 10; bandIdx++ ) diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index dde6065d82..62e2f0f35d 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1202,8 +1202,8 @@ ivas_error ivas_reverb_open( fft_hist_size = pState->fft_size - pState->fft_subblock_size; #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - transition_start = (int16_t) ( FFT_FILTER_WND_FLAT_REGION * fft_hist_size + 0.5f ); - transition_length = (int16_t) ( FFT_FILTER_WND_TRANS_REGION * fft_hist_size + 0.5f ); + transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); + transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); #else transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 6d38a7ec53..256b0772a0 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -728,7 +728,7 @@ void ivas_reverb_get_hrtf_set_properties( else { #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - base_idx = (int16_t) tbl_index; + base_idx = (int16_t) floorf( tbl_index ); #else base_idx = (int16_t) floor( tbl_index ); #endif -- GitLab From 6022bea29afab5590e93a5e41bc1824655921335 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:51:22 +0200 Subject: [PATCH 05/14] Remove ceil functions. --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 354c3974ec..76c526c14b 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); } #else for ( ; bandIdx < 10; bandIdx++ ) -- GitLab From 14e82b9bd3fbd71e3b05f4adc5870470ec7e6b44 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:59:01 +0200 Subject: [PATCH 06/14] Remove floor function. --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- lib_rend/ivas_reverb_filter_design.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 76c526c14b..354c3974ec 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); } #else for ( ; bandIdx < 10; bandIdx++ ) diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 256b0772a0..6d38a7ec53 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -728,7 +728,7 @@ void ivas_reverb_get_hrtf_set_properties( else { #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - base_idx = (int16_t) floorf( tbl_index ); + base_idx = (int16_t) tbl_index; #else base_idx = (int16_t) floor( tbl_index ); #endif -- GitLab From aadeb58155c9e6ee19a81bd6225ae1dac9a7da50 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:21:58 +0200 Subject: [PATCH 07/14] Remove round function in ivas_reverb.c --- lib_rend/ivas_reverb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 62e2f0f35d..dde6065d82 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1202,8 +1202,8 @@ ivas_error ivas_reverb_open( fft_hist_size = pState->fft_size - pState->fft_subblock_size; #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); - transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); + transition_start = (int16_t) ( FFT_FILTER_WND_FLAT_REGION * fft_hist_size + 0.5f ); + transition_length = (int16_t) ( FFT_FILTER_WND_TRANS_REGION * fft_hist_size + 0.5f ); #else transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); -- GitLab From ba88f5e1feb9b331d3867a933c6c073d75902314 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:44:37 +0200 Subject: [PATCH 08/14] Remove round function in ivas_reverb_filter_design.c --- lib_rend/ivas_reverb_filter_design.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 6d38a7ec53..49c1a6a3f2 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -588,7 +588,7 @@ void ivas_reverb_calc_color_levels( /* Limiting the frequency response gradients Find frequency band closest to chosen pivot frequency. */ #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - idx_pivot = (int16_t) roundf( STEP_LIMIT_PIVOT_FREQ / freq_step ); + idx_pivot = (int16_t) ( STEP_LIMIT_PIVOT_FREQ / freq_step + 0.5f ); #else idx_pivot = (int16_t) round( STEP_LIMIT_PIVOT_FREQ / freq_step ); #endif -- GitLab From 15c1ccf9ac41e786348c1520ec0e667416f480e1 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 11:27:04 +0200 Subject: [PATCH 09/14] Remove ceilf functions. --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 354c3974ec..76c526c14b 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); } #else for ( ; bandIdx < 10; bandIdx++ ) -- GitLab From 0718f5bbfc6799e1c49d8d401c9f832c31019da0 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 12:58:52 +0200 Subject: [PATCH 10/14] Add small subtraction to fix ceil for integers --- lib_dec/ivas_binRenderer_internal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 76c526c14b..b2fff9f3a0 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); } #else for ( ; bandIdx < 10; bandIdx++ ) -- GitLab From 825f5550435c6e81612066ba84bf9e4b66036ac5 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:33:20 +0200 Subject: [PATCH 11/14] Make the subtraction element bigger. --- lib_dec/ivas_binRenderer_internal.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index b2fff9f3a0..8f3ec2b507 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -176,6 +176,8 @@ static ivas_error ivas_binRenderer_convModuleOpen( { hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; + const float fltDistortion = 1e-5F; + /* Use variable order filtering */ bandIdx = 0; for ( ; bandIdx < 5; bandIdx++ ) @@ -185,19 +187,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps - FLT_MIN + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); } #else for ( ; bandIdx < 10; bandIdx++ ) -- GitLab From e446b0e7b6a98465731da40dd578acbf291b5a50 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:46:52 +0200 Subject: [PATCH 12/14] Move the definition to outside of if --- lib_dec/ivas_binRenderer_internal.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 8f3ec2b507..c9d6fe8d6a 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -152,6 +152,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; #endif + const float fltDistortion = 1e-5F; /*-----------------------------------------------------------------* * prepare library opening @@ -176,8 +177,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( { hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; - const float fltDistortion = 1e-5F; - /* Use variable order filtering */ bandIdx = 0; for ( ; bandIdx < 5; bandIdx++ ) -- GitLab From 3c459d3c20dc3a20c13d588359a8dda12646cbde Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 9 Oct 2023 16:10:56 +0200 Subject: [PATCH 13/14] Getting rid of ceilf in reverb modules: macros for number of taps array --- lib_com/ivas_cnst.h | 6 ++++++ lib_dec/ivas_binRenderer_internal.c | 9 ++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5461f74253..a35f3e4f63 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1513,6 +1513,12 @@ typedef enum #define BINAURAL_NTAPS_SBA BINAURAL_NTAPS #define BINAURAL_NTAPS_MAX 96 +#ifdef FIX_814_DOUBLE_PREC_IN_REVERB +#define BINAURAL_NTAPS_MAX_X06 58 +#define BINAURAL_NTAPS_MAX_X05 48 +#define BINAURAL_NTAPS_MAX_X04 39 +#define BINAURAL_NTAPS_MAX_X03 29 +#endif #define HRTF_SH_ORDER 3 #define HRTF_SH_CHANNELS HOA3_CHANNELS diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index c9d6fe8d6a..7b00dcf2eb 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -152,7 +152,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; #endif - const float fltDistortion = 1e-5F; /*-----------------------------------------------------------------* * prepare library opening @@ -186,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.6f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X06; } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.5f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X05; } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.4f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X04; } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ( 0.3f * hBinRenConvModule->numTaps - fltDistortion + 1.0f ); + hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X03; } #else for ( ; bandIdx < 10; bandIdx++ ) -- GitLab From 498404e489e63534e758da79a970c1043c560bb3 Mon Sep 17 00:00:00 2001 From: Serdar Buyuksarac <31622564+sbsarac@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:14:52 +0200 Subject: [PATCH 14/14] Only use single precision math functions for optimization This reverts commit 3c459d3c20dc3a20c13d588359a8dda12646cbde. --- lib_com/ivas_cnst.h | 6 ------ lib_dec/ivas_binRenderer_internal.c | 8 ++++---- lib_rend/ivas_reverb.c | 4 ++-- lib_rend/ivas_reverb_filter_design.c | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index a35f3e4f63..5461f74253 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1513,12 +1513,6 @@ typedef enum #define BINAURAL_NTAPS_SBA BINAURAL_NTAPS #define BINAURAL_NTAPS_MAX 96 -#ifdef FIX_814_DOUBLE_PREC_IN_REVERB -#define BINAURAL_NTAPS_MAX_X06 58 -#define BINAURAL_NTAPS_MAX_X05 48 -#define BINAURAL_NTAPS_MAX_X04 39 -#define BINAURAL_NTAPS_MAX_X03 29 -#endif #define HRTF_SH_ORDER 3 #define HRTF_SH_CHANNELS HOA3_CHANNELS diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 7b00dcf2eb..354c3974ec 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -185,19 +185,19 @@ static ivas_error ivas_binRenderer_convModuleOpen( #ifdef FIX_814_DOUBLE_PREC_IN_REVERB for ( ; bandIdx < 10; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X06; + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.6f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 20; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X05; + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.5f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < 30; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X04; + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.4f * hBinRenConvModule->numTaps ); } for ( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - hBinRenConvModule->numTapsArray[bandIdx] = BINAURAL_NTAPS_MAX_X03; + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t) ceilf( 0.3f * hBinRenConvModule->numTaps ); } #else for ( ; bandIdx < 10; bandIdx++ ) diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index dde6065d82..62e2f0f35d 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1202,8 +1202,8 @@ ivas_error ivas_reverb_open( fft_hist_size = pState->fft_size - pState->fft_subblock_size; #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - transition_start = (int16_t) ( FFT_FILTER_WND_FLAT_REGION * fft_hist_size + 0.5f ); - transition_length = (int16_t) ( FFT_FILTER_WND_TRANS_REGION * fft_hist_size + 0.5f ); + transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); + transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); #else transition_start = (int16_t) round( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); transition_length = (int16_t) round( FFT_FILTER_WND_TRANS_REGION * fft_hist_size ); diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 49c1a6a3f2..256b0772a0 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -588,7 +588,7 @@ void ivas_reverb_calc_color_levels( /* Limiting the frequency response gradients Find frequency band closest to chosen pivot frequency. */ #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - idx_pivot = (int16_t) ( STEP_LIMIT_PIVOT_FREQ / freq_step + 0.5f ); + idx_pivot = (int16_t) roundf( STEP_LIMIT_PIVOT_FREQ / freq_step ); #else idx_pivot = (int16_t) round( STEP_LIMIT_PIVOT_FREQ / freq_step ); #endif @@ -728,7 +728,7 @@ void ivas_reverb_get_hrtf_set_properties( else { #ifdef FIX_814_DOUBLE_PREC_IN_REVERB - base_idx = (int16_t) tbl_index; + base_idx = (int16_t) floorf( tbl_index ); #else base_idx = (int16_t) floor( tbl_index ); #endif -- GitLab