Commit 6b31c960 authored by Stephane Ragot's avatar Stephane Ragot
Browse files

extra enhancements; version used in testing

parent d584c497
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -660,7 +660,9 @@ static void norm_quat(
        // however the detection of zero norm is done here for general code robustness
        set_zero( q, 4 );
        q[0] = 1.f;
	} else {
    }
    else
    {
		norm_q = inv_sqrt( norm_q );
        for ( i = 0; i < IVAS_PCA_INTERP; i++ )
        {
+5 −0
Original line number Diff line number Diff line
@@ -4364,7 +4364,12 @@ void ivas_pca_enc(
    BSTR_ENC_HANDLE hMetaData,                                  /* i/o: MetaData handle                         */
    float *data_f[8],                                           /* i  : input/transformed audio channels        */
    const int16_t input_frame,                                  /* i  : input frame length                      */
#ifdef PCA_ENH
    const int16_t n_channels,                                   /* i  : number of channels                  */
    int16_t is_transient                                        /* i  : transient detector flag */
#else
    const int16_t n_channels                                    /* i  : number of channels                      */
#endif
);

void ivas_pca_read_bits( 
+50 −6
Original line number Diff line number Diff line
@@ -49,7 +49,9 @@

#define IVAS_PCA_SM_FAC    0.0234375f
#define IVAS_PCA_N_ITER_QR 10

#ifdef PCA_ENH
#define SILENT_CHANNEL_THRES 100
#endif

/*-----------------------------------------------------------------------*
 * Local function definitions
@@ -270,12 +272,19 @@ void ivas_pca_enc(
    BSTR_ENC_HANDLE hMetaData,                  /* i/o: MetaData handle                     */
    float *data_f[8],                           /* i  : input/transformed audio channels    */
    const int16_t input_frame,                  /* i  : input frame length                  */
#ifdef PCA_ENH
    const int16_t n_channels, /* i  : number of channels                  */
    int16_t is_transient      /* i  : transient detector flag */
#else
    const int16_t n_channels                    /* i  : number of channels                  */
#endif
)
{
    int16_t i, j, k, l;
#ifndef PCA_ENH
    int16_t len_subfr;
    float r[FOA_CHANNELS * FOA_CHANNELS];          /* covariance matrix */
#endif
	float eigVec[FOA_CHANNELS *FOA_CHANNELS];   /* eigenvectors in current frame */
    float eigVec_tmp[FOA_CHANNELS * FOA_CHANNELS]; /* transpose / tmp matrix for permutation */
    float cost_mtx[FOA_CHANNELS * FOA_CHANNELS];   /* cost matrix */
@@ -291,7 +300,9 @@ void ivas_pca_enc(
    float fac_D, sum_D;
    float fac_cost;
    float r_sm[16];
#ifndef PCA_ENH
    float alpha;
#endif
    float D_tmp[FOA_CHANNELS];
    int32_t ivas_total_brate;
    float min_dot, dotl, dotr;
@@ -305,10 +316,8 @@ void ivas_pca_enc(

    ivas_total_brate = hEncoderConfig->ivas_total_brate;

#ifndef PCA_ENH
    /* if PCA is disabled, just pass-through */
#ifdef PCA_ENH
    push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 );
#else
    if ( hEncoderConfig->Opt_PCA_ON == 0 )
    {
        /* write by-pass indicator */
@@ -363,6 +372,13 @@ void ivas_pca_enc(
    /*-----------------------------------------------------------------*
     * Covariance
     *-----------------------------------------------------------------*/
#ifdef PCA_ENH
    for ( k = 0; k < FOA_CHANNELS; k++ )
    {
        ptr_sig[k] = &data_f[k][0];
    }
    cov_subfr( ptr_sig, r_sm, FOA_CHANNELS, input_frame );
#else

    len_subfr = input_frame / 2;

@@ -382,7 +398,7 @@ void ivas_pca_enc(
            hPCA->old_r_sm[k] = r_sm[k];
        }
    }

#endif
    /* conditioning */
    for ( k = 0; k < FOA_CHANNELS; k++ )
    {
@@ -432,7 +448,11 @@ void ivas_pca_enc(
    dist_alt = 0.0;
    for ( k = 0; k < FOA_CHANNELS; k++ )
    {
#ifdef PCA_ENH
        dist_alt += logf( r_sm[k * FOA_CHANNELS + k] * fac_D + 1e-8f );
#else
        dist_alt += logf( r[k * FOA_CHANNELS + k] * fac_D + 1e-8f );
#endif
        dist_alt -= logf( D[k] + 1e-8f );
    }

@@ -440,7 +460,11 @@ void ivas_pca_enc(
     * Eigenvector alignment
     *-----------------------------------------------------------------*/

#ifdef PCA_ENH
    if ( 1 )
#else
    if ( hPCA->prev_bypass_decision == PCA_MODE_ACTIVE )
#endif
    {
        /* compute absolute cost matrix */
        for ( k = 0; k < n_channels; k++ ) /* column */
@@ -544,6 +568,12 @@ void ivas_pca_enc(
        min_dot2 = qr[0];

    bypass_decision = PCA_MODE_ACTIVE;
#ifdef PCA_ENH
    if ( is_transient )
    {
        bypass_decision = PCA_MODE_INACTIVE;
    }
#endif
    if ( dist_alt < IVAS_PCA_THRES_DIST_ALT )
    {
        bypass_decision = PCA_MODE_INACTIVE;
@@ -557,6 +587,20 @@ void ivas_pca_enc(
        bypass_decision = PCA_MODE_INACTIVE;
    }

#ifdef PCA_ENH
    if ( hEncoderConfig->sba_planar )
    {
        bypass_decision = PCA_MODE_INACTIVE;
    }
    for ( k = 0; k < FOA_CHANNELS; k++ )
    {
		if ( r_sm[k * FOA_CHANNELS + k] < SILENT_CHANNEL_THRES )
        {
           bypass_decision = PCA_MODE_INACTIVE;
        }
	}
#endif

    /* if PCA is inactive */
    if ( bypass_decision == PCA_MODE_INACTIVE )
    {
+5 −0
Original line number Diff line number Diff line
@@ -850,7 +850,12 @@ static ivas_error ivas_spar_enc_process(

    if ( hSpar->hPCA != NULL )
    {

#ifdef PCA_ENH 
        ivas_pca_enc( hEncoderConfig, hSpar->hPCA, hMetaData, p_pcm_tmp, input_frame, FOA_CHANNELS, transient_det[0] );
#else
        ivas_pca_enc( hEncoderConfig, hSpar->hPCA, hMetaData, p_pcm_tmp, input_frame, FOA_CHANNELS );
#endif
    }
    else
    {