diff --git a/lib_com/options.h b/lib_com/options.h index 88a8a0757279c9f3c7bae35ac566c5961e8ca6b2..d51e80754d1aa20991f7f03a2086b7881721952b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,7 @@ #define FIX_852_FIX_HANDLE_DEREF /* VA: issue 852: Fix missing handle dereferencing of hIsmMetadaData in ivas_ism_metadata_close() */ #define FIX_520_REMOVE_MEMMOVE_JBM /* VA: issue 520: Remove memmove() from JBM code */ #define FIX_853_ARRAY_SIZE_MISMATCH /* Nokia: Issue #853: Mismatch of declaration and definition of computeIntensityVector_ana and computeReferencePower_ana */ - +#define FIX_814_DOUBLE_PREC_IN_REVERB /* Philips: Issue 814: Replace double precision arithmetic in reverb */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index bd13d245a42c90c093075772e9fed1fa9266024b..e243494623258f4b2efb8183ef603dfcff2e314f 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -184,6 +184,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 ); @@ -200,6 +218,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 2a34a24c48f69fdffdc0ab0d2c054e09e88c49f8..8c962c11eb045ed16164cad7533f152f3ccf3de5 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 78bf588246fc36cad289d6c6c098c8923ba3f061..256b0772a012c2aca7ccd92f869d512b0267ddfc 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 */ {