Commit a6323fe0 authored by Fabian Bauer's avatar Fabian Bauer
Browse files

addov

parent 3342b22c
Loading
Loading
Loading
Loading
Loading
+111 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@
#include "ivas_rom_enc.h"
#include "wmc_auto.h"
#include "ivas_prot_fx.h"

// #define compute_cov_mtx_fx_ADDCOV

/*-------------------------------------------------------------------------
 * Local constants
@@ -72,6 +72,17 @@ static void ivas_mcmasa_dmx_fx(
    const Word16 nchan_transport,
    const Word16 nchan_inp );

#ifdef compute_cov_mtx_fx_ADDCOV
/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */
static void compute_cov_mtx_fx(
    Word32 sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, real, s[ch][freq]               (inp_exp) */
    Word32 si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, imag, s[ch][freq]               (inp_exp) */
    Word16 num_freq_bands,
    const Word16 N,                                /* i  : Number of channels                                      */
    CovarianceMatrix pCOVls[MASA_FREQUENCY_BANDS], /* o  : Output matrix, contains upper part of cov mtx           */
    Word16 inp_exp,                                /*Stores exponent for temp*/
    Word16 *band_grouping );
#else
static void compute_cov_mtx_fx(
    Word32 sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, real, s[ch][freq]                         */
    Word32 si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, imag, s[ch][freq]                         */
@@ -80,6 +91,7 @@ static void compute_cov_mtx_fx(
    CovarianceMatrix *COVls,                                /* o  : Output matrix, contains upper part of cov mtx           */
    Word16 inp_exp                                          /*Stores exponent for temp*/
);
#endif

static void computeIntensityVector_enc_fx(
    const Word16 *band_grouping,
@@ -919,7 +931,11 @@ void ivas_mcmasa_param_est_enc_fx(
    Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; // renormalization_factor_diff_e
    Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS];
    Word32 norm_tmp_fx;
#ifdef compute_cov_mtx_fx_ADDCOV
    Word16 mrange[2];
#else
    Word16 mrange[2], brange[2];
#endif
    Word16 numSubFramesForRatio;
    CovarianceMatrix COVls[MASA_FREQUENCY_BANDS];
    Word32 absCOVls_fx[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS];
@@ -1064,6 +1080,20 @@ void ivas_mcmasa_param_est_enc_fx(
            }
            inp_q = add( inp_q, sf );

#ifdef compute_cov_mtx_fx_ADDCOV
            /* Compute covariance matrix */
            compute_cov_mtx_fx( Chnl_RealBuffer_fx, Chnl_ImagBuffer_fx, num_freq_bands, numAnalysisChannels, COVls, sub( 31, inp_q ), hMcMasa->band_grouping );

            FOR( i = 0; i < num_freq_bands; i++ )
            {
                /* Store energies for guiding metadata encoding */
                FOR( j = 0; j < numAnalysisChannels; j++ )
                {
                    move32();
                    hMasa->data.energy_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hMasa->data.energy_fx[block_m_idx][i], hMasa->data.energy_e[block_m_idx][i], COVls[i].xr_fx[j][j], COVls[i].xr_e[j][j], &hMasa->data.energy_e[block_m_idx][i] );
                }
            }
#else
            /* Compute covariance matrix */
            FOR( i = 0; i < num_freq_bands; i++ )
            {
@@ -1076,6 +1106,7 @@ void ivas_mcmasa_param_est_enc_fx(
                    compute_cov_mtx_fx( Chnl_RealBuffer_fx, Chnl_ImagBuffer_fx, j, numAnalysisChannels, &( COVls[i] ), sub( 31, inp_q ) );
                }


                /* Store energies for guiding metadata encoding */
                FOR( j = 0; j < numAnalysisChannels; j++ )
                {
@@ -1083,6 +1114,7 @@ void ivas_mcmasa_param_est_enc_fx(
                    hMasa->data.energy_fx[block_m_idx][i] = BASOP_Util_Add_Mant32Exp( hMasa->data.energy_fx[block_m_idx][i], hMasa->data.energy_e[block_m_idx][i], COVls[i].xr_fx[j][j], COVls[i].xr_e[j][j], &hMasa->data.energy_e[block_m_idx][i] );
                }
            }
#endif

            IF( !hMcMasa->separateChannelEnabled )
            {
@@ -2087,6 +2119,83 @@ static void ivas_mcmasa_dmx_fx(

    return;
}

#ifdef compute_cov_mtx_fx_ADDCOV

/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */
static void compute_cov_mtx_fx(
    Word32 sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, real, s[ch][freq]               (inp_exp) */
    Word32 si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, imag, s[ch][freq]               (inp_exp) */
    Word16 num_freq_bands,
    const Word16 N,                                /* i  : Number of channels                                      */
    CovarianceMatrix pCOVls[MASA_FREQUENCY_BANDS], /* o  : Output matrix, contains upper part of cov mtx           */
    Word16 inp_exp,                                /*Stores exponent for temp*/
    Word16 *band_grouping )
{
    Word16 brange[2];
    Word16 freq;
    int k;
    int i, j;
    Word16 max_exp_r, max_exp_i;
    Word64 temp64_1_r_acc, temp64_1_i_acc;
    Word64 temp64_1;
    Word16 tmp_16;
    Word16 temp_exp = shl( inp_exp, 1 );


    FOR( i = 0; i < N; i++ )
    {
        FOR( j = i; j < N; j++ )
        {
            FOR( k = 0; k < num_freq_bands; k++ )
            {
                brange[0] = band_grouping[k];
                move16();
                brange[1] = band_grouping[k + 1];
                move16();
                CovarianceMatrix *COVls = &( pCOVls[k] );

                temp64_1_r_acc = W_deposit32_h( COVls->xr_fx[i][j] );
                max_exp_r = s_max( COVls->xr_e[i][j], temp_exp );
                temp64_1_r_acc = W_shl( temp64_1_r_acc, sub( COVls->xr_e[i][j], max_exp_r ) ); // exp:max_exp_r

                temp64_1_i_acc = W_deposit32_h( COVls->xi_fx[i][j] ); // exp:COVls->xi_e[i][j]
                max_exp_i = s_max( COVls->xi_e[i][j], temp_exp );
                temp64_1_i_acc = W_shl( temp64_1_i_acc, sub( COVls->xi_e[i][j], max_exp_i ) ); // exp:max_exp_i

                FOR( freq = brange[0]; freq < brange[1]; freq++ )
                {
                    temp64_1 = W_mac_32_32( W_mult_32_32( sr[i][freq], sr[j][freq] ), si[i][freq], si[j][freq] ); // exp:2*inp_exp
                    temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp_r ) ); // exp:max_exp_r
                    temp64_1_r_acc = W_add( temp64_1, temp64_1_r_acc );       // exp:max_exp_r

                    temp64_1 = W_sub( W_mult_32_32( si[i][freq], sr[j][freq] ), W_mult_32_32( sr[i][freq], si[j][freq] ) ); // exp :2*inp_exp
                    temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp_i ) ); // exp:max_exp_i
                    temp64_1_i_acc = W_add( temp64_1, temp64_1_i_acc );       // exp:max_exp_i
                }

                tmp_16 = W_norm( temp64_1_r_acc );

                COVls->xr_fx[i][j] = W_extract_h( W_shl( temp64_1_r_acc, tmp_16 ) ); // exp:max_exp-tmp_16
                COVls->xr_e[i][j] = sub( max_exp_r, tmp_16 );
                move32();
                move16();

                tmp_16 = W_norm( temp64_1_i_acc );

                COVls->xi_fx[i][j] = W_extract_h( W_shl( temp64_1_i_acc, tmp_16 ) ); // exp:max_exp-tmp_16
                COVls->xi_e[i][j] = sub( max_exp_i, tmp_16 );
                move32();
                move16();

            }
        }
    }
    return;
}


#else
/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */
static void compute_cov_mtx_fx(
    Word32 sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i  : Input matrix, real, s[ch][freq]               (inp_exp) */
@@ -2133,6 +2242,7 @@ static void compute_cov_mtx_fx(
    }
    return;
}
#endif

static void computeIntensityVector_enc_fx(
    const Word16 *band_grouping,