diff --git a/lib_com/options.h b/lib_com/options.h old mode 100644 new mode 100755 index f9f53108b57a8981751e3446b7926c941c418698..76ab7c14c0989f90c1611f42e1ca0643e78df0d1 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,7 @@ #define NONBE_FIX_225_MASA_EXT_REND /* Nokia: Resolve #225: Complete MASA external renderer implementation */ #define NONBE_FIX_897_USAN_WITH_MASA_RENDERING /* Nokia: issue #897: USAN null pointer in MASA external renderer to Ambisonics */ #define NONBE_FIX_903_OSBA_TO_STEREO /* VA: issue 903: fix OSBA to stereo rendering issue */ +#define NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT /* FhG: issue 811: change double precision functions to float in DFT Stereo */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c old mode 100644 new mode 100755 index 5c515aeb2a7a6d7e54c6f5ad86d60765420ed664..ad18db77784a9283e0fd6e4a11ccfc5c91bab2f6 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -135,10 +135,18 @@ static void stereo_dft_dequantize_res_gains_f( /* compensate for the offset and extract/remove sign of first index */ sign = ind1[i] < 15 ? -1 : 1; +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + i1 = (int16_t) floorf( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ); +#else i1 = (int16_t) floor( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ); +#endif fi = ( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ) - i1; +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + j1 = (int16_t) floorf( ind2[i] ); +#else j1 = (int16_t) floor( ind2[i] ); +#endif fj = ind2[i] - j1; /* choose base indices for interpolation */ diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c old mode 100644 new mode 100755 index 68164363be669aac2458abf9abdbfe83fee15b1f..e2b21bf61c6c54591867fa8db8c2d0f7dd15573d --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -2695,7 +2695,11 @@ static void stereo_dft_enc_compute_prm( { hStereoDft->dot_prod_real_smooth[b2] = 0.5f * hStereoDft->dot_prod_real_smooth[b2] + 0.5f * dot_prod_real2; hStereoDft->dot_prod_img_smooth[b2] = 0.5f * hStereoDft->dot_prod_img_smooth[b2] + 0.5f * dot_prod_img2; +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + pIpd[b2] = (float) atan2f( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] ); +#else pIpd[b2] = (float) atan2( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] ); +#endif ipd_smooth[b2] = stereo_dft_calc_mean_bipd( &pIpd[b2], hStereoDft->ipd_buf[b2] ); @@ -2825,7 +2829,11 @@ static void stereo_dft_enc_compute_prm( { conversion_factor = 2.f / 3; } +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + dItd32 = (int16_t) floorf( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f ); +#else dItd32 = (int16_t) floor( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f ); +#endif gain_offset = stereo_dft_gain_offset( c, dItd32 ); pPredGain[b] = max( 0, pPredGain[b] - gain_offset ); @@ -2861,7 +2869,11 @@ static void stereo_dft_enc_compute_prm( hStereoDft->sum_dot_prod_real = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_real + hStereoDft->sfm * sum_dot_prod_real; hStereoDft->sum_dot_prod_img = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_img + hStereoDft->sfm * sum_dot_prod_img; +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + pgIpd[0] = (float) atan2f( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real ); +#else pgIpd[0] = (float) atan2( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real ); +#endif stereo_dft_gipd_stabilization( &pgIpd[0], hStereoDft->prev_gipd, ipd_mean_change ); hStereoDft->prev_gipd = pgIpd[0]; diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c old mode 100644 new mode 100755 index 984c128e857283c71ed823471d0711bf79c791ce..8852a8425bd710c8e6d2e5efc75eec11cc24a2ad --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -1368,7 +1368,11 @@ void stereo_dft_enc_compute_itd( if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 ) { +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + int16_t tmp_itd = (int16_t) floorf( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f ); +#else int16_t tmp_itd = (int16_t) floor( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f ); +#endif hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset]; } } diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c old mode 100644 new mode 100755 index 9fbe5e273a7d9347023f580dc0dc4d4f7238235c..7f724685dd324073636ede5141fae4e4bcd01908 --- a/lib_enc/ivas_stereo_dft_td_itd.c +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -83,7 +83,11 @@ static void stereo_td_get_td_itd( { assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" ); d = (int16_t) ( input_Fs / 16000 ); +#ifdef NONBE_FIX_811_DFT_DOUBLE_TO_FLOAT + *td_itd_32 = 2 * (int16_t) floorf( itd / d + 0.5f ); +#else *td_itd_32 = 2 * (int16_t) floor( itd / d + 0.5f ); +#endif *td_itd = ( ( *td_itd_32 ) / 2 ) * d; }