Commit 6ad5703c authored by emerit's avatar emerit
Browse files

Merge branch 'main' into update_crend

parents 5bbcf554 c7b43a06
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -2170,6 +2170,7 @@ uint16_t get_indice_1(
 * Reset the buffer of encoder indices
 *-------------------------------------------------------------------*/

#ifndef IVAS_FLOAT_FIXED
void reset_indices_enc(
    BSTR_ENC_HANDLE hBstr,       /* i/o: encoder bitstream handle    */
    const Word16 max_num_indices /* i  : max number of indices       */
@@ -2187,6 +2188,28 @@ void reset_indices_enc(

    return;
}
#else
void reset_indices_enc(
    BSTR_ENC_HANDLE hBstr,       /* i/o: encoder bitstream handle    */
    const Word16 max_num_indices /* i  : max number of indices       */
)
{
    Word16 i;

    hBstr->nb_bits_tot = 0;
    move16();
    hBstr->nb_ind_tot = 0;
    move16();

    FOR( i = 0; i < max_num_indices; i++ )
    {
        hBstr->ind_list[i].nb_bits = -1;
        move16();
    }

    return;
}
#endif

/*-------------------------------------------------------------------*
 * reset_indices_dec()
+21 −19
Original line number Diff line number Diff line
@@ -1950,7 +1950,9 @@ void analysisCldfbEncoder_ivas(

void analysisCldfbEncoder_ivas_fx(
    Encoder_State *st,    /* i/o: encoder state structure   */
    const Word16 *timeIn,
    const Word32 *timeIn, /*q11*/
    Word16 timeInq,
    Word16 samplesToProcess,
    Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
    Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
    Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
@@ -1965,7 +1967,6 @@ void analysisCldfbEncoder_ivas_fx(
    Word32 *ppBuf_Imag[CLDFB_NO_COL_MAX];
    Word16 *ppBuf_Real16[CLDFB_NO_COL_MAX];
    Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX];
    Word32 workBuffer[256];

    FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
    {
@@ -1974,13 +1975,14 @@ void analysisCldfbEncoder_ivas_fx(
        ppBuf_Real16[i] = &realBuffer16[i][0];
        ppBuf_Imag16[i] = &imagBuffer16[i][0];
    }
    cldfbAnalysis_ivas_fx( timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc );

    cldfbAnalysisFiltering( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, scale, timeIn, 0, CLDFB_NO_COL_MAX, workBuffer );

    scale->lb_scale = sub( 16 + 5, timeInq );
    enerScale.lb_scale = negate( scale->lb_scale );
    enerScale.lb_scale16 = negate( scale->lb_scale );
    move16();
    move16();
    move16();

    AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 );

@@ -2793,7 +2795,7 @@ static void cldfb_init_proto_and_twiddles_enc(
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 17036;
                hs->scale = cldfb_scale_2_5ms[0];
                hs->p_filter = cldfb_protoFilter_2_5ms[0];
                hs->p_filter = CLDFB80_10_fx;
#endif
            }
            else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
@@ -2808,7 +2810,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 15388;
                hs->p_filter = cldfb_protoFilter_5_0ms[0];
                hs->p_filter = LDQMF_10_fx;
                hs->scale = cldfb_scale_5_0ms[0];
#endif
            }
@@ -2843,7 +2845,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = NULL;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 17051;
                hs->p_filter = cldfb_protoFilter_2_5ms[1];
                hs->p_filter = CLDFB80_16_fx;
                hs->scale = cldfb_scale_2_5ms[1];
#endif
            }
@@ -2859,7 +2861,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 15388;
                hs->p_filter = cldfb_protoFilter_5_0ms[1];
                hs->p_filter = LDQMF_16_fx;
                hs->scale = cldfb_scale_5_0ms[1];
#endif
            }
@@ -2900,7 +2902,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = NULL;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 17050;
                hs->p_filter = cldfb_protoFilter_2_5ms[2];
                hs->p_filter = CLDFB80_20_fx;
                hs->scale = cldfb_scale_2_5ms[2];
#endif
            }
@@ -2916,7 +2918,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 15390;
                hs->p_filter = cldfb_protoFilter_5_0ms[2];
                hs->p_filter = LDQMF_20_fx;
                hs->scale = cldfb_scale_5_0ms[2];
#endif
            }
@@ -2958,7 +2960,7 @@ static void cldfb_init_proto_and_twiddles_enc(
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 17051;
                hs->scale = cldfb_scale_2_5ms[6];
                hs->p_filter = cldfb_protoFilter_2_5ms[6];
                hs->p_filter = CLDFB80_30_fx;
#endif
            }
            else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
@@ -2974,7 +2976,7 @@ static void cldfb_init_proto_and_twiddles_enc(
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 15388;
                hs->scale = cldfb_scale_5_0ms[6];
                hs->p_filter = cldfb_protoFilter_5_0ms[6];
                hs->p_filter = LDQMF_30_fx;
#endif
            }
            break;
@@ -3008,7 +3010,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_im = NULL;
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 17050;
                hs->p_filter = cldfb_protoFilter_2_5ms[3];
                hs->p_filter = CLDFB80_32_fx;
                hs->scale = cldfb_scale_2_5ms[3];
#endif
            }
@@ -3025,7 +3027,7 @@ static void cldfb_init_proto_and_twiddles_enc(
#ifdef IVAS_FLOAT_FIXED
                hs->p_filter_sf = (Word16) 15392;
                hs->scale = cldfb_scale_5_0ms[3];
                hs->p_filter = cldfb_protoFilter_5_0ms[3];
                hs->p_filter = LDQMF_32_fx;
#endif
            }
            break;
@@ -3067,7 +3069,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->p_filter_sf = (Word16) 17051;
                hs->q_scale = norm_s( (Word16) CLDFB80_40_SCALE );
                hs->scale = cldfb_scale_2_5ms[4];
                hs->p_filter = cldfb_protoFilter_2_5ms[4];
                hs->p_filter = CLDFB80_40_fx;
#endif
            }
            else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
@@ -3086,7 +3088,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
                hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
                hs->p_filter_sf = (Word16) 15391;
                hs->p_filter = cldfb_protoFilter_5_0ms[4];
                hs->p_filter = LDQMF_40_fx;
                hs->scale = cldfb_scale_5_0ms[4];
#endif
            }
@@ -3131,7 +3133,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_re_fx = NULL;
                hs->rot_vec_syn_delay_im_fx = NULL;
                hs->p_filter_sf = (Word16) 17051;
                hs->p_filter = cldfb_protoFilter_2_5ms[5];
                hs->p_filter = CLDFB80_60_fx;
                hs->scale = cldfb_scale_2_5ms[5];
#endif
            }
@@ -3151,7 +3153,7 @@ static void cldfb_init_proto_and_twiddles_enc(
                hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
                hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
                hs->p_filter_sf = (Word16) 15391;
                hs->p_filter = cldfb_protoFilter_5_0ms[5];
                hs->p_filter = LDQMF_60_fx;
                hs->scale = cldfb_scale_5_0ms[5];
#endif
            }
+7 −0
Original line number Diff line number Diff line
@@ -745,12 +745,14 @@ enum
#define PIT_UP_SAMP6                        6
#define PIT_L_INTERPOL6_2                   17
#define PIT_FIR_SIZE6_2                     ( PIT_UP_SAMP6 * PIT_L_INTERPOL6_2 + 1 )
#define E_MIN_Q11_FX                            7                      /* minimum allowable energy in Q11*/
#define E_MIN                               0.0035f                /* minimum allowable energy */
#define E_MIN_Q11_FX                            7                      /* minimum allowable energy in Q11*/
#define STEP_DELTA                          0.0625f                /* quantization step for tilt compensation of gaussian cb. excitation */
#define GAMMA_EV                            0.92f                  /* weighting factor for core synthesis error weighting */
#define FORMANT_SHARPENING_NOISE_THRESHOLD  21.0f                  /* lp_noise level above which formant sharpening is deactivated */
#define E_MIN_FX                              1       /* QSCALE (Q7)*/
#define E_MIN_IVAS_FX                         1835       /* (Q19) (E12) */
#define STEP_DELTA_FX                         11
#define FORMANT_SHARPENING_NOISE_THRESHOLD_FX   5376     /* 21 (!8)lp_noise level above which formant sharpening is deactivated - at this level most of 20 dB SNR office noisy speech still uses sharpening */

@@ -1010,6 +1012,7 @@ typedef enum
#define BWD_COUNT_MAX                       100                     /* maximum value of BWD counter              */
#define BWD_N_BINS_MAX                      13                      /* maximum number of BWD bins */
#define BWS_TRAN_PERIOD                     5                       /* BWS - number of frames for transition period */
#define ONE_BY_BWS_TRAN_PERIOD_Q15          6554

#define PREEMPH_FAC_FLT                         0.68f                   /* preemphasis factor at 12.8kHz                */
#define PREEMPH_FAC_16k_FLT                     0.72f
@@ -1953,10 +1956,14 @@ typedef enum _DCTTYPE
#define ATT_NSEG                            32                      /* strong attack detection - number of time blocks */

#define TOD_NSPEC                           80                      /* number of spectral bins of the tonal detector */
#define TOD_NSPEC_INV_Q31                   26843546                /* inverse of number of spectral bins of the tonal detector */
#define TOD_THR_MASS                        0.86f                   /* initial value for the adaptive threshold of the tonal detector */
#define P2A_FACT                            0.9f                    /* long-term averaging factor for peak-to-average ratio */
#define P2A_FACT_FX_Q15                     29491                   /* long-term averaging factor for peak-to-average ratio */
#define THR_P2A_HIGH                        95.0f                   /* higher threshold to detect strongly peaky signals at low bitrates*/
#define THR_P2A                             80.0f                   /* lower threshold to detect strongly peaky signals at higher bitrates */
#define THR_P2A_HIGH_FX                     95                      /* Q0, higher threshold to detect strongly peaky signals at low bitrates*/
#define THR_P2A_FX                          80                      /* Q0, lower threshold to detect strongly peaky signals at higher bitrates */

/*----------------------------------------------------------------------------------*
 * LD music post-filter constants
+142 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include "rom_basop_util.h"
#include "rom_com.h"
#include "prot_fx.h"
#include "prot_fx_enc.h"
#include "ivas_prot_fx.h"

#define DELTA_SHIFT      2
@@ -2471,6 +2472,147 @@ void AnalysisSTFT_fx(
}
#endif // IVAS_FLOAT_FIXED

#ifdef IVAS_FLOAT_FIXED
/*-------------------------------------------------------------------
 * SynthesisSTFT_enc_ivas_fx()
 *
 * STFT synthesis filterbank
 *-------------------------------------------------------------------*/

void SynthesisSTFT_enc_ivas_fx(
    Word32 *fftBuffer,        /* i    : pointer to FFT bins */
    Word16 fftBufferExp,      /* i    : exponent of FFT bins */
    Word16 *timeDomainOutput, /* o    : pointer to time domain signal */
    Word16 *olapBuffer,       /* i/o  : pointer to overlap buffer */
    const PWord16 *olapWin,   /* i    : pointer to overlap window */
    Word16 tcx_transition,
    HANDLE_FD_CNG_COM hFdCngCom, /* i/o  : pointer to FD_CNG structure containing all buffers and variables */
    Word16 gen_exc,
    Word16 *Q_new,             /* i  : Q of generated exc_cng */
    const Word16 element_mode, /* i  : element mode */
    const Word16 nchan_out     /* i  : number of output channels */
)
{
    Word16 i, len, scale, tmp;
    Word16 len2, len3, len4;
    Word16 buf[M + 1 + L_FRAME16k];


    /* Perform IFFT */
    scale = 0;
    move16();
    BASOP_rfft( fftBuffer, hFdCngCom->fftlen, &scale, 1 );
    fftBufferExp = add( fftBufferExp, scale );
    hFdCngCom->fftBuffer_exp = fftBufferExp;
    move16();

    fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift );

    /* Perform overlap-add */
    /* Handle overlap in P/S domain for stereo */
    test();
    test();
    IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) )
    {
        Copy( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf, hFdCngCom->frameSize + M + 1 );
        set16_fx( olapBuffer, 0, hFdCngCom->fftlen );
    }
    ELSE
    {
        Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize );
        set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize );
    }
    len2 = shr( hFdCngCom->fftlen, 2 );
    len4 = shr( hFdCngCom->fftlen, 3 );
    len3 = add( len2, len4 );
    len = add( hFdCngCom->frameSize, len4 );
    IF( tcx_transition )
    {
        FOR( i = 0; i < len; i++ )
        {
            olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], sub( fftBufferExp, 15 ) ) );
            move16();
        }
    }
    ELSE
    {
        FOR( i = 0; i < len4; i++ )
        {
            olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], sub( fftBufferExp, 15 ) ) ), olapWin[i].v.im ) );
            move16();
            olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], sub( fftBufferExp, 15 ) ) ), olapWin[len4 - 1 - i].v.re ) );
            move16();
        }
        FOR( i = len3; i < len; i++ )
        {
            olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], sub( fftBufferExp, 15 ) ) );
            move16();
        }
    }

    FOR( i = 0; i < len4; i++ )
    {
        olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], sub( fftBufferExp, 15 ) ) ), olapWin[i].v.re );
        move16();
        olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], sub( fftBufferExp, 15 ) ) ), olapWin[len4 - 1 - i].v.im );
        move16();
    }

    len = add( len, len2 );
    FOR( i = len; i < hFdCngCom->fftlen; i++ )
    {
        olapBuffer[i] = 0;
        move16();
    }

    /* Get time-domain signal */
    FOR( i = 0; i < hFdCngCom->frameSize; i++ )
    {
        timeDomainOutput[i] = mult_r( olapBuffer[i + len4], hFdCngCom->fftlenFac );
        move16();
    }
    /* Generate excitation */
    test();
    test();
    IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) )
    {
        FOR( i = 0; i < hFdCngCom->frameSize / 2; i++ )
        {
            buf[i + ( M + 1 )] = add( buf[i + ( M + 1 )], olapBuffer[i + hFdCngCom->frameSize / 4] );
            move16();
        }

        FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ )
        {
            buf[i] = mult_r( buf[i], hFdCngCom->fftlenFac );
            move16();
        }
    }
    ELSE
    {
        FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ )
        {
            buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac );
            move16();
        }
        tmp = buf[0];
        move16();
    }
    IF( EQ_16( gen_exc, 1 ) )
    {

        E_UTIL_f_preemph2( sub( *Q_new, 1 ), buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp );
        Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 );
    }
    IF( EQ_16( gen_exc, 2 ) )
    {
        *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 );
        move16();
        Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 );
    }
}
#endif

/*-------------------------------------------------------------------
 * SynthesisSTFT()
 *
+2 −2
Original line number Diff line number Diff line
@@ -431,7 +431,7 @@ void apply_noisefill_HQ_fx(
                        {
                            cb_buff[i] = CodeBook_mod[cb_pos++];
                            move16();
                            L_E_cb_vec = L_mac0( L_E_cb_vec, cb_buff[i], cb_buff[i] ); /*Q24 (12+12) */
                            L_E_cb_vec = L_mac0_sat( L_E_cb_vec, cb_buff[i], cb_buff[i] ); /*Q24 (12+12) */

                            if ( GE_16( cb_pos, cb_size ) )
                            {
@@ -446,7 +446,7 @@ void apply_noisefill_HQ_fx(
                        {
                            cb_buff[i] = CodeBook[cb_pos++];
                            move16();
                            L_E_cb_vec = L_mac0( L_E_cb_vec, cb_buff[i], cb_buff[i] ); /*Q24 (12+12) */
                            L_E_cb_vec = L_mac0_sat( L_E_cb_vec, cb_buff[i], cb_buff[i] ); /*Q24 (12+12) */

                            if ( GE_16( cb_pos, cb_size ) )
                            {
Loading