Commit 28671f13 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'ivas_enc_funcs_fxd_conversion' into 'main'

Encoder functions converted to fixed point

See merge request !497
parents cb7c961c 514a9689
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -174,6 +174,19 @@ Word32 BASOP_Util_InvLog2( Word32 x )
    return retVal;
}

Word32 BASOP_Util_Log10( Word32 x, Word16 e )
{
    Word32 res = BASOP_Util_Log2( x );
    res = L_add( Mpy_32_32( res, 646456993 /* log10(2) in Q31 */ ), Mpy_32_32( L_shl( e, 25 ), 646456993 /* log10(2) in Q31 */ ) ); // Adjusting for the exponent mismatch: multiplying first so as to avoid saturation
    return res;
}

Word32 BASOP_Util_Loge( Word32 x, Word16 e )
{
    Word32 res = BASOP_Util_Log2( x );
    res = L_add( Mpy_32_32( res, 1488522235 /* loge(2) in Q31 */ ), Mpy_32_32( L_shl( e, 25 ), 1488522235 /* loge(2) in Q31 */ ) ); // Adjusting for the exponent mismatch: multiplying first so as to avoid saturation
    return res;
}

Word16 BASOP_Util_Add_MantExp /*!< Exponent of result        */
    ( Word16 a_m,             /*!< Mantissa of 1st operand a */
+2 −0
Original line number Diff line number Diff line
@@ -340,6 +340,8 @@ Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, /*!< i : Numerator*/
 */
/************************************************************************/
Word32 BASOP_Util_Log2( Word32 x );
Word32 BASOP_Util_Log10( Word32 x, Word16 e );
Word32 BASOP_Util_Loge( Word32 x, Word16 e );


/****************************************************************************/
+76 −0
Original line number Diff line number Diff line
@@ -163,6 +163,16 @@ ivas_error ivas_sce_enc(
    const int16_t nb_bits_metadata                              /* i  : number of metadata bits                 */
);

#ifdef IVAS_FLOAT_FIXED
ivas_error ivas_cpe_enc(
    Encoder_Struct *st_ivas,       /* i/o: IVAS encoder structure          */
    const Word16 cpe_id,          /* i  : CPE # identifier                */
    float data_f_ch0[],      /* i  : input signal for channel 0      */
    float data_f_ch1[],      /* i  : input signal for channel 1      */
    const Word16 input_frame,     /* i  : input frame length per channel  */
    const Word16 nb_bits_metadata /* i  : number of metadata bits         */
);
#else
ivas_error ivas_cpe_enc(
    Encoder_Struct *st_ivas,                                    /* i/o: IVAS encoder structure                  */
    const int16_t cpe_id,                                       /* i  : CPE # identifier                        */
@@ -171,6 +181,7 @@ ivas_error ivas_cpe_enc(
    const int16_t input_frame,                                  /* i  : input frame length per channel          */
    const int16_t nb_bits_metadata                              /* i  : number of metadata bits                 */
);
#endif

ivas_error ivas_mct_enc(
    Encoder_Struct *st_ivas,                                    /* i/o: IVAS encoder structure                  */
@@ -1684,10 +1695,17 @@ void stereo_enc_itd_init_fx(
    ITD_DATA_HANDLE hItd                                        /* i/o: encoder ITD handle                  */
);

#ifdef IVAS_FLOAT_FIXED
void stereo_dft_enc_update_fx(
    STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle     */
    const Word16 max_bwidth               /* i  : maximum encoded bandwidth */
);
#else
void stereo_dft_enc_update(
    STEREO_DFT_ENC_DATA_HANDLE hStereoDft,                      /* i/o: encoder DFT stereo handle           */
    const int16_t max_bwidth                                    /* i  : maximum encoded bandwidth           */
);
#endif

void stereo_dft_enc_destroy(
    STEREO_DFT_ENC_DATA_HANDLE *hStereoDft                      /* i/o: encoder DFT stereo handle           */
@@ -1703,6 +1721,19 @@ void stereo_dft_enc_analyze(
    float *input_mem[CPE_CHANNELS]                              /* i/o: input buffer memory                 */
);

#ifdef IVAS_FLOAT_FIXED
void stereo_dft_enc_analyze_fx(
  Encoder_State **sts,                                        /* i/o: encoder state structure             */
  const Word16 n_channels,                                   /* i  : number of input channels            */
  const Word16 input_frame,                                  /* i  : input frame length                  */
  STEREO_DFT_ENC_DATA_HANDLE hStereoDft,                      /* i/o: encoder DFT stereo handle           */
  STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,                    /* i/o: encoder MDCT stereo handle          */
  Word32 DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC],              /* o  : DFT buffers                         */
  Word16 *input_mem[CPE_CHANNELS],                              /* i/o: input buffer memory                 */
  Word16 *q_input_mem
  );
#endif

float stereo_dft_enc_synthesize(
    STEREO_DFT_ENC_DATA_HANDLE hStereoDft,                      /* i/o: encoder DFT stereo handle           */
    float *output,                                              /* o  : output synthesis                    */
@@ -2187,6 +2218,22 @@ void stereo_dft_hybrid_ITD_flag(
    const Word16 hybrid_itd_max                                /* i  : flag for hybrid ITD for very large ITDs */
);

#ifdef IVAS_FLOAT_FIXED
void stereo_dft_enc_compute_itd_fx(
    CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure           */
    Word32 *DFT_L,
    Word16 DFT_L_e,
    Word32 *DFT_R,
    Word16 DFT_R_e,
    const Word16 k_offset,
    const Word16 input_frame,
    const Word16 vad_flag_dtx[],
    const Word16 vad_hover_flag[],
    Word32 *bin_nrgL,
    Word16 *bin_nrgL_e,
    Word32 *bin_nrgR,
    Word16 *bin_nrgR_e );
#endif
void stereo_dft_enc_compute_itd(
    CPE_ENC_HANDLE hCPE,                                        /* i/o: CPE encoder structure                   */
    float *DFT_L,
@@ -2223,6 +2270,20 @@ void stereo_td_itd(
    float *input_mem[CPE_CHANNELS]                              /* i/o: input buffer memory                     */
);

#ifdef IVAS_FLOAT_FIXED
void stereo_td_itd_fx(
  ITD_DATA *hITD,                                             /* i/o: ITD data structure                      */
  Word16 input_mem_itd_fx[CPE_CHANNELS][STEREO_DFT_OVL_MAX],      /* o  : ITD memory (only used in DFT Stereo)    */
  Word16 *q_input_mem_itd,
  const Word16 hybrid_itd_flag,                              /* i  : flag for hybrid TD/FD ITD processing    */
  const Word16 dft_ovl,                                      /* i  : size of DFT overlap                     */
  Encoder_State **sts,                                        /* i/o: Encoder state structure                 */
  const Word16 input_frame,                                  /* i  : input frame length                      */
  Word16 *input_mem[CPE_CHANNELS],                            /* i/o: input buffer memory                     */
  Word16 *q_input_mem
);
#endif

void stereo_dft_dmx_out_reset(
    STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx                    /* i/o: DFT stereo DMX decoder                  */
);
@@ -2560,6 +2621,13 @@ void unclr_classifier_td(
    CPE_ENC_HANDLE hCPE                                         /* i/o: CPE encoder structure                           */
);

#ifdef IVAS_FLOAT_FIXED
void xtalk_classifier_dft_fx(
    CPE_ENC_HANDLE hCPE,    /* i/o: CPE encoder structure                   */
    const Word16 itd,       /* i  : ITD from DFT stereo - used as a feature */
    const Word32 gcc_phat[] /* i  : GPHAT cross-channel correlation function Q31*/
);
#endif
void xtalk_classifier_dft(
    CPE_ENC_HANDLE hCPE,                                        /* i/o: CPE encoder structure                           */
    const int16_t itd,                                          /* i  : ITD from DFT stereo - used as a feature         */
@@ -3817,6 +3885,14 @@ int16_t check_bounds_s(
    const int16_t high                                          /* i  : High limit                              */
);

#ifdef IVAS_FLOAT_FIXED
Word16 check_bounds_s_fx(
    const Word16 value, /* i  : Input value                  */
    const Word16 low,   /* i  : Low limit                    */
    const Word16 high   /* i  : High limit                   */
);
#endif

Word32 check_bounds_l(
    const Word32 value, /* i  : Input value                  */
    const Word32 low,   /* i  : Low limit                    */
+11 −0
Original line number Diff line number Diff line
@@ -1189,6 +1189,17 @@ void create_IDCT_N_Matrix_fx(
    const Word16 alloc_size   /* i  : RAM buffer size in elements                    */
);

void extend_dctN_input_fx(
    const Word32 *input,     /* i  :  input in fdcng domain                        */
    const Word32 *dct_input, /* i  :  input in dctN(fdcng) domain                  */
    const Word16 in_dim,     /* i  :  in_dim == N                                  */
    Word32 *ext_sig,         /* o  :  extended output in fdcng domain              */
    const Word16 out_dim,    /* i  :  output total dim                             */
    Word32 *matrix,          /* i  : idct synthesis matrix N rows, n_cols  columns */
    const Word16 n_cols,     /* i  : number of columns ==  DCT truncation length   */
    const DCTTYPE dcttype    /* i  : matrix operation type                         */
);

void ivas_dirac_dec_get_frequency_axis_fx(
    Word16 *frequency_axis, /* Q0 */
    const Word32 output_Fs,
+51 −0
Original line number Diff line number Diff line
@@ -2828,6 +2828,57 @@ void extend_dctN_input(
    return;
}

#ifdef IVAS_FLOAT_FIXED
void extend_dctN_input_fx(
    const Word32 *input,     /* i  :  input in fdcng domain                        Q */
    const Word32 *dct_input, /* i  :  input in dctN(fdcng) domain                  Q */
    const Word16 in_dim,     /* i  :  in_dim == N                                  */
    Word32 *ext_sig,         /* o  :  extended output in fdcng domain              Q */
    const Word16 out_dim,    /* i  :  output total dim                             */
    Word32 *matrix,          /* i  : idct synthesis matrix N rows, n_cols  columns  31 */
    const Word16 n_cols,     /* i  : number of columns ==  DCT truncation length   */
    const DCTTYPE dcttype    /* i  : matrix operation type                         */
)
{
    Word16 i, j, i_rev;
    const Word32( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix;

    /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC)   matrix  */
    assert( in_dim < FDCNG_VQ_MAX_LEN );
    assert( out_dim <= FDCNG_VQ_MAX_LEN );
    assert( out_dim > in_dim );
    assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/
    assert( ( dcttype & 1 ) != 0 );            /* idct tables always in use for this basis vector extension */

    Copy32( input, ext_sig, in_dim ); /* copy initial part,  i.e.  only  last/tail  parts are  extended */
    set32_fx( &( ext_sig[in_dim] ), 0, sub( out_dim, in_dim ) );

    i_rev = in_dim; /*ptr init*/
    move16();
    FOR( i = in_dim; i < out_dim; i++ )
    { /* for each extension sample */
        /*   i  = 21  22  23;
          i_rev = 20  19  18;    for odd dctII  reflect basis vector
         */
        i_rev = sub( i_rev, 1 );

        FOR( j = 0; j < n_cols; j++ ) /* for each available  DCT coeff */
        {
            /* DCTcoeff * reflected basis vector */
#define WMC_TOOL_SKIP
            /*  pure ptr MAC   operations */
            ext_sig[i] = L_add( ext_sig[i], Mpy_32_32( dct_input[j], ptr[i_rev][j] ) ); /* sum up scaled and extended basis vector */
            // Q31 + Q - Q31 -> Q
            move32();
            MAC( 1 );
#undef WMC_TOOL_SKIP
        }
    }

    return;
}

#endif

/*-------------------------------------------------------------------*
 * create_IDCT_N_Matrix()
Loading