Commit 4aff7de7 authored by reutelhuber's avatar reutelhuber
Browse files

Merge branch '811-double-precision-arithmetic-in-dft-stereo' into 'main'

Resolve "Double precision arithmetic in DFT stereo"

See merge request !1220
parents e4e76488 00532e93
Loading
Loading
Loading
Loading
Loading

lib_com/options.h

100644 → 100755
+1 −0
Original line number Original line Diff line number Diff line
@@ -166,6 +166,7 @@
#define NONBE_FIX_225_MASA_EXT_REND                           /* Nokia: Resolve #225: Complete MASA external renderer implementation */
#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_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_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 ########################### */
/* ##################### End NON-BE switches ########################### */


lib_dec/ivas_stereo_dft_dec.c

100644 → 100755
+8 −0
Original line number Original line Diff line number Diff line
@@ -135,10 +135,18 @@ static void stereo_dft_dequantize_res_gains_f(


        /* compensate for the offset and extract/remove sign of first index */
        /* compensate for the offset and extract/remove sign of first index */
        sign = ind1[i] < 15 ? -1 : 1;
        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 );
        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;
        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] );
        j1 = (int16_t) floor( ind2[i] );
#endif
        fj = ind2[i] - j1;
        fj = ind2[i] - j1;


        /* choose base indices for interpolation */
        /* choose base indices for interpolation */

lib_enc/ivas_stereo_dft_enc.c

100644 → 100755
+12 −0
Original line number Original line Diff line number Diff line
@@ -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_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;
                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] );
                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] );
                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;
                    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 );
                dItd32 = (int16_t) floor( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f );
#endif


                gain_offset = stereo_dft_gain_offset( c, dItd32 );
                gain_offset = stereo_dft_gain_offset( c, dItd32 );
                pPredGain[b] = max( 0, pPredGain[b] - gain_offset );
                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_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;
            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 );
            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 );
            stereo_dft_gipd_stabilization( &pgIpd[0], hStereoDft->prev_gipd, ipd_mean_change );
            hStereoDft->prev_gipd = pgIpd[0];
            hStereoDft->prev_gipd = pgIpd[0];
+4 −0
Original line number Original line Diff line number Diff line
@@ -1368,7 +1368,11 @@ void stereo_dft_enc_compute_itd(


        if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 )
        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 );
            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];
            hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset];
        }
        }
    }
    }
+4 −0
Original line number Original line Diff line number Diff line
@@ -83,7 +83,11 @@ static void stereo_td_get_td_itd(
    {
    {
        assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" );
        assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" );
        d = (int16_t) ( input_Fs / 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 );
        *td_itd_32 = 2 * (int16_t) floor( itd / d + 0.5f );
#endif
        *td_itd = ( ( *td_itd_32 ) / 2 ) * d;
        *td_itd = ( ( *td_itd_32 ) / 2 ) * d;
    }
    }