Loading lib_enc/ivas_mcmasa_enc_fx.c +111 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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] */ Loading @@ -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, Loading Loading @@ -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]; Loading Loading @@ -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++ ) { Loading @@ -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++ ) { Loading @@ -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 ) { Loading Loading @@ -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) */ Loading Loading @@ -2133,6 +2242,7 @@ static void compute_cov_mtx_fx( } return; } #endif static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Loading Loading
lib_enc/ivas_mcmasa_enc_fx.c +111 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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] */ Loading @@ -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, Loading Loading @@ -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]; Loading Loading @@ -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++ ) { Loading @@ -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++ ) { Loading @@ -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 ) { Loading Loading @@ -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) */ Loading Loading @@ -2133,6 +2242,7 @@ static void compute_cov_mtx_fx( } return; } #endif static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Loading