LCOV - code coverage report
Current view: top level - lib_com - ivas_spar_com_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 2263 2625 86.2 %
Date: 2025-05-03 01:55:50 Functions: 31 31 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <stdint.h>
      34             : #include "math.h"
      35             : #include "options.h"
      36             : #include "basop_util.h"
      37             : #include "ivas_stat_com.h"
      38             : #include "prot_fx.h"
      39             : #include "rom_com.h"
      40             : #include "ivas_rom_com.h"
      41             : #include "cnst.h"
      42             : #include <assert.h>
      43             : #include "wmc_auto.h"
      44             : #include "basop_util.h"
      45             : #include "basop32.h"
      46             : #include "ivas_prot_fx.h"
      47             : #include "ivas_rom_com_fx.h"
      48             : 
      49             : 
      50             : /*------------------------------------------------------------------------------------------*
      51             :  * Local constants
      52             :  *------------------------------------------------------------------------------------------*/
      53             : 
      54             : #define IVAS_FIX_EPS     ( 1 )
      55             : #define IVAS_FIX_EPS_Q40 ( 110 )
      56             : 
      57             : 
      58             : #define IVAS_ACTIVEW_DM_F_Q30                    ( ONE_IN_Q30 ) /*1 Q30*/
      59             : #define IVAS_ACTIVEW_DM_F_DTX_Q30                ( 268435456 )  /*0.25 Q30*/
      60             : #define IVAS_ACTIVEW_DM_F_VLBR_Q30               ( 268435456 )  /*0.25 Q30*/
      61             : #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29 ( 1610612736 ) /*3 Q29*/
      62             : 
      63             : #define IVAS_P_NORM_SCALING_FX     ( ONE_IN_Q31 ) // 1 Q31
      64             : #define IVAS_P_NORM_SCALING_DTX_FX ( 1610612736 ) // 0.75 Q31
      65             : 
      66             : #define IVAS_MAT_DIM_3 ( 3 )
      67             : #define IVAS_MAT_DIM_2 ( 2 )
      68             : #define IVAS_MAT_DIM_1 ( 1 )
      69             : #define MAX_MAT_DIM    ( FOA_CHANNELS - 1 )
      70             : 
      71             : /*------------------------------------------------------------------------------------------*
      72             :  * Static functions declaration
      73             :  *------------------------------------------------------------------------------------------*/
      74             : 
      75             : static void ivas_get_pred_coeffs_enc_fx(
      76             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
      77             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
      78             :     Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
      79             :     Word16 *q_pred_coeffs,
      80             :     Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
      81             :     Word16 *q_dm_fv_re,
      82             :     const Word16 in_chans,
      83             :     const Word16 start_band,
      84             :     const Word16 end_band,
      85             :     const Word16 active_w,
      86             :     const Word16 active_w_vlbr,
      87             :     const Word16 dtx_vad,
      88             :     const Word16 from_dirac,
      89             :     const Word16 dyn_active_w_flag,
      90             :     const Word16 res_ind );
      91             : 
      92             : static void ivas_get_Wscaling_factor_enc_fx(
      93             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
      94             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
      95             :     Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
      96             :     Word16 q_pred_coeffs_re,
      97             :     Word32 ***mixer_mat, /*q_mixer_mat*/
      98             :     Word16 q_mixer_mat,
      99             :     const Word16 start_band,
     100             :     const Word16 end_band,
     101             :     const Word16 dtx_vad,
     102             :     const Word16 num_ch,
     103             :     const Word16 *pNum_dmx,
     104             :     const Word16 bands_bw,
     105             :     const Word16 active_w,
     106             :     const Word16 active_w_vlbr,
     107             :     Word32 *pWscale, /*q_pWscale*/
     108             :     Word16 *q_pWscale,
     109             :     const Word16 dyn_active_w_flag );
     110             : 
     111             : static void ivas_calc_post_pred_per_band_enc_fx(
     112             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
     113             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     114             :     Word32 ***mixer_mat, /*q_mixer_mat*/
     115             :     Word16 q_mixer_mat,
     116             :     const Word16 num_ch,
     117             :     const Word16 band_idx,
     118             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
     119             :     Word16 *q_postpred_cov_re );
     120             : 
     121             : static void ivas_get_pred_coeffs_fx(
     122             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],              /*Q30*/
     123             :     Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
     124             :     Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS],       /*q_dm_fv_re*/
     125             :     const Word16 in_chans,
     126             :     const Word16 start_band,
     127             :     const Word16 end_band,
     128             :     const Word16 active_w,
     129             :     const Word16 active_w_vlbr,
     130             :     const Word16 dtx_vad,
     131             :     const Word16 from_dirac,
     132             :     const Word16 dyn_active_w_flag,
     133             :     const Word16 res_ind,
     134             :     Word16 *q_pred_coeffs,
     135             :     Word16 *q_dm_fv_re );
     136             : static void ivas_reorder_array_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /*qx*/, const Word16 in_chans, const Word16 order[IVAS_SPAR_MAX_CH], Word32 ***mixer_mat /*qx*/, const Word16 start_band, const Word16 end_band );
     137             : static void ivas_get_Wscaling_factor_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_cov_real*/, Word16 q_cov_real, Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS] /*q_pred_coeffs_re*/, Word16 q_pred_coeffs_re, Word32 ***mixer_mat /*q_mixer_mat*/, Word16 q_mixer_mat, const Word16 start_band, const Word16 end_band, const Word16 dtx_vad, const Word16 num_ch, const Word16 *pNum_dmx, const Word16 bands_bw, const Word16 active_w, const Word16 active_w_vlbr, Word32 *pWscale /*q_pWscale*/, Word16 *q_pWscale, const Word16 dyn_active_w_flag );
     138             : static void ivas_calc_post_pred_per_band_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_cov_real*/, Word16 q_cov_real, Word32 ***mixer_mat /*q_mixer_mat*/, Word16 q_mixer_mat, const Word16 num_ch, const Word16 band_idx, Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_postpred_cov_re*/, Word16 *q_postpred_cov_re );
     139             : static Word16 ivas_is_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_in_re*/, Word16 q_in_re, const Word16 dim );
     140             : static void ivas_calc_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_in_re*/, Word16 q_in_re, const Word16 dim, Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_out_re*/, Word16 *q_out_re );
     141             : 
     142             : /*-----------------------------------------------------------------------------------------*
     143             :  * Function ivas_get_bw_idx_from_sample_rate()
     144             :  *
     145             :  * Get bwidth index from sample rate.
     146             :  *-----------------------------------------------------------------------------------------*/
     147             : 
     148             : /*! r: audio BW index */
     149      158628 : Word16 ivas_get_bw_idx_from_sample_rate_fx(
     150             :     const Word32 sampling_rate /* i  : sampling rate */
     151             : )
     152             : {
     153      158628 :     Word16 bwidth = 0;
     154      158628 :     move16();
     155             : 
     156      158628 :     SWITCH( sampling_rate )
     157             :     {
     158       12158 :         case 16000:
     159       12158 :             bwidth = WB;
     160       12158 :             move16();
     161       12158 :             BREAK;
     162       70962 :         case 32000:
     163       70962 :             bwidth = SWB;
     164       70962 :             move16();
     165       70962 :             BREAK;
     166       75508 :         case 48000:
     167       75508 :             bwidth = FB;
     168       75508 :             move16();
     169       75508 :             BREAK;
     170           0 :         default:
     171           0 :             assert( !"Unsupported sample rate!" );
     172             :     }
     173             : 
     174      158628 :     return bwidth;
     175             : }
     176             : 
     177             : /*-------------------------------------------------------------------------
     178             :  * ivas_spar_config()
     179             :  *
     180             :  * SPAR configuration function
     181             :  *------------------------------------------------------------------------*/
     182             : 
     183        6107 : void ivas_spar_config_fx(
     184             :     Word32 ivas_total_brate,    /* i  : codec total bitrate                  */
     185             :     const Word16 sba_order,     /* i  : Ambisonic (SBA) order                */
     186             :     Word16 *nchan_transport,    /* o  : number of transport channels         */
     187             :     Word16 *nSCE,               /* o  : number of SCEs                       */
     188             :     Word16 *nCPE,               /* o  : number of CPEs                       */
     189             :     Word32 *core_nominal_brate, /* o  : core-coding nominal bitrate          */
     190             :     const Word16 sid_format     /* i  : IVAS format indicator from SID frame */
     191             : )
     192             : {
     193        6107 :     IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
     194             :     {
     195           0 :         IF( EQ_16( sid_format, SID_SBA_1TC ) )
     196             :         {
     197           0 :             *nchan_transport = 1;
     198           0 :             move16();
     199             :         }
     200             :         ELSE
     201             :         {
     202           0 :             *nchan_transport = 2;
     203           0 :             move16();
     204             :         }
     205             :     }
     206             :     ELSE
     207             :     {
     208        6107 :         *nchan_transport = ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_order );
     209        6107 :         move16();
     210             :     }
     211             : 
     212        6107 :     IF( GT_16( *nchan_transport, 1 ) )
     213             :     {
     214        3953 :         *nCPE = shr( add( *nchan_transport, 1 ), 1 );
     215        3953 :         move16();
     216             :     }
     217             :     ELSE
     218             :     {
     219        2154 :         *nCPE = 0;
     220        2154 :         move16();
     221             :     }
     222             : 
     223        6107 :     *nSCE = s_max( 0, sub( *nchan_transport, shl( *nCPE, 1 ) ) );
     224        6107 :     move16();
     225             : 
     226        6107 :     IF( EQ_16( *nchan_transport, 1 ) )
     227             :     {
     228             :         /* map SPAR SID bitrate to SPAR active bitrate */
     229        2154 :         if ( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
     230             :         {
     231           0 :             ivas_total_brate = IVAS_32k;
     232           0 :             move32();
     233             :         }
     234        2154 :         assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 );
     235        2154 :         IF( EQ_32( ivas_total_brate, IVAS_32k ) )
     236             :         {
     237         469 :             *core_nominal_brate = ACELP_24k40;
     238         469 :             move32();
     239             :         }
     240        1685 :         ELSE IF( EQ_32( ivas_total_brate, IVAS_24k4 ) )
     241             :         {
     242         442 :             *core_nominal_brate = ACELP_16k40;
     243         442 :             move32();
     244             :         }
     245        1243 :         ELSE IF( EQ_32( ivas_total_brate, IVAS_16k4 ) )
     246             :         {
     247         650 :             *core_nominal_brate = ACELP_13k20;
     248         650 :             move32();
     249             :         }
     250         593 :         ELSE IF( EQ_32( ivas_total_brate, IVAS_13k2 ) )
     251             :         {
     252         593 :             *core_nominal_brate = ACELP_9k60;
     253         593 :             move32();
     254             :         }
     255             :     }
     256             : 
     257        6107 :     return;
     258             : }
     259             : 
     260             : /*-----------------------------------------------------------------------------------------*
     261             :  * Function ivas_get_spar_table_idx()
     262             :  *
     263             :  * Get SPAR table index
     264             :  *-----------------------------------------------------------------------------------------*/
     265             : 
     266             : /*! r: config. table index */
     267      480877 : Word16 ivas_get_spar_table_idx_fx(
     268             :     const Word32 ivas_total_brate, /* i  : IVAS total bitrate      */
     269             :     const Word16 sba_order,        /* i  : Ambisonic (SBA) order   */
     270             :     const Word16 bwidth,           /* i  : audio bandwidth         */
     271             :     Word16 *bitlen,                /* o  : number of bits          */
     272             :     Word16 *ind                    /* o  : indice                  */
     273             : )
     274             : {
     275      480877 :     Word16 table_idx = 0, ind1[IVAS_SPAR_BR_TABLE_LEN];
     276      480877 :     Word16 i, j = 0, ind2 = -1;
     277      480877 :     move16();
     278      480877 :     move16();
     279      480877 :     move16();
     280             : 
     281    10098417 :     FOR( i = 0; i < IVAS_SPAR_BR_TABLE_LEN; i++ )
     282             :     {
     283     9617540 :         ind1[j] = 0;
     284     9617540 :         move16();
     285     9617540 :         test();
     286     9617540 :         IF( ( EQ_32( ivas_spar_br_table_consts[i].ivas_total_brate, ivas_total_brate ) ) &&
     287             :             ( EQ_16( ivas_spar_br_table_consts[i].sba_order, sba_order ) ) )
     288             :         {
     289      480877 :             ind1[j] = i;
     290      480877 :             j++;
     291      480877 :             move16();
     292             :         }
     293             :     }
     294             : 
     295      480877 :     FOR( i = 0; i < j; i++ )
     296             :     {
     297      480877 :         IF( EQ_16( ivas_spar_br_table_consts[ind1[i]].bwidth, bwidth ) )
     298             :         {
     299      480877 :             ind2 = i;
     300      480877 :             move16();
     301      480877 :             BREAK;
     302             :         }
     303             :     }
     304      480877 :     assert( j > 0 );     /* to check if bitrate entry is present */
     305      480877 :     assert( ind2 >= 0 ); /* to check if bw entry is present */
     306             : 
     307      480877 :     table_idx = ind1[ind2];
     308      480877 :     move16();
     309             : 
     310      480877 :     if ( ind != NULL )
     311             :     {
     312        5183 :         *ind = ind2;
     313        5183 :         move16();
     314             :     }
     315             : 
     316      480877 :     IF( bitlen != NULL )
     317             :     {
     318       29833 :         *bitlen = ivas_get_bits_to_encode( sub( j, 1 ) );
     319       29833 :         move16();
     320             :     }
     321             : 
     322      480877 :     return table_idx;
     323             : }
     324             : /*-------------------------------------------------------------------*
     325             :  * ivas_get_sba_num_TCs()
     326             :  *
     327             :  * Return number of TCs in SBA format
     328             :  *-------------------------------------------------------------------*/
     329             : 
     330             : /*! r: number of transport channels */
     331      288649 : Word16 ivas_get_sba_num_TCs_fx(
     332             :     const Word32 ivas_total_brate, /* i  : IVAS total bitrate      */
     333             :     const Word16 sba_order         /* i  : Ambisonic (SBA) order   */
     334             : )
     335             : {
     336             :     Word16 table_idx, nchan_transport;
     337             : 
     338      288649 :     table_idx = ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
     339             : 
     340      288649 :     nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
     341      288649 :     move16();
     342             : 
     343      288649 :     return nchan_transport;
     344             : }
     345             : 
     346             : /*-----------------------------------------------------------------------------------------*
     347             :  * Function ivas_get_pred_coeffs()
     348             :  *
     349             :  * Calculation of prediction coefficients
     350             :  *-----------------------------------------------------------------------------------------*/
     351             : 
     352             : /*-----------------------------------------------------------------------------------------*
     353             :  * Function ivas_get_pred_coeffs_fx()
     354             :  *
     355             :  * Calculation of prediction coefficients
     356             :  *-----------------------------------------------------------------------------------------*/
     357             : 
     358      305060 : static void ivas_get_pred_coeffs_enc_fx(
     359             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
     360             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     361             :     Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
     362             :     Word16 *q_pred_coeffs,
     363             :     Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
     364             :     Word16 *q_dm_fv_re,
     365             :     const Word16 in_chans,
     366             :     const Word16 start_band,
     367             :     const Word16 end_band,
     368             :     const Word16 active_w,
     369             :     const Word16 active_w_vlbr,
     370             :     const Word16 dtx_vad,
     371             :     const Word16 from_dirac,
     372             :     const Word16 dyn_active_w_flag,
     373             :     const Word16 res_ind )
     374             : {
     375             :     Word16 i, j, k, b;
     376             :     Word32 abs_value;
     377             :     Word32 w_norm_fac;
     378             :     Word32 L_tmp;
     379             :     Word16 q_tmp, e_tmp;
     380             :     Word64 abs_value64, tmp64;
     381             :     Word16 q_ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     382             :     Word16 div_factor[IVAS_MAX_NUM_BANDS];
     383             :     Word16 div_factor_e[IVAS_MAX_NUM_BANDS];
     384      305060 :     Word16 pred_dim = sub( in_chans, 1 );
     385             :     Word16 tmp_shift, s_div, div_shift;
     386             : 
     387      305060 :     IF( EQ_16( from_dirac, 1 ) )
     388             :     {
     389      147560 :         w_norm_fac = 1;
     390      147560 :         move32();
     391             :     }
     392             :     ELSE
     393             :     {
     394      157500 :         w_norm_fac = 3;
     395      157500 :         move32();
     396             :     }
     397             : 
     398      305060 :     IF( active_w == 0 )
     399             :     {
     400             :         Word64 pPred_temp[IVAS_MAX_NUM_BANDS];
     401             :         Word16 q_pPred_temp[IVAS_MAX_NUM_BANDS];
     402             : 
     403      217278 :         set64_fx( pPred_temp, 0, IVAS_MAX_NUM_BANDS );
     404      217278 :         set16_fx( q_pPred_temp, 31, IVAS_MAX_NUM_BANDS );
     405     1670446 :         FOR( k = start_band; k < end_band; k++ )
     406             :         {
     407     1453168 :             div_factor[k] = BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 in q31*/, L_max( 1, cov_real[0][0][k] ), &s_div ); /*Q=15-(s_div-(31-q_cov_real))*/
     408     1453168 :             move16();
     409             : 
     410     1453168 :             div_factor_e[k] = sub( add( s_div, q_cov_real[0][0][k] ), 31 );
     411     1453168 :             move16();
     412             :         }
     413             : 
     414      971312 :         FOR( i = 0; i < pred_dim; i++ )
     415             :         {
     416     6339938 :             FOR( k = start_band; k < end_band; k++ )
     417             :             {
     418     5585904 :                 tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); /*q_cov_real+15-div_factor_e[k]+1*/
     419     5585904 :                 tmp_shift = W_norm( tmp64 );
     420     5585904 :                 IF( tmp64 != 0 )
     421             :                 {
     422     5130186 :                     ppPred_coeffs_re[i][k] = W_extract_h( W_shl( tmp64, tmp_shift ) ); // 1 + q_cov_real[i+1][0][k] + tmp_shift + 15 - div_factor_e[k] - 32
     423     5130186 :                     move32();
     424     5130186 :                     q_ppPred_coeffs_re[i][k] = add( sub( add( q_cov_real[i + 1][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 );
     425     5130186 :                     move16();
     426             :                 }
     427             :                 ELSE
     428             :                 {
     429      455718 :                     ppPred_coeffs_re[i][k] = 0;
     430      455718 :                     move32();
     431      455718 :                     q_ppPred_coeffs_re[i][k] = 31;
     432      455718 :                     move16();
     433             :                 }
     434             : 
     435             :                 // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value );
     436     5585904 :                 abs_value = Mpy_32_32( ppPred_coeffs_re[i][k], ppPred_coeffs_re[i][k] ); // Q = 2*q_ppPred_coeffs_re[i][k] - 31
     437     5585904 :                 q_tmp = sub( shl( q_ppPred_coeffs_re[i][k], 1 ), 31 );
     438             : 
     439     5585904 :                 IF( GE_16( q_tmp, q_pPred_temp[k] ) )
     440             :                 {
     441     5578313 :                     abs_value = L_shr( abs_value, sub( q_tmp, q_pPred_temp[k] ) ); // q_tmp -> q_pPred_temp[k]
     442             :                 }
     443             :                 ELSE
     444             :                 {
     445        7591 :                     pPred_temp[k] = W_shr( pPred_temp[k], sub( q_pPred_temp[k], q_tmp ) ); // q_pPred_temp[k]->q_tmp
     446        7591 :                     move64();
     447        7591 :                     q_pPred_temp[k] = q_tmp;
     448        7591 :                     move16();
     449             :                 }
     450             : 
     451     5585904 :                 pPred_temp[k] = W_add( pPred_temp[k], abs_value ); // Q = q_pPred_temp[k]
     452     5585904 :                 move64();
     453             :             }
     454             :         }
     455             : 
     456     1670446 :         FOR( k = start_band; k < end_band; k++ )
     457             :         {
     458     1453168 :             tmp_shift = W_norm( pPred_temp[k] );
     459     1453168 :             e_tmp = sub( 31, sub( add( q_pPred_temp[k], tmp_shift ), 32 ) );
     460     1453168 :             L_tmp = Sqrt32( W_extract_h( W_shl( pPred_temp[k], tmp_shift ) ), &e_tmp ); // Q=31-e_tmp
     461             : 
     462     1453168 :             IF( BASOP_Util_Cmp_Mant32Exp( L_tmp, e_tmp, ONE_IN_Q31, 0 ) <= 0 )
     463             :             {
     464     1381626 :                 L_tmp = ONE_IN_Q31;
     465     1381626 :                 move32();
     466     1381626 :                 e_tmp = 0;
     467     1381626 :                 move16();
     468             :             }
     469             : 
     470     1453168 :             div_factor[k] = BASOP_Util_Divide3232_Scale( 1, L_tmp, &s_div ); // exp(0-e_tmp+s_div)
     471     1453168 :             move16();
     472     1453168 :             div_factor[k] = shl( div_factor[k], sub( add( s_div, 30 ), e_tmp ) ); // Q = Q14
     473     1453168 :             move16();
     474             :         }
     475             : 
     476      217278 :         tmp_shift = Q30; // To avoid saturation for Q31
     477      217278 :         move16();
     478      971312 :         FOR( i = 0; i < pred_dim; i++ )
     479             :         {
     480     6339938 :             FOR( k = start_band; k < end_band; k++ )
     481             :             {
     482     5585904 :                 IF( NE_16( div_factor[k], ONE_IN_Q14 /*1 in Q14*/ ) )
     483             :                 {
     484      473648 :                     ppPred_coeffs_re[i][k] = L_shl( Mpy_32_16_1( ppPred_coeffs_re[i][k], div_factor[k] ), 1 ); // Q = q_ppPred_coeffs_re[i][k]
     485      473648 :                     move32();
     486             :                 }
     487     5585904 :                 ppDM_Fv_re[i][k] = 0;
     488     5585904 :                 move32();
     489             : 
     490     5585904 :                 IF( ppPred_coeffs_re[i][k] != 0 )
     491             :                 {
     492     5130186 :                     tmp_shift = s_min( tmp_shift, add( norm_l( ppPred_coeffs_re[i][k] ), q_ppPred_coeffs_re[i][k] ) );
     493             :                 }
     494             :             }
     495             :         }
     496      971312 :         FOR( i = 0; i < pred_dim; i++ )
     497             :         {
     498     6339938 :             FOR( k = start_band; k < end_band; k++ )
     499             :             {
     500     5585904 :                 ppPred_coeffs_re[i][k] = L_shr( ppPred_coeffs_re[i][k], sub( q_ppPred_coeffs_re[i][k], tmp_shift ) ); // Q=tmp_shift
     501     5585904 :                 move32();
     502             :             }
     503             :         }
     504      217278 :         *q_pred_coeffs = tmp_shift;
     505      217278 :         move16();
     506      217278 :         *q_dm_fv_re = 30; // To avoid saturation in Q31
     507      217278 :         move16();
     508             :     }
     509             :     ELSE
     510             :     {
     511             :         Word64 real64[IVAS_SPAR_MAX_CH - 1];
     512             :         Word64 re, dm_y;
     513             :         Word16 dm_beta_re_q;
     514             :         Word16 dm_alpha_q[IVAS_MAX_NUM_BANDS];
     515             :         Word16 dm_v_re_q[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     516             :         Word32 dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     517             :         Word32 dm_g[IVAS_MAX_NUM_BANDS];
     518             :         Word16 real64_q[IVAS_SPAR_MAX_CH - 1];
     519             :         Word32 dm_f_local, dm_w, DM_F[IVAS_MAX_NUM_BANDS];
     520             :         Word16 DM_F_q[IVAS_MAX_NUM_BANDS], dm_g_q[IVAS_MAX_NUM_BANDS];
     521             :         Word32 num_f, den_f, passive_g, dm_beta_re /*, inv_den_f*/;
     522             :         Word32 activew_quad_thresh, g_th_sq;
     523             :         Word32 L_tmp1, L_tmp2;
     524             :         Word16 L_tmp1_q, L_tmp2_q;
     525             :         Word16 den_f_e, s_dm_f;
     526             :         Word16 guard_bits;
     527             : 
     528       87782 :         IF( EQ_16( dyn_active_w_flag, 1 ) )
     529             :         {
     530           0 :             activew_quad_thresh = ONE_IN_Q29; /*1 in Q29*/
     531           0 :             move32();
     532             :         }
     533             :         ELSE
     534             :         {
     535       87782 :             activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29; /*3.0f Q29*/
     536       87782 :             move32();
     537             :         }
     538       87782 :         g_th_sq = Mpy_32_32( activew_quad_thresh, activew_quad_thresh ); // Q27
     539             : 
     540       87782 :         guard_bits = sub( find_guarded_bits_fx( in_chans ), 1 );
     541      552420 :         FOR( k = start_band; k < end_band; k++ )
     542             :         {
     543      464638 :             IF( cov_real[1][0][k] == 0 )
     544             :             {
     545       46275 :                 tmp64 = 0;
     546       46275 :                 move64();
     547       46275 :                 dm_alpha_q[k] = 127;
     548       46275 :                 move16();
     549             :             }
     550             :             ELSE
     551             :             {
     552      418363 :                 tmp64 = W_shr( W_mult0_32_32( cov_real[1][0][k], cov_real[1][0][k] ), guard_bits ); // Q = 2 * q_cov_real[1][0][k] - guard_bits
     553      418363 :                 dm_alpha_q[k] = sub( shl( q_cov_real[1][0][k], 1 ), guard_bits );
     554      418363 :                 move16();
     555             :             }
     556     1393914 :             FOR( i = 2; i < in_chans; i++ )
     557             :             {
     558             :                 // IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value );
     559      929276 :                 IF( cov_real[i][0][k] != 0 )
     560             :                 {
     561      869714 :                     abs_value64 = W_shr( W_mult0_32_32( cov_real[i][0][k], cov_real[i][0][k] ), guard_bits ); // Q = 2 * q_cov_real[i][0][k] - guard_bits
     562      869714 :                     q_tmp = sub( shl( q_cov_real[i][0][k], 1 ), guard_bits );
     563      869714 :                     tmp_shift = sub( q_tmp, dm_alpha_q[k] );
     564             : 
     565      869714 :                     IF( tmp_shift < 0 )
     566             :                     {
     567      176849 :                         IF( LE_16( tmp_shift, -63 ) )
     568             :                         {
     569       46095 :                             tmp64 = abs_value64;
     570       46095 :                             move64();
     571             :                         }
     572             :                         ELSE
     573             :                         {
     574      130754 :                             tmp64 = W_add( W_shl( tmp64, tmp_shift ), abs_value64 ); // Q=q_tmp
     575             :                         }
     576      176849 :                         dm_alpha_q[k] = q_tmp;
     577      176849 :                         move16();
     578             :                     }
     579             :                     ELSE
     580             :                     {
     581      692865 :                         IF( LE_16( tmp_shift, 63 ) )
     582             :                         {
     583      692865 :                             tmp64 = W_add( tmp64, W_shr( abs_value64, tmp_shift ) ); // Q=dm_alpha_q[k]
     584             :                         }
     585             :                     }
     586             :                 }
     587             :             }
     588      464638 :             IF( tmp64 != 0 )
     589             :             {
     590      464458 :                 tmp_shift = W_norm( tmp64 );
     591      464458 :                 e_tmp = sub( 63, add( dm_alpha_q[k], tmp_shift ) );
     592      464458 :                 dm_alpha[k] = Sqrt32( W_extract_h( W_shl( tmp64, tmp_shift ) ), &e_tmp ); // Q=31-e_tmp
     593      464458 :                 move32();
     594      464458 :                 dm_alpha_q[k] = sub( 31, e_tmp );
     595      464458 :                 move16();
     596             : 
     597      464458 :                 div_factor[k] = BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 Q31*/, dm_alpha[k], &s_div ); // Q=15-(dm_alpha_q[k]+ s_div-31)
     598      464458 :                 move16();
     599             : 
     600      464458 :                 div_factor_e[k] = sub( add( dm_alpha_q[k], s_div ), 31 );
     601      464458 :                 move16();
     602             :             }
     603             :             ELSE
     604             :             {
     605         180 :                 dm_alpha[k] = 0;
     606         180 :                 move32();
     607         180 :                 dm_alpha_q[k] = 31;
     608         180 :                 move16();
     609             : 
     610         180 :                 div_factor[k] = 22204;
     611         180 :                 move16();
     612             : 
     613         180 :                 div_factor_e[k] = -37;
     614         180 :                 move16();
     615             :             }
     616             :         }
     617             : 
     618      351128 :         FOR( i = 0; i < pred_dim; i++ )
     619             :         {
     620     1657260 :             FOR( k = start_band; k < end_band; k++ )
     621             :             {
     622     1393914 :                 tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); // Q=(15-div_factor_e[k]+q_cov_real[i+1][0][k])+1
     623     1393914 :                 tmp_shift = W_norm( tmp64 );
     624     1393914 :                 IF( tmp64 != 0 )
     625             :                 {
     626     1288077 :                     dm_v_re[i][k] = W_extract_h( W_shl( tmp64, tmp_shift ) ); // 1 + q_cov_real[i+1][0][k] + tmp_shift + 15 - div_factor_e[k] - 32
     627     1288077 :                     move32();
     628     1288077 :                     dm_v_re_q[i][k] = add( sub( add( q_cov_real[i + 1][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 );
     629     1288077 :                     move16();
     630             :                 }
     631             :                 ELSE
     632             :                 {
     633      105837 :                     dm_v_re[i][k] = 0;
     634      105837 :                     move32();
     635      105837 :                     dm_v_re_q[i][k] = 31;
     636      105837 :                     move16();
     637             :                 }
     638             :             }
     639             :         }
     640             : 
     641       87782 :         IF( dtx_vad == 0 )
     642             :         {
     643        3746 :             dm_f_local = IVAS_ACTIVEW_DM_F_DTX_Q30; // q30
     644        3746 :             move32();
     645             :         }
     646             :         ELSE
     647             :         {
     648       84036 :             IF( active_w_vlbr )
     649             :             {
     650       25408 :                 dm_f_local = IVAS_ACTIVEW_DM_F_VLBR_Q30; // q30
     651       25408 :                 move32();
     652             :             }
     653             :             ELSE
     654             :             {
     655       58628 :                 dm_f_local = IVAS_ACTIVEW_DM_F_Q30; // q30
     656       58628 :                 move32();
     657             :             }
     658             :         }
     659             : 
     660      552420 :         FOR( b = start_band; b < end_band; b++ )
     661             :         {
     662      464638 :             set64_fx( real64, 0, pred_dim );
     663      464638 :             set16_fx( real64_q, 31, pred_dim );
     664             : 
     665     1858552 :             FOR( j = 0; j < pred_dim; j++ )
     666             :             {
     667     5575656 :                 FOR( k = 1; k < in_chans; k++ )
     668             :                 {
     669             :                     // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re );
     670     4181742 :                     re = W_mult0_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q=q_cov_real[j+1][k][b]+dm_v_re_q[k-1][b]
     671     4181742 :                     tmp_shift = W_norm( re );
     672     4181742 :                     IF( re != 0 )
     673             :                     {
     674     3641693 :                         q_tmp = sub( add( add( q_cov_real[j + 1][k][b], dm_v_re_q[k - 1][b] ), tmp_shift ), 32 );
     675             :                     }
     676             :                     ELSE
     677             :                     {
     678      540049 :                         q_tmp = 31;
     679      540049 :                         move16();
     680             :                     }
     681             : 
     682     4181742 :                     IF( LT_16( q_tmp, real64_q[j] ) )
     683             :                     {
     684     1321583 :                         real64[j] = W_add( W_shr( real64[j], sub( real64_q[j], q_tmp ) ), W_extract_h( W_shl( re, tmp_shift ) ) ); // Q=q_tmp
     685     1321583 :                         move64();
     686     1321583 :                         real64_q[j] = q_tmp;
     687     1321583 :                         move16();
     688             :                     }
     689             :                     ELSE
     690             :                     {
     691     2860159 :                         tmp_shift = sub( add( q_tmp, sub( 32, tmp_shift ) ), real64_q[j] );
     692     2860159 :                         IF( LT_16( tmp_shift, 63 ) )
     693             :                         {
     694     2854952 :                             real64[j] = W_add( real64[j], W_shr( re, tmp_shift ) ); // Q=real64_q[j]
     695     2854952 :                             move64();
     696             :                         }
     697             :                     }
     698             :                 }
     699             :             }
     700             : 
     701      464638 :             tmp64 = 0;
     702      464638 :             move64();
     703      464638 :             dm_beta_re_q = 31;
     704      464638 :             move16();
     705     1858552 :             FOR( k = 0; k < pred_dim; k++ )
     706             :             {
     707             :                 // IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re );
     708     1393914 :                 tmp_shift = W_norm( real64[k] );
     709     1393914 :                 re = W_mult0_32_32( W_extract_h( W_shl( real64[k], tmp_shift ) ), dm_v_re[k][b] ); // Q=(real64[k]+tmp_shift-32)+dm_v_re_q
     710     1393914 :                 q_tmp = sub( add( add( real64_q[k], dm_v_re_q[k][b] ), tmp_shift ), 32 );
     711     1393914 :                 tmp_shift = W_norm( re );
     712     1393914 :                 IF( re != 0 )
     713             :                 {
     714     1288077 :                     q_tmp = sub( add( q_tmp, tmp_shift ), 32 );
     715             :                 }
     716             :                 ELSE
     717             :                 {
     718      105837 :                     q_tmp = 31;
     719      105837 :                     move16();
     720             :                 }
     721             : 
     722     1393914 :                 IF( LT_16( q_tmp, dm_beta_re_q ) )
     723             :                 {
     724      437154 :                     tmp64 = W_add( W_shr( tmp64, sub( dm_beta_re_q, q_tmp ) ), W_extract_h( W_shl( re, tmp_shift ) ) ); // Q=q_tmp
     725      437154 :                     dm_beta_re_q = q_tmp;
     726      437154 :                     move16();
     727             :                 }
     728             :                 ELSE
     729             :                 {
     730      956760 :                     tmp_shift = sub( add( q_tmp, sub( 32, tmp_shift ) ), dm_beta_re_q );
     731      956760 :                     IF( LT_16( tmp_shift, 63 ) )
     732             :                     {
     733      911093 :                         tmp64 = W_add( tmp64, W_shr( re, tmp_shift ) ); // Q=dm_beta_re_q
     734             :                     }
     735             :                 }
     736             :             }
     737      464638 :             tmp_shift = W_norm( tmp64 );
     738      464638 :             dm_beta_re = W_extract_h( W_shl( tmp64, tmp_shift ) ); // Q=dm_beta_re_q+tmp_shift-32
     739      464638 :             IF( tmp64 != 0 )
     740             :             {
     741      464458 :                 dm_beta_re_q = sub( add( dm_beta_re_q, tmp_shift ), 32 );
     742             :             }
     743             :             ELSE
     744             :             {
     745         180 :                 dm_beta_re_q = 31;
     746         180 :                 move16();
     747             :             }
     748             : 
     749      464638 :             dm_w = cov_real[0][0][b]; // q_cov_real[0][0][b]
     750      464638 :             move32();
     751      464638 :             den_f = L_max( dm_w, 1 );                                                             // q_cov_real[0][0][b]
     752      464638 :             passive_g = L_deposit_l( BASOP_Util_Divide3232_Scale( dm_alpha[b], den_f, &s_div ) ); // dm_alpha_q[b] - q_cov_real[0][0][b] + 15 - s_div
     753             : 
     754      464638 :             div_shift = sub( Q29, add( sub( dm_alpha_q[b], q_cov_real[0][0][b] ), sub( 15, s_div ) ) );
     755      464638 :             passive_g = L_shl_sat( passive_g, div_shift ); // Q = 29
     756             : 
     757      464638 :             IF( EQ_16( dyn_active_w_flag, 1 ) )
     758             :             {
     759           0 :                 dm_alpha[b] = 0;
     760           0 :                 move32();
     761           0 :                 dm_alpha_q[b] = 0;
     762           0 :                 move16();
     763           0 :                 dm_w = 0;
     764           0 :                 move32();
     765           0 :                 FOR( i = 0; i < pred_dim; i++ )
     766             :                 {
     767           0 :                     dm_v_re[i][b] = 0;
     768           0 :                     move32();
     769           0 :                     dm_v_re_q[i][b] = 31;
     770           0 :                     move16();
     771             :                 }
     772           0 :                 dm_v_re[res_ind - 1][b] = MAX_32; /*1 Q31*/
     773           0 :                 move32();
     774           0 :                 dm_v_re_q[i][b] = 31;
     775           0 :                 move16();
     776             : 
     777           0 :                 passive_g = activew_quad_thresh; // q29
     778           0 :                 move32();
     779             :             }
     780             : 
     781      464638 :             IF( LT_32( passive_g, activew_quad_thresh ) ) // q29
     782             :             {
     783             :                 /*linear activeW*/
     784      464638 :                 dm_y = 0;
     785      464638 :                 move32();
     786      464638 :                 q_tmp = 31;
     787      464638 :                 move16();
     788             : 
     789     1858552 :                 FOR( k = 1; k < in_chans; k++ )
     790             :                 {
     791     1393914 :                     IF( GT_16( q_tmp, q_cov_real[k][k][b] ) )
     792             :                     {
     793      574803 :                         dm_y = W_add( W_shr( dm_y, sub( q_tmp, q_cov_real[k][k][b] ) ), cov_real[k][k][b] ); // q_cov_real[k][k][b]
     794      574803 :                         q_tmp = q_cov_real[k][k][b];
     795      574803 :                         move16();
     796             :                     }
     797             :                     ELSE
     798             :                     {
     799      819111 :                         dm_y = W_add( dm_y, L_shr( cov_real[k][k][b], sub( q_cov_real[k][k][b], q_tmp ) ) ); // q_tmp
     800             :                     }
     801             :                 }
     802      464638 :                 tmp64 = W_mult0_32_32( w_norm_fac, dm_w ); // Q=q_tmp
     803      464638 :                 IF( LT_16( q_tmp, q_cov_real[0][0][b] ) )
     804             :                 {
     805        8590 :                     tmp64 = W_shr( tmp64, sub( q_cov_real[0][0][b], q_tmp ) ); // Q=q_tmp
     806             :                 }
     807             :                 ELSE
     808             :                 {
     809      456048 :                     q_tmp = q_cov_real[0][0][b];
     810      456048 :                     move16();
     811      456048 :                     dm_y = W_shr( dm_y, sub( q_tmp, q_cov_real[0][0][b] ) ); // Q=q_cov_real[0][0][b]
     812             :                 }
     813             : 
     814      464638 :                 if ( GT_64( tmp64, dm_y ) )
     815             :                 {
     816      426736 :                     dm_y = tmp64; // Q=q_tmp
     817      426736 :                     move16();
     818             :                 }
     819             : 
     820      464638 :                 tmp_shift = W_norm( dm_y );
     821      464638 :                 IF( dm_y == 0 )
     822             :                 {
     823           0 :                     tmp_shift = 32;
     824           0 :                     move16();
     825           0 :                     den_f = W_extract_l( dm_y );
     826             :                 }
     827             :                 ELSE
     828             :                 {
     829      464638 :                     den_f = W_extract_h( W_shl( dm_y, tmp_shift ) ); // q_tmp + tmp_shift - 32
     830             :                 }
     831             : 
     832      464638 :                 den_f = L_max( den_f, 1 ); // q_tmp + tmp_shift - 32
     833             : 
     834      464638 :                 DM_F[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( Mpy_32_32( dm_f_local, dm_alpha[b] ), den_f, &s_div ) ); // Q30 + dm_alpha_q[b] - 31 - q_tmp - tmp_shift + 32 + 15 - s_div
     835      464638 :                 move32();
     836             : 
     837      464638 :                 DM_F_q[b] = add( sub( sub( dm_alpha_q[b], add( q_tmp, tmp_shift ) ), s_div ), ( 30 - 31 + 32 + 15 ) );
     838      464638 :                 move16();
     839             : 
     840      464638 :                 IF( LT_32( ONE_IN_Q30, L_shl_sat( DM_F[b], sub( Q30, DM_F_q[b] ) ) ) ) // q30
     841             :                 {
     842           0 :                     DM_F[b] = ONE_IN_Q31; /*1 Q31*/
     843           0 :                     move32();
     844           0 :                     DM_F_q[b] = Q31;
     845           0 :                     move16();
     846             :                 }
     847             : 
     848      464638 :                 tmp64 = W_mult0_32_32( DM_F[b], DM_F[b] ); /*Q=(2*DM_F_q[b])*/
     849      464638 :                 tmp_shift = W_norm( tmp64 );
     850      464638 :                 IF( tmp64 == 0 )
     851             :                 {
     852         180 :                     tmp_shift = 32;
     853         180 :                     move16();
     854             :                 }
     855             :                 ELSE
     856             :                 {
     857      464458 :                     tmp64 = W_shl( tmp64, tmp_shift ); /*Q=(2*DM_F_q[b]+tmp_shift)*/
     858             :                 }
     859      464638 :                 tmp64 = W_mult0_32_32( W_extract_h( tmp64 ), dm_beta_re ); // 2 * DM_F_q[b] + tmp_shift - 32 + dm_beta_re_q
     860      464638 :                 q_tmp = sub( add( add( shl( DM_F_q[b], 1 ), tmp_shift ), dm_beta_re_q ), 32 );
     861      464638 :                 tmp_shift = sub( W_norm( tmp64 ), 2 );
     862      464638 :                 IF( tmp64 == 0 )
     863             :                 {
     864         180 :                     tmp_shift = 32;
     865         180 :                     move16();
     866             :                 }
     867             :                 ELSE
     868             :                 {
     869      464458 :                     tmp64 = W_shl( tmp64, tmp_shift ); // Q=q_tmp+tmp_shift
     870             :                 }
     871      464638 :                 L_tmp2 = W_extract_h( tmp64 ); // Q=q_tmp+tmp_shift-32
     872      464638 :                 L_tmp2_q = sub( add( q_tmp, tmp_shift ), 32 );
     873             : 
     874      464638 :                 tmp64 = W_shl( W_mult0_32_32( dm_alpha[b], DM_F[b] ), 1 ); // Q=dm_alpha_q[b]+DM_F_q[b]
     875      464638 :                 tmp_shift = sub( W_norm( tmp64 ), 2 );
     876      464638 :                 IF( tmp64 == 0 )
     877             :                 {
     878         180 :                     tmp_shift = 32;
     879         180 :                     move16();
     880             :                 }
     881             :                 ELSE
     882             :                 {
     883      464458 :                     tmp64 = W_shl( tmp64, tmp_shift ); // Q=dm_alpha_q[b]+DM_F_q[b]+tmp_shift
     884             :                 }
     885      464638 :                 L_tmp1 = W_extract_h( tmp64 ); // DM_F_q[b] + dm_alpha_q[b] + tmp_shift - 32
     886      464638 :                 L_tmp1_q = sub( add( add( DM_F_q[b], dm_alpha_q[b] ), tmp_shift ), 32 );
     887             : 
     888      464638 :                 IF( LT_16( L_tmp2_q, L_tmp1_q ) )
     889             :                 {
     890           0 :                     L_tmp1 = L_add( L_shr( L_tmp1, sub( L_tmp1_q, L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
     891           0 :                     L_tmp1_q = L_tmp2_q;
     892           0 :                     move16();
     893             :                 }
     894             :                 ELSE
     895             :                 {
     896      464638 :                     L_tmp1 = L_add( L_tmp1, L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp1_q
     897             :                 }
     898             : 
     899      464638 :                 tmp_shift = sub( norm_l( dm_w ), 1 );
     900      464638 :                 L_tmp2 = L_shl( dm_w, tmp_shift ); // Q=q_cov_real[0][0][b]+ tmp_shift
     901      464638 :                 L_tmp2_q = add( q_cov_real[0][0][b], tmp_shift );
     902             : 
     903      464638 :                 IF( LT_16( L_tmp2_q, L_tmp1_q ) )
     904             :                 {
     905      353282 :                     den_f = L_add( L_shr( L_tmp1, sub( L_tmp1_q, L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
     906      353282 :                     den_f_e = sub( 31, L_tmp2_q );
     907             :                 }
     908             :                 ELSE
     909             :                 {
     910      111356 :                     den_f = L_add( L_tmp1, L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp2_q
     911      111356 :                     den_f_e = sub( 31, L_tmp1_q );
     912             :                 }
     913             : 
     914      464638 :                 den_f = L_max( den_f, 1 ); // Q=31-den_f_e
     915             : 
     916      464638 :                 tmp64 = W_mult0_32_32( DM_F[b], dm_beta_re ); // Q= DM_F_q[b]+dm_beta_re_q
     917      464638 :                 tmp_shift = sub( W_norm( tmp64 ), 1 );
     918      464638 :                 IF( tmp64 == 0 )
     919             :                 {
     920         180 :                     tmp_shift = 32;
     921         180 :                     move16();
     922             :                 }
     923             :                 ELSE
     924             :                 {
     925      464458 :                     tmp64 = W_shl( tmp64, tmp_shift ); // Q= DM_F_q[b]+dm_beta_re_q+tmp_shift
     926             :                 }
     927      464638 :                 L_tmp2_q = sub( add( add( DM_F_q[b], dm_beta_re_q ), tmp_shift ), 32 );
     928      464638 :                 L_tmp2 = W_extract_h( tmp64 ); // Q= DM_F_q[b]+dm_beta_re_q+tmp_shift-32
     929             : 
     930      464638 :                 tmp_shift = sub( norm_l( dm_alpha[b] ), 1 );
     931             : 
     932      464638 :                 IF( LT_16( L_tmp2_q, add( dm_alpha_q[b], tmp_shift ) ) )
     933             :                 {
     934        1224 :                     L_tmp1 = L_add( L_shr( dm_alpha[b], sub( dm_alpha_q[b], L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
     935        1224 :                     L_tmp1_q = L_tmp2_q;
     936        1224 :                     move16();
     937             :                 }
     938             :                 ELSE
     939             :                 {
     940      463414 :                     L_tmp1_q = add( dm_alpha_q[b], tmp_shift );
     941      463414 :                     L_tmp1 = L_add( L_shl( dm_alpha[b], tmp_shift ), L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp1_q
     942             :                 }
     943             : 
     944      464638 :                 dm_g[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( L_tmp1, den_f, &s_div ) ); // L_tmp1_q - (31 - den_f_e) + (15 - s_div)
     945      464638 :                 move32();
     946      464638 :                 dm_g_q[b] = add( sub( add( L_tmp1_q, den_f_e ), s_div ), 15 - 31 );
     947      464638 :                 move16();
     948             :             }
     949             :             ELSE
     950             :             {
     951             :                 Word32 sqrt_val;
     952             :                 Word16 val_e;
     953             :                 Word16 num_f_e;
     954             : 
     955             :                 /* quadratic activeW */
     956           0 :                 tmp64 = W_shl( W_mult0_32_32( dm_alpha[b], activew_quad_thresh ), 1 ); // Q=dm_alpha_q[b]+29
     957           0 :                 tmp_shift = sub( W_norm( tmp64 ), 1 );
     958           0 :                 IF( tmp64 == 0 )
     959             :                 {
     960           0 :                     tmp_shift = 32;
     961           0 :                     move16();
     962             :                 }
     963             :                 ELSE
     964             :                 {
     965           0 :                     tmp64 = W_shl( tmp64, tmp_shift ); // Q=dm_alpha_q+29+tmp_shift
     966             :                 }
     967           0 :                 L_tmp1 = W_extract_h( tmp64 );                                     // Q29 + dm_alpha_q[b] + tmp_shift - 32
     968           0 :                 L_tmp1_q = sub( add( add( Q29, dm_alpha_q[b] ), tmp_shift ), 32 ); // Q=dm_alpha_q+29+1+tmp_shift-32
     969             : 
     970           0 :                 num_f = BASOP_Util_Add_Mant32Exp( dm_beta_re, sub( 31, dm_beta_re_q ), L_negate( L_tmp1 ), sub( 31, L_tmp1_q ), &num_f_e ); // Q=31-num_f_e
     971             : 
     972           0 :                 sqrt_val = Mpy_32_32( Mpy_32_32( dm_alpha[b], dm_alpha[b] ), g_th_sq );                                                                                                                                                                                                                  //((2*dm_alpha_q[b]-31)+27-31)-2 ,reducing the Q by 2 instead of multiplication by 4
     973           0 :                 val_e = sub( 31, sub( sub( add( sub( shl( dm_alpha_q[b], 1 ), 31 ), 27 ), 31 ), 2 ) );                                                                                                                                                                                                   // reducing the Q by 2 instead of multiplication by 4
     974           0 :                 sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, Mpy_32_32( dm_beta_re, dm_beta_re ), sub( 31, sub( shl( dm_beta_re_q, 1 ), 31 ) ), &val_e );                                                                                                                                       // q=31-val_e
     975           0 :                 sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, L_negate( Mpy_32_32( Mpy_32_32( dm_beta_re, g_th_sq ), dm_w ) ), sub( 31, sub( sub( add( sub( add( dm_beta_re_q, 27 ), 31 ), q_cov_real[0][0][b] ), 31 ), 2 ) ) /* reducing the Q by 2 instead of multiplication by 4*/, &val_e ); // q=31-val_e
     976             :                 // val_e = norm_l( sqrt_val );
     977           0 :                 sqrt_val = Sqrt32( sqrt_val, &val_e ); // q=31-val_e
     978             : 
     979           0 :                 num_f = BASOP_Util_Add_Mant32Exp( num_f, num_f_e, sqrt_val, val_e, &num_f_e ); // q=31-num_f_e
     980             : 
     981           0 :                 den_f = Mpy_32_32( dm_beta_re, g_th_sq );              // Q=dm_beta_re_q+27-31-1
     982           0 :                 den_f_e = add( add( sub( 31, dm_beta_re_q ), 4 ), 1 ); // adding the exp with 1 instead of multiplication by 2
     983           0 :                 den_f = L_max( den_f, 1 );                             // q=31-den_f_e
     984           0 :                 dm_g[b] = activew_quad_thresh;                         // Q29
     985           0 :                 move32();
     986           0 :                 dm_g_q[b] = Q29;
     987           0 :                 move16();
     988           0 :                 DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e))
     989           0 :                 move32();
     990           0 :                 DM_F_q[b] = sub( 31, add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ) );
     991           0 :                 move16();
     992             :             }
     993             :         }
     994             : 
     995       87782 :         *q_pred_coeffs = 30; // To avoid saturation in Q31
     996       87782 :         move16();
     997       87782 :         *q_dm_fv_re = 30; // To avoid saturation in Q31
     998       87782 :         move16();
     999             : 
    1000      351128 :         FOR( i = 0; i < pred_dim; i++ )
    1001             :         {
    1002     1657260 :             FOR( b = start_band; b < end_band; b++ )
    1003             :             {
    1004     1393914 :                 tmp64 = W_mult0_32_32( dm_v_re[i][b], dm_g[b] ); // dm_v_re_q[i][b]+dm_g_q[b]
    1005     1393914 :                 tmp_shift = W_norm( tmp64 );
    1006     1393914 :                 IF( tmp64 == 0 )
    1007             :                 {
    1008      105837 :                     tmp_shift = 32;
    1009      105837 :                     move16();
    1010             :                 }
    1011             :                 ELSE
    1012             :                 {
    1013     1288077 :                     tmp64 = W_shl( tmp64, tmp_shift ); // dm_v_re_q[i][b]+dm_g_q[b]+tmp_shift
    1014             :                 }
    1015     1393914 :                 ppPred_coeffs_re[i][b] = W_extract_h( tmp64 ); // Q = dm_v_re_q[i][b] + dm_g_q[b] + tmp_shift - 32
    1016     1393914 :                 move32();
    1017     1393914 :                 q_ppPred_coeffs_re[i][b] = sub( add( add( dm_v_re_q[i][b], dm_g_q[b] ), tmp_shift ), 32 );
    1018     1393914 :                 move16();
    1019             : 
    1020     1393914 :                 tmp64 = W_mult0_32_32( dm_v_re[i][b], DM_F[b] ); // Q = dm_v_re_q[i][b] + DM_F_q[b]
    1021     1393914 :                 tmp_shift = W_norm( tmp64 );
    1022     1393914 :                 IF( tmp64 == 0 )
    1023             :                 {
    1024      105837 :                     tmp_shift = 32;
    1025      105837 :                     move16();
    1026             :                 }
    1027             :                 ELSE
    1028             :                 {
    1029     1288077 :                     tmp64 = W_shl( tmp64, tmp_shift ); // Q = dm_v_re_q[i][b] + DM_F_q[b] + tmp_shift
    1030             :                 }
    1031     1393914 :                 ppDM_Fv_re[i][b] = W_extract_h( tmp64 ); // Q = dm_v_re_q[i][b] + DM_F_q[b] + tmp_shift - 32
    1032     1393914 :                 move32();
    1033     1393914 :                 dm_v_re_q[i][b] = sub( add( add( dm_v_re_q[i][b], DM_F_q[b] ), tmp_shift ), 32 );
    1034     1393914 :                 move16();
    1035             :                 // if ( ppDM_Fv_re[i][b] == 0 )
    1036             :                 //{
    1037             :                 //     dm_v_re_q[i][b] = Q31;
    1038             :                 //     move16();
    1039             :                 // }
    1040             : 
    1041     1393914 :                 IF( ppPred_coeffs_re[i][b] )
    1042             :                 {
    1043     1288077 :                     *q_pred_coeffs = s_min( *q_pred_coeffs, q_ppPred_coeffs_re[i][b] );
    1044     1288077 :                     move16();
    1045             :                 }
    1046     1393914 :                 IF( ppDM_Fv_re[i][b] )
    1047             :                 {
    1048     1288077 :                     *q_dm_fv_re = s_min( *q_dm_fv_re, dm_v_re_q[i][b] );
    1049     1288077 :                     move16();
    1050             :                 }
    1051             :             }
    1052             :         }
    1053      351128 :         FOR( i = 0; i < pred_dim; i++ )
    1054             :         {
    1055     1657260 :             FOR( b = start_band; b < end_band; b++ )
    1056             :             {
    1057     1393914 :                 ppPred_coeffs_re[i][b] = L_shr( ppPred_coeffs_re[i][b], sub( q_ppPred_coeffs_re[i][b], *q_pred_coeffs ) ); // Q=*q_pred_coeffs
    1058     1393914 :                 move32();
    1059     1393914 :                 ppDM_Fv_re[i][b] = L_shr( ppDM_Fv_re[i][b], sub( dm_v_re_q[i][b], *q_dm_fv_re ) ); // Q=*q_dm_fv_re
    1060     1393914 :                 move32();
    1061             :             }
    1062             :         }
    1063             :     }
    1064             : 
    1065      305060 :     return;
    1066             : }
    1067             : 
    1068      584711 : static void ivas_get_pred_coeffs_fx(
    1069             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],              /*Q30*/
    1070             :     Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
    1071             :     Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS],       /*q_dm_fv_re*/
    1072             :     const Word16 in_chans,
    1073             :     const Word16 start_band,
    1074             :     const Word16 end_band,
    1075             :     const Word16 active_w,
    1076             :     const Word16 active_w_vlbr,
    1077             :     const Word16 dtx_vad,
    1078             :     const Word16 from_dirac,
    1079             :     const Word16 dyn_active_w_flag,
    1080             :     const Word16 res_ind,
    1081             :     Word16 *q_pred_coeffs,
    1082             :     Word16 *q_dm_fv_re )
    1083             : {
    1084             :     Word16 i, j, k, b, p;
    1085             :     Word32 abs_value;
    1086             :     Word32 w_norm_fac;
    1087             :     Word32 one_in_q;
    1088             :     Word32 div_factor[IVAS_MAX_NUM_BANDS];
    1089      584711 :     Word16 pred_dim = sub( in_chans, 1 );
    1090             :     Word16 tmp_shift, prev_tmp_shift, s_div, div_shift;
    1091             : 
    1092      584711 :     IF( EQ_16( from_dirac, 1 ) )
    1093             :     {
    1094      584711 :         w_norm_fac = ONE_IN_Q29; /*1 q29*/
    1095      584711 :         move32();
    1096             :     }
    1097             :     ELSE
    1098             :     {
    1099           0 :         w_norm_fac = 3 * ONE_IN_Q29; /* 3 q29*/
    1100           0 :         move32();
    1101             :     }
    1102      584711 :     tmp_shift = Q30;
    1103      584711 :     move16();
    1104      584711 :     IF( active_w == 0 )
    1105             :     {
    1106             :         Word32 pPred_temp[IVAS_MAX_NUM_BANDS];
    1107             :         Word16 q_pred_temp;
    1108      467230 :         prev_tmp_shift = 31;
    1109      467230 :         move16();
    1110             : 
    1111      467230 :         set32_fx( pPred_temp, 0, IVAS_MAX_NUM_BANDS );
    1112     2265630 :         FOR( k = start_band; k < end_band; k++ )
    1113             :         {
    1114     1798400 :             div_factor[k] = L_max( 1, cov_real[0][0][k] ); // q30
    1115     1798400 :             move32();
    1116     1798400 :             tmp_shift = Q30;
    1117     1798400 :             move16();
    1118     1798400 :             IF( NE_32( cov_real[0][0][k], ONE_IN_Q30 ) ) // q30
    1119             :             {
    1120           0 :                 div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 q31*/, div_factor[k], &s_div ) ); // Q=15-(s_div-(31-30))
    1121           0 :                 move32();
    1122           0 :                 IF( s_div < 0 )
    1123             :                 {
    1124           0 :                     div_shift = add( 15, s_div );
    1125           0 :                     tmp_shift = Q30;
    1126           0 :                     move16();
    1127             :                 }
    1128             :                 ELSE
    1129             :                 {
    1130           0 :                     div_shift = 15;
    1131           0 :                     move16();
    1132           0 :                     tmp_shift = sub( Q30, s_div );
    1133             :                 }
    1134           0 :                 div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
    1135           0 :                 move16();
    1136             : 
    1137           0 :                 IF( LT_16( tmp_shift, prev_tmp_shift ) )
    1138             :                 {
    1139           0 :                     FOR( p = start_band; p < k; p++ )
    1140             :                     {
    1141           0 :                         div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // tmp_shift
    1142           0 :                         move32();
    1143             :                     }
    1144           0 :                     prev_tmp_shift = tmp_shift;
    1145           0 :                     move16();
    1146             :                 }
    1147           0 :                 ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
    1148             :                 {
    1149           0 :                     div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // prev_tmp_shift
    1150           0 :                     move32();
    1151           0 :                     tmp_shift = prev_tmp_shift;
    1152           0 :                     move16();
    1153             :                 }
    1154             :             }
    1155             :         }
    1156             : 
    1157     1868920 :         FOR( i = 0; i < pred_dim; i++ )
    1158             :         {
    1159     6796890 :             FOR( k = start_band; k < end_band; k++ )
    1160             :             {
    1161     5395200 :                 ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1
    1162     5395200 :                 move32();
    1163             : 
    1164             :                 // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value );
    1165     5395200 :                 abs_value = Mpy_32_32( ppPred_coeffs_re[i][k], ppPred_coeffs_re[i][k] ); // Q = 2*tmp_shift - 2 - 31
    1166             : 
    1167     5395200 :                 pPred_temp[k] = L_add( pPred_temp[k], abs_value ); // Q= 2*tmp_shift - 2 - 31
    1168     5395200 :                 move32();
    1169             :             }
    1170             :         }
    1171      467230 :         *q_pred_coeffs = sub( tmp_shift, 1 );
    1172      467230 :         move16();
    1173             : 
    1174     2265630 :         FOR( k = start_band; k < end_band; k++ )
    1175             :         {
    1176     1798400 :             q_pred_temp = sub( 31, sub( shl( *q_pred_coeffs, 1 ), 31 ) );
    1177     1798400 :             pPred_temp[k] = Sqrt32( pPred_temp[k], &q_pred_temp ); // q=31-q_pred_temp
    1178     1798400 :             move32();
    1179             : 
    1180     1798400 :             IF( LT_16( q_pred_temp, 1 ) )
    1181             :             {
    1182     1733441 :                 pPred_temp[k] = L_shr( pPred_temp[k], add( abs_s( q_pred_temp ), 1 ) ); // Q30
    1183     1733441 :                 move32();
    1184     1733441 :                 q_pred_temp = 1;
    1185     1733441 :                 move16();
    1186             :             }
    1187       64959 :             ELSE IF( GT_16( q_pred_temp, 1 ) )
    1188             :             {
    1189         100 :                 pPred_temp[k] = L_shl( pPred_temp[k], sub( abs_s( q_pred_temp ), 1 ) ); // Q30
    1190         100 :                 move32();
    1191         100 :                 q_pred_temp = 1;
    1192         100 :                 move16();
    1193             :             }
    1194             : 
    1195     1798400 :             one_in_q = L_shl( 1, sub( 31, q_pred_temp ) ); /*Q=q_pred_temp*/
    1196             : 
    1197     1798400 :             IF( LT_32( one_in_q, pPred_temp[k] ) )
    1198             :             {
    1199        4531 :                 div_factor[k] = pPred_temp[k]; /*Q=q_pred_temp*/
    1200        4531 :                 move32();
    1201             : 
    1202        4531 :                 div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( one_in_q, div_factor[k], &s_div ) ); // q=15-s_div
    1203        4531 :                 move32();
    1204        4531 :                 IF( s_div < 0 )
    1205             :                 {
    1206           0 :                     div_shift = add( 15, s_div );
    1207           0 :                     tmp_shift = Q30;
    1208           0 :                     move16();
    1209             :                 }
    1210             :                 ELSE
    1211             :                 {
    1212        4531 :                     div_shift = 15;
    1213        4531 :                     move16();
    1214        4531 :                     tmp_shift = sub( Q30, s_div );
    1215             :                 }
    1216        4531 :                 div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
    1217        4531 :                 move32();
    1218             :             }
    1219             :             ELSE
    1220             :             {
    1221     1793869 :                 div_factor[k] = one_in_q; // q=31-q_pred_temp
    1222     1793869 :                 move32();
    1223     1793869 :                 tmp_shift = sub( 31, q_pred_temp );
    1224             :             }
    1225             : 
    1226     1798400 :             IF( LT_16( tmp_shift, prev_tmp_shift ) )
    1227             :             {
    1228      468290 :                 FOR( p = start_band; p < k; p++ )
    1229             :                 {
    1230         596 :                     div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // q=tmp_shift
    1231         596 :                     move32();
    1232             :                 }
    1233      467694 :                 prev_tmp_shift = tmp_shift;
    1234      467694 :                 move16();
    1235             :             }
    1236     1330706 :             ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
    1237             :             {
    1238         507 :                 div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // q=prev_tmp_shift
    1239         507 :                 move32();
    1240         507 :                 tmp_shift = prev_tmp_shift;
    1241         507 :                 move16();
    1242             :             }
    1243             :         }
    1244             : 
    1245     1868920 :         FOR( i = 0; i < pred_dim; i++ )
    1246             :         {
    1247     6796890 :             FOR( k = start_band; k < end_band; k++ )
    1248             :             {
    1249     5395200 :                 ppPred_coeffs_re[i][k] = Mpy_32_32( ppPred_coeffs_re[i][k], div_factor[k] ); // Q = q_pred_coeffs + tmp_shift -31
    1250     5395200 :                 move32();
    1251     5395200 :                 ppDM_Fv_re[i][k] = 0;
    1252     5395200 :                 move32();
    1253             :             }
    1254             :         }
    1255      467230 :         *q_pred_coeffs = sub( add( *q_pred_coeffs, tmp_shift ), 31 );
    1256      467230 :         *q_dm_fv_re = 0;
    1257      467230 :         move16();
    1258             :     }
    1259             :     ELSE
    1260             :     {
    1261             :         Word32 dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
    1262      117481 :         Word32 real[IVAS_SPAR_MAX_CH - 1], dm_beta_re = 0, dm_g[IVAS_MAX_NUM_BANDS];
    1263             :         Word32 dm_f_local, dm_w, dm_y, DM_F[IVAS_MAX_NUM_BANDS];
    1264             :         Word32 num_f, den_f, passive_g /*, inv_den_f*/;
    1265             :         Word32 activew_quad_thresh, g_th_sq;
    1266             :         Word32 L_tmp1, L_tmp2;
    1267             :         Word16 L_tmp2_q;
    1268             :         Word16 dm_alpha_e, den_f_e, s_dm_f;
    1269      117481 :         prev_tmp_shift = 31;
    1270      117481 :         dm_alpha_e = 0;
    1271      117481 :         Word16 dm_beta_re_e = 0;
    1272      117481 :         move32();
    1273      117481 :         move16();
    1274      117481 :         move16();
    1275      117481 :         move16();
    1276             : 
    1277             : 
    1278      117481 :         IF( EQ_16( dyn_active_w_flag, 1 ) )
    1279             :         {
    1280           0 :             activew_quad_thresh = ONE_IN_Q29; // 1 q29
    1281           0 :             move32();
    1282             :         }
    1283             :         ELSE
    1284             :         {
    1285      117481 :             activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29; // 3 q29
    1286      117481 :             move32();
    1287             :         }
    1288      117481 :         g_th_sq = Mpy_32_32( activew_quad_thresh, activew_quad_thresh ); // Q27
    1289             : 
    1290      117481 :         set32_fx( dm_alpha, 0, IVAS_MAX_NUM_BANDS );
    1291             : 
    1292      469924 :         FOR( i = 1; i < in_chans; i++ )
    1293             :         {
    1294     1664967 :             FOR( k = start_band; k < end_band; k++ )
    1295             :             {
    1296             :                 // IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value );
    1297     1312524 :                 abs_value = Mpy_32_32( cov_real[i][0][k], cov_real[i][0][k] ); // Q29
    1298     1312524 :                 dm_alpha[k] = L_add( dm_alpha[k], abs_value );                 // Q29
    1299     1312524 :                 move32();
    1300             :             }
    1301             :         }
    1302             : 
    1303      554989 :         FOR( k = start_band; k < end_band; k++ )
    1304             :         {
    1305      437508 :             dm_alpha_e = 31 - Q29;
    1306      437508 :             dm_alpha[k] = Sqrt32( dm_alpha[k], &dm_alpha_e ); // q=31-dm_alpha_e
    1307      437508 :             move32();
    1308             : 
    1309      437508 :             div_factor[k] = L_max( dm_alpha[k], 1 ); // q=31-dm_alpha_e
    1310      437508 :             move32();
    1311             : 
    1312      437508 :             div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31, div_factor[k], &s_div ) ); // q=15-(s_div+(0-dm_alpha_e))
    1313      437508 :             move32();
    1314      437508 :             IF( s_div < 0 )
    1315             :             {
    1316           0 :                 div_shift = add( 15, sub( s_div, dm_alpha_e ) );
    1317           0 :                 tmp_shift = Q30;
    1318           0 :                 move16();
    1319             :             }
    1320             :             ELSE
    1321             :             {
    1322      437508 :                 div_shift = 15;
    1323      437508 :                 move16();
    1324      437508 :                 tmp_shift = sub( Q30, sub( s_div, dm_alpha_e ) );
    1325             :             }
    1326      437508 :             div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
    1327      437508 :             move32();
    1328             : 
    1329      437508 :             IF( LT_16( tmp_shift, prev_tmp_shift ) )
    1330             :             {
    1331      221616 :                 FOR( p = start_band; p < k; p++ )
    1332             :                 {
    1333       62086 :                     div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // q=tmp_shift
    1334       62086 :                     move32();
    1335             :                 }
    1336      159530 :                 prev_tmp_shift = tmp_shift;
    1337      159530 :                 move16();
    1338             :             }
    1339      277978 :             ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
    1340             :             {
    1341       26410 :                 div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // q=prev_tmp_shift
    1342       26410 :                 move32();
    1343       26410 :                 tmp_shift = prev_tmp_shift;
    1344       26410 :                 move16();
    1345             :             }
    1346             :         }
    1347             : 
    1348      469924 :         FOR( i = 0; i < pred_dim; i++ )
    1349             :         {
    1350     1664967 :             FOR( k = start_band; k < end_band; k++ )
    1351             :             {
    1352     1312524 :                 dm_v_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + Qb - 31 = tmp_shift - 1
    1353     1312524 :                 move32();
    1354             :             }
    1355             :         }
    1356             : 
    1357      117481 :         IF( dtx_vad == 0 )
    1358             :         {
    1359         890 :             dm_f_local = IVAS_ACTIVEW_DM_F_DTX_Q30; // q30
    1360         890 :             move32();
    1361             :         }
    1362             :         ELSE
    1363             :         {
    1364      116591 :             IF( active_w_vlbr )
    1365             :             {
    1366       10943 :                 dm_f_local = IVAS_ACTIVEW_DM_F_VLBR_Q30; // q30
    1367       10943 :                 move32();
    1368             :             }
    1369             :             ELSE
    1370             :             {
    1371      105648 :                 dm_f_local = IVAS_ACTIVEW_DM_F_Q30; // q30
    1372      105648 :                 move32();
    1373             :             }
    1374             :         }
    1375             : 
    1376      554989 :         FOR( b = start_band; b < end_band; b++ )
    1377             :         {
    1378      437508 :             set32_fx( real, 0, pred_dim );
    1379             : 
    1380     1750032 :             FOR( j = 0; j < pred_dim; j++ )
    1381             :             {
    1382     5250096 :                 FOR( k = 1; k < in_chans; k++ )
    1383             :                 {
    1384             :                     Word32 re;
    1385             : 
    1386             :                     // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re );
    1387     3937572 :                     re = Mpy_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q30 + Q_div_factor - 1 - 31
    1388     3937572 :                     real[j] = L_add( real[j], re );                             // tmp_shift - 2
    1389     3937572 :                     move32();
    1390             :                 }
    1391             :             }
    1392      437508 :             dm_beta_re = 0;
    1393      437508 :             move32();
    1394     1750032 :             FOR( k = 0; k < pred_dim; k++ )
    1395             :             {
    1396             :                 Word32 re;
    1397             :                 // IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re );
    1398     1312524 :                 re = Mpy_32_32( real[k], dm_v_re[k][b] ); // Q = 2*tmp_shift - 3 - 31
    1399     1312524 :                 dm_beta_re = L_add( dm_beta_re, re );     // Q = 2*tmp_shift - 3 - 31
    1400             :             }
    1401             : 
    1402      437508 :             dm_beta_re_e = sub( 31, ( sub( sub( shl( tmp_shift, 1 ), 3 ), 31 ) ) );
    1403      437508 :             dm_w = cov_real[0][0][b]; // Q30
    1404      437508 :             move32();
    1405      437508 :             den_f = L_max( dm_w, 1 );                                                             // Q30
    1406      437508 :             passive_g = L_deposit_l( BASOP_Util_Divide3232_Scale( dm_alpha[b], den_f, &s_div ) ); // Q=15-(s_div+dm_alpha_e-1)
    1407             : 
    1408      437508 :             div_shift = add( ( sub( 15, ( sub( ( sub( 31, dm_alpha_e ) ), Q30 ) ) ) ), sub( s_div, 1 ) );
    1409      437508 :             passive_g = L_shl( passive_g, div_shift ); // Q = 29
    1410             : 
    1411      437508 :             IF( EQ_16( dyn_active_w_flag, 1 ) )
    1412             :             {
    1413           0 :                 dm_alpha[b] = 0;
    1414           0 :                 move32();
    1415           0 :                 dm_w = 0;
    1416           0 :                 move32();
    1417           0 :                 FOR( i = 0; i < pred_dim; i++ )
    1418             :                 {
    1419           0 :                     dm_v_re[i][b] = 0;
    1420           0 :                     move32();
    1421             :                 }
    1422           0 :                 IF( NE_16( sub( tmp_shift, 1 ), 31 ) )
    1423             :                 {
    1424           0 :                     dm_v_re[res_ind - 1][b] = L_shl( 1, sub( tmp_shift, 1 ) ); // Q=tmp_shift-1
    1425           0 :                     move32();
    1426             :                 }
    1427             :                 ELSE
    1428             :                 {
    1429           0 :                     dm_v_re[res_ind - 1][b] = MAX_32; // Q=tmp_shift-1
    1430           0 :                     move32();
    1431             :                 }
    1432           0 :                 passive_g = activew_quad_thresh; // q29
    1433           0 :                 move32();
    1434             :             }
    1435             : 
    1436      437508 :             IF( LT_32( passive_g, activew_quad_thresh ) )
    1437             :             {
    1438             :                 /*linear activeW*/
    1439      437508 :                 dm_y = 0;
    1440      437508 :                 move32();
    1441             : 
    1442     1750032 :                 FOR( k = 1; k < in_chans; k++ )
    1443             :                 {
    1444     1312524 :                     dm_y = L_add( dm_y, L_shr( cov_real[k][k][b], 2 ) ); // Q28
    1445             :                 }
    1446      437508 :                 den_f = L_max( dm_y, 1 );                              // Q28
    1447      437508 :                 den_f = L_max( den_f, Mpy_32_32( w_norm_fac, dm_w ) ); // Q28
    1448             : 
    1449      437508 :                 DM_F[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( Mpy_32_32( dm_f_local, dm_alpha[b] ), den_f, &s_div ) ); // Q30 + 31 - dm_alpha_e - 31 + den_f_e - 31 => den_f_e - dm_alpha_e - 1
    1450      437508 :                 move32();
    1451             : 
    1452      437508 :                 div_shift = add( ( sub( 15, ( sub( ( sub( 30, dm_alpha_e ) ), 28 ) ) ) ), s_div );
    1453             : 
    1454      437508 :                 DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30
    1455      437508 :                 move32();
    1456             : 
    1457      437508 :                 DM_F[b] = L_min( ONE_IN_Q30, DM_F[b] ); // q30
    1458      437508 :                 move32();
    1459             : 
    1460      437508 :                 L_tmp1 = L_add( L_shr( dm_w, 1 ), Mpy_32_32( dm_alpha[b], DM_F[b] ) ); /* Q 29*/
    1461      437508 :                 L_tmp2 = Mpy_32_32( Mpy_32_32( DM_F[b], DM_F[b] ), dm_beta_re );       // Q=(Q29-dm_beta_re_e)
    1462      437508 :                 L_tmp2_q = add( 29, sub( shl( tmp_shift, 1 ), 65 ) );                  // simplified equation for calculating Q of L_tmp2
    1463      437508 :                 L_tmp2 = L_shl( L_tmp2, sub( 29, L_tmp2_q ) );                         // Q29
    1464             : 
    1465      437508 :                 den_f = L_add( L_tmp1, L_tmp2 ); // Q29
    1466      437508 :                 den_f = L_max( den_f, 1 );       // Q29
    1467             : 
    1468      437508 :                 den_f_e = 31 - 29;
    1469      437508 :                 move16();
    1470      437508 :                 L_tmp2 = Mpy_32_32( DM_F[b], dm_beta_re ); // Q=30-dm_beta_re_e
    1471      437508 :                 L_tmp2_q = add( 30, sub( ( sub( shl( tmp_shift, 1 ), 34 ) ), 31 ) );
    1472      437508 :                 L_tmp2 = L_shl( L_tmp2, ( sub( ( sub( 29, dm_alpha_e ) ), L_tmp2_q ) ) ); // Q=29
    1473      437508 :                 L_tmp1 = L_shr( dm_alpha[b], ( sub( ( sub( 31, dm_alpha_e ) ), 29 ) ) );  // Q=29
    1474      437508 :                 L_tmp1 = L_add( L_tmp1, L_tmp2 );                                         // Q29
    1475             : 
    1476      437508 :                 dm_g[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( L_tmp1, den_f, &s_div ) ); // Q29 + den_f_e - 31 + 15 - s_div
    1477      437508 :                 move32();
    1478      437508 :                 div_shift = add( sub( 15, ( sub( 29, sub( 31, den_f_e ) ) ) ), s_div );
    1479      437508 :                 dm_g[b] = L_shl( dm_g[b], div_shift ); // Q30
    1480      437508 :                 move32();
    1481             :             }
    1482             :             ELSE
    1483             :             {
    1484             :                 Word32 sqrt_val;
    1485             :                 Word16 val_e;
    1486             :                 Word16 num_f_e;
    1487             : 
    1488             :                 /* quadratic activeW */
    1489             : 
    1490           0 :                 num_f = BASOP_Util_Add_Mant32Exp( dm_beta_re, dm_beta_re_e, L_negate( L_shl( Mpy_32_32( dm_alpha[b], activew_quad_thresh ), 1 ) ), add( dm_alpha_e, ( 31 - Q29 ) ), &num_f_e ); // Q=31-num_f_e
    1491             : 
    1492           0 :                 sqrt_val = L_shl( Mpy_32_32( Mpy_32_32( dm_alpha[b], dm_alpha[b] ), g_th_sq ), 2 ); /*Q27*/
    1493           0 :                 val_e = 4;
    1494           0 :                 move16();
    1495             : 
    1496           0 :                 sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, 4, Mpy_32_32( dm_beta_re, dm_beta_re ), 2 * dm_beta_re_e, &val_e );                                                       // Q=31-val_e
    1497           0 :                 sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, L_negate( L_shl( Mpy_32_32( Mpy_32_32( dm_beta_re, g_th_sq ), dm_w ), 2 ) ), add( dm_beta_re_e, 4 + 1 ), &val_e ); // Q=31-val_e
    1498             :                 // val_e = norm_l( sqrt_val );
    1499           0 :                 sqrt_val = Sqrt32( sqrt_val, &val_e ); // Q=31-val_e
    1500           0 :                 IF( val_e < 0 )
    1501             :                 {
    1502           0 :                     sqrt_val = L_shr( sqrt_val, abs_s( val_e ) ); // Q31
    1503             :                 }
    1504           0 :                 ELSE IF( val_e > 0 )
    1505             :                 {
    1506           0 :                     sqrt_val = L_shl( sqrt_val, abs_s( val_e ) ); // Q31
    1507           0 :                     val_e = 0;
    1508           0 :                     move16();
    1509             :                 }
    1510           0 :                 num_f = BASOP_Util_Add_Mant32Exp( num_f, num_f_e, sqrt_val, 0, &num_f_e ); // Q=31-num_f_e
    1511             : 
    1512           0 :                 den_f = L_shl( Mpy_32_32( dm_beta_re, g_th_sq ), 1 ); // Q=31-dm_beta_re_e+27-31=>-dm_beta_re_e+27
    1513           0 :                 den_f_e = add( dm_beta_re_e, 4 );
    1514           0 :                 den_f = L_max( den_f, 1 );     // Q=31-den_f_e
    1515           0 :                 dm_g[b] = activew_quad_thresh; // Q29
    1516           0 :                 move32();
    1517           0 :                 DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e
    1518           0 :                 move32();
    1519           0 :                 s_dm_f = add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ); /*Resultant exp for DM_F s_dm_f +( 2 + num_f_e ) - den_f_e*/
    1520           0 :                 div_shift = sub( s_dm_f, 1 );
    1521           0 :                 DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30
    1522           0 :                 move32();
    1523             :             }
    1524             :         }
    1525             : 
    1526      469924 :         FOR( i = 0; i < pred_dim; i++ )
    1527             :         {
    1528     1664967 :             FOR( b = start_band; b < end_band; b++ )
    1529             :             {
    1530     1312524 :                 ppPred_coeffs_re[i][b] = Mpy_32_32( dm_v_re[i][b], dm_g[b] ); // Q = tmp_shift - 1 + 30 - 31
    1531     1312524 :                 move32();
    1532     1312524 :                 ppDM_Fv_re[i][b] = Mpy_32_32( dm_v_re[i][b], DM_F[b] ); // Q = tmp_shift - 1 + 30 -31
    1533     1312524 :                 move32();
    1534             :             }
    1535             :         }
    1536      117481 :         *q_pred_coeffs = sub( tmp_shift, 2 );
    1537      117481 :         move16();
    1538      117481 :         *q_dm_fv_re = sub( tmp_shift, 2 );
    1539      117481 :         move16();
    1540             :     }
    1541             : 
    1542      584711 :     return;
    1543             : }
    1544             : 
    1545             : 
    1546             : /*-----------------------------------------------------------------------------------------*
    1547             :  * Function ivas_get_Wscaling_factor()
    1548             :  *
    1549             :  * Calculation of scaling factor for post predicted W channel
    1550             :  *-----------------------------------------------------------------------------------------*/
    1551             : 
    1552             : 
    1553      305060 : static void ivas_get_Wscaling_factor_enc_fx(
    1554             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    1555             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    1556             :     Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
    1557             :     Word16 q_pred_coeffs_re,
    1558             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    1559             :     Word16 q_mixer_mat,
    1560             :     const Word16 start_band,
    1561             :     const Word16 end_band,
    1562             :     const Word16 dtx_vad,
    1563             :     const Word16 num_ch,
    1564             :     const Word16 *pNum_dmx,
    1565             :     const Word16 bands_bw,
    1566             :     const Word16 active_w,
    1567             :     const Word16 active_w_vlbr,
    1568             :     Word32 *pWscale, /*q_pWscale*/
    1569             :     Word16 *q_pWscale,
    1570             :     const Word16 dyn_active_w_flag )
    1571             : {
    1572             :     Word16 b, ch, q_tmp, q_postpred_cov_re;
    1573             :     Word32 dm_f_local, abs_val;
    1574             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1575             : 
    1576      305060 :     q_postpred_cov_re = 0;
    1577      305060 :     move16();
    1578             : 
    1579     3660720 :     FOR( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ )
    1580             :     {
    1581     3355660 :         set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH );
    1582             :     }
    1583             : 
    1584      305060 :     IF( dtx_vad == 0 )
    1585             :     {
    1586        6726 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31
    1587        6726 :         move32();
    1588             :     }
    1589      298334 :     ELSE IF( active_w_vlbr != 0 )
    1590             :     {
    1591       25408 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31
    1592       25408 :         move32();
    1593             :     }
    1594             :     ELSE
    1595             :     {
    1596      272926 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_FX; // Q31
    1597      272926 :         move32();
    1598             :     }
    1599             : 
    1600     2222866 :     FOR( b = start_band; b < end_band; b++ )
    1601             :     {
    1602     1917806 :         pWscale[b] = ONE_IN_Q31;
    1603     1917806 :         move32();
    1604     1917806 :         q_pWscale[b] = Q31;
    1605     1917806 :         move16();
    1606             : 
    1607     1917806 :         test();
    1608     1917806 :         IF( EQ_16( active_w, 1 ) && ( dyn_active_w_flag == 0 ) )
    1609             :         {
    1610             :             Word16 shift, guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp;
    1611             :             Word32 Gw_sq, g_sq, tmp;
    1612             : 
    1613      464638 :             g_sq = 0;
    1614      464638 :             move32();
    1615             : 
    1616      464638 :             IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) )
    1617             :             {
    1618      464638 :                 ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re );
    1619             :             }
    1620             : 
    1621      464638 :             tmp = L_shl_sat( IVAS_FIX_EPS_Q40, sub( q_postpred_cov_re, 40 ) );
    1622             : 
    1623      464638 :             IF( LE_32( postpred_cov_re[0][0], tmp ) )
    1624             :             {
    1625         180 :                 Gw_sq = Mpy_32_32( cov_real[0][0][b], 1250000000 ); /*1/1e-10 = 1250000000 Q(-4)*/
    1626         180 :                 q_Gw_sq = add( q_cov_real[0][0][b], -4 - 31 );
    1627             :             }
    1628             :             ELSE
    1629             :             {
    1630      464458 :                 Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], postpred_cov_re[0][0], &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re))
    1631      464458 :                 q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real[0][0][b], q_postpred_cov_re ) );
    1632             :             }
    1633             : 
    1634      464638 :             shift = MAX16B;
    1635      464638 :             move16();
    1636             : 
    1637     1858552 :             FOR( ch = 0; ch < ( num_ch - 1 ); ch++ )
    1638             :             {
    1639     1393914 :                 IF( pred_coeffs_re[ch][b] != 0 )
    1640             :                 {
    1641     1288077 :                     shift = s_min( shift, norm_l( pred_coeffs_re[ch][b] ) );
    1642             :                 }
    1643             :             }
    1644      464638 :             guard_bits = find_guarded_bits_fx( num_ch );
    1645      464638 :             if ( EQ_16( shift, MAX16B ) )
    1646             :             {
    1647         180 :                 shift = 0;
    1648         180 :                 move16();
    1649             :             }
    1650     1858552 :             FOR( ch = 0; ch < ( num_ch - 1 ); ch++ )
    1651             :             {
    1652     1393914 :                 abs_val = L_shr( Mpy_32_32( L_shl( pred_coeffs_re[ch][b], shift ), L_shl( pred_coeffs_re[ch][b], shift ) ), guard_bits ); // q=2*q_pred_coeffs_re-guard_bits-31
    1653     1393914 :                 g_sq = L_add( g_sq, abs_val );                                                                                            // q=2*q_pred_coeffs_re-guard_bits-31
    1654             :             }
    1655      464638 :             q_g_sq = sub( shl( add( q_pred_coeffs_re, shift ), 1 ), add( 31, guard_bits ) );
    1656             : 
    1657      464638 :             tmp = Mpy_32_32( ONE_IN_Q30 /*4 in Q28*/, Mpy_32_32( dm_f_local, g_sq ) ); // q_g_sq+28-31
    1658      464638 :             q_tmp = sub( q_g_sq, 3 );
    1659             : 
    1660      464638 :             q_min = s_min( q_Gw_sq, q_tmp );
    1661      464638 :             tmp = L_shr( tmp, sub( q_tmp, q_min ) );                   // Q=q_min
    1662      464638 :             tmp = L_add( L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ), tmp ); // Q=q_min
    1663             : 
    1664      464638 :             tmp_exp = sub( 31, q_min );
    1665      464638 :             tmp = Sqrt32( tmp, &tmp_exp ); // q=31-tmp_exp
    1666      464638 :             q_tmp = sub( 31, tmp_exp );
    1667             : 
    1668      464638 :             tmp_exp = sub( 31, q_Gw_sq );
    1669      464638 :             Gw_sq = Sqrt32( Gw_sq, &tmp_exp ); // q=31-tmp_exp
    1670      464638 :             q_Gw_sq = sub( 31, tmp_exp );
    1671             : 
    1672      464638 :             q_min = s_min( q_Gw_sq, q_tmp );
    1673      464638 :             Gw_sq = L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ); // q=q_min
    1674      464638 :             q_Gw_sq = q_min;
    1675      464638 :             move16();
    1676             : 
    1677      464638 :             tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // q=q_min
    1678             : 
    1679      464638 :             pWscale[b] = L_add( Mpy_32_32( Gw_sq, ONE_IN_Q30 /* 0.5 in Q31*/ ), Mpy_32_32( tmp, ONE_IN_Q30 /* 0.5 in Q31*/ ) ); // q=q_Gw_sq
    1680      464638 :             move32();
    1681      464638 :             q_pWscale[b] = q_Gw_sq;
    1682      464638 :             move16();
    1683             :         }
    1684             :     }
    1685             : 
    1686      305060 :     return;
    1687             : }
    1688             : 
    1689      584711 : static void ivas_get_Wscaling_factor_fx(
    1690             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    1691             :     Word16 q_cov_real,
    1692             :     Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
    1693             :     Word16 q_pred_coeffs_re,
    1694             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    1695             :     Word16 q_mixer_mat,
    1696             :     const Word16 start_band,
    1697             :     const Word16 end_band,
    1698             :     const Word16 dtx_vad,
    1699             :     const Word16 num_ch,
    1700             :     const Word16 *pNum_dmx,
    1701             :     const Word16 bands_bw,
    1702             :     const Word16 active_w,
    1703             :     const Word16 active_w_vlbr,
    1704             :     Word32 *pWscale, /*q_pWscale*/
    1705             :     Word16 *q_pWscale,
    1706             :     const Word16 dyn_active_w_flag )
    1707             : {
    1708             :     Word16 b, ch, q_tmp, q_postpred_cov_re;
    1709             :     Word32 dm_f_local, abs_val;
    1710             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1711             : 
    1712      584711 :     q_postpred_cov_re = 0;
    1713      584711 :     move16();
    1714             : 
    1715     7016532 :     FOR( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ )
    1716             :     {
    1717     6431821 :         set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH );
    1718             :     }
    1719             : 
    1720      584711 :     IF( dtx_vad == 0 )
    1721             :     {
    1722        2480 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31
    1723        2480 :         move32();
    1724             :     }
    1725      582231 :     ELSE IF( active_w_vlbr != 0 )
    1726             :     {
    1727       10943 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31
    1728       10943 :         move32();
    1729             :     }
    1730             :     ELSE
    1731             :     {
    1732      571288 :         dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_FX; // Q31
    1733      571288 :         move32();
    1734             :     }
    1735             : 
    1736     2820619 :     FOR( b = start_band; b < end_band; b++ )
    1737             :     {
    1738     2235908 :         pWscale[b] = 1;
    1739     2235908 :         move32();
    1740     2235908 :         q_pWscale[b] = 0;
    1741     2235908 :         move16();
    1742             : 
    1743     2235908 :         test();
    1744     2235908 :         IF( EQ_16( active_w, 1 ) && ( dyn_active_w_flag == 0 ) )
    1745             :         {
    1746             :             Word16 guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp;
    1747             :             Word32 Gw_sq, g_sq, tmp;
    1748             : 
    1749      437508 :             g_sq = 0;
    1750      437508 :             move32();
    1751             : 
    1752      437508 :             IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) )
    1753             :             {
    1754      437508 :                 ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re );
    1755             :             }
    1756             : 
    1757      437508 :             Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], L_max( postpred_cov_re[0][0], IVAS_FIX_EPS ), &tmp_exp ); /*15-(tmp_exp-(q_cov_real-q_postpred_cov_re))*/
    1758      437508 :             q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real, q_postpred_cov_re ) );
    1759             : 
    1760      437508 :             guard_bits = find_guarded_bits_fx( num_ch );
    1761             : 
    1762     1750032 :             FOR( ch = 0; ch < sub( num_ch, 1 ); ch++ )
    1763             :             {
    1764     1312524 :                 abs_val = L_shr( Mpy_32_32( pred_coeffs_re[ch][b], pred_coeffs_re[ch][b] ), guard_bits ); /*q=2*q_pred_coeffs_re-guard_bits-31*/
    1765     1312524 :                 g_sq = L_add( g_sq, abs_val );                                                            /*q=2*q_pred_coeffs_re-guard_bits-31*/
    1766             :             }
    1767      437508 :             q_g_sq = sub( add( q_pred_coeffs_re, q_pred_coeffs_re ), add( 31, guard_bits ) );
    1768             : 
    1769      437508 :             tmp = Mpy_32_32( ONE_IN_Q30 /*4 in Q28*/, Mpy_32_32( dm_f_local, g_sq ) ); /*q=q_g_sq-3*/
    1770      437508 :             q_tmp = sub( q_g_sq, 3 );
    1771             : 
    1772      437508 :             q_min = s_min( q_Gw_sq, q_tmp );
    1773      437508 :             tmp = L_shr( tmp, sub( q_tmp, q_min ) );                   // q=q_min
    1774      437508 :             tmp = L_add( L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ), tmp ); // q=q_min
    1775             : 
    1776      437508 :             tmp_exp = sub( 31, q_min );
    1777      437508 :             tmp = Sqrt32( tmp, &tmp_exp ); // q=31-tmp_exp
    1778      437508 :             q_tmp = sub( 31, tmp_exp );
    1779             : 
    1780      437508 :             tmp_exp = sub( 31, q_Gw_sq );
    1781      437508 :             Gw_sq = Sqrt32( Gw_sq, &tmp_exp ); // q=31-tmp_exp
    1782      437508 :             q_Gw_sq = sub( 31, tmp_exp );
    1783             : 
    1784      437508 :             q_min = s_min( q_Gw_sq, q_tmp );
    1785      437508 :             Gw_sq = L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ); // q=q_min
    1786      437508 :             q_Gw_sq = q_min;
    1787      437508 :             move16();
    1788             : 
    1789      437508 :             tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // q=q_min
    1790             : 
    1791      437508 :             pWscale[b] = L_add( L_shr( Gw_sq, 1 /* Gw_sq * 0.5 */ ), L_shr( tmp, 1 /* tmp * 0.5 */ ) ); // q=q_Gw_sq
    1792      437508 :             move32();
    1793      437508 :             q_pWscale[b] = q_Gw_sq;
    1794      437508 :             move16();
    1795             :         }
    1796             :     }
    1797             : 
    1798      584711 :     return;
    1799             : }
    1800             : 
    1801             : 
    1802             : /*-----------------------------------------------------------------------------------------*
    1803             :  * Function ivas_create_fullr_dmx_mat()
    1804             :  *
    1805             :  * Calculation of downmix matrix
    1806             :  *-----------------------------------------------------------------------------------------*/
    1807             : 
    1808             : 
    1809     1048350 : void ivas_create_fullr_dmx_mat_fx(
    1810             :     Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
    1811             :     Word16 q_pred_coeffs_re,
    1812             :     Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
    1813             :     Word16 q_dm_fv_re,
    1814             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    1815             :     Word16 *q_mixer_mat,
    1816             :     const Word16 in_chans,
    1817             :     const Word16 start_band,
    1818             :     const Word16 end_band,
    1819             :     const Word16 active_w,
    1820             :     ivas_spar_md_com_cfg *hMdCfg )
    1821             : {
    1822             :     Word16 i, j, k, b;
    1823             :     const Word16 *order;
    1824             :     Word32 max_val_tmp_p2;
    1825             :     Word32 tmp_p1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    1826             :     Word32 tmp_p2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    1827             :     Word32 down_mix_mat1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    1828             :     Word16 remix_unmix_order;
    1829             :     Word16 nbands;
    1830             : 
    1831     1048350 :     max_val_tmp_p2 = 0;
    1832     1048350 :     move32();
    1833             : 
    1834     1048350 :     nbands = sub( end_band, start_band );
    1835     1048350 :     remix_unmix_order = hMdCfg->remix_unmix_order;
    1836     1048350 :     move16();
    1837             : 
    1838     1048350 :     order = remix_order_set[remix_unmix_order];
    1839     1048350 :     move16();
    1840             : 
    1841     5446150 :     FOR( i = 0; i < in_chans; i++ )
    1842             :     {
    1843    23924320 :         FOR( j = 0; j < in_chans; j++ )
    1844             :         {
    1845    19526520 :             set32_fx( &tmp_p1_re[i][j][start_band], 0, nbands );
    1846    19526520 :             set32_fx( &tmp_p2_re[i][j][start_band], 0, nbands );
    1847    19526520 :             set32_fx( &down_mix_mat1_re[i][j][start_band], 0, nbands );
    1848             :         }
    1849             :     }
    1850             : 
    1851     5446150 :     FOR( j = 0; j < in_chans; j++ )
    1852             :     {
    1853    28603112 :         FOR( b = start_band; b < end_band; b++ )
    1854             :         {
    1855    24205312 :             tmp_p2_re[j][j][b] = L_shl( 1, q_pred_coeffs_re ); // q=q_pred_coeffs_re
    1856    24205312 :             move32();
    1857             :         }
    1858             :     }
    1859     1048350 :     max_val_tmp_p2 = L_shl( 1, q_pred_coeffs_re ); // q=q_pred_coeffs_re
    1860             : 
    1861     4397800 :     FOR( j = 1; j < in_chans; j++ )
    1862             :     {
    1863    22116634 :         FOR( b = start_band; b < end_band; b++ )
    1864             :         {
    1865    18767184 :             tmp_p2_re[j][0][b] = L_negate( pred_coeffs_re[j - 1][b] ); // q=q_pred_coeffs_re
    1866    18767184 :             move32();
    1867    18767184 :             max_val_tmp_p2 = L_max( max_val_tmp_p2, L_abs( tmp_p2_re[j][0][b] ) ); // q=q_pred_coeffs_re
    1868             :         }
    1869             :     }
    1870             : 
    1871     1048350 :     IF( EQ_16( active_w, 1 ) )
    1872             :     {
    1873             :         Word16 guard_bits;
    1874             :         Word32 max_val, tmp_re;
    1875             : 
    1876      249974 :         max_val = 0;
    1877      249974 :         move32();
    1878             : 
    1879     1249870 :         FOR( j = 0; j < in_chans; j++ )
    1880             :         {
    1881     5785480 :             FOR( b = start_band; b < end_band; b++ )
    1882             :             {
    1883     4785584 :                 tmp_p1_re[j][j][b] = L_shl( 1, q_dm_fv_re ); // q=q_dm_fv_re
    1884     4785584 :                 move32();
    1885             :             }
    1886             :         }
    1887      249974 :         max_val = L_shl( 1, q_dm_fv_re ); // q=q_dm_fv_re
    1888             : 
    1889      999896 :         FOR( j = 1; j < in_chans; j++ )
    1890             :         {
    1891     4339110 :             FOR( b = start_band; b < end_band; b++ )
    1892             :             {
    1893     3589188 :                 tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; // q=q_dm_fv_re
    1894     3589188 :                 move32();
    1895     3589188 :                 max_val = L_max( max_val, L_abs( tmp_p1_re[0][j][b] ) ); // q=q_dm_fv_re
    1896             :             }
    1897             :         }
    1898             : 
    1899      249974 :         guard_bits = add( norm_l( max_val ), norm_l( max_val_tmp_p2 ) );
    1900      249974 :         guard_bits = s_max( sub( find_guarded_bits_fx( sub( end_band, start_band ) ), guard_bits ), 0 );
    1901             :         /* 4x4 mult */
    1902     1249870 :         FOR( i = 0; i < in_chans; i++ )
    1903             :         {
    1904     4999480 :             FOR( j = 0; j < in_chans; j++ )
    1905             :             {
    1906    19997920 :                 FOR( k = 0; k < in_chans; k++ )
    1907             :                 {
    1908    92567680 :                     FOR( b = start_band; b < end_band; b++ )
    1909             :                     {
    1910    76569344 :                         tmp_re = L_shr( Mpy_32_32( tmp_p2_re[i][k][b], tmp_p1_re[k][j][b] ), guard_bits ); // q= q_dm_fv_re+ q_pred_coeffs_re-31-guard_bits
    1911    76569344 :                         down_mix_mat1_re[i][j][b] = L_add( down_mix_mat1_re[i][j][b], tmp_re );            // q= q_dm_fv_re+ q_pred_coeffs_re-31-guard_bits
    1912    76569344 :                         move32();
    1913             :                     }
    1914             :                 }
    1915             :             }
    1916             :         }
    1917      249974 :         *q_mixer_mat = sub( add( q_dm_fv_re, q_pred_coeffs_re ), add( 31, guard_bits ) );
    1918      249974 :         move16();
    1919             :     }
    1920             :     ELSE
    1921             :     {
    1922     4196280 :         FOR( j = 0; j < in_chans; j++ )
    1923             :         {
    1924    18924840 :             FOR( k = 0; k < in_chans; k++ )
    1925             :             {
    1926   116429688 :                 FOR( b = start_band; b < end_band; b++ )
    1927             :                 {
    1928   100902752 :                     down_mix_mat1_re[j][k][b] = tmp_p2_re[j][k][b]; // q=q_pred_coeffs_re
    1929   100902752 :                     move32();
    1930             :                 }
    1931             :             }
    1932             :         }
    1933      798376 :         *q_mixer_mat = q_pred_coeffs_re;
    1934      798376 :         move16();
    1935             :     }
    1936             : 
    1937     1048350 :     IF( NE_16( remix_unmix_order, 3 ) )
    1938             :     {
    1939     1048350 :         ivas_reorder_array_fx( down_mix_mat1_re, in_chans, order, mixer_mat, start_band, end_band );
    1940             :     }
    1941             : 
    1942     1048350 :     return;
    1943             : }
    1944             : 
    1945             : 
    1946             : /*-----------------------------------------------------------------------------------------*
    1947             :  * Function ivas_reorder_array()
    1948             :  *
    1949             :  * reorders the input matrix based on order
    1950             :  *-----------------------------------------------------------------------------------------*/
    1951             : 
    1952     1048350 : static void ivas_reorder_array_fx(
    1953             :     Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], /*qx*/
    1954             :     const Word16 in_chans,
    1955             :     const Word16 order[IVAS_SPAR_MAX_CH],
    1956             :     Word32 ***mixer_mat, /*qx*/
    1957             :     const Word16 start_band,
    1958             :     const Word16 end_band )
    1959             : {
    1960             :     Word16 i, j, b, idx;
    1961             : 
    1962     5446150 :     FOR( i = 0; i < in_chans; i++ )
    1963             :     {
    1964     4397800 :         idx = order[i];
    1965     4397800 :         move16();
    1966             : 
    1967    23924320 :         FOR( j = 0; j < in_chans; j++ )
    1968             :         {
    1969   139571608 :             FOR( b = start_band; b < end_band; b++ )
    1970             :             {
    1971   120045088 :                 mixer_mat[i][j][b] = in_re[idx][j][b]; /*qx*/
    1972   120045088 :                 move32();
    1973             :             }
    1974             :         }
    1975             :     }
    1976             : 
    1977     1048350 :     return;
    1978             : }
    1979             : 
    1980             : /*-----------------------------------------------------------------------------------------*
    1981             :  * Function ivas_calc_post_pred_per_band()
    1982             :  *
    1983             :  * Calculate post pred mat per band
    1984             :  *-----------------------------------------------------------------------------------------*/
    1985             : 
    1986             : 
    1987     2895408 : static void ivas_calc_post_pred_per_band_enc_fx(
    1988             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    1989             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    1990             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    1991             :     Word16 q_mixer_mat,
    1992             :     const Word16 num_ch,
    1993             :     const Word16 band_idx,
    1994             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
    1995             :     Word16 *q_postpred_cov_re )
    1996             : {
    1997             :     Word16 i, j, k;
    1998             :     Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1999             :     Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    2000             :     Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    2001             :     Word16 q_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    2002             :     Word16 min_val;
    2003             :     Word32 tmp_re;
    2004             :     Word16 tmp_q;
    2005             :     Word16 tmp_e;
    2006             : 
    2007    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2008             :     {
    2009    93396000 :         FOR( j = 0; j < num_ch; j++ )
    2010             :         {
    2011    79361568 :             dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; /*q_mixer_mat*/
    2012    79361568 :             move32();
    2013             :         }
    2014             :     }
    2015             : 
    2016    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2017             :     {
    2018    14034432 :         set32_fx( temp_mat[i], 0, num_ch );
    2019    14034432 :         set32_fx( postpred_cov_re[i], 0, num_ch );
    2020             :     }
    2021             : 
    2022     2895408 :     min_val = MAX16B;
    2023     2895408 :     move16();
    2024             :     /* num_ch x num_ch mult */
    2025    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2026             :     {
    2027    93396000 :         FOR( j = 0; j < num_ch; j++ )
    2028             :         {
    2029    79361568 :             temp_mat[i][j] = 0;
    2030    79361568 :             move32();
    2031    79361568 :             temp_mat_e[i][j] = 0;
    2032    79361568 :             move16();
    2033   624374400 :             FOR( k = 0; k < num_ch; k++ )
    2034             :             {
    2035   545012832 :                 tmp_re = Mpy_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] );
    2036   545012832 :                 tmp_e = sub( 62, add( q_cov_real[i][k][band_idx], q_mixer_mat ) );
    2037   545012832 :                 IF( tmp_re )
    2038             :                 {
    2039   153709032 :                     temp_mat[i][j] = BASOP_Util_Add_Mant32Exp( temp_mat[i][j], temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] );
    2040   153709032 :                     move32();
    2041             :                 }
    2042             :             }
    2043             :         }
    2044             :     }
    2045             : 
    2046             :     /* num_ch x num_ch mult */
    2047    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2048             :     {
    2049    60732432 :         FOR( j = i; j < num_ch; j++ )
    2050             :         {
    2051    46698000 :             q_postpred_cov_re_buf[i][j] = *q_postpred_cov_re;
    2052    46698000 :             move16();
    2053   358885200 :             FOR( k = 0; k < num_ch; k++ )
    2054             :             {
    2055   312187200 :                 tmp_re = Mpy_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] );
    2056   312187200 :                 tmp_q = sub( q_mixer_mat, temp_mat_e[k][j] );
    2057   312187200 :                 IF( tmp_re )
    2058             :                 {
    2059    89626478 :                     tmp_e = sub( 31, q_postpred_cov_re_buf[i][j] );
    2060    89626478 :                     postpred_cov_re[i][j] = BASOP_Util_Add_Mant32Exp( postpred_cov_re[i][j], tmp_e, tmp_re, sub( Q31, tmp_q ), &tmp_e );
    2061    89626478 :                     move32();
    2062    89626478 :                     q_postpred_cov_re_buf[i][j] = sub( 31, tmp_e );
    2063    89626478 :                     move16();
    2064             :                 }
    2065             :             }
    2066    46698000 :             IF( postpred_cov_re[i][j] )
    2067             :             {
    2068    43547400 :                 min_val = s_min( min_val, q_postpred_cov_re_buf[i][j] );
    2069             :             }
    2070             :         }
    2071             :     }
    2072             : 
    2073             :     /*Changing Q of postpred_cov_re to min_val*/
    2074    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2075             :     {
    2076    60732432 :         FOR( j = i; j < num_ch; j++ )
    2077             :         {
    2078    46698000 :             IF( postpred_cov_re[i][j] )
    2079             :             {
    2080    43547400 :                 postpred_cov_re[i][j] = L_shl( postpred_cov_re[i][j], sub( min_val, q_postpred_cov_re_buf[i][j] ) );
    2081    43547400 :                 move32();
    2082             :             }
    2083             :         }
    2084             :     }
    2085             : 
    2086             : 
    2087    16929840 :     FOR( i = 0; i < num_ch; i++ )
    2088             :     {
    2089    46698000 :         FOR( j = 0; j < i; j++ )
    2090             :         {
    2091    32663568 :             postpred_cov_re[i][j] = postpred_cov_re[j][i]; //*q_postpred_cov_re
    2092    32663568 :             move32();
    2093             :         }
    2094             :     }
    2095             : 
    2096     2895408 :     if ( EQ_16( min_val, MAX16B ) )
    2097             :     {
    2098        6720 :         min_val = Q31;
    2099        6720 :         move16();
    2100             :     }
    2101     2895408 :     *q_postpred_cov_re = min_val;
    2102     2895408 :     move16();
    2103             : 
    2104     2895408 :     return;
    2105             : }
    2106             : 
    2107     2155966 : static void ivas_calc_post_pred_per_band_fx(
    2108             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    2109             :     Word16 q_cov_real,
    2110             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    2111             :     Word16 q_mixer_mat,
    2112             :     const Word16 num_ch,
    2113             :     const Word16 band_idx,
    2114             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
    2115             :     Word16 *q_postpred_cov_re )
    2116             : {
    2117             :     Word16 i, j, k, guard_bits, tmp, q_temp_mat;
    2118             :     Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    2119             :     Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    2120             :     Word32 max_val;
    2121             :     Word64 tmp_re;
    2122             : 
    2123    10779830 :     FOR( i = 0; i < num_ch; i++ )
    2124             :     {
    2125    43119320 :         FOR( j = 0; j < num_ch; j++ )
    2126             :         {
    2127    34495456 :             dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; /*q_mixer_mat*/
    2128    34495456 :             move32();
    2129             :         }
    2130             :     }
    2131             : 
    2132     2155966 :     guard_bits = find_guarded_bits_fx( num_ch );
    2133             : 
    2134    10779830 :     FOR( i = 0; i < num_ch; i++ )
    2135             :     {
    2136     8623864 :         set32_fx( temp_mat[i], 0, num_ch );
    2137     8623864 :         set32_fx( postpred_cov_re[i], 0, num_ch );
    2138             :     }
    2139             : 
    2140     2155966 :     max_val = 1;
    2141     2155966 :     move32();
    2142             :     /* num_ch x num_ch mult */
    2143    10779830 :     FOR( i = 0; i < num_ch; i++ )
    2144             :     {
    2145    43119320 :         FOR( j = 0; j < num_ch; j++ )
    2146             :         {
    2147    34495456 :             tmp_re = 0;
    2148    34495456 :             move64();
    2149   172477280 :             FOR( k = 0; k < num_ch; k++ )
    2150             :             {
    2151   137981824 :                 tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ), guard_bits ) ); /*q_cov_real+q_mixer_mat-guard_bits*/
    2152             :             }
    2153    34495456 :             if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) )
    2154             :             {
    2155     5697570 :                 tmp_re = 0;
    2156     5697570 :                 move64();
    2157             :             }
    2158    34495456 :             temp_mat[i][j] = W_extract_l( W_shr( tmp_re, q_mixer_mat ) ); // Q = (q_cov_real - guard_bits)
    2159    34495456 :             move32();
    2160    34495456 :             max_val = L_max( max_val, L_abs( temp_mat[i][j] ) ); // Q = (q_cov_real - guard_bits)
    2161             :         }
    2162             :     }
    2163     2155966 :     q_temp_mat = sub( q_cov_real, guard_bits );
    2164             : 
    2165     2155966 :     guard_bits = find_guarded_bits_fx( num_ch );
    2166             : 
    2167     2155966 :     tmp = norm_l( max_val );
    2168     2155966 :     IF( LT_16( tmp, guard_bits ) )
    2169             :     {
    2170       12537 :         guard_bits = sub( guard_bits, tmp );
    2171             :     }
    2172             :     ELSE
    2173             :     {
    2174     2143429 :         guard_bits = 0;
    2175     2143429 :         move16();
    2176             :     }
    2177             : 
    2178             :     /* num_ch x num_ch mult */
    2179    10779830 :     FOR( i = 0; i < num_ch; i++ )
    2180             :     {
    2181    30183524 :         FOR( j = i; j < num_ch; j++ )
    2182             :         {
    2183    21559660 :             tmp_re = 0;
    2184    21559660 :             move64();
    2185   107798300 :             FOR( k = 0; k < num_ch; k++ )
    2186             :             {
    2187    86238640 :                 tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ), guard_bits ) ); /*q_mixer_mat+q_temp_mat-guard_bits*/
    2188             :             }
    2189             : 
    2190    21559660 :             if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) )
    2191             :             {
    2192     5634038 :                 tmp_re = 0;
    2193     5634038 :                 move64();
    2194             :             }
    2195             : 
    2196    21559660 :             postpred_cov_re[i][j] = W_extract_l( W_shr( tmp_re, q_mixer_mat ) ); /*q_temp_mat-guard_bits*/
    2197    21559660 :             move32();
    2198             :         }
    2199             :     }
    2200             : 
    2201     2155966 :     *q_postpred_cov_re = sub( q_temp_mat, guard_bits );
    2202     2155966 :     move16();
    2203             : 
    2204    10779830 :     FOR( i = 0; i < num_ch; i++ )
    2205             :     {
    2206    21559660 :         FOR( j = 0; j < i; j++ )
    2207             :         {
    2208    12935796 :             postpred_cov_re[i][j] = postpred_cov_re[j][i]; /* *q_postpred_cov_re */
    2209    12935796 :             move32();
    2210             :         }
    2211             :     }
    2212             : 
    2213     2155966 :     return;
    2214             : }
    2215             : 
    2216             : 
    2217             : /*-----------------------------------------------------------------------------------------*
    2218             :  * Function ivas_calc_p_coeffs_per_band()
    2219             :  *
    2220             :  * Calculate P coeffs per band
    2221             :  *-----------------------------------------------------------------------------------------*/
    2222             : 
    2223     1591966 : static void ivas_calc_p_coeffs_per_band_enc_fx(
    2224             :     ivas_spar_md_t *pSparMd,
    2225             :     const Word16 i_ts,
    2226             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
    2227             :     Word16 q_postpred_cov_re,
    2228             :     const Word16 num_ch,
    2229             :     const Word16 dtx_vad,
    2230             :     const Word16 num_dmx,
    2231             :     const Word16 band_idx )
    2232             : {
    2233             :     Word16 i, j, k;
    2234             :     Word16 m;
    2235             :     Word32 factor;
    2236             :     Word32 recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
    2237             :     Word16 q_recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
    2238             :     Word64 trace, W_tmp;
    2239             :     Word16 q_factor, q_tmp, q_tmp1;
    2240             :     Word32 tmp;
    2241             :     Word32 p_norm_scaling;
    2242             :     Word16 q_cov_uu_re, q_cov_dd_re;
    2243             :     Word32 cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
    2244             :     Word32 cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
    2245             :     Word16 q_cov_uu_re_per_value[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
    2246             :     Word16 b_ts_idx;
    2247             : 
    2248     1591966 :     b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
    2249             : 
    2250     1591966 :     IF( NE_16( num_dmx, num_ch ) )
    2251             :     {
    2252     1591966 :         set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 );
    2253     1591966 :         pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = 0;
    2254     1591966 :         move16();
    2255    12735728 :         FOR( i = 0; i < sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ); i++ )
    2256             :         {
    2257    11143762 :             set32_fx( recon_uu_re[i], 0, sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ) );
    2258             :         }
    2259             : 
    2260     5548228 :         FOR( i = num_dmx; i < num_ch; i++ )
    2261             :         {
    2262    17126472 :             FOR( j = num_dmx; j < num_ch; j++ )
    2263             :             {
    2264    13170210 :                 cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; // q_postpred_cov_re
    2265    13170210 :                 move32();
    2266             :             }
    2267             :         }
    2268     1591966 :         q_cov_uu_re = q_postpred_cov_re;
    2269     1591966 :         move16();
    2270             : 
    2271     1591966 :         IF( EQ_16( dtx_vad, 1 ) )
    2272             :         {
    2273     3608884 :             FOR( i = 1; i < num_dmx; i++ )
    2274             :             {
    2275     6440568 :                 FOR( j = 1; j < num_dmx; j++ )
    2276             :                 {
    2277     4403472 :                     cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_postpred_cov_re
    2278     4403472 :                     move32();
    2279             :                 }
    2280             :             }
    2281     1571788 :             q_cov_dd_re = q_postpred_cov_re;
    2282     1571788 :             move16();
    2283             : 
    2284     1571788 :             Word16 q_C_re = pSparMd->band_coeffs[b_ts_idx].q_C_re_fx;
    2285     1571788 :             move16();
    2286             : 
    2287     1571788 :             IF( EQ_16( num_dmx, 2 ) )
    2288             :             {
    2289             :                 Word32 re1, re2;
    2290             : 
    2291      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ pSparMd->band_coeffs[b_ts_idx].q_C_re_fx*/
    2292      464160 :                 q_tmp1 = W_norm( W_tmp );
    2293      464160 :                 re1 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); /*q_cov_dd_re+ q_C_re+q_tmp1-32*/
    2294      464160 :                 q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_cov_dd_re ), 32 );
    2295      464160 :                 if ( W_tmp == 0 )
    2296             :                 {
    2297       45420 :                     q_tmp1 = 31;
    2298       45420 :                     move16();
    2299             :                 }
    2300      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ q_C_re*/
    2301      464160 :                 q_tmp = W_norm( W_tmp );
    2302      464160 :                 re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_dd_re+ q_C_re+q_tmp-32*/
    2303      464160 :                 q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
    2304      464160 :                 if ( W_tmp == 0 )
    2305             :                 {
    2306       92540 :                     q_tmp = 31;
    2307       92540 :                     move16();
    2308             :                 }
    2309             : 
    2310      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ); // q_tmp1+q_C_re
    2311      464160 :                 q_recon_uu_re[0][0] = W_norm( W_tmp );
    2312      464160 :                 move16();
    2313      464160 :                 recon_uu_re[0][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][0] ) ); // q_tmp1+q_C_re+q_recon_uu_re[0][0]-32
    2314      464160 :                 move32();
    2315      464160 :                 q_recon_uu_re[0][0] = sub( add( add( q_C_re, q_recon_uu_re[0][0] ), q_tmp1 ), 32 );
    2316      464160 :                 move16();
    2317      464160 :                 if ( W_tmp == 0 )
    2318             :                 {
    2319       45420 :                     q_recon_uu_re[0][0] = 31;
    2320       45420 :                     move16();
    2321             :                 }
    2322             : 
    2323      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ); // q_C_re+q_tmp1
    2324      464160 :                 q_recon_uu_re[0][1] = W_norm( W_tmp );
    2325      464160 :                 move16();
    2326      464160 :                 recon_uu_re[0][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][1] ) ); // q_C_re+q_tmp1+q_recon_uu_re[0][1]-32
    2327      464160 :                 move32();
    2328      464160 :                 q_recon_uu_re[0][1] = sub( add( add( q_C_re, q_recon_uu_re[0][1] ), q_tmp1 ), 32 );
    2329      464160 :                 move16();
    2330      464160 :                 if ( W_tmp == 0 )
    2331             :                 {
    2332       94712 :                     q_recon_uu_re[0][1] = 31;
    2333       94712 :                     move16();
    2334             :                 }
    2335             : 
    2336      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ); // q_C_re+q_tmp
    2337      464160 :                 q_recon_uu_re[1][0] = W_norm( W_tmp );
    2338      464160 :                 move16();
    2339      464160 :                 recon_uu_re[1][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][0] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][0]-32
    2340      464160 :                 move32();
    2341      464160 :                 q_recon_uu_re[1][0] = sub( add( add( q_C_re, q_recon_uu_re[1][0] ), q_tmp ), 32 );
    2342      464160 :                 move16();
    2343      464160 :                 if ( W_tmp == 0 )
    2344             :                 {
    2345       94712 :                     q_recon_uu_re[1][0] = 31;
    2346       94712 :                     move16();
    2347             :                 }
    2348             : 
    2349      464160 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ); // q_C_re+q_tmp
    2350      464160 :                 q_recon_uu_re[1][1] = W_norm( W_tmp );
    2351      464160 :                 move16();
    2352      464160 :                 recon_uu_re[1][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][1] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][1]-32
    2353      464160 :                 move32();
    2354      464160 :                 q_recon_uu_re[1][1] = sub( add( add( q_C_re, q_recon_uu_re[1][1] ), q_tmp ), 32 );
    2355      464160 :                 move16();
    2356      464160 :                 if ( W_tmp == 0 )
    2357             :                 {
    2358       92540 :                     q_recon_uu_re[1][1] = 31;
    2359       92540 :                     move16();
    2360             :                 }
    2361             : 
    2362      464160 :                 q_tmp = 31;
    2363      464160 :                 move16();
    2364     1392480 :                 FOR( i = 0; i < 2; i++ )
    2365             :                 {
    2366     2784960 :                     FOR( j = 0; j < 2; j++ )
    2367             :                     {
    2368     1856640 :                         q_tmp = s_min( q_tmp, q_recon_uu_re[i][j] );
    2369             :                     }
    2370             :                 }
    2371      464160 :                 q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 );
    2372             : 
    2373     1392480 :                 FOR( i = 0; i < 2; i++ )
    2374             :                 {
    2375     2784960 :                     FOR( j = 0; j < 2; j++ )
    2376             :                     {
    2377     1856640 :                         cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp
    2378     1856640 :                         move32();
    2379             :                     }
    2380             :                 }
    2381      464160 :                 q_cov_uu_re = q_tmp;
    2382      464160 :                 move16();
    2383             :             }
    2384     1107628 :             ELSE IF( EQ_16( num_dmx, 3 ) )
    2385             :             {
    2386             :                 Word32 re1[2], re2;
    2387             :                 Word16 q_re1[2];
    2388      389748 :                 set32_fx( re1, 0, 2 );
    2389      389748 :                 set16_fx( q_re1, 31, 2 );
    2390             : 
    2391     1169244 :                 FOR( j = 0; j < 2; j++ )
    2392             :                 {
    2393     2338488 :                     FOR( k = 0; k < 2; k++ )
    2394             :                     {
    2395             :                         Word32 re;
    2396     1558992 :                         W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ); // q_C_re+q_cov_dd_re
    2397     1558992 :                         q_tmp = sub( W_norm( W_tmp ), 1 );
    2398     1558992 :                         re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32
    2399     1558992 :                         q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
    2400     1558992 :                         if ( W_tmp == 0 )
    2401             :                         {
    2402      279963 :                             q_tmp = 31;
    2403      279963 :                             move16();
    2404             :                         }
    2405             : 
    2406     1558992 :                         IF( LT_16( q_tmp, q_re1[j] ) )
    2407             :                         {
    2408      693200 :                             re1[j] = L_shr( re1[j], sub( q_re1[j], q_tmp ) ); // q_tmp
    2409      693200 :                             move32();
    2410      693200 :                             q_re1[j] = q_tmp;
    2411      693200 :                             move16();
    2412             :                         }
    2413             :                         ELSE
    2414             :                         {
    2415      865792 :                             re = L_shr( re, sub( q_tmp, q_re1[j] ) ); // q_re1[j]
    2416             :                         }
    2417     1558992 :                         re1[j] = L_add( re1[j], re ); // q_re1[j]
    2418     1558992 :                         move32();
    2419             :                     }
    2420             :                 }
    2421             : 
    2422      389748 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ); // q_C_re+q_re1[0]
    2423      389748 :                 q_tmp = sub( W_norm( W_tmp ), 1 );
    2424      389748 :                 re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[0]+q_tmp-32
    2425      389748 :                 q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[0] ), 32 );
    2426      389748 :                 if ( W_tmp == 0 )
    2427             :                 {
    2428       72526 :                     q_tmp = 31;
    2429       72526 :                     move16();
    2430             :                 }
    2431      389748 :                 recon_uu_re[0][0] = re2; // q_C_re+q_re1[0]+q_tmp-32
    2432      389748 :                 move32();
    2433             : 
    2434      389748 :                 W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ); // q_C_re+q_re1[1]
    2435      389748 :                 q_tmp1 = sub( W_norm( W_tmp ), 1 );
    2436      389748 :                 re2 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); // q_C_re+q_re1[1]+q_tmp1-32
    2437      389748 :                 q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_re1[1] ), 32 );
    2438      389748 :                 if ( W_tmp == 0 )
    2439             :                 {
    2440       59726 :                     q_tmp1 = 31;
    2441       59726 :                     move16();
    2442             :                 }
    2443             : 
    2444      389748 :                 IF( LT_16( q_tmp, q_tmp1 ) )
    2445             :                 {
    2446      168033 :                     re2 = L_shr( re2, sub( q_tmp1, q_tmp ) ); // q_tmp
    2447             :                 }
    2448             :                 ELSE
    2449             :                 {
    2450      221715 :                     recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], sub( q_tmp, q_tmp1 ) ); // q_tmp1
    2451      221715 :                     move32();
    2452      221715 :                     q_tmp = q_tmp1;
    2453      221715 :                     move16();
    2454             :                 }
    2455             : 
    2456      389748 :                 recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 ); // q_tmp
    2457      389748 :                 move32();
    2458             : 
    2459      389748 :                 IF( LT_16( q_cov_uu_re, q_tmp ) )
    2460             :                 {
    2461      328838 :                     recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], sub( q_tmp, q_cov_uu_re ) ); // q_cov_uu_re
    2462      328838 :                     move32();
    2463             :                 }
    2464             :                 ELSE
    2465             :                 {
    2466      121820 :                     FOR( i = num_dmx; i < num_ch; i++ )
    2467             :                     {
    2468      121820 :                         FOR( j = num_dmx; j < num_ch; j++ )
    2469             :                         {
    2470       60910 :                             cov_uu_re[i - num_dmx][j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], sub( q_cov_uu_re, q_tmp ) ); // q_tmp
    2471       60910 :                             move32();
    2472             :                         }
    2473             :                     }
    2474       60910 :                     q_cov_uu_re = q_tmp;
    2475       60910 :                     move16();
    2476             :                 }
    2477             : 
    2478      389748 :                 IF( recon_uu_re[0][0] != 0 )
    2479             :                 {
    2480      331520 :                     test();
    2481      331520 :                     IF( W_norm( recon_uu_re[0][0] ) == 0 || W_norm( cov_uu_re[0][0] ) == 0 )
    2482             :                     {
    2483         128 :                         FOR( i = num_dmx; i < num_ch; i++ )
    2484             :                         {
    2485         128 :                             FOR( j = num_dmx; j < num_ch; j++ )
    2486             :                             {
    2487          64 :                                 cov_uu_re[i - num_dmx][j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], 1 ); // q_cov_uu_re-1
    2488          64 :                                 move32();
    2489             :                             }
    2490             :                         }
    2491          64 :                         q_cov_uu_re = sub( q_cov_uu_re, 1 );
    2492          64 :                         recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], 1 ); // q_cov_uu_re
    2493          64 :                         move32();
    2494             :                     }
    2495             :                 }
    2496             : 
    2497      389748 :                 cov_uu_re[0][0] = L_sub( cov_uu_re[0][0], recon_uu_re[0][0] ); // q_cov_uu_re
    2498      389748 :                 move32();
    2499             :             }
    2500      717880 :             ELSE IF( EQ_16( num_dmx, 4 ) )
    2501             :             {
    2502             :                 /* Step 1: Multiply C * cov_dd * C' */
    2503             :                 Word32 re1[3], re;
    2504             :                 Word16 q_re1[3];
    2505             : 
    2506     1490880 :                 FOR( i = 0; i < num_ch - num_dmx; i++ )
    2507             :                 {
    2508     1226400 :                     set32_fx( re1, 0, 3 );
    2509     1226400 :                     set16_fx( q_re1, 31, 3 );
    2510     1226400 :                     set16_fx( q_recon_uu_re[i], 31, IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS );
    2511     4905600 :                     FOR( m = 0; m < num_dmx - 1; m++ )
    2512             :                     {
    2513    14716800 :                         FOR( k = 0; k < num_dmx - 1; k++ )
    2514             :                         {
    2515    11037600 :                             W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ); // q_C_re+q_cov_dd_re
    2516    11037600 :                             q_tmp = sub( W_norm( W_tmp ), 2 );
    2517    11037600 :                             re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32
    2518    11037600 :                             q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
    2519    11037600 :                             if ( W_tmp == 0 )
    2520             :                             {
    2521     1198684 :                                 q_tmp = 31;
    2522     1198684 :                                 move16();
    2523             :                             }
    2524             : 
    2525    11037600 :                             IF( LT_16( q_tmp, q_re1[m] ) )
    2526             :                             {
    2527     5052247 :                                 re1[m] = L_shr( re1[m], sub( q_re1[m], q_tmp ) ); // q_tmp
    2528     5052247 :                                 move32();
    2529     5052247 :                                 q_re1[m] = q_tmp;
    2530     5052247 :                                 move16();
    2531             :                             }
    2532             :                             ELSE
    2533             :                             {
    2534     5985353 :                                 re = L_shr( re, sub( q_tmp, q_re1[m] ) ); // q_re1[m]
    2535             :                             }
    2536    11037600 :                             IF( re != 0 )
    2537             :                             {
    2538     9838896 :                                 test();
    2539     9838896 :                                 IF( W_norm( re ) == 0 || W_norm( re1[m] ) == 0 )
    2540             :                                 {
    2541     3337912 :                                     re1[m] = L_shr( re1[m], 1 ); // q_re1[m]-1
    2542     3337912 :                                     move32();
    2543     3337912 :                                     q_re1[m] = sub( q_re1[m], 1 );
    2544     3337912 :                                     move16();
    2545     3337912 :                                     re = L_shr( re, 1 ); // q_re1[m]
    2546             :                                 }
    2547             :                             }
    2548             : 
    2549    11037600 :                             re1[m] = L_add( re1[m], re ); // q_re1[m]
    2550    11037600 :                             move32();
    2551             :                         }
    2552             :                     }
    2553     7932720 :                     FOR( j = 0; j < num_ch - num_dmx; j++ )
    2554             :                     {
    2555    26825280 :                         FOR( m = 0; m < num_dmx - 1; m++ )
    2556             :                         {
    2557    20118960 :                             W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ); // q_C_re+q_re1[m]
    2558    20118960 :                             q_tmp = sub( W_norm( W_tmp ), 2 );
    2559    20118960 :                             re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[m]+q_tmp-32
    2560    20118960 :                             q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[m] ), 32 );
    2561    20118960 :                             if ( W_tmp == 0 )
    2562             :                             {
    2563     2460892 :                                 q_tmp = 31;
    2564     2460892 :                                 move16();
    2565             :                             }
    2566             : 
    2567    20118960 :                             IF( LT_16( q_tmp, q_recon_uu_re[i][j] ) )
    2568             :                             {
    2569     8540740 :                                 recon_uu_re[i][j] = L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ); // q_tmp
    2570     8540740 :                                 move32();
    2571     8540740 :                                 q_recon_uu_re[i][j] = q_tmp;
    2572     8540740 :                                 move16();
    2573             :                             }
    2574             :                             ELSE
    2575             :                             {
    2576    11578220 :                                 re = L_shr( re, sub( q_tmp, q_recon_uu_re[i][j] ) ); // q_recon_uu_re[i][j]
    2577             :                             }
    2578    20118960 :                             IF( re != 0 )
    2579             :                             {
    2580    17658024 :                                 test();
    2581    17658024 :                                 IF( W_norm( re ) == 0 || W_norm( recon_uu_re[i][j] ) == 0 )
    2582             :                                 {
    2583     5986546 :                                     recon_uu_re[i][j] = L_shr( recon_uu_re[i][j], 1 ); // q_recon_uu_re[i][j] - 1
    2584     5986546 :                                     move32();
    2585     5986546 :                                     q_recon_uu_re[i][j] = sub( q_recon_uu_re[i][j], 1 );
    2586     5986546 :                                     move16();
    2587     5986546 :                                     re = L_shr( re, 1 ); // q_recon_uu_re[i][j]
    2588             :                                 }
    2589             :                             }
    2590    20118960 :                             recon_uu_re[i][j] = L_add( recon_uu_re[i][j], re ); // q_recon_uu_re[i][j]
    2591    20118960 :                             move32();
    2592             :                         }
    2593             :                     }
    2594             :                 }
    2595             : 
    2596      264480 :                 q_tmp = 31;
    2597      264480 :                 move16();
    2598     1490880 :                 FOR( i = 0; i < num_ch - num_dmx; i++ )
    2599             :                 {
    2600     7932720 :                     FOR( j = 0; j < num_ch - num_dmx; j++ )
    2601             :                     {
    2602     6706320 :                         q_tmp = s_min( q_tmp, q_recon_uu_re[i][j] );
    2603             :                     }
    2604             :                 }
    2605      264480 :                 q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 );
    2606             : 
    2607             :                 /* Step 2: cov_uu - recon_uu */
    2608     1490880 :                 FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    2609             :                 {
    2610     7932720 :                     FOR( j = 0; j < num_ch - num_dmx; j++ )
    2611             :                     {
    2612     6706320 :                         cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp
    2613     6706320 :                         move32();
    2614             :                     }
    2615             :                 }
    2616      264480 :                 q_cov_uu_re = q_tmp;
    2617      264480 :                 move16();
    2618             :             }
    2619             :         }
    2620             : 
    2621     1591966 :         p_norm_scaling = IVAS_P_NORM_SCALING_FX; // q31
    2622     1591966 :         move32();
    2623             : 
    2624     1591966 :         test();
    2625     1591966 :         if ( ( dtx_vad == 0 ) && EQ_16( num_dmx, 1 ) )
    2626             :         {
    2627       11238 :             p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; // q31
    2628       11238 :             move32();
    2629             :         }
    2630             : 
    2631     1591966 :         trace = 0;
    2632     1591966 :         move64();
    2633             : 
    2634     5548228 :         FOR( i = num_dmx; i < num_ch; i++ )
    2635             :         {
    2636     3956262 :             trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ) ); // q_cov_uu_re
    2637             :         }
    2638             : 
    2639     1591966 :         factor = postpred_cov_re[0][0]; // q_postpred_cov_re
    2640     1591966 :         move32();
    2641     1591966 :         q_factor = q_postpred_cov_re;
    2642     1591966 :         move16();
    2643     1591966 :         IF( trace != 0 )
    2644             :         {
    2645     1557458 :             q_factor = W_norm( trace );
    2646     1557458 :             tmp = Mpy_32_32( p_norm_scaling, W_extract_h( W_shl( trace, q_factor ) ) ); // q_cov_uu_re+q_factor-32
    2647     1557458 :             q_factor = sub( add( q_cov_uu_re, q_factor ), 32 );
    2648     1557458 :             IF( GT_16( q_factor, q_postpred_cov_re ) )
    2649             :             {
    2650     1286041 :                 tmp = L_shr( tmp, sub( q_factor, q_postpred_cov_re ) ); // q_postpred_cov_re
    2651     1286041 :                 q_factor = q_postpred_cov_re;
    2652     1286041 :                 move16();
    2653             :             }
    2654             :             ELSE
    2655             :             {
    2656      271417 :                 factor = L_shr( factor, sub( q_postpred_cov_re, q_factor ) ); // q_factor
    2657             :             }
    2658     1557458 :             factor = L_max( factor, tmp ); // q_factor
    2659             :         }
    2660             : 
    2661     1591966 :         tmp = L_shl_sat( 189 /* 1e-20 in Q74 */, sub( q_factor, 74 ) );
    2662             : 
    2663     1591966 :         Word16 factor_exp = 0;
    2664     1591966 :         move16();
    2665     1591966 :         IF( LE_32( factor, tmp ) )
    2666             :         {
    2667        3573 :             factor = 22204; // (1 / 1e-20) in Q(-52)
    2668        3573 :             factor_exp = Q15 - ( -52 );
    2669        3573 :             move32();
    2670        3573 :             move16();
    2671             :         }
    2672             :         ELSE
    2673             :         {
    2674     1588393 :             factor = BASOP_Util_Divide3232_Scale( 1, factor, &factor_exp ); // q=15-(factor_exp+31-(31-q_factor))
    2675     1588393 :             factor_exp = add( factor_exp, q_factor );
    2676             :         }
    2677             : 
    2678             :         /* normalise Hermitian (except for rounding) cov_uu */
    2679     5548228 :         FOR( i = num_dmx; i < num_ch; i++ )
    2680             :         {
    2681    17126472 :             FOR( j = num_dmx; j < num_ch; j++ )
    2682             :             {
    2683    13170210 :                 IF( EQ_16( i, j ) )
    2684             :                 {
    2685             :                     /* force diagonal to be real */
    2686     3956262 :                     W_tmp = W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ); /*q_cov_uu_re+15-factor_exp*/
    2687     3956262 :                     q_tmp = 32;
    2688     3956262 :                     move16();
    2689     3956262 :                     if ( W_tmp != 0 )
    2690             :                     {
    2691     3754086 :                         q_tmp = W_norm( W_tmp );
    2692             :                     }
    2693     3956262 :                     cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_uu_re+15-factor_exp+q_tmp-32*/
    2694     3956262 :                     move32();
    2695     3956262 :                     q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = sub( add( add( q_cov_uu_re, sub( 15, factor_exp ) ), q_tmp ), 32 );
    2696     3956262 :                     move16();
    2697             :                 }
    2698             :                 ELSE
    2699             :                 {
    2700             :                     /* set off-diag elements to zero */
    2701     9213948 :                     cov_uu_re[i - num_dmx][j - num_dmx] = 0;
    2702     9213948 :                     move32();
    2703     9213948 :                     q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = 0;
    2704     9213948 :                     move16();
    2705             :                 }
    2706             :             }
    2707             :         }
    2708             : 
    2709             :         Word16 cov_uu_re_exp;
    2710     1591966 :         q_tmp = 31;
    2711     1591966 :         move16();
    2712             :         /* take sqrt of max of diags and zero */
    2713     5548228 :         FOR( i = num_dmx; i < num_ch; i++ )
    2714             :         {
    2715     3956262 :             cov_uu_re_exp = sub( 31, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] );
    2716     3956262 :             cov_uu_re[i - num_dmx][i - num_dmx] = Sqrt32( L_max( 0, cov_uu_re[i - num_dmx][i - num_dmx] ), &cov_uu_re_exp ); // q=31-cov_uu_re_exp
    2717     3956262 :             move32();
    2718     3956262 :             q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] = sub( 31, cov_uu_re_exp );
    2719     3956262 :             move16();
    2720     3956262 :             q_tmp = s_min( q_tmp, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] );
    2721             :         }
    2722             : 
    2723             :         /* save into MD struct */
    2724     5548228 :         FOR( i = num_dmx; i < num_ch; i++ )
    2725             :         {
    2726    17126472 :             FOR( j = num_dmx; j < num_ch; j++ )
    2727             :             {
    2728    13170210 :                 IF( EQ_16( i, j ) )
    2729             :                 {
    2730     3956262 :                     pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], sub( q_cov_uu_re_per_value[i - num_dmx][j - num_dmx], Q28 ) ); // Q28
    2731     3956262 :                     move32();
    2732             :                 }
    2733             :             }
    2734             :         }
    2735     1591966 :         pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = Q28;
    2736     1591966 :         move16();
    2737             :     }
    2738             : 
    2739     1591966 :     return;
    2740             : }
    2741             : 
    2742     1718458 : static void ivas_calc_p_coeffs_per_band_fx(
    2743             :     ivas_spar_md_t *pSparMd,
    2744             :     const Word16 i_ts,
    2745             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // q_postpred_cov_re
    2746             :     Word16 q_postpred_cov_re,
    2747             :     const Word16 num_ch,
    2748             :     const Word16 dtx_vad,
    2749             :     const Word16 num_dmx,
    2750             :     const Word16 band_idx )
    2751             : {
    2752             :     Word16 i, j, k;
    2753             :     Word16 m;
    2754             :     Word32 factor;
    2755             :     Word32 recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
    2756             :     Word32 trace;
    2757             :     Word32 p_norm_scaling;
    2758             :     Word16 q_cov_uu_re;
    2759             :     Word32 cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
    2760             :     Word32 cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
    2761             :     Word16 b_ts_idx;
    2762             :     Word16 tmp;
    2763             : 
    2764     1718458 :     b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
    2765             : 
    2766     1718458 :     IF( NE_16( num_dmx, num_ch ) )
    2767             :     {
    2768     1718458 :         set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 );
    2769     1718458 :         pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = 0;
    2770     1718458 :         move16();
    2771    13747664 :         FOR( i = 0; i < sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ); i++ )
    2772             :         {
    2773    12029206 :             set32_fx( recon_uu_re[i], 0, sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ) );
    2774             :         }
    2775             : 
    2776     5024812 :         FOR( i = num_dmx; i < num_ch; i++ )
    2777             :         {
    2778    10663516 :             FOR( j = num_dmx; j < num_ch; j++ )
    2779             :             {
    2780     7357162 :                 cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; // q=q_postpred_cov_re
    2781     7357162 :                 move32();
    2782             :             }
    2783             :         }
    2784     1718458 :         q_cov_uu_re = q_postpred_cov_re;
    2785     1718458 :         move16();
    2786             : 
    2787     1718458 :         IF( EQ_16( dtx_vad, 1 ) )
    2788             :         {
    2789     3551338 :             FOR( i = 1; i < num_dmx; i++ )
    2790             :             {
    2791     4821560 :                 FOR( j = 1; j < num_dmx; j++ )
    2792             :                 {
    2793     2978850 :                     cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q=q_postpred_cov_re
    2794     2978850 :                     move32();
    2795             :                 }
    2796             :             }
    2797             : 
    2798     1708628 :             Word16 q_C_re = pSparMd->band_coeffs[b_ts_idx].q_C_re_fx;
    2799     1708628 :             move16();
    2800             : 
    2801     1708628 :             IF( EQ_16( num_dmx, 2 ) )
    2802             :             {
    2803             :                 Word32 re1, re2;
    2804             : 
    2805      706570 :                 re1 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ), q_C_re ) ); // q_cov_uu_re
    2806      706570 :                 re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ), q_C_re ) ); // q_cov_uu_re
    2807             : 
    2808      706570 :                 recon_uu_re[0][0] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ), q_C_re ) ); // q_cov_uu_re
    2809      706570 :                 recon_uu_re[0][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ), q_C_re ) ); // q_cov_uu_re
    2810      706570 :                 recon_uu_re[1][0] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ), q_C_re ) ); // q_cov_uu_re
    2811      706570 :                 recon_uu_re[1][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ), q_C_re ) ); // q_cov_uu_re
    2812      706570 :                 move32();
    2813      706570 :                 move32();
    2814      706570 :                 move32();
    2815      706570 :                 move32();
    2816             : 
    2817     2119710 :                 FOR( i = 0; i < 2; i++ )
    2818             :                 {
    2819     4239420 :                     FOR( j = 0; j < 2; j++ )
    2820             :                     {
    2821     2826280 :                         cov_uu_re[i][j] = L_sub( cov_uu_re[i][j], recon_uu_re[i][j] ); // q_cov_uu_re
    2822     2826280 :                         move32();
    2823             :                     }
    2824             :                 }
    2825             :             }
    2826     1002058 :             ELSE IF( EQ_16( num_dmx, 3 ) )
    2827             :             {
    2828             :                 Word32 re1[2], re2;
    2829      568070 :                 set32_fx( re1, 0, 2 );
    2830             : 
    2831     1704210 :                 FOR( j = 0; j < 2; j++ )
    2832             :                 {
    2833     3408420 :                     FOR( k = 0; k < 2; k++ )
    2834             :                     {
    2835             :                         Word32 re;
    2836     2272280 :                         re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ), q_C_re ) ); // q_cov_uu_re
    2837     2272280 :                         re1[j] = L_add( re1[j], re );                                                                                        // q_cov_uu_re
    2838     2272280 :                         move32();
    2839             :                     }
    2840             :                 }
    2841             : 
    2842      568070 :                 re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ), q_C_re ) ); // q_cov_uu_re
    2843      568070 :                 recon_uu_re[0][0] = re2;                                                                                     // q_cov_uu_re
    2844      568070 :                 move32();
    2845      568070 :                 re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ), q_C_re ) ); // q_cov_uu_re
    2846      568070 :                 recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 );                                                         // q_cov_uu_re
    2847      568070 :                 move32();
    2848             : 
    2849      568070 :                 cov_uu_re[0][0] = L_sub( cov_uu_re[0][0], recon_uu_re[0][0] ); // q_cov_uu_re
    2850      568070 :                 move32();
    2851             :             }
    2852      433988 :             ELSE IF( EQ_16( num_dmx, 4 ) )
    2853             :             {
    2854             :                 /* Step 1: Multiply C * cov_dd * C' */
    2855             :                 Word32 re1[3], re;
    2856             : 
    2857           0 :                 FOR( i = 0; i < num_ch - num_dmx; i++ )
    2858             :                 {
    2859           0 :                     set32_fx( re1, 0, 3 );
    2860           0 :                     FOR( m = 0; m < num_dmx - 1; m++ )
    2861             :                     {
    2862           0 :                         FOR( k = 0; k < num_dmx - 1; k++ )
    2863             :                         {
    2864           0 :                             re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ), q_C_re ) ); // q_cov_uu_re
    2865           0 :                             re1[m] = L_add( re1[m], re );                                                                                        // q_cov_uu_re
    2866           0 :                             move32();
    2867             :                         }
    2868             :                     }
    2869           0 :                     FOR( j = 0; j < num_ch - num_dmx; j++ )
    2870             :                     {
    2871           0 :                         FOR( m = 0; m < num_dmx - 1; m++ )
    2872             :                         {
    2873           0 :                             re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ), q_C_re ) ); // q_cov_uu_re
    2874           0 :                             recon_uu_re[i][j] = L_add( recon_uu_re[i][j], re );                                                         // q_cov_uu_re
    2875           0 :                             move32();
    2876             :                         }
    2877             :                     }
    2878             :                 }
    2879             : 
    2880             :                 /* Step 2: cov_uu - recon_uu */
    2881           0 :                 FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    2882             :                 {
    2883           0 :                     FOR( j = 0; j < num_ch - num_dmx; j++ )
    2884             :                     {
    2885           0 :                         cov_uu_re[i][j] = L_sub( cov_uu_re[i][j], recon_uu_re[i][j] ); // q_cov_uu_re
    2886           0 :                         move32();
    2887             :                     }
    2888             :                 }
    2889             :             }
    2890             :         }
    2891             : 
    2892     1718458 :         p_norm_scaling = IVAS_P_NORM_SCALING_FX; /*q31*/
    2893     1718458 :         move32();
    2894             : 
    2895     1718458 :         test();
    2896     1718458 :         if ( ( dtx_vad == 0 ) && EQ_16( num_dmx, 1 ) )
    2897             :         {
    2898        3520 :             p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; /*q31*/
    2899        3520 :             move32();
    2900             :         }
    2901             : 
    2902     1718458 :         trace = 0;
    2903     1718458 :         move32();
    2904             : 
    2905     5024812 :         FOR( i = num_dmx; i < num_ch; i++ )
    2906             :         {
    2907     3306354 :             trace = L_add( trace, L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ); // q_cov_uu_re
    2908             :         }
    2909             : 
    2910     1718458 :         factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] );        // q=q_postpred_cov_re
    2911     1718458 :         factor = L_max( factor, Mpy_32_32( p_norm_scaling, trace ) ); // q=q_postpred_cov_re
    2912             : 
    2913     1718458 :         Word16 factor_exp = 0;
    2914     1718458 :         move16();
    2915     1718458 :         factor = BASOP_Util_Divide3232_Scale( L_shl( 1, q_postpred_cov_re ), factor, &factor_exp ); // q=15-factor_exp
    2916     1718458 :         tmp = sub( 15, factor_exp );
    2917             : 
    2918             :         /* normalise Hermitian (except for rounding) cov_uu */
    2919     5024812 :         FOR( i = num_dmx; i < num_ch; i++ )
    2920             :         {
    2921    10663516 :             FOR( j = num_dmx; j < num_ch; j++ )
    2922             :             {
    2923     7357162 :                 IF( EQ_16( i, j ) )
    2924             :                 {
    2925             :                     /* force diagonal to be real */
    2926     3306354 :                     cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_l( W_shr( W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ), tmp ) ); // q_cov_uu_re
    2927     3306354 :                     move32();
    2928             :                 }
    2929             :                 ELSE
    2930             :                 {
    2931             :                     /* set off-diag elements to zero */
    2932     4050808 :                     cov_uu_re[i - num_dmx][j - num_dmx] = 0;
    2933     4050808 :                     move32();
    2934             :                 }
    2935             :             }
    2936             :         }
    2937             : 
    2938             :         Word16 cov_uu_re_exp;
    2939             :         /* take sqrt of max of diags and zero */
    2940     5024812 :         FOR( i = num_dmx; i < num_ch; i++ )
    2941             :         {
    2942     3306354 :             cov_uu_re_exp = sub( 31, q_cov_uu_re );
    2943     3306354 :             cov_uu_re[i - num_dmx][i - num_dmx] = Sqrt32( L_max( 0, cov_uu_re[i - num_dmx][i - num_dmx] ), &cov_uu_re_exp );                  // q=31-cov_uu_re_exp
    2944     3306354 :             cov_uu_re[i - num_dmx][i - num_dmx] = L_shl( cov_uu_re[i - num_dmx][i - num_dmx], sub( q_cov_uu_re, sub( 31, cov_uu_re_exp ) ) ); // q_cov_uu_re
    2945     3306354 :             move32();
    2946     3306354 :             move32();
    2947             :         }
    2948             : 
    2949             :         /* save into MD struct */
    2950     5024812 :         FOR( i = num_dmx; i < num_ch; i++ )
    2951             :         {
    2952    10663516 :             FOR( j = num_dmx; j < num_ch; j++ )
    2953             :             {
    2954     7357162 :                 IF( EQ_16( i, j ) )
    2955             :                 {
    2956     3306354 :                     pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; // q_cov_uu_re
    2957     3306354 :                     move32();
    2958             :                 }
    2959             :             }
    2960             :         }
    2961     1718458 :         pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = q_cov_uu_re;
    2962     1718458 :         move16();
    2963             :     }
    2964             : 
    2965     1718458 :     return;
    2966             : }
    2967             : 
    2968             : 
    2969             : /*-----------------------------------------------------------------------------------------*
    2970             :  * Function ivas_calc_c_coeffs_per_band()
    2971             :  *
    2972             :  * Calculate C coeffs per band
    2973             :  *-----------------------------------------------------------------------------------------*/
    2974             : 
    2975     1966132 : static void ivas_calc_c_coeffs_per_band_enc_fx(
    2976             :     ivas_spar_md_t *pSparMd,
    2977             :     const Word16 i_ts,
    2978             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // q_post_pred_cov_re
    2979             :     Word16 q_post_pred_cov_re,
    2980             :     const Word16 num_ch,
    2981             :     const Word16 num_dmx,
    2982             :     const Word16 band_idx,
    2983             :     const Word16 dtx_vad )
    2984             : {
    2985             :     Word16 i, j, k;
    2986             : 
    2987             :     /* worst case for cov_ud is actually 12 x 3 */
    2988             :     Word32 cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
    2989             :     Word32 cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
    2990             :     Word32 cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
    2991             :     Word16 q_cov_dd_re_inv;
    2992             :     Word32 trace_cov_dd_re, max_val;
    2993             :     Word16 q_tmp;
    2994             :     Word32 abs_trace;
    2995             :     Word16 b_ts_idx;
    2996             : 
    2997     1966132 :     b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
    2998             : 
    2999     1966132 :     IF( dtx_vad == 0 )
    3000             :     {
    3001       11920 :         set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3002       11920 :         pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3003       11920 :         move16();
    3004       11920 :         return;
    3005             :     }
    3006             : 
    3007     6607936 :     FOR( i = num_dmx; i < num_ch; i++ )
    3008             :     {
    3009    14862628 :         FOR( j = 1; j < num_dmx; j++ )
    3010             :         {
    3011    10208904 :             cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
    3012    10208904 :             move32();
    3013             :         }
    3014             :     }
    3015             : 
    3016     1954212 :     max_val = 0;
    3017     1954212 :     move32();
    3018             : 
    3019     5615924 :     FOR( i = 1; i < num_dmx; i++ )
    3020             :     {
    3021    11796344 :         FOR( j = 1; j < num_dmx; j++ )
    3022             :         {
    3023     8134632 :             IF( EQ_16( i, j ) )
    3024             :             {
    3025     3661712 :                 max_val = L_max( max_val, postpred_cov_re[i][j] ); // q_post_pred_cov_re
    3026             :             }
    3027     8134632 :             cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
    3028     8134632 :             move32();
    3029             :         }
    3030             :     }
    3031             : 
    3032     1954212 :     trace_cov_dd_re = 0;
    3033     1954212 :     move32();
    3034             : 
    3035     5615924 :     FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
    3036             :     {
    3037     3661712 :         trace_cov_dd_re = L_add( trace_cov_dd_re, Mpy_32_32( cov_dd_re[i][i], 10737418 /* 0.005f in Q31*/ ) ); // q_post_pred_cov_re
    3038             :     }
    3039             : 
    3040     1954212 :     abs_trace = L_abs( trace_cov_dd_re ); // q_post_pred_cov_re
    3041             : 
    3042     1954212 :     IF( LE_32( abs_trace, IVAS_FIX_EPS ) )
    3043             :     {
    3044             :         /* protection from cases when variance of residual channels is very small */
    3045       30683 :         set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3046       30683 :         pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3047       30683 :         move16();
    3048             :     }
    3049             :     ELSE
    3050             :     {
    3051     1923529 :         q_tmp = 1;
    3052     1923529 :         move16();
    3053     1923529 :         if ( norm_l( max_val ) > 0 )
    3054             :         {
    3055     1830161 :             q_tmp = 0;
    3056     1830161 :             move16();
    3057             :         }
    3058     1923529 :         trace_cov_dd_re = L_shr( trace_cov_dd_re, q_tmp ); // q_post_pred_cov_re - q_tmp
    3059     5529684 :         FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
    3060             :         {
    3061    11622042 :             FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3062             :             {
    3063     8015887 :                 cov_dd_re[i][j] = L_shr( cov_dd_re[i][j], q_tmp ); // q_post_pred_cov_re - q_tmp
    3064     8015887 :                 move32();
    3065             :             }
    3066             :         }
    3067             : 
    3068     5529684 :         FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
    3069             :         {
    3070     3606155 :             cov_dd_re[i][i] = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re - q_tmp
    3071     3606155 :             move32();
    3072             :         }
    3073     1923529 :         test();
    3074     1923529 :         IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ) ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) )
    3075             :         {
    3076         204 :             set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3077         204 :             pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3078         204 :             move16();
    3079             :         }
    3080             :         ELSE
    3081             :         {
    3082     1923325 :             ivas_calc_mat_inv_fx( cov_dd_re, sub( q_post_pred_cov_re, q_tmp ), sub( num_dmx, 1 ), cov_dd_re_inv, &q_cov_dd_re_inv );
    3083             : 
    3084             :             Word16 tmp;
    3085     1923325 :             Word64 W_max_val = 1;
    3086     1923325 :             move64();
    3087             :             Word64 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
    3088             : 
    3089     6520113 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3090             :             {
    3091    14696638 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3092             :                 {
    3093    10099850 :                     C_re_fx[i][j] = 0;
    3094    10099850 :                     move64();
    3095    36070944 :                     FOR( k = 0; k < sub( num_dmx, 1 ); k++ )
    3096             :                     {
    3097    25971094 :                         C_re_fx[i][j] = W_add_nosat( C_re_fx[i][j], W_mult0_32_32( cov_ud_re[i][k], cov_dd_re_inv[k][j] ) ); // q_post_pred_cov_re+q_cov_dd_re_inv
    3098    25971094 :                         move64();
    3099             :                     }
    3100    10099850 :                     if ( LT_64( W_max_val, W_abs( C_re_fx[i][j] ) ) )
    3101             :                     {
    3102     3219213 :                         W_max_val = W_abs( C_re_fx[i][j] ); // q_post_pred_cov_re+q_cov_dd_re_inv
    3103             :                     }
    3104             :                 }
    3105             :             }
    3106             : 
    3107     1923325 :             tmp = s_max( sub( 32, W_norm( W_max_val ) ), 0 );
    3108             : 
    3109     6520113 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3110             :             {
    3111    14696638 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3112             :                 {
    3113    10099850 :                     pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][j] = W_extract_l( W_shr( C_re_fx[i][j], tmp ) ); // q_post_pred_cov_re+q_cov_dd_re_inv-tmp
    3114    10099850 :                     move32();
    3115             :                 }
    3116             :             }
    3117     1923325 :             pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = sub( add( q_cov_dd_re_inv, q_post_pred_cov_re ), tmp );
    3118     1923325 :             move16();
    3119             :         }
    3120             :     }
    3121             : 
    3122     1954212 :     return;
    3123             : }
    3124             : 
    3125     1280950 : static void ivas_calc_c_coeffs_per_band_fx(
    3126             :     ivas_spar_md_t *pSparMd,
    3127             :     const Word16 i_ts,
    3128             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_post_pred_cov_re*/
    3129             :     Word16 q_post_pred_cov_re,
    3130             :     const Word16 num_ch,
    3131             :     const Word16 num_dmx,
    3132             :     const Word16 band_idx,
    3133             :     const Word16 dtx_vad )
    3134             : {
    3135             :     Word16 i, j, k;
    3136             : 
    3137             :     /* worst case for cov_ud is actually 12 x 3 */
    3138             :     Word32 cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
    3139             :     Word32 cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
    3140             :     Word32 cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
    3141             :     Word16 q_cov_dd_re_inv;
    3142             :     Word32 trace_cov_dd_re;
    3143             :     Word32 abs_trace;
    3144             :     Word16 b_ts_idx;
    3145             : 
    3146     1280950 :     b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
    3147             : 
    3148     1280950 :     IF( dtx_vad == 0 )
    3149             :     {
    3150        6310 :         set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3151        6310 :         pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3152        6310 :         move16();
    3153        6310 :         return;
    3154             :     }
    3155             : 
    3156     3255850 :     FOR( i = num_dmx; i < num_ch; i++ )
    3157             :     {
    3158     4530490 :         FOR( j = 1; j < num_dmx; j++ )
    3159             :         {
    3160     2549280 :             cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
    3161     2549280 :             move32();
    3162             :         }
    3163             :     }
    3164             : 
    3165     3117350 :     FOR( i = 1; i < num_dmx; i++ )
    3166             :     {
    3167     4821560 :         FOR( j = 1; j < num_dmx; j++ )
    3168             :         {
    3169     2978850 :             cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
    3170     2978850 :             move32();
    3171             :         }
    3172             :     }
    3173             : 
    3174     1274640 :     trace_cov_dd_re = 0;
    3175     1274640 :     move32();
    3176             : 
    3177     3117350 :     FOR( i = 0; i < num_dmx - 1; i++ )
    3178             :     {
    3179     1842710 :         trace_cov_dd_re = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re
    3180             :     }
    3181     1274640 :     trace_cov_dd_re = Mpy_32_32( trace_cov_dd_re, 10737418 /* 0.005f in Q31*/ ); // q_post_pred_cov_re
    3182             : 
    3183     1274640 :     abs_trace = L_abs( trace_cov_dd_re ); // q_post_pred_cov_re
    3184             : 
    3185     1274640 :     IF( LE_32( abs_trace, IVAS_FIX_EPS ) )
    3186             :     {
    3187             :         /* protection from cases when variance of residual channels is very small */
    3188       86990 :         set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3189       86990 :         pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3190       86990 :         move16();
    3191             :     }
    3192             :     ELSE
    3193             :     {
    3194     2898135 :         FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
    3195             :         {
    3196     1710485 :             cov_dd_re[i][i] = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re
    3197     1710485 :             move32();
    3198             :         }
    3199     1187650 :         test();
    3200     1187650 :         IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ) ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) )
    3201             :         {
    3202           0 :             set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
    3203           0 :             pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
    3204           0 :             move16();
    3205             :         }
    3206             :         ELSE
    3207             :         {
    3208     1187650 :             ivas_calc_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ), cov_dd_re_inv, &q_cov_dd_re_inv );
    3209             : 
    3210             :             Word16 tmp;
    3211     1187650 :             Word64 max_val = 1;
    3212     1187650 :             move64();
    3213             :             Word64 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
    3214             : 
    3215     3040115 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3216             :             {
    3217     4227765 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3218             :                 {
    3219     2375300 :                     C_re_fx[i][j] = 0;
    3220     2375300 :                     move64();
    3221     5796270 :                     FOR( k = 0; k < sub( num_dmx, 1 ); k++ )
    3222             :                     {
    3223     3420970 :                         C_re_fx[i][j] = W_add_nosat( C_re_fx[i][j], W_mult0_32_32( cov_ud_re[i][k], cov_dd_re_inv[k][j] ) ); // q_post_pred_cov_re+q_cov_dd_re_inv
    3224     3420970 :                         move64();
    3225             :                     }
    3226     2375300 :                     if ( LT_64( max_val, W_abs( C_re_fx[i][j] ) ) )
    3227             :                     {
    3228     1278659 :                         max_val = W_abs( C_re_fx[i][j] ); // q_post_pred_cov_re+q_cov_dd_re_inv
    3229             :                     }
    3230             :                 }
    3231             :             }
    3232             : 
    3233     1187650 :             tmp = s_max( sub( 32, W_norm( max_val ) ), 0 );
    3234             : 
    3235     3040115 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3236             :             {
    3237     4227765 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3238             :                 {
    3239     2375300 :                     pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][j] = W_extract_l( W_shr( C_re_fx[i][j], tmp ) ); // q_post_pred_cov_re+q_cov_dd_re_inv-tmp
    3240     2375300 :                     move32();
    3241             :                 }
    3242             :             }
    3243     1187650 :             pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = sub( add( q_cov_dd_re_inv, q_post_pred_cov_re ), tmp );
    3244     1187650 :             move16();
    3245             :         }
    3246             :     }
    3247             : 
    3248     1274640 :     return;
    3249             : }
    3250             : 
    3251             : 
    3252             : /*-----------------------------------------------------------------------------------------*
    3253             :  * Function ivas_calc_c_p_coeffs()
    3254             :  *
    3255             :  * Calculation of C and P coeffs
    3256             :  *-----------------------------------------------------------------------------------------*/
    3257             : 
    3258             : 
    3259     2430770 : void ivas_calc_c_p_coeffs_enc_fx(
    3260             :     ivas_spar_md_t *pSparMd,
    3261             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    3262             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    3263             :     const Word16 i_ts,
    3264             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    3265             :     Word16 q_mixer_mat,
    3266             :     const Word16 num_ch,
    3267             :     const Word16 num_dmx,
    3268             :     const Word16 band_idx,
    3269             :     const Word16 dtx_vad,
    3270             :     const Word16 compute_p_flag,
    3271             :     const Word16 dyn_active_w_flag )
    3272             : {
    3273             :     Word16 i, j, q_postpred_cov_re;
    3274             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    3275             : 
    3276     2430770 :     q_postpred_cov_re = 0;
    3277     2430770 :     move16();
    3278             : 
    3279    29169240 :     FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
    3280             :     {
    3281    26738470 :         set_zero_fx( postpred_cov_re[i], IVAS_SPAR_MAX_CH );
    3282             :     }
    3283     2430770 :     IF( NE_16( num_dmx, num_ch ) )
    3284             :     {
    3285     2430770 :         ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, band_idx, postpred_cov_re, &q_postpred_cov_re );
    3286             : 
    3287     2430770 :         IF( NE_16( num_dmx, 1 ) )
    3288             :         {
    3289     1966132 :             ivas_calc_c_coeffs_per_band_enc_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad );
    3290             :         }
    3291             : 
    3292     2430770 :         IF( dyn_active_w_flag )
    3293             :         {
    3294           0 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3295             :             {
    3296           0 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3297             :                 {
    3298           0 :                     pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0;
    3299           0 :                     move32();
    3300             :                 }
    3301             :             }
    3302           0 :             pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0;
    3303           0 :             move16();
    3304             :         }
    3305     2430770 :         IF( EQ_16( compute_p_flag, 1 ) )
    3306             :         {
    3307     1591966 :             ivas_calc_p_coeffs_per_band_enc_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx );
    3308             :         }
    3309             : 
    3310     2430770 :         IF( dyn_active_w_flag )
    3311             :         {
    3312           0 :             FOR( i = num_dmx; i < num_ch; i++ )
    3313             :             {
    3314           0 :                 pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0;
    3315           0 :                 move32();
    3316             :             }
    3317           0 :             pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0;
    3318           0 :             move16();
    3319             :         }
    3320             :     }
    3321             : 
    3322     2430770 :     return;
    3323             : }
    3324             : 
    3325     1718458 : void ivas_calc_c_p_coeffs_fx(
    3326             :     ivas_spar_md_t *pSparMd,
    3327             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    3328             :     Word16 q_cov_real,
    3329             :     const Word16 i_ts,
    3330             :     Word32 ***mixer_mat, /*q_mixer_mat*/
    3331             :     Word16 q_mixer_mat,
    3332             :     const Word16 num_ch,
    3333             :     const Word16 num_dmx,
    3334             :     const Word16 band_idx,
    3335             :     const Word16 dtx_vad,
    3336             :     const Word16 compute_p_flag,
    3337             :     const Word16 dyn_active_w_flag )
    3338             : {
    3339             :     Word16 i, j, q_postpred_cov_re;
    3340             :     Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    3341             : 
    3342     1718458 :     IF( NE_16( num_dmx, num_ch ) )
    3343             :     {
    3344     1718458 :         ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, band_idx, postpred_cov_re, &q_postpred_cov_re );
    3345             : 
    3346     1718458 :         IF( NE_16( num_dmx, 1 ) )
    3347             :         {
    3348     1280950 :             ivas_calc_c_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad );
    3349             :         }
    3350             : 
    3351     1718458 :         IF( dyn_active_w_flag )
    3352             :         {
    3353           0 :             FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
    3354             :             {
    3355           0 :                 FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
    3356             :                 {
    3357           0 :                     pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0;
    3358           0 :                     move32();
    3359             :                 }
    3360             :             }
    3361           0 :             pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0;
    3362           0 :             move16();
    3363             :         }
    3364     1718458 :         IF( EQ_16( compute_p_flag, 1 ) )
    3365             :         {
    3366     1718458 :             ivas_calc_p_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx );
    3367             :         }
    3368             : 
    3369     1718458 :         IF( dyn_active_w_flag )
    3370             :         {
    3371           0 :             FOR( i = num_dmx; i < num_ch; i++ )
    3372             :             {
    3373           0 :                 pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0;
    3374           0 :                 move32();
    3375             :             }
    3376           0 :             pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0;
    3377           0 :             move16();
    3378             :         }
    3379             :     }
    3380             : 
    3381     1718458 :     return;
    3382             : }
    3383             : 
    3384             : 
    3385     9494356 : static void ivas_calc_mat_det_fx(
    3386             :     Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
    3387             :     Word16 q_in_re,
    3388             :     const Word16 dim,
    3389             :     Word64 *det_re, /*q_det_re*/
    3390             :     Word16 *q_det_re )
    3391             : {
    3392     9494356 :     IF( EQ_16( dim, IVAS_MAT_DIM_3 ) )
    3393             :     {
    3394             :         Word64 re1, re2, re;
    3395     1044480 :         re1 = W_mult0_32_32( in_re[1][1], in_re[2][2] ); /* 2*q_in_re */
    3396     1044480 :         re2 = W_mult0_32_32( in_re[1][2], in_re[2][1] ); /* 2*q_in_re */
    3397     1044480 :         re = W_sub_nosat( re1, re2 );                    /* 2*q_in_re */
    3398             : 
    3399     1044480 :         re1 = W_mult0_32_32( in_re[0][0], W_extract_h( re ) ); /* 3*q_in_re - 32 */
    3400             : 
    3401     1044480 :         *det_re = re1; /* 3*q_in_re - 32 */
    3402     1044480 :         move64();
    3403             : 
    3404     1044480 :         re1 = W_mult0_32_32( in_re[1][0], in_re[2][2] ); /* 2*q_in_re */
    3405     1044480 :         re2 = W_mult0_32_32( in_re[1][2], in_re[2][0] ); /* 2*q_in_re */
    3406     1044480 :         re = W_sub_nosat( re1, re2 );                    /* 2*q_in_re */
    3407             : 
    3408     1044480 :         re1 = W_mult0_32_32( in_re[0][1], W_extract_h( re ) ); /* 3*q_in_re - 32 */
    3409             : 
    3410     1044480 :         *det_re = W_sub_nosat( *det_re, re1 ); /* 3*q_in_re - 32 */
    3411     1044480 :         move64();
    3412             : 
    3413     1044480 :         re1 = W_mult0_32_32( in_re[1][0], in_re[2][1] ); /* 2*q_in_re */
    3414     1044480 :         re2 = W_mult0_32_32( in_re[1][1], in_re[2][0] ); /* 2*q_in_re */
    3415     1044480 :         re = W_sub_nosat( re1, re2 );                    /* 2*q_in_re */
    3416             : 
    3417     1044480 :         re1 = W_mult0_32_32( in_re[0][2], W_extract_h( re ) ); /* 3*q_in_re - 32 */
    3418             : 
    3419     1044480 :         *det_re = W_add_nosat( *det_re, re1 ); /* 3*q_in_re - 32 */
    3420     1044480 :         move64();
    3421             : 
    3422     1044480 :         *q_det_re = add( q_in_re, sub( add( q_in_re, q_in_re ), 32 ) );
    3423     1044480 :         move16();
    3424             :     }
    3425     8449876 :     ELSE IF( EQ_16( dim, IVAS_MAT_DIM_2 ) )
    3426             :     {
    3427             :         Word64 re1, re2;
    3428     7021918 :         re1 = W_mult0_32_32( in_re[0][0], in_re[1][1] ); /* 2*q_in_re */
    3429     7021918 :         re2 = W_mult0_32_32( in_re[0][1], in_re[1][0] ); /* 2*q_in_re */
    3430     7021918 :         *det_re = W_sub_nosat( re1, re2 );               /* 2*q_in_re */
    3431     7021918 :         move64();
    3432     7021918 :         *q_det_re = add( q_in_re, q_in_re );
    3433     7021918 :         move16();
    3434             :     }
    3435     1427958 :     ELSE IF( EQ_16( dim, IVAS_MAT_DIM_1 ) )
    3436             :     {
    3437     1427958 :         *det_re = in_re[0][0]; /*q_in_re*/
    3438     1427958 :         move32();
    3439     1427958 :         *q_det_re = q_in_re;
    3440     1427958 :         move16();
    3441             :     }
    3442             :     ELSE
    3443             :     {
    3444           0 :         assert( !"matrix dimention not supported!" );
    3445             :     }
    3446             : 
    3447     9494356 :     return;
    3448             : }
    3449             : 
    3450             : 
    3451             : /*-----------------------------------------------------------------------------------------*
    3452             :  * Function ivas_get_mat_cofactor()
    3453             :  *
    3454             :  * Calculate cofactor for invert matrix
    3455             :  *-----------------------------------------------------------------------------------------*/
    3456             : 
    3457             : 
    3458     4700160 : static void ivas_get_mat_cofactor_fx(
    3459             :     Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM],  /*qx*/
    3460             :     Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], /*qx*/
    3461             :     const Word16 row,
    3462             :     const Word16 col )
    3463             : {
    3464             :     Word16 i, j;
    3465     4700160 :     Word16 r = 0, c = 0;
    3466     4700160 :     move16();
    3467     4700160 :     move16();
    3468             : 
    3469    18800640 :     FOR( i = 0; i < MAX_MAT_DIM; i++ )
    3470             :     {
    3471    56401920 :         FOR( j = 0; j < MAX_MAT_DIM; j++ )
    3472             :         {
    3473    42301440 :             test();
    3474    42301440 :             IF( NE_16( i, row ) && NE_16( j, col ) )
    3475             :             {
    3476    18800640 :                 out_re[r][c] = in_re[i][j]; /*qx*/
    3477    18800640 :                 move64();
    3478    18800640 :                 c = add( c, 1 );
    3479             :             }
    3480             :         }
    3481    14100480 :         IF( EQ_16( c, 2 ) )
    3482             :         {
    3483     9400320 :             r = add( r, 1 );
    3484     9400320 :             c = 0;
    3485     9400320 :             move16();
    3486             :         }
    3487             :     }
    3488             : 
    3489     4700160 :     return;
    3490             : }
    3491             : 
    3492             : 
    3493             : /*-----------------------------------------------------------------------------------------*
    3494             :  * Function ivas_calc_mat_inv()
    3495             :  *
    3496             :  * Calculate Invert of a matrix
    3497             :  *-----------------------------------------------------------------------------------------*/
    3498             : 
    3499             : 
    3500     3110975 : static void ivas_calc_mat_inv_fx(
    3501             :     Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
    3502             :     Word16 q_in_re,
    3503             :     const Word16 dim,
    3504             :     Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_out_re*/
    3505             :     Word16 *q_out_re )
    3506             : {
    3507             :     Word64 det;
    3508             :     Word16 one_by_det, q_one_by_det;
    3509             :     Word16 i, j, q_tmp;
    3510             : 
    3511     3110975 :     IF( EQ_16( dim, IVAS_MAT_DIM_1 ) )
    3512             :     {
    3513     1427958 :         det = W_mult0_32_32( in_re[0][0], in_re[0][0] ); /* 2*q_in_re */
    3514             :         /* assert to catch cases when input is singular matrix*/
    3515     1427958 :         assert( det > 0 );
    3516             : 
    3517             :         // det = (dbl_in_re[0][0] * dbl_in_re[0][0]);
    3518             :         // det = 1 / det = 1 / (dbl_in_re[0][0] * dbl_in_re[0][0]);
    3519             :         // dbl_out_re[0][0] = dbl_in_re[0][0] * det = dbl_in_re[0][0] * (1 / (dbl_in_re[0][0] * dbl_in_re[0][0]));
    3520             :         // dbl_out_re[0][0] = 1 / dbl_in_re[0][0];
    3521             : 
    3522     1427958 :         one_by_det = BASOP_Util_Divide3232_Scale( 1, in_re[0][0], &q_tmp ); /*q=15-(q_tmp-(0-q_in_re))*/
    3523     1427958 :         q_one_by_det = sub( 15, add( q_tmp, q_in_re ) );
    3524             : 
    3525     1427958 :         out_re[0][0] = one_by_det; /*q=q_one_by_det*/
    3526     1427958 :         move32();
    3527     1427958 :         *q_out_re = q_one_by_det;
    3528     1427958 :         move16();
    3529             :     }
    3530     1683017 :     ELSE IF( EQ_16( dim, IVAS_MAT_DIM_2 ) )
    3531             :     {
    3532             :         Word64 det_re;
    3533             :         Word16 q_det_re;
    3534             : 
    3535     1160777 :         ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
    3536     1160777 :         q_tmp = W_norm( det_re );
    3537     1160777 :         q_tmp = s_max( sub( 32, q_tmp ), 0 );
    3538             : 
    3539     1160777 :         det_re = W_shr( det_re, q_tmp ); /*q_det_re-q_tmp*/
    3540     1160777 :         q_det_re = sub( q_det_re, q_tmp );
    3541             : 
    3542     1160777 :         det = W_mult0_32_32( W_extract_l( det_re ), W_extract_l( det_re ) ); /* 2*q_det_re */
    3543             :         /* assert to catch cases when input is singular matrix*/
    3544     1160777 :         assert( det > 0 );
    3545             : 
    3546     1160777 :         one_by_det = BASOP_Util_Divide3232_Scale( 1, W_extract_l( det_re ), &q_tmp ); // Q = (15 - (q_tmp + q_det_re))
    3547             : 
    3548     1160777 :         out_re[0][0] = Mpy_32_16_1( in_re[1][1], one_by_det ); /*q_in_re+(15 - (q_tmp + q_det_re)) -15=>q_in_re-(q_tmp + q_det_re)*/
    3549             : 
    3550     1160777 :         out_re[0][1] = L_negate( Mpy_32_16_1( in_re[0][1], one_by_det ) ); /*q_in_re-(q_tmp + q_det_re)*/
    3551             : 
    3552     1160777 :         out_re[1][0] = L_negate( Mpy_32_16_1( in_re[1][0], one_by_det ) ); /*q_in_re-(q_tmp + q_det_re)*/
    3553             : 
    3554     1160777 :         out_re[1][1] = Mpy_32_16_1( in_re[0][0], one_by_det ); /*q_in_re-(q_tmp + q_det_re)*/
    3555     1160777 :         move32();
    3556     1160777 :         move32();
    3557     1160777 :         move32();
    3558     1160777 :         move32();
    3559             : 
    3560     1160777 :         *q_out_re = sub( q_in_re, add( q_tmp, q_det_re ) ); // Q = (15-(q_tmp + q_det_re)) + q_in_re - 15
    3561     1160777 :         move16();
    3562             :     }
    3563      522240 :     ELSE IF( EQ_16( dim, IVAS_MAT_DIM_3 ) )
    3564             :     {
    3565             :         Word32 fac_re[IVAS_MAT_DIM_3][IVAS_MAT_DIM_3];
    3566             :         Word64 det_re, W_tmp;
    3567      522240 :         Word16 q_det_re, q_W_tmp = 0;
    3568      522240 :         move16();
    3569      522240 :         Word16 sign = 1;
    3570      522240 :         move16();
    3571             : 
    3572      522240 :         ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
    3573      522240 :         q_tmp = W_norm( det_re );
    3574      522240 :         q_tmp = s_max( sub( 32, q_tmp ), 0 );
    3575             : 
    3576      522240 :         det_re = W_shr( det_re, q_tmp ); /*q_det_re-q_tmp*/
    3577      522240 :         q_det_re = sub( q_det_re, q_tmp );
    3578             : 
    3579      522240 :         if ( det_re == 0 )
    3580             :         {
    3581         226 :             det_re = 1;
    3582         226 :             move64();
    3583             :         }
    3584             : 
    3585      522240 :         one_by_det = BASOP_Util_Divide3232_Scale( 1, W_extract_l( det_re ), &q_tmp ); /*15-(q_tmp-(0-q_det_re))*/
    3586      522240 :         q_one_by_det = sub( 15, add( q_tmp, q_det_re ) );
    3587             : 
    3588     2088960 :         FOR( i = 0; i < dim; i++ )
    3589             :         {
    3590     6266880 :             FOR( j = 0; j < dim; j++ )
    3591             :             {
    3592     4700160 :                 ivas_get_mat_cofactor_fx( in_re, fac_re, i, j );
    3593     4700160 :                 ivas_calc_mat_det_fx( fac_re, q_in_re, IVAS_MAT_DIM_2, &W_tmp, &q_W_tmp );
    3594             : 
    3595     4700160 :                 out_re[j][i] = Mpy_32_16_1( W_extract_h( W_tmp ), one_by_det ); /*q_W_tmp-32+q_one_by_det-15*/
    3596     4700160 :                 move32();
    3597     4700160 :                 out_re[j][i] = W_extract_l( W_mult0_32_32( out_re[j][i], sign ) ); /*q_W_tmp-32+q_one_by_det-15*/
    3598     4700160 :                 move32();
    3599             : 
    3600     4700160 :                 IF( s_and( add( i, j ), 1 ) == 0 )
    3601             :                 {
    3602     2611200 :                     sign = -1;
    3603     2611200 :                     move16();
    3604             :                 }
    3605             :                 ELSE
    3606             :                 {
    3607     2088960 :                     sign = 1;
    3608     2088960 :                     move16();
    3609             :                 }
    3610             :             }
    3611             :         }
    3612      522240 :         *q_out_re = sub( add( sub( q_W_tmp, 32 ), q_one_by_det ), 15 );
    3613      522240 :         move16();
    3614             :     }
    3615             :     ELSE
    3616             :     {
    3617           0 :         assert( !"matrix dimension not supported!" );
    3618             :     }
    3619             : 
    3620     3110975 :     return;
    3621             : }
    3622             : 
    3623             : 
    3624             : /*-----------------------------------------------------------------------------------------*
    3625             :  * Function ivas_is_mat_inv()
    3626             :  *
    3627             :  * Check if matrix is invertible or not by checking if determinant is 0 or very close to 0
    3628             :  *-----------------------------------------------------------------------------------------*/
    3629             : 
    3630             : 
    3631     3111179 : static Word16 ivas_is_mat_inv_fx(
    3632             :     Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
    3633             :     Word16 q_in_re,
    3634             :     const Word16 dim )
    3635             : {
    3636     3111179 :     Word16 is_det_zero = 0, q_det_re = 0, tmp;
    3637     3111179 :     move16();
    3638     3111179 :     move16();
    3639             :     Word64 det, det_re;
    3640             : 
    3641     3111179 :     ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
    3642             : 
    3643     3111179 :     tmp = W_norm( det_re );
    3644     3111179 :     tmp = s_max( sub( 32, tmp ), 0 );
    3645             : 
    3646     3111179 :     det_re = W_shr( det_re, tmp ); /*q_det_re-tmp*/
    3647     3111179 :     q_det_re = sub( q_det_re, tmp );
    3648             : 
    3649     3111179 :     det = W_mult0_32_32( W_extract_l( det_re ), W_extract_l( det_re ) ); /*2*q_det_re*/
    3650             : 
    3651     3111179 :     if ( LE_64( det, IVAS_FIX_EPS ) )
    3652             :     {
    3653         430 :         is_det_zero = 1;
    3654         430 :         move16();
    3655             :     }
    3656             : 
    3657     3111179 :     return is_det_zero;
    3658             : }
    3659             : 
    3660             : 
    3661             : /*-----------------------------------------------------------------------------------------*
    3662             :  * Function ivas_compute_spar_params()
    3663             :  *
    3664             :  *
    3665             :  *-----------------------------------------------------------------------------------------*/
    3666             : 
    3667             : 
    3668      305060 : void ivas_compute_spar_params_enc_fx(
    3669             :     Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    3670             :     Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    3671             :     Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
    3672             :     Word16 *q_dm_fv_re,
    3673             :     const Word16 i_ts,
    3674             :     Word32 ***mixer_mat_fx, /*q_mixer_mat*/
    3675             :     Word16 *q_mixer_mat,
    3676             :     const Word16 start_band,
    3677             :     const Word16 end_band,
    3678             :     const Word16 dtx_vad,
    3679             :     const Word16 num_ch,
    3680             :     const Word16 bands_bw,
    3681             :     const Word16 active_w,
    3682             :     const Word16 active_w_vlbr,
    3683             :     ivas_spar_md_com_cfg *hSparCfg,
    3684             :     ivas_spar_md_t *hSparMd,
    3685             :     Word32 *pWscale, /*q_Wscale*/
    3686             :     Word16 *q_Wscale,
    3687             :     const Word16 from_dirac,
    3688             :     const Word16 dyn_active_w_flag )
    3689             : {
    3690             :     Word16 b, i, ndm;
    3691             :     Word16 q_pred_coeffs_re;
    3692             :     Word32 pred_coeffs_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
    3693             : 
    3694      305060 :     ivas_get_pred_coeffs_enc_fx( cov_real_fx, q_cov_real, pred_coeffs_re_fx, &q_pred_coeffs_re, dm_fv_re_fx, q_dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind );
    3695             : 
    3696      305060 :     ivas_create_fullr_dmx_mat_fx( pred_coeffs_re_fx, q_pred_coeffs_re, dm_fv_re_fx, *q_dm_fv_re, mixer_mat_fx, q_mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg );
    3697             : 
    3698      305060 :     ivas_get_Wscaling_factor_enc_fx( cov_real_fx, q_cov_real, pred_coeffs_re_fx, q_pred_coeffs_re, mixer_mat_fx, *q_mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale, q_Wscale, dyn_active_w_flag );
    3699             : 
    3700     2222866 :     FOR( b = start_band; b < end_band; b++ )
    3701             :     {
    3702             :         Word16 tmp_exp, q_tmp, tmp;
    3703     1917806 :         IF( pWscale[b] == 0 )
    3704             :         {
    3705           0 :             pWscale[b] = 1;
    3706           0 :             move32();
    3707           0 :             q_Wscale[b] = Q31;
    3708           0 :             move16();
    3709             :         }
    3710             : 
    3711     1917806 :         Word16 onebyscale_fx = BASOP_Util_Divide3232_Scale( 1, pWscale[b], &tmp_exp ); /*q=15-(tmp_exp+(15-(15-q_Wscale)))=>15-(tmp_exp+q_Wscale)*/
    3712     1917806 :         q_tmp = sub( sub( 15, tmp_exp ), q_Wscale[b] );
    3713             : 
    3714     1917806 :         tmp = sub( add( q_pred_coeffs_re, q_tmp ), 15 );
    3715     8897624 :         FOR( i = 0; i < sub( num_ch, 1 ); i++ )
    3716             :         {
    3717     6979818 :             hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shl( Mpy_32_16_1( pred_coeffs_re_fx[i][b], onebyscale_fx ), sub( Q28, tmp ) ); // Q28
    3718     6979818 :             move32();
    3719             :         }
    3720             :         // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15);
    3721     1917806 :         hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_pred_re_fx = Q28;
    3722     1917806 :         move16();
    3723             : 
    3724    10815430 :         FOR( i = 0; i < num_ch; i++ )
    3725             :         {
    3726     8897624 :             mixer_mat_fx[0][i][b] = W_extract_l( W_shr( W_mult0_32_32( mixer_mat_fx[0][i][b], pWscale[b] ), q_Wscale[b] ) ); /*q_mixer_mat*/
    3727     8897624 :             move32();
    3728             :         }
    3729             :     }
    3730             : 
    3731     2222866 :     FOR( b = start_band; b < end_band; b++ )
    3732             :     {
    3733     1917806 :         ndm = hSparCfg->num_dmx_chans_per_band[( b * bands_bw )];
    3734     1917806 :         move16();
    3735             : 
    3736     1917806 :         IF( NE_16( ndm, num_ch ) )
    3737             :         {
    3738     1591966 :             ivas_calc_c_p_coeffs_enc_fx( hSparMd, cov_real_fx, q_cov_real, i_ts, mixer_mat_fx, *q_mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag );
    3739             :         }
    3740             :     }
    3741             : 
    3742      305060 :     return;
    3743             : }
    3744             : 
    3745             : 
    3746      584711 : void ivas_compute_spar_params_fx(
    3747             :     Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
    3748             :     Word16 q_cov_real,
    3749             :     Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
    3750             :     Word16 *q_dm_fv_re,
    3751             :     const Word16 i_ts,
    3752             :     Word32 ***mixer_mat_fx, /*q_mixer_mat*/
    3753             :     Word16 *q_mixer_mat,
    3754             :     const Word16 start_band,
    3755             :     const Word16 end_band,
    3756             :     const Word16 dtx_vad,
    3757             :     const Word16 num_ch,
    3758             :     const Word16 bands_bw,
    3759             :     const Word16 active_w,
    3760             :     const Word16 active_w_vlbr,
    3761             :     ivas_spar_md_com_cfg *hSparCfg,
    3762             :     ivas_spar_md_t *hSparMd,
    3763             :     Word32 *pWscale_fx, /*q_pWscale*/
    3764             :     Word16 *q_pWscale,
    3765             :     const Word16 from_dirac,
    3766             :     const Word16 dyn_active_w_flag )
    3767             : {
    3768             :     Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
    3769             : 
    3770             :     Word16 b, i, ndm, j;
    3771             :     Word16 q_pred_coeffs;
    3772             : 
    3773      584711 :     ivas_get_pred_coeffs_fx( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind, &q_pred_coeffs, q_dm_fv_re );
    3774             : 
    3775      584711 :     ivas_create_fullr_dmx_mat_fx( pred_coeffs_re, q_pred_coeffs, dm_fv_re, *q_dm_fv_re, mixer_mat_fx, q_mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg );
    3776             : 
    3777      584711 :     ivas_get_Wscaling_factor_fx( cov_real, q_cov_real, pred_coeffs_re, q_pred_coeffs, mixer_mat_fx, *q_mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale_fx, q_pWscale, dyn_active_w_flag );
    3778             : 
    3779     2820619 :     FOR( b = start_band; b < end_band; b++ )
    3780             :     {
    3781             :         Word16 tmp_exp, q_tmp, tmp;
    3782     2235908 :         Word16 onebyscale_fx = BASOP_Util_Divide3232_Scale( 1, pWscale_fx[b], &tmp_exp ); /*15-(tmp_exp+q_pWscale[b])*/
    3783     2235908 :         q_tmp = sub( sub( 15, tmp_exp ), q_pWscale[b] );
    3784             : 
    3785     2235908 :         tmp = sub( add( q_pred_coeffs, q_tmp ), 15 );
    3786     8943632 :         FOR( i = 0; i < sub( num_ch, 1 ); i++ )
    3787             :         {
    3788     6707724 :             hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re[i][b], onebyscale_fx ); // q=tmp
    3789     6707724 :             move32();
    3790     6707724 :             IF( tmp < 0 )
    3791             :             {
    3792           0 :                 tmp = negate( tmp );
    3793           0 :                 hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shl( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], add( tmp, 22 ) ); // q22
    3794           0 :                 move32();
    3795             :             }
    3796             :             ELSE
    3797             :             {
    3798     6707724 :                 hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shr_r( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], sub( tmp, 22 ) ); // q22
    3799     6707724 :                 move32();
    3800             :             }
    3801             :         }
    3802             :         // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15);
    3803     2235908 :         hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_pred_re_fx = Q22;
    3804     2235908 :         move16();
    3805             : 
    3806    11179540 :         FOR( i = 0; i < num_ch; i++ )
    3807             :         {
    3808     8943632 :             mixer_mat_fx[0][i][b] = W_extract_l( W_shr( W_mult0_32_32( mixer_mat_fx[0][i][b], pWscale_fx[b] ), q_pWscale[b] ) ); /*q_mixer_mat*/
    3809     8943632 :             move32();
    3810             :         }
    3811             :     }
    3812             : 
    3813     2820619 :     FOR( b = start_band; b < end_band; b++ )
    3814             :     {
    3815     2235908 :         ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw];
    3816     2235908 :         move16();
    3817             : 
    3818     2235908 :         IF( NE_16( ndm, num_ch ) )
    3819             :         {
    3820     1718458 :             ivas_calc_c_p_coeffs_fx( hSparMd, cov_real, q_cov_real, i_ts, mixer_mat_fx, *q_mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag );
    3821             : 
    3822     1718458 :             Word16 q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx;
    3823     1718458 :             IF( NE_16( ndm, 1 ) )
    3824             :             {
    3825     3274780 :                 FOR( i = 0; i < ( num_ch - ndm ); i++ )
    3826             :                 {
    3827     4555730 :                     FOR( j = 0; j < sub( ndm, 1 ); j++ )
    3828             :                     {
    3829     2561900 :                         hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j], sub( q_tmp, 22 ) ); // q22
    3830     2561900 :                         move32();
    3831             :                     }
    3832             :                 }
    3833     1280950 :                 hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = Q22;
    3834     1280950 :                 move16();
    3835             :             }
    3836             : 
    3837     1718458 :             q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx;
    3838     1718458 :             move16();
    3839             : 
    3840    18903038 :             FOR( j = 0; j < sub( IVAS_SPAR_MAX_CH, 1 ); j++ )
    3841             :             {
    3842    17184580 :                 hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[j] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[j], sub( q_tmp, 22 ) ); // q22
    3843    17184580 :                 move32();
    3844             :             }
    3845     1718458 :             hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = Q22;
    3846     1718458 :             move16();
    3847             :         }
    3848             :     }
    3849             : 
    3850      584711 :     return;
    3851             : }
    3852             : 
    3853             : 
    3854             : /*-----------------------------------------------------------------------------------------*
    3855             :  * Function ivas_get_spar_md_from_dirac_fx()
    3856             :  *
    3857             :  *
    3858             :  *-----------------------------------------------------------------------------------------*/
    3859             : Word32 diff_norm_order1_table[4] = { 0, 805306368, 402653184, 268435456 };                                              // q28
    3860             : Word32 diff_norm_order2_table[6] = { 0, 1342177280, 671088640, 447392416, 335544320, 268435456 };                       // q28
    3861             : Word32 diff_norm_order3_table[8] = { 0, 1879048192, 939524096, 626349376, 469762048, 375809632, 313174688, 268435456 }; // q28
    3862             : #define EPSILON_FX_THR   70
    3863             : #define ONE_BY_THREE_Q31 715827882
    3864             : #define ONE_BY_FIVE_Q31  429496729
    3865             : #define ONE_BY_SEVEN_Q31 306783378
    3866             : 
    3867      147560 : void ivas_get_spar_md_from_dirac_enc_fx(
    3868             :     Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
    3869             :     Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
    3870             :     Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS],                            // Q30
    3871             :     const Word16 n_ts,
    3872             :     Word32 ***mixer_mat_fx, /*q_mixer_mat_fx*/
    3873             :     Word16 *q_mixer_mat_fx,
    3874             :     ivas_spar_md_t *hSpar_md,
    3875             :     ivas_spar_md_com_cfg *hSpar_md_cfg,
    3876             :     const Word16 start_band,
    3877             :     const Word16 end_band,
    3878             :     const Word16 order,
    3879             :     const Word16 dtx_vad,
    3880             :     Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29
    3881             :     const UWord8 useLowerRes,
    3882             :     const Word16 active_w_vlbr,
    3883             :     const Word16 dyn_active_w_flag )
    3884             : {
    3885             : 
    3886             :     Word16 num_ch, band, i, j;
    3887             :     Word16 block, ch;
    3888             :     Word16 azimuth, elevation;
    3889             : 
    3890             :     Word32 response_avg_fx[MAX_OUTPUT_CHANNELS];
    3891             :     Word32 response_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS];
    3892             :     Word32 cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    3893             :     Word16 q_cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    3894             :     Word32 *pCov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    3895             :     Word16 *p_q_Cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    3896             :     Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
    3897      147560 :     Word16 q_dm_fv_re_fx = 0;
    3898             :     Word16 q_Wscale[IVAS_MAX_NUM_BANDS];
    3899             :     Word32 Wscale_fx[IVAS_MAX_NUM_BANDS];
    3900             :     Word32 mixer_mat_local_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS];
    3901             :     Word32 **ppMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH];
    3902             :     Word32 *pMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH];
    3903      147560 :     Word16 q_ppMixer_mat = 0;
    3904             :     Word32 en_ratio_fac_fx, diff_norm_order1_fx, diff_norm_order2_fx, diff_norm_order3_fx;
    3905             :     Word16 active_w;
    3906      147560 :     move16();
    3907      147560 :     move16();
    3908             : 
    3909             :     Word16 ndm, foa_ch, hoa2_ch;
    3910             :     Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1];
    3911             :     const Word16 *remix_order;
    3912             : 
    3913      147560 :     set16_fx( q_Wscale, 0, IVAS_MAX_NUM_BANDS );
    3914      147560 :     set32_fx( Wscale_fx, 0, IVAS_MAX_NUM_BANDS );
    3915      147560 :     remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order];
    3916             : 
    3917      147560 :     num_ch = ivas_sba_get_nchan_metadata_fx( order, IVAS_256k /*dummy value as order is always 1 in this function*/ );
    3918             : 
    3919      147560 :     hoa2_ch = ivas_sba_get_nchan_metadata_fx( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ );
    3920      147560 :     foa_ch = FOA_CHANNELS;
    3921      147560 :     move16();
    3922      147560 :     diff_norm_order1_fx = 3;
    3923      147560 :     move32();
    3924      147560 :     diff_norm_order2_fx = 5;
    3925      147560 :     move32();
    3926      147560 :     diff_norm_order3_fx = 7;
    3927      147560 :     move32();
    3928             : 
    3929     1770720 :     FOR( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ )
    3930             :     {
    3931    19477920 :         FOR( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ )
    3932             :         {
    3933    17854760 :             pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j];
    3934             :         }
    3935     1623160 :         ppMixer_mat_fx[i] = pMixer_mat_fx[i];
    3936             :     }
    3937             : 
    3938      147560 :     test();
    3939      147560 :     test();
    3940      147560 :     test();
    3941      147560 :     test();
    3942      147560 :     test();
    3943      147560 :     test();
    3944      147560 :     IF( ( GE_16( start_band, 6 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) || ( useLowerRes && GE_16( start_band, 3 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) )
    3945             :     {
    3946             :         Word32 P_norm_fx[3];
    3947             :         Word16 idx;
    3948             : 
    3949       80698 :         ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1];
    3950       80698 :         move16();
    3951       80698 :         P_norm_fx[0] = 0;
    3952       80698 :         move32();
    3953       80698 :         Word16 len = s_max( 0, sub( foa_ch, ndm ) );
    3954      284112 :         FOR( i = 0; i < len; i++ )
    3955             :         {
    3956      203414 :             P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    3957      203414 :             move32();
    3958             :         }
    3959       80698 :         P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, sub( foa_ch, ndm ) ) )] ); // 2*q_P_re - 31
    3960       80698 :         move32();
    3961             : 
    3962       80698 :         P_norm_fx[1] = 0;
    3963       80698 :         move32();
    3964       80698 :         len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
    3965       80698 :         FOR( ; i < len; i++ ) // max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
    3966             :         {
    3967           0 :             P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    3968           0 :             move32();
    3969             :         }
    3970       80698 :         P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, ( min( num_ch, hoa2_ch ) - ndm ) ) )] ); // 2*q_P_re - 31
    3971       80698 :         move32();
    3972             : 
    3973       80698 :         P_norm_fx[2] = 0;
    3974       80698 :         move32();
    3975       80698 :         FOR( ; i < ( num_ch - ndm ); i++ )
    3976             :         {
    3977           0 :             P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    3978           0 :             move32();
    3979             :         }
    3980       80698 :         P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, ( num_ch - ndm ) ) )] ); // 2*q_P_re - 31
    3981       80698 :         move32();
    3982       80698 :         len = s_max( 0, sub( foa_ch, ndm ) );
    3983      284112 :         FOR( i = 0; i < len; i++ ) // i < max( 0, ( foa_ch - ndm ) )
    3984             :         {
    3985      203414 :             idx = sub( remix_order[i + ndm], ndm );
    3986      203414 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    3987      203414 :             move32();
    3988      203414 :             IF( P_dir_fact_fx[idx] != 0 )
    3989             :             {
    3990      151924 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[0], IVAS_FIX_EPS ) ); // q15
    3991      151924 :                 move32();
    3992      151924 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    3993      151924 :                 move32();
    3994             :             }
    3995             :         }
    3996       80698 :         len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
    3997       80698 :         FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
    3998             :         {
    3999           0 :             idx = sub( remix_order[i + ndm], ndm );
    4000           0 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    4001           0 :             IF( P_dir_fact_fx[idx] != 0 )
    4002             :             {
    4003           0 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[1], IVAS_FIX_EPS ) ); // q15
    4004           0 :                 move32();
    4005           0 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    4006           0 :                 move32();
    4007             :             }
    4008             :         }
    4009             : 
    4010       80698 :         FOR( ; i < ( num_ch - ndm ); i++ )
    4011             :         {
    4012           0 :             idx = sub( remix_order[i + ndm], ndm );
    4013           0 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    4014           0 :             move32();
    4015           0 :             IF( P_dir_fact_fx[idx] != 0 )
    4016             :             {
    4017           0 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[2], IVAS_FIX_EPS ) ); // q15
    4018           0 :                 move32();
    4019           0 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    4020           0 :                 move32();
    4021             :             }
    4022             :         }
    4023             :     }
    4024             : 
    4025      295120 :     FOR( Word16 i_ts = 0; i_ts < n_ts; i_ts++ )
    4026             :     {
    4027      788200 :         FOR( band = start_band; band < end_band; band++ )
    4028             :         {
    4029      640640 :             ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
    4030      640640 :             move16();
    4031             : 
    4032             :             /*SPAR from DirAC*/
    4033      640640 :             set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS );
    4034             : 
    4035      640640 :             IF( GT_16( n_ts, 1 ) )
    4036             :             {
    4037           0 :                 IF( ele_dirac_fx[band][i_ts] < 0 )
    4038             :                 {
    4039           0 :                     elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
    4040             :                 }
    4041             :                 ELSE
    4042             :                 {
    4043           0 :                     elevation = extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ); // q0
    4044             :                 }
    4045           0 :                 IF( azi_dirac_fx[band][i_ts] < 0 )
    4046             :                 {
    4047           0 :                     azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
    4048             :                 }
    4049             :                 ELSE
    4050             :                 {
    4051           0 :                     azimuth = extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ); // q0
    4052             :                 }
    4053           0 :                 ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
    4054             :             }
    4055      640640 :             ELSE IF( useLowerRes )
    4056             :             {
    4057       53292 :                 IF( ele_dirac_fx[band][0] < 0 )
    4058             :                 {
    4059       12774 :                     elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][0] ), Q22 ) ) ); // q0
    4060             :                 }
    4061             :                 ELSE
    4062             :                 {
    4063       40518 :                     elevation = extract_l( L_shr( ele_dirac_fx[band][0], Q22 ) ); // q0
    4064             :                 }
    4065       53292 :                 IF( azi_dirac_fx[band][0] < 0 )
    4066             :                 {
    4067       31196 :                     azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][0] ), Q22 ) ) ); // q0
    4068             :                 }
    4069             :                 ELSE
    4070             :                 {
    4071       22096 :                     azimuth = extract_l( L_shr( azi_dirac_fx[band][0], Q22 ) ); // q0
    4072             :                 }
    4073       53292 :                 ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
    4074             :             }
    4075             :             ELSE
    4076             :             {
    4077     2936740 :                 FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
    4078             :                 {
    4079     2349392 :                     IF( ele_dirac_fx[band][block] < 0 )
    4080             :                     {
    4081      481924 :                         elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][block] ), Q22 ) ) ); // q0
    4082             :                     }
    4083             :                     ELSE
    4084             :                     {
    4085     1867468 :                         elevation = extract_l( L_shr( ele_dirac_fx[band][block], Q22 ) ); // q0
    4086             :                     }
    4087     2349392 :                     IF( azi_dirac_fx[band][block] < 0 )
    4088             :                     {
    4089     1130804 :                         azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][block] ), Q22 ) ) ); // q0
    4090             :                     }
    4091             :                     ELSE
    4092             :                     {
    4093     1218588 :                         azimuth = extract_l( L_shr( azi_dirac_fx[band][block], Q22 ) ); // q0
    4094             :                     }
    4095     2349392 :                     ivas_dirac_dec_get_response_fx( azimuth, elevation, &( response_fx[block][0] ), order, Q30 );
    4096             :                 }
    4097             : 
    4098             :                 /* average responses in all subframes*/
    4099             :                 {
    4100             :                     Word32 norm_fx;
    4101             :                     Word16 norm_q;
    4102             :                     Word16 num_ch_order, hoa2_ch_order;
    4103             : 
    4104      587348 :                     num_ch_order = ivas_sba_get_nchan_fx( order, 0 );
    4105      587348 :                     hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 );
    4106             : 
    4107     2936740 :                     FOR( ch = 0; ch < num_ch_order; ch++ )
    4108             :                     {
    4109     2349392 :                         Word64 temp = 0;
    4110     2349392 :                         move64();
    4111    11746960 :                         FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
    4112             :                         {
    4113     9397568 :                             temp = W_add( temp, W_deposit32_l( response_fx[block][ch] ) ); // q30
    4114             :                         }
    4115     2349392 :                         response_avg_fx[ch] = W_extract_l( W_shr( temp, 2 ) ); // q30
    4116     2349392 :                         move32();
    4117             :                     }
    4118             : 
    4119             :                     /*normalize 1st order*/
    4120      587348 :                     norm_fx = 0;
    4121      587348 :                     move32();
    4122      587348 :                     norm_q = 0;
    4123      587348 :                     move16();
    4124     2349392 :                     FOR( ch = 1; ch < foa_ch; ch++ )
    4125             :                     {
    4126     1762044 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4127             :                     }
    4128             : 
    4129      587348 :                     norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) );
    4130      587348 :                     IF( norm_fx )
    4131             :                     {
    4132      582780 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4133             :                     }
    4134             :                     ELSE
    4135             :                     {
    4136        4568 :                         norm_fx = EPSILON_FX;
    4137        4568 :                         move32();
    4138             :                     }
    4139      587348 :                     IF( norm_q <= 0 )
    4140             :                     {
    4141      542843 :                         norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31
    4142      542843 :                         norm_q = 0;
    4143      542843 :                         move16();
    4144             :                     }
    4145      587348 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4146     2349392 :                     FOR( ch = 1; ch < foa_ch; ch++ )
    4147             :                     {
    4148     1762044 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4149             :                         {
    4150       13704 :                             IF( response_avg_fx[ch] != 0 )
    4151             :                             {
    4152       13171 :                                 response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4153       13171 :                                 move32();
    4154             :                             }
    4155       13704 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4156       13704 :                             move32();
    4157             :                         }
    4158     1748340 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4159             :                         {
    4160       63133 :                             response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
    4161       63133 :                             move32();
    4162             :                         }
    4163             :                         ELSE
    4164             :                         {
    4165     1685207 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4166     1685207 :                             move32();
    4167     1685207 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4168     1685207 :                             move32();
    4169             :                         }
    4170             :                     }
    4171             : 
    4172             :                     /*normalize 2nd order*/
    4173      587348 :                     norm_fx = 0;
    4174      587348 :                     move32();
    4175      587348 :                     Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order );
    4176      587348 :                     FOR( ch = foa_ch; ch < min_ch_order; ch++ )
    4177             :                     {
    4178           0 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4179             :                     }
    4180      587348 :                     norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
    4181      587348 :                     IF( norm_fx )
    4182             :                     {
    4183           0 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4184             :                     }
    4185             :                     ELSE
    4186             :                     {
    4187      587348 :                         norm_fx = EPSILON_FX;
    4188      587348 :                         move32();
    4189             :                     }
    4190      587348 :                     IF( norm_q < 0 )
    4191             :                     {
    4192           0 :                         norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
    4193           0 :                         norm_q = 0;
    4194           0 :                         move16();
    4195             :                     }
    4196      587348 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4197      587348 :                     min_ch_order = s_min( hoa2_ch_order, num_ch_order );
    4198      587348 :                     FOR( ch = foa_ch; ch < min_ch_order; ch++ )
    4199             :                     {
    4200           0 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4201             :                         {
    4202           0 :                             response_avg_fx[ch] = response_avg_fx[ch];                               // q30
    4203           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4204           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );                  // q30
    4205           0 :                             move32();
    4206           0 :                             move32();
    4207           0 :                             move32();
    4208             :                         }
    4209           0 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4210             :                         {
    4211           0 :                             response_avg_fx[ch] = ONE_IN_Q30; // q30
    4212           0 :                             move32();
    4213             :                         }
    4214             :                         ELSE
    4215             :                         {
    4216           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4217           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );           // q30
    4218           0 :                             move32();
    4219           0 :                             move32();
    4220             :                         }
    4221             :                     }
    4222             : 
    4223             :                     /*normalize 3rd order*/
    4224      587348 :                     norm_fx = 0;
    4225      587348 :                     move32();
    4226      587348 :                     FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
    4227             :                     {
    4228           0 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4229             :                     }
    4230      587348 :                     norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
    4231      587348 :                     IF( norm_fx )
    4232             :                     {
    4233           0 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4234             :                     }
    4235             :                     ELSE
    4236             :                     {
    4237      587348 :                         norm_fx = EPSILON_FX;
    4238      587348 :                         move32();
    4239             :                     }
    4240      587348 :                     IF( norm_q < 0 )
    4241             :                     {
    4242           0 :                         norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
    4243           0 :                         norm_q = 0;
    4244           0 :                         move16();
    4245             :                     }
    4246      587348 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4247      587348 :                     FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
    4248             :                     {
    4249           0 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4250             :                         {
    4251           0 :                             response_avg_fx[ch] = response_avg_fx[ch];                               // q30
    4252           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4253           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );                  // q30
    4254           0 :                             move32();
    4255           0 :                             move32();
    4256           0 :                             move32();
    4257             :                         }
    4258           0 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4259             :                         {
    4260           0 :                             response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
    4261           0 :                             move32();
    4262             :                         }
    4263             :                         ELSE
    4264             :                         {
    4265           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4266           0 :                             move32();
    4267           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4268           0 :                             move32();
    4269             :                         }
    4270             :                     }
    4271             :                 }
    4272             :             }
    4273             : 
    4274      640640 :             FOR( i = add( FOA_CHANNELS, 1 ); i < num_ch; i++ )
    4275             :             {
    4276           0 :                 response_avg_fx[i] = response_avg_fx[HOA_keep_ind[i]]; // q30
    4277           0 :                 move32();
    4278             :             }
    4279             : 
    4280             : 
    4281      640640 :             en_ratio_fac_fx = L_shl( L_sub( ONE_IN_Q30 - EPSILON_FX /* Guard to prevent overflow if diffuseness_fx is 0 */, diffuseness_fx[band] ), 1 ); // assuming q of dissusion 30=>q31
    4282      640640 :             en_ratio_fac_fx = L_max( en_ratio_fac_fx, 0 );                                                                                               // q31
    4283             : 
    4284     3203200 :             FOR( i = 0; i < num_ch; i++ )
    4285             :             {
    4286    12812800 :                 FOR( j = 0; j < num_ch; j++ )
    4287             :                 {
    4288    10250240 :                     IF( EQ_16( i, j ) )
    4289             :                     {
    4290     2562560 :                         IF( i == 0 )
    4291             :                         {
    4292      640640 :                             cov_real_dirac_fx[i][i][band] = ONE_IN_Q30; // 1 q30
    4293      640640 :                             move32();
    4294             :                         }
    4295             :                         ELSE
    4296             :                         {
    4297     1921920 :                             Word32 en_ratio_fac_sq = 0;
    4298     1921920 :                             move32();
    4299     1921920 :                             cov_real_dirac_fx[i][j][band] = Mpy_32_32( L_shl_sat( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), 1 ), response_avg_fx[j] ); // q30
    4300     1921920 :                             move32();
    4301             : 
    4302     1921920 :                             IF( LE_16( hSpar_md_cfg->nchan_transport, 2 ) )
    4303             :                             {
    4304     1008732 :                                 cov_real_dirac_fx[i][j][band] = Mpy_32_32( cov_real_dirac_fx[i][j][band], en_ratio_fac_fx ); // q30
    4305     1008732 :                                 move32();
    4306     1008732 :                                 test();
    4307     1008732 :                                 IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) )
    4308             :                                 {
    4309      813656 :                                     en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                                                                                   // q31
    4310      813656 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), P_dir_fact_fx[i - ndm] ) ); // q30
    4311      813656 :                                     move32();
    4312             :                                 }
    4313             :                                 ELSE
    4314             :                                 {
    4315      195076 :                                     IF( LT_16( i, foa_ch ) )
    4316             :                                     {
    4317      195076 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                                         // q31
    4318      195076 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31 /*1 q31*/, en_ratio_fac_sq ), ONE_BY_THREE_Q31 /*1/3 q31*/ ); // q31
    4319      195076 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );                // q30
    4320      195076 :                                         move32();
    4321             :                                     }
    4322           0 :                                     ELSE IF( LT_16( i, hoa2_ch ) )
    4323             :                                     {
    4324           0 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                              // q31
    4325           0 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ); // q31
    4326           0 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );     // q30
    4327           0 :                                         move32();
    4328             :                                     }
    4329             :                                     ELSE
    4330             :                                     {
    4331           0 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                               // q31
    4332           0 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ); // q31
    4333           0 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );      // q30
    4334           0 :                                         move32();
    4335             :                                     }
    4336             :                                 }
    4337             :                             }
    4338             :                             ELSE
    4339             :                             {
    4340      913188 :                                 IF( LT_16( i, foa_ch ) )
    4341             :                                 {
    4342      913188 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_THREE_Q31 /*1/3 q31*/ ), 1 ) ); // q30
    4343      913188 :                                     move32();
    4344             :                                 }
    4345           0 :                                 ELSE IF( LT_16( i, hoa2_ch ) )
    4346             :                                 {
    4347           0 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ), 1 ) ); // q30
    4348           0 :                                     move32();
    4349             :                                 }
    4350             :                                 ELSE
    4351             :                                 {
    4352           0 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ), 1 ) ); // q30
    4353           0 :                                     move32();
    4354             :                                 }
    4355             :                             }
    4356             :                         }
    4357             :                     }
    4358             :                     ELSE
    4359             :                     {
    4360     7687680 :                         cov_real_dirac_fx[i][j][band] = L_shl( Mpy_32_32( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), response_avg_fx[j] ), 1 ); // q30
    4361     7687680 :                         move32();
    4362             :                     }
    4363             :                 }
    4364             :             }
    4365             :         }
    4366             : 
    4367      737800 :         FOR( i = 0; i < num_ch; i++ )
    4368             :         {
    4369     2951200 :             FOR( j = 0; j < num_ch; j++ )
    4370             :             {
    4371     2360960 :                 pCov_real_fx[i][j] = cov_real_dirac_fx[i][j];      // q30
    4372     2360960 :                 p_q_Cov_real_fx[i][j] = q_cov_real_dirac_fx[i][j]; // q30
    4373     2360960 :                 set16_fx( q_cov_real_dirac_fx[i][j], Q30, IVAS_MAX_NUM_BANDS );
    4374             :             }
    4375             :         }
    4376             : 
    4377      147560 :         test();
    4378      147560 :         active_w = ( EQ_16( dyn_active_w_flag, 1 ) ) || ( EQ_16( hSpar_md_cfg->active_w, 1 ) );
    4379      147560 :         ivas_compute_spar_params_enc_fx( pCov_real_fx, p_q_Cov_real_fx, dm_fv_re_fx, &q_dm_fv_re_fx, i_ts, ppMixer_mat_fx, &q_ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale_fx, q_Wscale, 1, dyn_active_w_flag );
    4380             : 
    4381      147560 :         IF( mixer_mat_fx != NULL )
    4382             :         {
    4383      147560 :             if ( *q_mixer_mat_fx == 0 )
    4384             :             {
    4385         164 :                 *q_mixer_mat_fx = q_ppMixer_mat;
    4386         164 :                 move16();
    4387             :             }
    4388      788200 :             FOR( band = start_band; band < end_band; band++ )
    4389             :             {
    4390      640640 :                 ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
    4391      640640 :                 move16();
    4392             : 
    4393     2225232 :                 FOR( i = 0; i < ndm; i++ )
    4394             :                 {
    4395     7922960 :                     FOR( j = 0; j < num_ch; j++ )
    4396             :                     {
    4397     6338368 :                         mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = L_shl( ppMixer_mat_fx[i][j][band], sub( *q_mixer_mat_fx, q_ppMixer_mat ) ); // q_mixer_mat_fx
    4398     6338368 :                         move32();
    4399             :                     }
    4400             :                 }
    4401             : 
    4402     1618608 :                 FOR( i = ndm; i < num_ch; i++ )
    4403             :                 {
    4404     4889840 :                     FOR( j = 0; j < num_ch; j++ )
    4405             :                     {
    4406     3911872 :                         mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = 0;
    4407     3911872 :                         move32();
    4408             :                     }
    4409             :                 }
    4410             : 
    4411      640640 :                 test();
    4412      640640 :                 IF( ( EQ_16( ndm, 1 ) ) && ( Wscale_d != NULL ) )
    4413             :                 {
    4414      877820 :                     FOR( j = 0; j < num_ch; j++ )
    4415             :                     {
    4416      702256 :                         mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = Mpy_32_32( L_shl( mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )], 2 ), Wscale_d[band] ); // q_mixer_mat_fx
    4417      702256 :                         move32();
    4418             :                     }
    4419             :                 }
    4420             :             }
    4421             :         }
    4422             :     }
    4423             : 
    4424      147560 :     return;
    4425             : }
    4426             : 
    4427             : 
    4428      224486 : void ivas_get_spar_md_from_dirac_fx(
    4429             :     Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
    4430             :     Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
    4431             :     Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS],                            // Q30
    4432             :     const Word16 n_ts,
    4433             :     Word32 ***mixer_mat_fx, /*q_mixer_mat_fx*/
    4434             :     Word16 *q_mixer_mat_fx,
    4435             :     ivas_spar_md_t *hSpar_md,
    4436             :     ivas_spar_md_com_cfg *hSpar_md_cfg,
    4437             :     const Word16 start_band,
    4438             :     const Word16 end_band,
    4439             :     const Word16 order,
    4440             :     const Word16 dtx_vad,
    4441             :     Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29
    4442             :     const UWord8 useLowerRes,
    4443             :     const Word16 active_w_vlbr,
    4444             :     const Word16 dyn_active_w_flag )
    4445             : {
    4446             : 
    4447             :     Word16 num_ch, band, i, j;
    4448             :     Word16 block, ch;
    4449             :     Word16 azimuth, elevation;
    4450             : 
    4451             :     Word32 response_avg_fx[MAX_OUTPUT_CHANNELS];
    4452             :     Word32 response_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS];
    4453             :     Word32 cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
    4454             :     Word32 *pCov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    4455             :     Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
    4456      224486 :     Word16 q_dm_fv_re_fx = 0;
    4457             :     Word16 q_Wscale[IVAS_MAX_NUM_BANDS];
    4458             :     Word32 Wscale_fx[IVAS_MAX_NUM_BANDS];
    4459             :     Word32 mixer_mat_local_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS];
    4460             :     Word32 **ppMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH];
    4461             :     Word32 *pMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH];
    4462      224486 :     Word16 q_ppMixer_mat = 0;
    4463             :     Word32 en_ratio_fac_fx, diff_norm_order1_fx, diff_norm_order2_fx, diff_norm_order3_fx;
    4464             :     Word16 active_w;
    4465      224486 :     move16();
    4466      224486 :     move16();
    4467             : 
    4468             :     Word16 ndm, foa_ch, hoa2_ch;
    4469             :     Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1];
    4470             :     const Word16 *remix_order;
    4471             : 
    4472      224486 :     set16_fx( q_Wscale, 0, IVAS_MAX_NUM_BANDS );
    4473      224486 :     set32_fx( Wscale_fx, 0, IVAS_MAX_NUM_BANDS );
    4474      224486 :     remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order];
    4475             : 
    4476      224486 :     num_ch = ivas_sba_get_nchan_metadata_fx( order, IVAS_256k /*dummy value as order is always 1 in this function*/ );
    4477             : 
    4478      224486 :     hoa2_ch = ivas_sba_get_nchan_metadata_fx( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ );
    4479      224486 :     foa_ch = FOA_CHANNELS;
    4480      224486 :     move16();
    4481      224486 :     diff_norm_order1_fx = 3;
    4482      224486 :     move32();
    4483      224486 :     diff_norm_order2_fx = 5;
    4484      224486 :     move32();
    4485      224486 :     diff_norm_order3_fx = 7;
    4486      224486 :     move32();
    4487             : 
    4488     2693832 :     FOR( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ )
    4489             :     {
    4490    29632152 :         FOR( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ )
    4491             :         {
    4492    27162806 :             pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j];
    4493             :         }
    4494     2469346 :         ppMixer_mat_fx[i] = pMixer_mat_fx[i];
    4495             :     }
    4496             : 
    4497      224486 :     test();
    4498      224486 :     test();
    4499      224486 :     test();
    4500      224486 :     test();
    4501      224486 :     test();
    4502      224486 :     test();
    4503      224486 :     IF( ( GE_16( start_band, 6 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) || ( useLowerRes && GE_16( start_band, 3 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) )
    4504             :     {
    4505             :         Word32 P_norm_fx[3];
    4506             :         Word16 idx;
    4507             : 
    4508      110533 :         ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1];
    4509      110533 :         move16();
    4510      110533 :         P_norm_fx[0] = 0;
    4511      110533 :         move32();
    4512      110533 :         Word16 len = s_max( 0, sub( foa_ch, ndm ) );
    4513      368954 :         FOR( i = 0; i < len; i++ ) // i < max( 0, sub( foa_ch, ndm ) )
    4514             :         {
    4515      258421 :             P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    4516      258421 :             move32();
    4517             :         }
    4518      110533 :         P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, sub( foa_ch, ndm ) ) )] ); // 2*q_P_re - 31
    4519      110533 :         move32();
    4520             : 
    4521      110533 :         P_norm_fx[1] = 0;
    4522      110533 :         move32();
    4523      110533 :         len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
    4524      110533 :         FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
    4525             :         {
    4526           0 :             P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    4527           0 :             move32();
    4528             :         }
    4529      110533 :         P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, ( min( num_ch, hoa2_ch ) - ndm ) ) )] ); // 2*q_P_re - 31
    4530      110533 :         move32();
    4531             : 
    4532      110533 :         P_norm_fx[2] = 0;
    4533      110533 :         move32();
    4534      110533 :         FOR( ; i < ( num_ch - ndm ); i++ )
    4535             :         {
    4536           0 :             P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
    4537           0 :             move32();
    4538             :         }
    4539      110533 :         P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, ( num_ch - ndm ) ) )] ); // 2*q_P_re - 31
    4540      110533 :         move32();
    4541      110533 :         len = s_max( 0, sub( foa_ch, ndm ) );
    4542      368954 :         FOR( i = 0; i < len; i++ ) // i < max( 0, ( foa_ch - ndm ) )
    4543             :         {
    4544      258421 :             idx = sub( remix_order[i + ndm], ndm );
    4545      258421 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    4546      258421 :             move32();
    4547      258421 :             IF( P_dir_fact_fx[idx] != 0 )
    4548             :             {
    4549      228748 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[0], IVAS_FIX_EPS ) ); // q15
    4550      228748 :                 move32();
    4551      228748 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    4552      228748 :                 move32();
    4553             :             }
    4554             :         }
    4555      110533 :         len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
    4556      110533 :         FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
    4557             :         {
    4558           0 :             idx = sub( remix_order[i + ndm], ndm );
    4559           0 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    4560           0 :             IF( P_dir_fact_fx[idx] != 0 )
    4561             :             {
    4562           0 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[1], IVAS_FIX_EPS ) ); // q15
    4563           0 :                 move32();
    4564           0 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    4565           0 :                 move32();
    4566             :             }
    4567             :         }
    4568      110533 :         FOR( ; i < ( num_ch - ndm ); i++ )
    4569             :         {
    4570           0 :             idx = sub( remix_order[i + ndm], ndm );
    4571           0 :             P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
    4572           0 :             move32();
    4573           0 :             IF( P_dir_fact_fx[idx] != 0 )
    4574             :             {
    4575           0 :                 P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[2], IVAS_FIX_EPS ) ); // q15
    4576           0 :                 move32();
    4577           0 :                 P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
    4578           0 :                 move32();
    4579             :             }
    4580             :         }
    4581             :     }
    4582             : 
    4583      809197 :     FOR( Word16 i_ts = 0; i_ts < n_ts; i_ts++ )
    4584             :     {
    4585     2820619 :         FOR( band = start_band; band < end_band; band++ )
    4586             :         {
    4587     2235908 :             ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
    4588     2235908 :             move16();
    4589             : 
    4590             :             /*SPAR from DirAC*/
    4591     2235908 :             set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS );
    4592             : 
    4593     2235908 :             IF( GT_16( n_ts, 1 ) )
    4594             :             {
    4595     1832368 :                 IF( ele_dirac_fx[band][i_ts] < 0 )
    4596             :                 {
    4597      377461 :                     elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
    4598             :                 }
    4599             :                 ELSE
    4600             :                 {
    4601     1454907 :                     elevation = extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ); // q0
    4602             :                 }
    4603     1832368 :                 IF( azi_dirac_fx[band][i_ts] < 0 )
    4604             :                 {
    4605           0 :                     azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
    4606             :                 }
    4607             :                 ELSE
    4608             :                 {
    4609     1832368 :                     azimuth = extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ); // q0
    4610             :                 }
    4611     1832368 :                 ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
    4612             :             }
    4613      403540 :             ELSE IF( useLowerRes )
    4614             :             {
    4615       43860 :                 IF( ele_dirac_fx[band][0] < 0 )
    4616             :                 {
    4617       10376 :                     elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][0] ), Q22 ) ) ); // q0
    4618             :                 }
    4619             :                 ELSE
    4620             :                 {
    4621       33484 :                     elevation = extract_l( L_shr( ele_dirac_fx[band][0], Q22 ) ); // q0
    4622             :                 }
    4623       43860 :                 IF( azi_dirac_fx[band][0] < 0 )
    4624             :                 {
    4625           0 :                     azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][0] ), Q22 ) ) ); // q0
    4626             :                 }
    4627             :                 ELSE
    4628             :                 {
    4629       43860 :                     azimuth = extract_l( L_shr( azi_dirac_fx[band][0], Q22 ) ); // q0
    4630             :                 }
    4631       43860 :                 ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
    4632             :             }
    4633             :             ELSE
    4634             :             {
    4635     1798400 :                 FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
    4636             :                 {
    4637     1438720 :                     IF( ele_dirac_fx[band][block] < 0 )
    4638             :                     {
    4639      296521 :                         elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][block] ), Q22 ) ) ); // q0
    4640             :                     }
    4641             :                     ELSE
    4642             :                     {
    4643     1142199 :                         elevation = extract_l( L_shr( ele_dirac_fx[band][block], Q22 ) ); // q0
    4644             :                     }
    4645     1438720 :                     IF( azi_dirac_fx[band][block] < 0 )
    4646             :                     {
    4647           0 :                         azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][block] ), Q22 ) ) ); // q0
    4648             :                     }
    4649             :                     ELSE
    4650             :                     {
    4651     1438720 :                         azimuth = extract_l( L_shr( azi_dirac_fx[band][block], Q22 ) ); // q0
    4652             :                     }
    4653     1438720 :                     ivas_dirac_dec_get_response_fx( azimuth, elevation, &( response_fx[block][0] ), order, Q30 );
    4654             :                 }
    4655             : 
    4656             :                 /* average responses in all subframes*/
    4657             :                 {
    4658             :                     Word32 norm_fx;
    4659             :                     Word16 norm_q;
    4660             :                     Word16 num_ch_order, hoa2_ch_order;
    4661             : 
    4662      359680 :                     num_ch_order = ivas_sba_get_nchan_fx( order, 0 );
    4663      359680 :                     hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 );
    4664             : 
    4665     1798400 :                     FOR( ch = 0; ch < num_ch_order; ch++ )
    4666             :                     {
    4667     1438720 :                         Word64 temp = 0;
    4668     1438720 :                         move64();
    4669     7193600 :                         FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
    4670             :                         {
    4671     5754880 :                             temp = W_add( temp, W_deposit32_l( response_fx[block][ch] ) ); // q30
    4672             :                         }
    4673     1438720 :                         response_avg_fx[ch] = W_extract_l( W_shr( temp, 2 ) ); // q30
    4674     1438720 :                         move32();
    4675             :                     }
    4676             : 
    4677             :                     /*normalize 1st order*/
    4678      359680 :                     norm_fx = 0;
    4679      359680 :                     move32();
    4680      359680 :                     norm_q = 0;
    4681      359680 :                     move16();
    4682     1438720 :                     FOR( ch = 1; ch < foa_ch; ch++ )
    4683             :                     {
    4684     1079040 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4685             :                     }
    4686             : 
    4687      359680 :                     norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) );
    4688      359680 :                     IF( norm_fx )
    4689             :                     {
    4690      356845 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4691             :                     }
    4692             :                     ELSE
    4693             :                     {
    4694        2835 :                         norm_fx = EPSILON_FX;
    4695        2835 :                         move32();
    4696             :                     }
    4697      359680 :                     IF( norm_q <= 0 )
    4698             :                     {
    4699      332085 :                         norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31
    4700      332085 :                         norm_q = 0;
    4701      332085 :                         move16();
    4702             :                     }
    4703      359680 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4704     1438720 :                     FOR( ch = 1; ch < foa_ch; ch++ )
    4705             :                     {
    4706     1079040 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4707             :                         {
    4708        8505 :                             IF( response_avg_fx[ch] != 0 )
    4709             :                             {
    4710        8124 :                                 response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4711        8124 :                                 move32();
    4712             :                             }
    4713        8505 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4714        8505 :                             move32();
    4715             :                         }
    4716     1070535 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4717             :                         {
    4718       24989 :                             response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
    4719       24989 :                             move32();
    4720             :                         }
    4721             :                         ELSE
    4722             :                         {
    4723     1045546 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4724     1045546 :                             move32();
    4725     1045546 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4726     1045546 :                             move32();
    4727             :                         }
    4728             :                     }
    4729             : 
    4730             :                     /*normalize 2nd order*/
    4731      359680 :                     norm_fx = 0;
    4732      359680 :                     move32();
    4733      359680 :                     Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order );
    4734      359680 :                     FOR( ch = foa_ch; ch < min_ch_order; ch++ )
    4735             :                     {
    4736           0 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4737             :                     }
    4738      359680 :                     norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
    4739      359680 :                     IF( norm_fx )
    4740             :                     {
    4741           0 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4742             :                     }
    4743             :                     ELSE
    4744             :                     {
    4745      359680 :                         norm_fx = EPSILON_FX;
    4746      359680 :                         move32();
    4747             :                     }
    4748      359680 :                     IF( norm_q < 0 )
    4749             :                     {
    4750           0 :                         norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
    4751           0 :                         norm_q = 0;
    4752           0 :                         move16();
    4753             :                     }
    4754      359680 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4755      359680 :                     min_ch_order = s_min( hoa2_ch_order, num_ch_order );
    4756      359680 :                     FOR( ch = foa_ch; ch < min_ch_order; ch++ )
    4757             :                     {
    4758           0 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4759             :                         {
    4760           0 :                             response_avg_fx[ch] = response_avg_fx[ch];                               // q30
    4761           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4762           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );                  // q30
    4763           0 :                             move32();
    4764           0 :                             move32();
    4765           0 :                             move32();
    4766             :                         }
    4767           0 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4768             :                         {
    4769           0 :                             response_avg_fx[ch] = ONE_IN_Q30; // q30
    4770           0 :                             move32();
    4771             :                         }
    4772             :                         ELSE
    4773             :                         {
    4774           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4775           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );           // q30
    4776           0 :                             move32();
    4777           0 :                             move32();
    4778             :                         }
    4779             :                     }
    4780             : 
    4781             :                     /*normalize 3rd order*/
    4782      359680 :                     norm_fx = 0;
    4783      359680 :                     move32();
    4784      359680 :                     FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
    4785             :                     {
    4786           0 :                         norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
    4787             :                     }
    4788      359680 :                     norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
    4789      359680 :                     IF( norm_fx )
    4790             :                     {
    4791           0 :                         norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
    4792             :                     }
    4793             :                     ELSE
    4794             :                     {
    4795      359680 :                         norm_fx = EPSILON_FX;
    4796      359680 :                         move32();
    4797             :                     }
    4798      359680 :                     IF( norm_q < 0 )
    4799             :                     {
    4800           0 :                         norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
    4801           0 :                         norm_q = 0;
    4802           0 :                         move16();
    4803             :                     }
    4804      359680 :                     norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
    4805      359680 :                     FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
    4806             :                     {
    4807           0 :                         IF( LT_32( norm_fx, EPSILON_FX_THR ) )
    4808             :                         {
    4809           0 :                             response_avg_fx[ch] = response_avg_fx[ch];                               // q30
    4810           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
    4811           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 );                  // q30
    4812           0 :                             move32();
    4813           0 :                             move32();
    4814           0 :                             move32();
    4815             :                         }
    4816           0 :                         ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
    4817             :                         {
    4818           0 :                             response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
    4819           0 :                             move32();
    4820             :                         }
    4821             :                         ELSE
    4822             :                         {
    4823           0 :                             response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
    4824           0 :                             move32();
    4825           0 :                             response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
    4826           0 :                             move32();
    4827             :                         }
    4828             :                     }
    4829             :                 }
    4830             :             }
    4831             : 
    4832     2235908 :             FOR( i = add( FOA_CHANNELS, 1 ); i < num_ch; i++ )
    4833             :             {
    4834           0 :                 response_avg_fx[i] = response_avg_fx[HOA_keep_ind[i]]; // q30
    4835           0 :                 move32();
    4836             :             }
    4837             : 
    4838             : 
    4839     2235908 :             en_ratio_fac_fx = L_shl( L_sub( ONE_IN_Q30 - EPSILON_FX /* Guard to prevent overflow if diffuseness_fx is 0 */, diffuseness_fx[band] ), 1 ); // assuming q of dissusion 30=>q31
    4840     2235908 :             en_ratio_fac_fx = L_max( en_ratio_fac_fx, 0 );                                                                                               // q31
    4841             : 
    4842    11179540 :             FOR( i = 0; i < num_ch; i++ )
    4843             :             {
    4844    44718160 :                 FOR( j = 0; j < num_ch; j++ )
    4845             :                 {
    4846    35774528 :                     IF( EQ_16( i, j ) )
    4847             :                     {
    4848     8943632 :                         IF( i == 0 )
    4849             :                         {
    4850     2235908 :                             cov_real_dirac_fx[i][i][band] = ONE_IN_Q30; // 1 q30
    4851     2235908 :                             move32();
    4852             :                         }
    4853             :                         ELSE
    4854             :                         {
    4855     6707724 :                             Word32 en_ratio_fac_sq = 0;
    4856     6707724 :                             move32();
    4857     6707724 :                             cov_real_dirac_fx[i][j][band] = Mpy_32_32( L_shl( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), 1 ), response_avg_fx[j] ); // q30
    4858     6707724 :                             move32();
    4859             : 
    4860     6707724 :                             IF( LE_16( hSpar_md_cfg->nchan_transport, 2 ) )
    4861             :                             {
    4862     3451164 :                                 cov_real_dirac_fx[i][j][band] = Mpy_32_32( cov_real_dirac_fx[i][j][band], en_ratio_fac_fx ); // q30
    4863     3451164 :                                 move32();
    4864     3451164 :                                 test();
    4865     3451164 :                                 IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) )
    4866             :                                 {
    4867     2715104 :                                     en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                                                                                   // q31
    4868     2715104 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), P_dir_fact_fx[i - ndm] ) ); // q30
    4869     2715104 :                                     move32();
    4870             :                                 }
    4871             :                                 ELSE
    4872             :                                 {
    4873      736060 :                                     IF( LT_16( i, foa_ch ) )
    4874             :                                     {
    4875      736060 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                                         // q31
    4876      736060 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31 /*1 q31*/, en_ratio_fac_sq ), ONE_BY_THREE_Q31 /*1/3 q31*/ ); // q31
    4877      736060 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );                // q30
    4878      736060 :                                         move32();
    4879             :                                     }
    4880           0 :                                     ELSE IF( LT_16( i, hoa2_ch ) )
    4881             :                                     {
    4882           0 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                              // q31
    4883           0 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ); // q31
    4884           0 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );     // q30
    4885           0 :                                         move32();
    4886             :                                     }
    4887             :                                     ELSE
    4888             :                                     {
    4889           0 :                                         en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx );                               // q31
    4890           0 :                                         Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ); // q31
    4891           0 :                                         cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) );      // q30
    4892           0 :                                         move32();
    4893             :                                     }
    4894             :                                 }
    4895             :                             }
    4896             :                             ELSE
    4897             :                             {
    4898     3256560 :                                 IF( LT_16( i, foa_ch ) )
    4899             :                                 {
    4900     3256560 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_THREE_Q31 /*1/3 q31*/ ), 1 ) ); // q30
    4901     3256560 :                                     move32();
    4902             :                                 }
    4903           0 :                                 ELSE IF( LT_16( i, hoa2_ch ) )
    4904             :                                 {
    4905           0 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ), 1 ) ); // q30
    4906           0 :                                     move32();
    4907             :                                 }
    4908             :                                 ELSE
    4909             :                                 {
    4910           0 :                                     cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ), 1 ) ); // q30
    4911           0 :                                     move32();
    4912             :                                 }
    4913             :                             }
    4914             :                         }
    4915             :                     }
    4916             :                     ELSE
    4917             :                     {
    4918    26830896 :                         cov_real_dirac_fx[i][j][band] = L_shl( Mpy_32_32( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), response_avg_fx[j] ), 1 ); // q30
    4919    26830896 :                         move32();
    4920             :                     }
    4921             :                 }
    4922             :             }
    4923             :         }
    4924             : 
    4925     2923555 :         FOR( i = 0; i < num_ch; i++ )
    4926             :         {
    4927    11694220 :             FOR( j = 0; j < num_ch; j++ )
    4928             :             {
    4929     9355376 :                 pCov_real_fx[i][j] = cov_real_dirac_fx[i][j]; // q30
    4930     9355376 :                 move32();
    4931             :             }
    4932             :         }
    4933             : 
    4934      584711 :         test();
    4935      584711 :         active_w = ( EQ_16( dyn_active_w_flag, 1 ) ) || ( EQ_16( hSpar_md_cfg->active_w, 1 ) );
    4936      584711 :         ivas_compute_spar_params_fx( pCov_real_fx, Q30, dm_fv_re_fx, &q_dm_fv_re_fx, i_ts, ppMixer_mat_fx, &q_ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale_fx, q_Wscale, 1, dyn_active_w_flag );
    4937             : 
    4938      584711 :         IF( mixer_mat_fx != NULL )
    4939             :         {
    4940           0 :             if ( *q_mixer_mat_fx == 0 )
    4941             :             {
    4942           0 :                 *q_mixer_mat_fx = q_ppMixer_mat;
    4943           0 :                 move16();
    4944             :             }
    4945           0 :             FOR( band = start_band; band < end_band; band++ )
    4946             :             {
    4947           0 :                 ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
    4948           0 :                 move16();
    4949             : 
    4950           0 :                 FOR( i = 0; i < ndm; i++ )
    4951             :                 {
    4952           0 :                     FOR( j = 0; j < num_ch; j++ )
    4953             :                     {
    4954           0 :                         mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = L_shl( ppMixer_mat_fx[i][j][band], sub( *q_mixer_mat_fx, q_ppMixer_mat ) ); // q_mixer_mat_fx
    4955           0 :                         move32();
    4956             :                     }
    4957             :                 }
    4958             : 
    4959           0 :                 FOR( i = ndm; i < num_ch; i++ )
    4960             :                 {
    4961           0 :                     FOR( j = 0; j < num_ch; j++ )
    4962             :                     {
    4963           0 :                         mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = 0;
    4964           0 :                         move32();
    4965             :                     }
    4966             :                 }
    4967             : 
    4968           0 :                 test();
    4969           0 :                 IF( ( EQ_16( ndm, 1 ) ) && ( Wscale_d != NULL ) )
    4970             :                 {
    4971           0 :                     FOR( j = 0; j < num_ch; j++ )
    4972             :                     {
    4973           0 :                         mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = Mpy_32_32( L_shl( mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )], 2 ), Wscale_d[band] ); // q_mixer_mat_fx
    4974           0 :                         move32();
    4975             :                     }
    4976             :                 }
    4977             :             }
    4978             :         }
    4979             :     }
    4980             : 
    4981      224486 :     return;
    4982             : }
    4983             : 
    4984             : /*-------------------------------------------------------------------------
    4985             :  * ivas_dirac_dec_get_response_fx()
    4986             :  *
    4987             :  * Block Q of 29 is maintained
    4988             :  * calculate reponse, 1 degree resolution
    4989             :  * Input azimuth and elevation are expected in Q0
    4990             :  *------------------------------------------------------------------------*/
    4991             : 
    4992             : Word32 local_result_table[91][9] /*q30*/ = {
    4993             :     {
    4994             :         -1518500224,
    4995             :         0,
    4996             :         1518500224,
    4997             :         0,
    4998             :         0,
    4999             :         -1518500224,
    5000             :         0,
    5001             :         0,
    5002             :         0,
    5003             :     },
    5004             :     {
    5005             :         -1518268928,
    5006             :         18739168,
    5007             :         1517806336,
    5008             :         -32452256,
    5009             :         283224,
    5010             :         -1517112832,
    5011             :         45883920,
    5012             :         -633213,
    5013             :         4512,
    5014             :     },
    5015             :     {
    5016             :         -1517575296,
    5017             :         37472840,
    5018             :         1515726208,
    5019             :         -64865308,
    5020             :         1132567,
    5021             :         -1512954368,
    5022             :         91649576,
    5023             :         -2530954,
    5024             :         36081,
    5025             :     },
    5026             :     {
    5027             :         -1516419072,
    5028             :         56195504,
    5029             :         1512261120,
    5030             :         -97200048,
    5031             :         2547029,
    5032             :         -1506034816,
    5033             :         137178960,
    5034             :         -5687523,
    5035             :         121687,
    5036             :     },
    5037             :     {
    5038             :         -1514801280,
    5039             :         74899824,
    5040             :         1507416960,
    5041             :         -129414272,
    5042             :         4524729,
    5043             :         -1496374144,
    5044             :         182350416,
    5045             :         -10092950,
    5046             :         288126,
    5047             :     },
    5048             :     {
    5049             :         -1512721920,
    5050             :         93582472,
    5051             :         1501198336,
    5052             :         -161472816,
    5053             :         7063499,
    5054             :         -1483994752,
    5055             :         227052672,
    5056             :         -15734350,
    5057             :         561983,
    5058             :     },
    5059             :     {
    5060             :         -1510181888,
    5061             :         112236512,
    5062             :         1493612928,
    5063             :         -193334368,
    5064             :         10160129,
    5065             :         -1468930304,
    5066             :         271167360,
    5067             :         -22594280,
    5068             :         969488,
    5069             :     },
    5070             :     {
    5071             :         -1507181440,
    5072             :         130856376,
    5073             :         1484670848,
    5074             :         -224960416,
    5075             :         13810849,
    5076             :         -1451219200,
    5077             :         314580448,
    5078             :         -30651802,
    5079             :         1536471,
    5080             :     },
    5081             :     {
    5082             :         -1503722368,
    5083             :         149436080,
    5084             :         1474381824,
    5085             :         -256312016,
    5086             :         18011172,
    5087             :         -1430907520,
    5088             :         357179712,
    5089             :         -39882252,
    5090             :         2288268,
    5091             :     },
    5092             :     {
    5093             :         -1499805056,
    5094             :         167970048,
    5095             :         1462759808,
    5096             :         -287350848,
    5097             :         22755934,
    5098             :         -1408048256,
    5099             :         398855200,
    5100             :         -50257348,
    5101             :         3249646,
    5102             :     },
    5103             :     {
    5104             :         -1495430784,
    5105             :         186453552,
    5106             :         1449817472,
    5107             :         -318040608,
    5108             :         28039610,
    5109             :         -1382698496,
    5110             :         439501280,
    5111             :         -61745920,
    5112             :         4444797,
    5113             :     },
    5114             :     {
    5115             :         -1490601216,
    5116             :         204879712,
    5117             :         1435571584,
    5118             :         -348342304,
    5119             :         33855484,
    5120             :         -1354926336,
    5121             :         479011360,
    5122             :         -74312248,
    5123             :         5897082,
    5124             :     },
    5125             :     {
    5126             :         -1485317248,
    5127             :         223243280,
    5128             :         1420039296,
    5129             :         -378219040,
    5130             :         40196448,
    5131             :         -1324801792,
    5132             :         517284416,
    5133             :         -87917840,
    5134             :         7629140,
    5135             :     },
    5136             :     {
    5137             :         -1479581312,
    5138             :         241539296,
    5139             :         1403239552,
    5140             :         -407635936,
    5141             :         47055084,
    5142             :         -1292403328,
    5143             :         554224000,
    5144             :         -102521616,
    5145             :         9662823,
    5146             :     },
    5147             :     {
    5148             :         -1473394304,
    5149             :         259761664,
    5150             :         1385192192,
    5151             :         -436555904,
    5152             :         54422836,
    5153             :         -1257814016,
    5154             :         589734528,
    5155             :         -118078312,
    5156             :         12018922,
    5157             :     },
    5158             :     {
    5159             :         -1466758528,
    5160             :         277904896,
    5161             :         1365919872,
    5162             :         -464943936,
    5163             :         62290712,
    5164             :         -1221123072,
    5165             :         623725376,
    5166             :         -134540160,
    5167             :         14717325,
    5168             :     },
    5169             :     {
    5170             :         -1459675904,
    5171             :         295963392,
    5172             :         1345445888,
    5173             :         -492765408,
    5174             :         70649128,
    5175             :         -1182425216,
    5176             :         656109568,
    5177             :         -151856528,
    5178             :         17776824,
    5179             :     },
    5180             :     {
    5181             :         -1452148992,
    5182             :         313931616,
    5183             :         1323795328,
    5184             :         -519986432,
    5185             :         79487904,
    5186             :         -1141820288,
    5187             :         686806528,
    5188             :         -169973952,
    5189             :         21215122,
    5190             :     },
    5191             :     {
    5192             :         -1444179456,
    5193             :         331804576,
    5194             :         1300994176,
    5195             :         -546574464,
    5196             :         88796448,
    5197             :         -1099412096,
    5198             :         715738304,
    5199             :         -188836864,
    5200             :         25048834,
    5201             :     },
    5202             :     {
    5203             :         -1435770240,
    5204             :         349576096,
    5205             :         1277071104,
    5206             :         -572495872,
    5207             :         98563056,
    5208             :         -1055310848,
    5209             :         742831168,
    5210             :         -208386384,
    5211             :         29293104,
    5212             :     },
    5213             :     {
    5214             :         -1426923392,
    5215             :         367241408,
    5216             :         1252053888,
    5217             :         -597720320,
    5218             :         108776240,
    5219             :         -1009627456,
    5220             :         768018944,
    5221             :         -228562448,
    5222             :         33962144,
    5223             :     },
    5224             :     {
    5225             :         -1417641984,
    5226             :         384794496,
    5227             :         1225974400,
    5228             :         -622216320,
    5229             :         119423168,
    5230             :         -962481536,
    5231             :         791238528,
    5232             :         -249301712,
    5233             :         39068520,
    5234             :     },
    5235             :     {
    5236             :         -1407929088,
    5237             :         402230560,
    5238             :         1198863744,
    5239             :         -645953856,
    5240             :         130491136,
    5241             :         -913992384,
    5242             :         812432896,
    5243             :         -270540160,
    5244             :         44623688,
    5245             :     },
    5246             :     {
    5247             :         -1397786880,
    5248             :         419544320,
    5249             :         1170754432,
    5250             :         -668905408,
    5251             :         141966720,
    5252             :         -864283712,
    5253             :         831550336,
    5254             :         -292211648,
    5255             :         50637684,
    5256             :     },
    5257             :     {
    5258             :         -1387219200,
    5259             :         436730112,
    5260             :         1141681280,
    5261             :         -691041088,
    5262             :         153835648,
    5263             :         -813483968,
    5264             :         848545344,
    5265             :         -314247680,
    5266             :         57118880,
    5267             :     },
    5268             :     {
    5269             :         -1376228736,
    5270             :         453783040,
    5271             :         1111679744,
    5272             :         -712335552,
    5273             :         166083808,
    5274             :         -761721216,
    5275             :         863377472,
    5276             :         -336579712,
    5277             :         64074440,
    5278             :     },
    5279             :     {
    5280             :         -1364819072,
    5281             :         470697504,
    5282             :         1080786560,
    5283             :         -732761408,
    5284             :         178695840,
    5285             :         -709128192,
    5286             :         876011648,
    5287             :         -359136416,
    5288             :         71509840,
    5289             :     },
    5290             :     {
    5291             :         -1352993664,
    5292             :         487468704,
    5293             :         1049038720,
    5294             :         -752295232,
    5295             :         191656864,
    5296             :         -655838272,
    5297             :         886421184,
    5298             :         -381847712,
    5299             :         79429264,
    5300             :     },
    5301             :     {
    5302             :         -1340756224,
    5303             :         504091296,
    5304             :         1016475840,
    5305             :         -770911616,
    5306             :         204950624,
    5307             :         -601987264,
    5308             :         894582912,
    5309             :         -404640384,
    5310             :         87835088,
    5311             :     },
    5312             :     {
    5313             :         -1328110336,
    5314             :         520560224,
    5315             :         983137344,
    5316             :         -788589376,
    5317             :         218561056,
    5318             :         -547711936,
    5319             :         900480064,
    5320             :         -427441888,
    5321             :         96728224,
    5322             :     },
    5323             :     {
    5324             :         -1315059712,
    5325             :         536870912,
    5326             :         949062848,
    5327             :         -805306304,
    5328             :         232471968,
    5329             :         -493147392,
    5330             :         904103488,
    5331             :         -450179904,
    5332             :         106108432,
    5333             :     },
    5334             :     {
    5335             :         -1301608576,
    5336             :         553017920,
    5337             :         914294592,
    5338             :         -821041856,
    5339             :         246665952,
    5340             :         -438433216,
    5341             :         905449280,
    5342             :         -472780672,
    5343             :         115973296,
    5344             :     },
    5345             :     {
    5346             :         -1287761024,
    5347             :         568996608,
    5348             :         878874816,
    5349             :         -835777472,
    5350             :         261126064,
    5351             :         -383705856,
    5352             :         904519040,
    5353             :         -495171488,
    5354             :         126319176,
    5355             :     },
    5356             :     {
    5357             :         -1273521536,
    5358             :         584801792,
    5359             :         842847360,
    5360             :         -849494592,
    5361             :         275834208,
    5362             :         -329104384,
    5363             :         901322112,
    5364             :         -517278496,
    5365             :         137140640,
    5366             :     },
    5367             :     {
    5368             :         -1258893952,
    5369             :         600428672,
    5370             :         806255552,
    5371             :         -862177024,
    5372             :         290772768,
    5373             :         -274764416,
    5374             :         895873408,
    5375             :         -539030016,
    5376             :         148430976,
    5377             :     },
    5378             :     {
    5379             :         -1243882624,
    5380             :         615873088,
    5381             :         769143424,
    5382             :         -873808640,
    5383             :         305923776,
    5384             :         -220820592,
    5385             :         888192128,
    5386             :         -560354240,
    5387             :         160182032,
    5388             :     },
    5389             :     {
    5390             :         -1228492672,
    5391             :         631129536,
    5392             :         731557056,
    5393             :         -884375872,
    5394             :         321268192,
    5395             :         -167408576,
    5396             :         878306816,
    5397             :         -581179712,
    5398             :         172383520,
    5399             :     },
    5400             :     {
    5401             :         -1212728192,
    5402             :         646193920,
    5403             :         693541568,
    5404             :         -893865664,
    5405             :         336788032,
    5406             :         -114659368,
    5407             :         866249088,
    5408             :         -601437056,
    5409             :         185024416,
    5410             :     },
    5411             :     {
    5412             :         -1196594560,
    5413             :         661061376,
    5414             :         655143872,
    5415             :         -902266304,
    5416             :         352463776,
    5417             :         -62704428,
    5418             :         852058240,
    5419             :         -621057088,
    5420             :         198091488,
    5421             :     },
    5422             :     {
    5423             :         -1180096256,
    5424             :         675727744,
    5425             :         616410112,
    5426             :         -909567168,
    5427             :         368276832,
    5428             :         -11670283,
    5429             :         835778240,
    5430             :         -639973248,
    5431             :         211570704,
    5432             :     },
    5433             :     {
    5434             :         -1163238528,
    5435             :         690187904,
    5436             :         577388480,
    5437             :         -915760192,
    5438             :         384207328,
    5439             :         38316972,
    5440             :         817459904,
    5441             :         -658119040,
    5442             :         225445952,
    5443             :     },
    5444             :     {
    5445             :         -1146026752,
    5446             :         704437888,
    5447             :         538126144,
    5448             :         -920838016,
    5449             :         400236128,
    5450             :         87136208,
    5451             :         797158016,
    5452             :         -675430976,
    5453             :         239700208,
    5454             :     },
    5455             :     {
    5456             :         -1128465792,
    5457             :         718473536,
    5458             :         498670016,
    5459             :         -924793792,
    5460             :         416343968,
    5461             :         134670400,
    5462             :         774934400,
    5463             :         -691848064,
    5464             :         254315376,
    5465             :     },
    5466             :     {
    5467             :         -1110560896,
    5468             :         732290176,
    5469             :         459069056,
    5470             :         -927622464,
    5471             :         432511008,
    5472             :         180804176,
    5473             :         750854336,
    5474             :         -707309760,
    5475             :         269271168,
    5476             :     },
    5477             :     {
    5478             :         -1092317568,
    5479             :         745883904,
    5480             :         419370880,
    5481             :         -929321088,
    5482             :         448717696,
    5483             :         225428032,
    5484             :         724989312,
    5485             :         -721759040,
    5486             :         284546880,
    5487             :     },
    5488             :     {
    5489             :         -1073741823,
    5490             :         759250176,
    5491             :         379625056,
    5492             :         -929887680,
    5493             :         464943936,
    5494             :         268435456,
    5495             :         697415552,
    5496             :         -735140736,
    5497             :         300119968,
    5498             :     },
    5499             :     {
    5500             :         -1054839104,
    5501             :         772385152,
    5502             :         339879232,
    5503             :         -929321088,
    5504             :         481170176,
    5505             :         309726208,
    5506             :         668213824,
    5507             :         -747403200,
    5508             :         315967200,
    5509             :     },
    5510             :     {
    5511             :         -1035614656,
    5512             :         785285184,
    5513             :         300180928,
    5514             :         -927622464,
    5515             :         497376864,
    5516             :         349204928,
    5517             :         637467712,
    5518             :         -758496960,
    5519             :         332064416,
    5520             :     },
    5521             :     {
    5522             :         -1016075072,
    5523             :         797945664,
    5524             :         260580400,
    5525             :         -924793792,
    5526             :         513543616,
    5527             :         386779488,
    5528             :         605268032,
    5529             :         -768375104,
    5530             :         348385536,
    5531             :     },
    5532             :     {
    5533             :         -996225600,
    5534             :         810363264,
    5535             :         221124000,
    5536             :         -920838016,
    5537             :         529651744,
    5538             :         422366560,
    5539             :         571706432,
    5540             :         -776995008,
    5541             :         364904864,
    5542             :     },
    5543             :     {
    5544             :         -976073088,
    5545             :         822533888,
    5546             :         181861520,
    5547             :         -915760768,
    5548             :         545680512,
    5549             :         455884896,
    5550             :         536880512,
    5551             :         -784315776,
    5552             :         381594208,
    5553             :     },
    5554             :     {
    5555             :         -955623040,
    5556             :         834454272,
    5557             :         142839376,
    5558             :         -909567168,
    5559             :         561611328,
    5560             :         487262400,
    5561             :         500889568,
    5562             :         -790300992,
    5563             :         398426144,
    5564             :     },
    5565             :     {
    5566             :         -934881920,
    5567             :         846120128,
    5568             :         104106176,
    5569             :         -902266304,
    5570             :         577424064,
    5571             :         516431136,
    5572             :         463836896,
    5573             :         -794917120,
    5574             :         415371168,
    5575             :     },
    5576             :     {
    5577             :         -913856384,
    5578             :         857528256,
    5579             :         65708784,
    5580             :         -893865664,
    5581             :         593099520,
    5582             :         543330048,
    5583             :         425828896,
    5584             :         -798133760,
    5585             :         432399904,
    5586             :     },
    5587             :     {
    5588             :         -892551936,
    5589             :         868675520,
    5590             :         27693010,
    5591             :         -884375872,
    5592             :         608619648,
    5593             :         567905408,
    5594             :         386972736,
    5595             :         -799925440,
    5596             :         449482624,
    5597             :     },
    5598             :     {
    5599             :         -870975872,
    5600             :         879557760,
    5601             :         -9893141,
    5602             :         -873808640,
    5603             :         623964096,
    5604             :         590108032,
    5605             :         347380800,
    5606             :         -800268608,
    5607             :         466587840,
    5608             :     },
    5609             :     {
    5610             :         -849134336,
    5611             :         890172352,
    5612             :         -47005296,
    5613             :         -862177024,
    5614             :         639115008,
    5615             :         609897856,
    5616             :         307164128,
    5617             :         -799144896,
    5618             :         483684960,
    5619             :     },
    5620             :     {
    5621             :         -827034624,
    5622             :         900515712,
    5623             :         -83597168,
    5624             :         -849494592,
    5625             :         654053696,
    5626             :         627240256,
    5627             :         266438224,
    5628             :         -796539136,
    5629             :         500742080,
    5630             :     },
    5631             :     {
    5632             :         -804682624,
    5633             :         910584576,
    5634             :         -119624760,
    5635             :         -835777472,
    5636             :         668762048,
    5637             :         642107520,
    5638             :         225317632,
    5639             :         -792439552,
    5640             :         517727488,
    5641             :     },
    5642             :     {
    5643             :         -782085312,
    5644             :         920376512,
    5645             :         -155044640,
    5646             :         -821041856,
    5647             :         683222080,
    5648             :         654480128,
    5649             :         183918624,
    5650             :         -786839296,
    5651             :         534609632,
    5652             :     },
    5653             :     {
    5654             :         -759250304,
    5655             :         929887616,
    5656             :         -189812384,
    5657             :         -805306304,
    5658             :         697415936,
    5659             :         664343872,
    5660             :         142359552,
    5661             :         -779734528,
    5662             :         551355584,
    5663             :     },
    5664             :     {
    5665             :         -736183296,
    5666             :         939115776,
    5667             :         -223886912,
    5668             :         -788589376,
    5669             :         711326720,
    5670             :         671693120,
    5671             :         100756408,
    5672             :         -771125696,
    5673             :         567933632,
    5674             :     },
    5675             :     {
    5676             :         -712892608,
    5677             :         948057792,
    5678             :         -257225888,
    5679             :         -770911616,
    5680             :         724937152,
    5681             :         676528896,
    5682             :         59227880,
    5683             :         -761017408,
    5684             :         584311680,
    5685             :     },
    5686             :     {
    5687             :         -689384832,
    5688             :         956710976,
    5689             :         -289788768,
    5690             :         -752295232,
    5691             :         738231168,
    5692             :         678858752,
    5693             :         17890716,
    5694             :         -749417856,
    5695             :         600457728,
    5696             :     },
    5697             :     {
    5698             :         -665666624,
    5699             :         965072704,
    5700             :         -321536480,
    5701             :         -732761408,
    5702             :         751191936,
    5703             :         678698240,
    5704             :         -23139272,
    5705             :         -736339008,
    5706             :         616340032,
    5707             :     },
    5708             :     {
    5709             :         -641745984,
    5710             :         973140608,
    5711             :         -352429632,
    5712             :         -712335552,
    5713             :         763803968,
    5714             :         676069440,
    5715             :         -63745280,
    5716             :         -721797248,
    5717             :         631926912,
    5718             :     },
    5719             :     {
    5720             :         -617629760,
    5721             :         980911936,
    5722             :         -382431072,
    5723             :         -691041088,
    5724             :         776052160,
    5725             :         671001088,
    5726             :         -103813880,
    5727             :         -705812224,
    5728             :         647187904,
    5729             :     },
    5730             :     {
    5731             :         -593325248,
    5732             :         988384512,
    5733             :         -411504000,
    5734             :         -668905408,
    5735             :         787920960,
    5736             :         663529280,
    5737             :         -143232048,
    5738             :         -688407552,
    5739             :         662091712,
    5740             :     },
    5741             :     {
    5742             :         -568840192,
    5743             :         995556160,
    5744             :         -439613248,
    5745             :         -645954560,
    5746             :         799396736,
    5747             :         653696896,
    5748             :         -181889024,
    5749             :         -669611072,
    5750             :         676608512,
    5751             :     },
    5752             :     {
    5753             :         -544181696,
    5754             :         1002424320,
    5755             :         -466724288,
    5756             :         -622216320,
    5757             :         810464576,
    5758             :         641552832,
    5759             :         -219676144,
    5760             :         -649453696,
    5761             :         690709312,
    5762             :     },
    5763             :     {
    5764             :         -519357600,
    5765             :         1008987328,
    5766             :         -492803904,
    5767             :         -597720256,
    5768             :         821111744,
    5769             :         627153216,
    5770             :         -256487184,
    5771             :         -627969792,
    5772             :         704364160,
    5773             :     },
    5774             :     {
    5775             :         -494375232,
    5776             :         1015242880,
    5777             :         -517820864,
    5778             :         -572495872,
    5779             :         831324672,
    5780             :         610560128,
    5781             :         -292219008,
    5782             :         -605198016,
    5783             :         717546496,
    5784             :     },
    5785             :     {
    5786             :         -469242400,
    5787             :         1021189056,
    5788             :         -541744064,
    5789             :         -546574272,
    5790             :         841091328,
    5791             :         591841984,
    5792             :         -326770816,
    5793             :         -581179840,
    5794             :         730228608,
    5795             :     },
    5796             :     {
    5797             :         -443966464,
    5798             :         1026824384,
    5799             :         -564545152,
    5800             :         -519986624,
    5801             :         850399808,
    5802             :         571072896,
    5803             :         -360046304,
    5804             :         -555960000,
    5805             :         742384384,
    5806             :     },
    5807             :     {
    5808             :         -418555424,
    5809             :         1032146880,
    5810             :         -586195904,
    5811             :         -492765472,
    5812             :         859238720,
    5813             :         548332736,
    5814             :         -391952064,
    5815             :         -529586400,
    5816             :         753988416,
    5817             :     },
    5818             :     {
    5819             :         -393016736,
    5820             :         1037154944,
    5821             :         -606669696,
    5822             :         -464943776,
    5823             :         867597120,
    5824             :         523707360,
    5825             :         -422398496,
    5826             :         -502110496,
    5827             :         765017472,
    5828             :     },
    5829             :     {
    5830             :         -367358464,
    5831             :         1041847104,
    5832             :         -625942016,
    5833             :         -436555712,
    5834             :         875464896,
    5835             :         497287264,
    5836             :         -451300416,
    5837             :         -473585952,
    5838             :         775447168,
    5839             :     },
    5840             :     {
    5841             :         -341588128,
    5842             :         1046221952,
    5843             :         -643989248,
    5844             :         -407635840,
    5845             :         882832768,
    5846             :         469168768,
    5847             :         -478576512,
    5848             :         -444069824,
    5849             :         785256768,
    5850             :     },
    5851             :     {
    5852             :         -315714112,
    5853             :         1050278016,
    5854             :         -660789184,
    5855             :         -378219488,
    5856             :         889691264,
    5857             :         439452448,
    5858             :         -504150464,
    5859             :         -413621792,
    5860             :         794425024,
    5861             :     },
    5862             :     {
    5863             :         -289743520,
    5864             :         1054014208,
    5865             :         -676321600,
    5866             :         -348342080,
    5867             :         896032512,
    5868             :         408242848,
    5869             :         -527951296,
    5870             :         -382302944,
    5871             :         802933568,
    5872             :     },
    5873             :     {
    5874             :         -263684816,
    5875             :         1057429248,
    5876             :         -690567552,
    5877             :         -318040352,
    5878             :         901848320,
    5879             :         375649632,
    5880             :         -549911936,
    5881             :         -350177888,
    5882             :         810763520,
    5883             :     },
    5884             :     {
    5885             :         -237545680,
    5886             :         1060522240,
    5887             :         -703509440,
    5888             :         -287351040,
    5889             :         907131648,
    5890             :         341785696,
    5891             :         -569970496,
    5892             :         -317312864,
    5893             :         817899072,
    5894             :     },
    5895             :     {
    5896             :         -211334384,
    5897             :         1063292288,
    5898             :         -715132096,
    5899             :         -256311760,
    5900             :         911876928,
    5901             :         306768160,
    5902             :         -588071424,
    5903             :         -283776384,
    5904             :         824324416,
    5905             :     },
    5906             :     {
    5907             :         -185058560,
    5908             :         1065738240,
    5909             :         -725420672,
    5910             :         -224960096,
    5911             :         916077184,
    5912             :         270716544,
    5913             :         -604163840,
    5914             :         -249638288,
    5915             :         830026560,
    5916             :     },
    5917             :     {
    5918             :         -158726560,
    5919             :         1067859776,
    5920             :         -734362944,
    5921             :         -193334624,
    5922             :         919727616,
    5923             :         233754128,
    5924             :         -618202944,
    5925             :         -214970528,
    5926             :         834993024,
    5927             :     },
    5928             :     {
    5929             :         -132346048,
    5930             :         1069655936,
    5931             :         -741948032,
    5932             :         -161473376,
    5933             :         922824448,
    5934             :         196005872,
    5935             :         -630149440,
    5936             :         -179845728,
    5937             :         839213568,
    5938             :     },
    5939             :     {
    5940             :         -105925224,
    5941             :         1071126272,
    5942             :         -748166720,
    5943             :         -129415376,
    5944             :         925363072,
    5945             :         157599216,
    5946             :         -639969344,
    5947             :         -144338352,
    5948             :         842679232,
    5949             :     },
    5950             :     {
    5951             :         -79472136,
    5952             :         1072270272,
    5953             :         -753011392,
    5954             :         -97199672,
    5955             :         927340864,
    5956             :         118664000,
    5957             :         -647635776,
    5958             :         -108523640,
    5959             :         845382016,
    5960             :     },
    5961             :     {
    5962             :         -52994836,
    5963             :         1073087808,
    5964             :         -756475840,
    5965             :         -64865616,
    5966             :         928755264,
    5967             :         79330888,
    5968             :         -653127424,
    5969             :         -72477792,
    5970             :         847316864,
    5971             :     },
    5972             :     {
    5973             :         -26501398,
    5974             :         1073578432,
    5975             :         -758556288,
    5976             :         -32452510,
    5977             :         929604544,
    5978             :         39731924,
    5979             :         -656428672,
    5980             :         -36277476,
    5981             :         848479808,
    5982             :     },
    5983             :     {
    5984             :         -66,
    5985             :         1073741823,
    5986             :         -759250112,
    5987             :         -81,
    5988             :         929887872,
    5989             :         99,
    5990             :         -657529856,
    5991             :         -90,
    5992             :         848867456,
    5993             :     }
    5994             : };
    5995             : 
    5996             : Word32 local_result_table_2[91][9] /*q30*/ = {
    5997             :     {
    5998             :         -1073741823,
    5999             :         0,
    6000             :         1073741823,
    6001             :         0,
    6002             :         0,
    6003             :         -1073741823,
    6004             :         0,
    6005             :         0,
    6006             :         0,
    6007             :     },
    6008             :     {
    6009             :         -1073578304,
    6010             :         13250594,
    6011             :         1073251200,
    6012             :         -22947212,
    6013             :         200270,
    6014             :         -1072760832,
    6015             :         32444832,
    6016             :         -447749,
    6017             :         3190,
    6018             :     },
    6019             :     {
    6020             :         -1073087808,
    6021             :         26497302,
    6022             :         1071780288,
    6023             :         -45866700,
    6024             :         800846,
    6025             :         -1069820288,
    6026             :         64806036,
    6027             :         -1789655,
    6028             :         25513,
    6029             :     },
    6030             :     {
    6031             :         -1072270272,
    6032             :         39736224,
    6033             :         1069330112,
    6034             :         -68730816,
    6035             :         1801021,
    6036             :         -1064927488,
    6037             :         97000176,
    6038             :         -4021686,
    6039             :         86045,
    6040             :     },
    6041             :     {
    6042             :         -1071126272,
    6043             :         52962176,
    6044             :         1065904768,
    6045             :         -91509712,
    6046             :         3199466,
    6047             :         -1058096320,
    6048             :         128941216,
    6049             :         -7136793,
    6050             :         203735,
    6051             :     },
    6052             :     {
    6053             :         -1069655936,
    6054             :         66172804,
    6055             :         1061507520,
    6056             :         -114178536,
    6057             :         4994649,
    6058             :         -1049342784,
    6059             :         160550480,
    6060             :         -11125865,
    6061             :         397382,
    6062             :     },
    6063             :     {
    6064             :         -1067859840,
    6065             :         79363208,
    6066             :         1056143808,
    6067             :         -136708048,
    6068             :         7184296,
    6069             :         -1038690624,
    6070             :         191744288,
    6071             :         -15976569,
    6072             :         685532,
    6073             :     },
    6074             :     {
    6075             :         -1065738240,
    6076             :         92529440,
    6077             :         1049820800,
    6078             :         -159071040,
    6079             :         9765746,
    6080             :         -1026166912,
    6081             :         222441968,
    6082             :         -21674096,
    6083             :         1086449,
    6084             :     },
    6085             :     {
    6086             :         -1063292288,
    6087             :         105667272,
    6088             :         1042545408,
    6089             :         -181239968,
    6090             :         12735822,
    6091             :         -1011804416,
    6092             :         252564208,
    6093             :         -28201010,
    6094             :         1618050,
    6095             :     },
    6096             :     {
    6097             :         -1060522368,
    6098             :         118772768,
    6099             :         1034327424,
    6100             :         -203187744,
    6101             :         16090877,
    6102             :         -995640448,
    6103             :         282033216,
    6104             :         -35537312,
    6105             :         2297847,
    6106             :     },
    6107             :     {
    6108             :         -1057429248,
    6109             :         131842576,
    6110             :         1025175744,
    6111             :         -224888688,
    6112             :         19827000,
    6113             :         -977715456,
    6114             :         310774336,
    6115             :         -43660960,
    6116             :         3142946,
    6117             :     },
    6118             :     {
    6119             :         -1054014208,
    6120             :         144871840,
    6121             :         1015102400,
    6122             :         -246315216,
    6123             :         23939442,
    6124             :         -958077632,
    6125             :         338712160,
    6126             :         -52546696,
    6127             :         4169866,
    6128             :     },
    6129             :     {
    6130             :         -1050277888,
    6131             :         157856848,
    6132             :         1004119424,
    6133             :         -267441264,
    6134             :         28423184,
    6135             :         -936776384,
    6136             :         365775328,
    6137             :         -62167296,
    6138             :         5394616,
    6139             :     },
    6140             :     {
    6141             :         -1046221952,
    6142             :         170794080,
    6143             :         992240192,
    6144             :         -288242144,
    6145             :         33272972,
    6146             :         -913867136,
    6147             :         391895552,
    6148             :         -72493728,
    6149             :         6832647,
    6150             :     },
    6151             :     {
    6152             :         -1041847104,
    6153             :         183679248,
    6154             :         979478784,
    6155             :         -308691648,
    6156             :         38482756,
    6157             :         -889408832,
    6158             :         417005280,
    6159             :         -83493976,
    6160             :         8498661,
    6161             :     },
    6162             :     {
    6163             :         -1037154944,
    6164             :         196508448,
    6165             :         965851264,
    6166             :         -328765024,
    6167             :         44046188,
    6168             :         -863464384,
    6169             :         441040416,
    6170             :         -95134256,
    6171             :         10406720,
    6172             :     },
    6173             :     {
    6174             :         -1032146752,
    6175             :         209277728,
    6176             :         951373888,
    6177             :         -348437760,
    6178             :         49956480,
    6179             :         -836100864,
    6180             :         463939520,
    6181             :         -107378776,
    6182             :         12570113,
    6183             :     },
    6184             :     {
    6185             :         -1026824448,
    6186             :         221983184,
    6187             :         936064704,
    6188             :         -367685952,
    6189             :         56206436,
    6190             :         -807388864,
    6191             :         485645568,
    6192             :         -120189736,
    6193             :         15001357,
    6194             :     },
    6195             :     {
    6196             :         -1021189120,
    6197             :         234621280,
    6198             :         919941824,
    6199             :         -386486528,
    6200             :         62788576,
    6201             :         -777401728,
    6202             :         506103424,
    6203             :         -133527832,
    6204             :         17712200,
    6205             :     },
    6206             :     {
    6207             :         -1015242880,
    6208             :         247187648,
    6209             :         903025664,
    6210             :         -404815744,
    6211             :         69694608,
    6212             :         -746217472,
    6213             :         525260928,
    6214             :         -147351424,
    6215             :         20713352,
    6216             :     },
    6217             :     {
    6218             :         -1008987264,
    6219             :         259678912,
    6220             :         885335808,
    6221             :         -422652128,
    6222             :         76916424,
    6223             :         -713914432,
    6224             :         543071424,
    6225             :         -161618048,
    6226             :         24014862,
    6227             :     },
    6228             :     {
    6229             :         -1002424320,
    6230             :         272090816,
    6231             :         866894784,
    6232             :         -439973408,
    6233             :         84444936,
    6234             :         -680577216,
    6235             :         559490112,
    6236             :         -176282928,
    6237             :         27625616,
    6238             :     },
    6239             :     {
    6240             :         -995556224,
    6241             :         284419968,
    6242             :         847724672,
    6243             :         -456758400,
    6244             :         92271176,
    6245             :         -646290240,
    6246             :         574476800,
    6247             :         -191300784,
    6248             :         31553712,
    6249             :     },
    6250             :     {
    6251             :         -988384640,
    6252             :         296662656,
    6253             :         827848384,
    6254             :         -472987584,
    6255             :         100385640,
    6256             :         -611140864,
    6257             :         587994880,
    6258             :         -206624832,
    6259             :         35806248,
    6260             :     },
    6261             :     {
    6262             :         -980912128,
    6263             :         308814848,
    6264             :         807290624,
    6265             :         -488639872,
    6266             :         108778240,
    6267             :         -575220032,
    6268             :         600012160,
    6269             :         -222206672,
    6270             :         40389148,
    6271             :     },
    6272             :     {
    6273             :         -973140672,
    6274             :         320873088,
    6275             :         786076288,
    6276             :         -503697312,
    6277             :         117438992,
    6278             :         -538618240,
    6279             :         610500032,
    6280             :         -237997792,
    6281             :         45307472,
    6282             :     },
    6283             :     {
    6284             :         -965072832,
    6285             :         332833408,
    6286             :         764231552,
    6287             :         -518140608,
    6288             :         126357048,
    6289             :         -501429376,
    6290             :         619433792,
    6291             :         -253947792,
    6292             :         50565096,
    6293             :     },
    6294             :     {
    6295             :         -956710976,
    6296             :         344692448,
    6297             :         741782400,
    6298             :         -531953120,
    6299             :         135521872,
    6300             :         -463747712,
    6301             :         626794432,
    6302             :         -270007104,
    6303             :         56164972,
    6304             :     },
    6305             :     {
    6306             :         -948057792,
    6307             :         356446400,
    6308             :         718756992,
    6309             :         -545116864,
    6310             :         144921984,
    6311             :         -425669280,
    6312             :         632565632,
    6313             :         -286123936,
    6314             :         62108788,
    6315             :     },
    6316             :     {
    6317             :         -939115840,
    6318             :         368091680,
    6319             :         695183104,
    6320             :         -557616896,
    6321             :         154546016,
    6322             :         -387290848,
    6323             :         636735552,
    6324             :         -302247040,
    6325             :         68397184,
    6326             :     },
    6327             :     {
    6328             :         -929887616,
    6329             :         379625088,
    6330             :         671088768,
    6331             :         -569437568,
    6332             :         164382512,
    6333             :         -348707872,
    6334             :         639297728,
    6335             :         -318325280,
    6336             :         75029992,
    6337             :     },
    6338             :     {
    6339             :         -920376256,
    6340             :         391042752,
    6341             :         646503936,
    6342             :         -580564288,
    6343             :         174419184,
    6344             :         -310019104,
    6345             :         640249344,
    6346             :         -334306432,
    6347             :         82005504,
    6348             :     },
    6349             :     {
    6350             :         -910584576,
    6351             :         402341376,
    6352             :         621458368,
    6353             :         -590983936,
    6354             :         184644016,
    6355             :         -271321024,
    6356             :         639591552,
    6357             :         -350139136,
    6358             :         89321144,
    6359             :     },
    6360             :     {
    6361             :         -900515712,
    6362             :         413517344,
    6363             :         595983104,
    6364             :         -600683392,
    6365             :         195044256,
    6366             :         -232711952,
    6367             :         637331008,
    6368             :         -365771136,
    6369             :         96973080,
    6370             :     },
    6371             :     {
    6372             :         -890172480,
    6373             :         424567200,
    6374             :         570108800,
    6375             :         -609651264,
    6376             :         205607392,
    6377             :         -194287792,
    6378             :         633478144,
    6379             :         -381151776,
    6380             :         104956552,
    6381             :     },
    6382             :     {
    6383             :         -879557888,
    6384             :         435488064,
    6385             :         543866560,
    6386             :         -617876032,
    6387             :         216320784,
    6388             :         -156143744,
    6389             :         628046656,
    6390             :         -396230272,
    6391             :         113265800,
    6392             :     },
    6393             :     {
    6394             :         -868675520,
    6395             :         446276000,
    6396             :         517288960,
    6397             :         -625348224,
    6398             :         227170944,
    6399             :         -118375744,
    6400             :         621056704,
    6401             :         -410956128,
    6402             :         121893560,
    6403             :     },
    6404             :     {
    6405             :         -857528320,
    6406             :         456928128,
    6407             :         490407968,
    6408             :         -632058496,
    6409             :         238145120,
    6410             :         -81076416,
    6411             :         612530560,
    6412             :         -425280224,
    6413             :         130832024,
    6414             :     },
    6415             :     {
    6416             :         -846120128,
    6417             :         467441024,
    6418             :         463256672,
    6419             :         -637998656,
    6420             :         249229552,
    6421             :         -44338728,
    6422             :         602496192,
    6423             :         -439153664,
    6424             :         140071840,
    6425             :     },
    6426             :     {
    6427             :         -834454080,
    6428             :         477811712,
    6429             :         435867776,
    6430             :         -643161152,
    6431             :         260411056,
    6432             :         -8252136,
    6433             :         590984448,
    6434             :         -452529440,
    6435             :         149603072,
    6436             :     },
    6437             :     {
    6438             :         -822533888,
    6439             :         488036576,
    6440             :         408275296,
    6441             :         -647540288,
    6442             :         271675616,
    6443             :         27094190,
    6444             :         578031424,
    6445             :         -465360448,
    6446             :         159414368,
    6447             :     },
    6448             :     {
    6449             :         -810363264,
    6450             :         498112832,
    6451             :         380512640,
    6452             :         -651130816,
    6453             :         283009696,
    6454             :         61614604,
    6455             :         563675840,
    6456             :         -477601824,
    6457             :         169493648,
    6458             :     },
    6459             :     {
    6460             :         -797945792,
    6461             :         508037536,
    6462             :         352612960,
    6463             :         -653928000,
    6464             :         294399648,
    6465             :         95226360,
    6466             :         547961344,
    6467             :         -489210464,
    6468             :         179828128,
    6469             :     },
    6470             :     {
    6471             :         -785285184,
    6472             :         517807392,
    6473             :         324610848,
    6474             :         -655928192,
    6475             :         305831488,
    6476             :         127847864,
    6477             :         530934208,
    6478             :         -500143520,
    6479             :         190403472,
    6480             :     },
    6481             :     {
    6482             :         -772385152,
    6483             :         527419616,
    6484             :         296540000,
    6485             :         -657129280,
    6486             :         317291360,
    6487             :         159401696,
    6488             :         512644864,
    6489             :         -510360704,
    6490             :         201205024,
    6491             :     },
    6492             :     {
    6493             :         -759250176,
    6494             :         536870976,
    6495             :         268435456,
    6496             :         -657529920,
    6497             :         328765024,
    6498             :         189812544,
    6499             :         493147264,
    6500             :         -519823008,
    6501             :         212216864,
    6502             :     },
    6503             :     {
    6504             :         -745883904,
    6505             :         546158784,
    6506             :         240330912,
    6507             :         -657129280,
    6508             :         340238720,
    6509             :         219009504,
    6510             :         472498528,
    6511             :         -528493856,
    6512             :         223422560,
    6513             :     },
    6514             :     {
    6515             :         -732290176,
    6516             :         555280512,
    6517             :         212259968,
    6518             :         -655928192,
    6519             :         351698592,
    6520             :         246925184,
    6521             :         450757760,
    6522             :         -536338336,
    6523             :         234805008,
    6524             :     },
    6525             :     {
    6526             :         -718473600,
    6527             :         564232832,
    6528             :         184258176,
    6529             :         -653928000,
    6530             :         363130208,
    6531             :         273494400,
    6532             :         427989120,
    6533             :         -543323264,
    6534             :         246345792,
    6535             :     },
    6536             :     {
    6537             :         -704437888,
    6538             :         573013376,
    6539             :         156358288,
    6540             :         -651130816,
    6541             :         374520352,
    6542             :         298658272,
    6543             :         404257472,
    6544             :         -549418432,
    6545             :         258026704,
    6546             :     },
    6547             :     {
    6548             :         -690187904,
    6549             :         581619328,
    6550             :         128595512,
    6551             :         -647540736,
    6552             :         385854432,
    6553             :         322359296,
    6554             :         379631872,
    6555             :         -554595008,
    6556             :         269827872,
    6557             :     },
    6558             :     {
    6559             :         -675727552,
    6560             :         590048320,
    6561             :         101002688,
    6562             :         -643161152,
    6563             :         397119232,
    6564             :         344546560,
    6565             :         354182432,
    6566             :         -558827200,
    6567             :         281729824,
    6568             :     },
    6569             :     {
    6570             :         -661061376,
    6571             :         598297344,
    6572             :         73614184,
    6573             :         -637998656,
    6574             :         408300512,
    6575             :         365171968,
    6576             :         327982208,
    6577             :         -562091264,
    6578             :         293711776,
    6579             :     },
    6580             :     {
    6581             :         -646194048,
    6582             :         606364096,
    6583             :         46463128,
    6584             :         -632058496,
    6585             :         419384736,
    6586             :         384192352,
    6587             :         301106496,
    6588             :         -564365760,
    6589             :         305752896,
    6590             :     },
    6591             :     {
    6592             :         -631129536,
    6593             :         614246400,
    6594             :         19581916,
    6595             :         -625348224,
    6596             :         430359136,
    6597             :         401569792,
    6598             :         273631040,
    6599             :         -565632704,
    6600             :         317832192,
    6601             :     },
    6602             :     {
    6603             :         -615872960,
    6604             :         621941312,
    6605             :         -6995507,
    6606             :         -617876032,
    6607             :         441209248,
    6608             :         417269376,
    6609             :         245635312,
    6610             :         -565875392,
    6611             :         329927424,
    6612             :     },
    6613             :     {
    6614             :         -600428672,
    6615             :         629446976,
    6616             :         -33237764,
    6617             :         -609651264,
    6618             :         451922592,
    6619             :         431262912,
    6620             :         217197840,
    6621             :         -565080768,
    6622             :         342016896,
    6623             :     },
    6624             :     {
    6625             :         -584801792,
    6626             :         636760832,
    6627             :         -59112128,
    6628             :         -600683392,
    6629             :         462485824,
    6630             :         443525824,
    6631             :         188400272,
    6632             :         -563238208,
    6633             :         354078112,
    6634             :     },
    6635             :     {
    6636             :         -568996544,
    6637             :         643880576,
    6638             :         -84587480,
    6639             :         -590983936,
    6640             :         472886208,
    6641             :         454038592,
    6642             :         159323616,
    6643             :         -560339392,
    6644             :         366088608,
    6645             :     },
    6646             :     {
    6647             :         -553017856,
    6648             :         650804544,
    6649             :         -109633120,
    6650             :         -580564288,
    6651             :         483110976,
    6652             :         462787328,
    6653             :         130050112,
    6654             :         -556379392,
    6655             :         378026112,
    6656             :     },
    6657             :     {
    6658             :         -536871040,
    6659             :         657529856,
    6660             :         -134217624,
    6661             :         -569437568,
    6662             :         493147552,
    6663             :         469762048,
    6664             :         100663400,
    6665             :         -551355584,
    6666             :         389867264,
    6667             :     },
    6668             :     {
    6669             :         -520560224,
    6670             :         664055168,
    6671             :         -158311952,
    6672             :         -557616896,
    6673             :         502983968,
    6674             :         474958752,
    6675             :         71245536,
    6676             :         -545268160,
    6677             :         401589760,
    6678             :     },
    6679             :     {
    6680             :         -504091200,
    6681             :         670378112,
    6682             :         -181886176,
    6683             :         -545116864,
    6684             :         512608032,
    6685             :         478378176,
    6686             :         41880432,
    6687             :         -538120576,
    6688             :         413170752,
    6689             :     },
    6690             :     {
    6691             :         -487468704,
    6692             :         676496896,
    6693             :         -204911600,
    6694             :         -531953120,
    6695             :         522008320,
    6696             :         480025632,
    6697             :         12650646,
    6698             :         -529918464,
    6699             :         424587712,
    6700             :     },
    6701             :     {
    6702             :         -470697376,
    6703             :         682409472,
    6704             :         -227360640,
    6705             :         -518140608,
    6706             :         531172928,
    6707             :         479912128,
    6708             :         -16361936,
    6709             :         -520670304,
    6710             :         435818208,
    6711             :     },
    6712             :     {
    6713             :         -453782944,
    6714             :         688114368,
    6715             :         -249205392,
    6716             :         -503697312,
    6717             :         540091008,
    6718             :         478053280,
    6719             :         -45074720,
    6720             :         -510387712,
    6721             :         446839808,
    6722             :     },
    6723             :     {
    6724             :         -436730208,
    6725             :         693609536,
    6726             :         -270419616,
    6727             :         -488639872,
    6728             :         548751808,
    6729             :         474469440,
    6730             :         -73407496,
    6731             :         -499084608,
    6732             :         457630944,
    6733             :     },
    6734             :     {
    6735             :         -419544320,
    6736             :         698893440,
    6737             :         -290977280,
    6738             :         -472987584,
    6739             :         557144256,
    6740             :         469186080,
    6741             :         -101280352,
    6742             :         -486777664,
    6743             :         468169568,
    6744             :     },
    6745             :     {
    6746             :         -402230784,
    6747             :         703964544,
    6748             :         -310853504,
    6749             :         -456758880,
    6750             :         565258880,
    6751             :         462233504,
    6752             :         -128614952,
    6753             :         -473486528,
    6754             :         478434464,
    6755             :     },
    6756             :     {
    6757             :         -384794592,
    6758             :         708821056,
    6759             :         -330023904,
    6760             :         -439973408,
    6761             :         573084992,
    6762             :         453646368,
    6763             :         -155334496,
    6764             :         -459233120,
    6765             :         488405216,
    6766             :     },
    6767             :     {
    6768             :         -367241280,
    6769             :         713461824,
    6770             :         -348464992,
    6771             :         -422652096,
    6772             :         580613696,
    6773             :         443464288,
    6774             :         -181363824,
    6775             :         -444041664,
    6776             :         498060704,
    6777             :     },
    6778             :     {
    6779             :         -349576096,
    6780             :         717885184,
    6781             :         -366154656,
    6782             :         -404815744,
    6783             :         587835392,
    6784             :         431731200,
    6785             :         -206630032,
    6786             :         -427939616,
    6787             :         507382016,
    6788             :     },
    6789             :     {
    6790             :         -331804480,
    6791             :         722089728,
    6792             :         -383070912,
    6793             :         -386486400,
    6794             :         594741440,
    6795             :         418495488,
    6796             :         -231061856,
    6797             :         -410956224,
    6798             :         516349600,
    6799             :     },
    6800             :     {
    6801             :         -313931712,
    6802             :         726074560,
    6803             :         -399193696,
    6804             :         -367686080,
    6805             :         601323520,
    6806             :         403809504,
    6807             :         -254591184,
    6808             :         -393123104,
    6809             :         524945024,
    6810             :     },
    6811             :     {
    6812             :         -295963392,
    6813             :         729838080,
    6814             :         -414503104,
    6815             :         -348437824,
    6816             :         607573568,
    6817             :         387729792,
    6818             :         -277151968,
    6819             :         -374474112,
    6820             :         533150336,
    6821             :     },
    6822             :     {
    6823             :         -277904800,
    6824             :         733379328,
    6825             :         -428980256,
    6826             :         -328764896,
    6827             :         613483840,
    6828             :         370317024,
    6829             :         -298680832,
    6830             :         -355045728,
    6831             :         540949056,
    6832             :     },
    6833             :     {
    6834             :         -259761664,
    6835             :         736697216,
    6836             :         -442607872,
    6837             :         -308691520,
    6838             :         619047232,
    6839             :         351635200,
    6840             :         -319117568,
    6841             :         -334875840,
    6842             :         548323968,
    6843             :     },
    6844             :     {
    6845             :         -241539296,
    6846             :         739790656,
    6847             :         -455369184,
    6848             :         -288242080,
    6849             :         624257088,
    6850             :         331752416,
    6851             :         -338404704,
    6852             :         -314004800,
    6853             :         555260352,
    6854             :     },
    6855             :     {
    6856             :         -223243600,
    6857             :         742658752,
    6858             :         -467248512,
    6859             :         -267441568,
    6860             :         629106752,
    6861             :         310739808,
    6862             :         -356488192,
    6863             :         -292474784,
    6864             :         561743360,
    6865             :     },
    6866             :     {
    6867             :         -204879600,
    6868             :         745300672,
    6869             :         -478231616,
    6870             :         -246315056,
    6871             :         633590720,
    6872             :         288671296,
    6873             :         -373317920,
    6874             :         -270328992,
    6875             :         567759744,
    6876             :     },
    6877             :     {
    6878             :         -186453328,
    6879             :         747715456,
    6880             :         -488305024,
    6881             :         -224888512,
    6882             :         637703104,
    6883             :         265624400,
    6884             :         -388846464,
    6885             :         -247613152,
    6886             :         573296384,
    6887             :     },
    6888             :     {
    6889             :         -167970160,
    6890             :         749902528,
    6891             :         -497456320,
    6892             :         -203187888,
    6893             :         641438976,
    6894             :         241678992,
    6895             :         -403030016,
    6896             :         -224374080,
    6897             :         578342016,
    6898             :     },
    6899             :     {
    6900             :         -149435984,
    6901             :         751861248,
    6902             :         -505674752,
    6903             :         -181239792,
    6904             :         644794368,
    6905             :         216917856,
    6906             :         -415829312,
    6907             :         -200660208,
    6908             :         582885376,
    6909             :     },
    6910             :     {
    6911             :         -130856168,
    6912             :         753590784,
    6913             :         -512949888,
    6914             :         -159070816,
    6915             :         647764480,
    6916             :         191425504,
    6917             :         -427208320,
    6918             :         -176520928,
    6919             :         586917440,
    6920             :     },
    6921             :     {
    6922             :         -112236624,
    6923             :         755090944,
    6924             :         -519273024,
    6925             :         -136708240,
    6926             :         650345664,
    6927             :         165289136,
    6928             :         -437135488,
    6929             :         -152007120,
    6930             :         590429248,
    6931             :     },
    6932             :     {
    6933             :         -93582792,
    6934             :         756361024,
    6935             :         -524636480,
    6936             :         -114178928,
    6937             :         652535424,
    6938             :         138597088,
    6939             :         -445582912,
    6940             :         -127170136,
    6941             :         593413568,
    6942             :     },
    6943             :     {
    6944             :         -74900448,
    6945             :         757400704,
    6946             :         -529033792,
    6947             :         -91510496,
    6948             :         654330560,
    6949             :         111439480,
    6950             :         -452526688,
    6951             :         -102062624,
    6952             :         595864192,
    6953             :     },
    6954             :     {
    6955             :         -56195288,
    6956             :         758209600,
    6957             :         -532459456,
    6958             :         -68730552,
    6959             :         655729088,
    6960             :         83908120,
    6961             :         -457947648,
    6962             :         -76737800,
    6963             :         597775360,
    6964             :     },
    6965             :     {
    6966             :         -37473008,
    6967             :         758787712,
    6968             :         -534909184,
    6969             :         -45866920,
    6970             :         656729216,
    6971             :         56095408,
    6972             :         -461830816,
    6973             :         -51249536,
    6974             :         599143488,
    6975             :     },
    6976             :     {
    6977             :         -18739318,
    6978             :         759134656,
    6979             :         -536380320,
    6980             :         -22947390,
    6981             :         657329728,
    6982             :         28094712,
    6983             :         -464165184,
    6984             :         -25652050,
    6985             :         599965824,
    6986             :     },
    6987             :     {
    6988             :         -46,
    6989             :         759250176,
    6990             :         -536870912,
    6991             :         -57,
    6992             :         657530048,
    6993             :         70,
    6994             :         -464943808,
    6995             :         -64,
    6996             :         600239936,
    6997             :     }
    6998             : };
    6999    14551491 : void ivas_dirac_dec_get_response_fx(
    7000             :     const Word16 azimuth,
    7001             :     const Word16 elevation,
    7002             :     Word32 *response_fx, /*Q_out*/
    7003             :     const Word16 ambisonics_order,
    7004             :     Word16 Q_out )
    7005             : {
    7006             :     Word16 index_azimuth, index_elevation;
    7007             :     Word16 el, e, az, q_diff;
    7008             :     Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3];
    7009             :     Word32 sin_az_fx[3];
    7010             :     Word32 f_fx;
    7011             :     Word32 c_fx_better;
    7012             :     Word16 l, m;
    7013             :     Word16 b, b1, b_2, b1_2, a;
    7014             : 
    7015    14551491 :     index_azimuth = add( azimuth, 180 ) % 360;
    7016    14551491 :     move16();
    7017    14551491 :     index_elevation = add( elevation, 90 );
    7018             : 
    7019    14551491 :     e = 1;
    7020    14551491 :     move16();
    7021             : 
    7022    14551491 :     if ( GT_16( index_elevation, 90 ) )
    7023             :     {
    7024     4620019 :         e = -1;
    7025             :     }
    7026             : 
    7027    14551491 :     el = index_elevation;
    7028    14551491 :     move16();
    7029             : 
    7030    14551491 :     if ( GT_16( index_elevation, 90 ) )
    7031             :     {
    7032     4620019 :         el = sub( 180, index_elevation );
    7033             :     }
    7034             : 
    7035    14551491 :     az = index_azimuth;
    7036    14551491 :     move16();
    7037             : 
    7038    14551491 :     if ( GT_16( index_azimuth, 180 ) )
    7039             :     {
    7040     4971281 :         az = sub( 360, index_azimuth );
    7041             :     }
    7042             : 
    7043    14551491 :     f_fx = 1;
    7044    14551491 :     move16();
    7045             : 
    7046    14551491 :     if ( GT_16( index_azimuth, 180 ) )
    7047             :     {
    7048     4971281 :         f_fx = -1;
    7049             :     }
    7050             : 
    7051    14551491 :     cos_1_fx = L_shr( dirac_gains_trg_term_fx[az][0], 1 );  // q30
    7052    14551491 :     cos_2_fx = L_shl( Mpy_32_32( cos_1_fx, cos_1_fx ), 1 ); // q30
    7053    14551491 :     sin_1_fx = L_shr( dirac_gains_trg_term_fx[az][1], 1 );  // q30
    7054             : 
    7055    14551491 :     if ( EQ_32( f_fx, -1 ) )
    7056             :     {
    7057     4971281 :         sin_1_fx = L_negate( sin_1_fx ); // q30
    7058             :     }
    7059    14551491 :     cos_az_fx[0] = cos_1_fx; // q30
    7060    14551491 :     move32();
    7061    14551491 :     cos_az_fx[1] = L_shl( L_sub( cos_2_fx, ONE_IN_Q29 /*0.5 q30*/ ), 1 ); /*q30*/
    7062    14551491 :     move32();
    7063    14551491 :     cos_az_fx[2] = L_sub( L_shl( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), 2 ), cos_az_fx[0] /* cos_az_fx[0] q30*/ ); /*q30*/
    7064    14551491 :     move32();
    7065    14551491 :     sin_az_fx[0] = sin_1_fx; /*q30*/
    7066    14551491 :     move32();
    7067    14551491 :     sin_az_fx[1] = L_shl( Mpy_32_32( sin_1_fx, cos_1_fx ), 2 ); /*q30*/
    7068    14551491 :     move32();
    7069    14551491 :     sin_az_fx[2] = L_shl( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q28 /*1/4 q30*/ ) ), 3 ); /*q30*/
    7070    14551491 :     move32();
    7071             : 
    7072    14551491 :     response_fx[0] = L_shl_sat( 1, Q_out ); // Q_out
    7073    14551491 :     move32();
    7074             : 
    7075    14551491 :     q_diff = sub( Q_out, 29 );
    7076             : 
    7077    44724286 :     FOR( l = 1; l <= ambisonics_order; l++ )
    7078             :     {
    7079    30172795 :         b_2 = imult1616( l, l );
    7080    30172795 :         b1_2 = add( b_2, shl( l, 1 ) );
    7081    68016758 :         FOR( m = 0; m < l; m += 2 )
    7082             :         {
    7083    37843963 :             b = b_2 + m;
    7084    37843963 :             a = dirac_gains_P_idx[b];
    7085             : 
    7086    37843963 :             c_fx_better = local_result_table[el][a]; // q30
    7087    37843963 :             move32();
    7088    37843963 :             response_fx[b] = L_shl( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), q_diff ); // Q_out
    7089    37843963 :             move32();
    7090             : 
    7091    37843963 :             b1 = b1_2 - m;
    7092    37843963 :             response_fx[b1] = L_shl( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), q_diff ); // Q_out
    7093    37843963 :             move32();
    7094             :         }
    7095             : 
    7096    45794099 :         FOR( m = 1; m < l; m += 2 )
    7097             :         {
    7098    15621304 :             b = b_2 + m;
    7099    15621304 :             a = dirac_gains_P_idx[b];
    7100    15621304 :             c_fx_better = local_result_table[el][a]; // q30
    7101    15621304 :             move32();
    7102    15621304 :             if ( EQ_16( e, -1 ) )
    7103             :             {
    7104     5689986 :                 c_fx_better = L_negate( c_fx_better ); // q30
    7105             :             }
    7106    15621304 :             response_fx[b] = L_shl( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), q_diff ); // Q_out
    7107    15621304 :             move32();
    7108             : 
    7109    15621304 :             b1 = b1_2 - m;
    7110    15621304 :             response_fx[b1] = L_shl( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), q_diff ); // Q_out
    7111    15621304 :             move32();
    7112             :         }
    7113             : 
    7114    30172795 :         b = add( b_2, l );
    7115    30172795 :         a = dirac_gains_P_idx[b];
    7116    30172795 :         c_fx_better = local_result_table_2[el][a]; // q30
    7117    30172795 :         move32();
    7118    30172795 :         IF( EQ_16( s_and( l, 0x01 ), 1 ) )
    7119             :         {
    7120    22222659 :             if ( EQ_16( e, -1 ) )
    7121             :             {
    7122     7410948 :                 c_fx_better = L_negate( c_fx_better ); // q30
    7123             :             }
    7124             :         }
    7125    30172795 :         response_fx[b] = L_shl( c_fx_better, sub( Q_out, 30 ) ); // Q_out
    7126    30172795 :         move32();
    7127             :     }
    7128             : 
    7129    14551491 :     return;
    7130             : }
    7131             : 
    7132             : #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx
    7133             : /*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/
    7134    62931969 : void ivas_dirac_dec_get_response_fx_29(
    7135             :     const Word16 azimuth,
    7136             :     const Word16 elevation,
    7137             :     Word32 *response_fx, /*Q_out*/
    7138             :     const Word16 ambisonics_order )
    7139             : {
    7140             :     Word16 index_azimuth, index_elevation;
    7141             :     Word16 el, az;
    7142             :     Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3];
    7143             :     Word32 sin_az_fx[3];
    7144             :     Word32 f_fx;
    7145             :     Word32 c_fx_better;
    7146             :     Word16 l, m;
    7147             :     Word16 b, b1, b_2, b1_2;
    7148             :     // Word16 Q_out = 29;
    7149             : 
    7150    62931969 :     index_azimuth = add( azimuth, 180 ) % 360;
    7151    62931969 :     move16();
    7152    62931969 :     index_elevation = add( elevation, 90 );
    7153             : 
    7154    62931969 :     Word32 e_fac = L_add( 0x7FFFFFFF, 0 );
    7155             : 
    7156    62931969 :     if ( GT_16( index_elevation, 90 ) )
    7157             :     {
    7158    18624352 :         e_fac = MIN_32;
    7159             :     }
    7160             : 
    7161             : 
    7162    62931969 :     el = index_elevation;
    7163    62931969 :     move16();
    7164             : 
    7165    62931969 :     if ( GT_16( index_elevation, 90 ) )
    7166             :     {
    7167    18624352 :         el = sub( 180, index_elevation );
    7168             :     }
    7169             : 
    7170    62931969 :     az = index_azimuth;
    7171    62931969 :     move16();
    7172             : 
    7173    62931969 :     if ( GT_16( index_azimuth, 180 ) )
    7174             :     {
    7175    25589493 :         az = sub( 360, index_azimuth );
    7176             :     }
    7177             : 
    7178    62931969 :     f_fx = 1;
    7179    62931969 :     move16();
    7180             : 
    7181    62931969 :     if ( GT_16( index_azimuth, 180 ) )
    7182             :     {
    7183    25589493 :         f_fx = -1;
    7184             :     }
    7185             : 
    7186    62931969 :     cos_1_fx = L_shr( dirac_gains_trg_term_fx[az][0], 1 );  // q30
    7187    62931969 :     cos_2_fx = L_shl( Mpy_32_32( cos_1_fx, cos_1_fx ), 1 ); // q30
    7188    62931969 :     sin_1_fx = L_shr( dirac_gains_trg_term_fx[az][1], 1 );  // q30
    7189             : 
    7190    62931969 :     if ( EQ_32( f_fx, -1 ) )
    7191             :     {
    7192    25589493 :         sin_1_fx = L_negate( sin_1_fx ); // q30
    7193             :     }
    7194    62931969 :     cos_az_fx[0] = cos_1_fx; // q30
    7195    62931969 :     move32();
    7196    62931969 :     cos_az_fx[1] = L_shl( L_sub( cos_2_fx, ONE_IN_Q29 /*0.5 q30*/ ), 1 ); /*q30*/
    7197    62931969 :     move32();
    7198    62931969 :     cos_az_fx[2] = L_sub( L_shl( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), 2 ), cos_az_fx[0] /* cos_az_fx[0] q30*/ ); /*q30*/
    7199    62931969 :     move32();
    7200    62931969 :     sin_az_fx[0] = sin_1_fx; /*q30*/
    7201    62931969 :     move32();
    7202    62931969 :     sin_az_fx[1] = L_shl( Mpy_32_32( sin_1_fx, cos_1_fx ), 2 ); /*q30*/
    7203    62931969 :     move32();
    7204    62931969 :     sin_az_fx[2] = L_shl( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q28 /*1/4 q30*/ ) ), 3 ); /*q30*/
    7205    62931969 :     move32();
    7206             : 
    7207    62931969 :     response_fx[0] = 0x20000000;
    7208    62931969 :     move32();
    7209             : 
    7210   244383178 :     FOR( l = 1; l <= ambisonics_order; l++ )
    7211             :     {
    7212             :         Word16 a;
    7213   181451209 :         b_2 = imult1616( l, l );
    7214   181451209 :         b1_2 = add( b_2, shl( l, 1 ) );
    7215   418771138 :         FOR( m = 0; m < l; m += 2 )
    7216             :         {
    7217   237319929 :             b = b_2 + m;
    7218   237319929 :             a = dirac_gains_P_idx[b];
    7219             : 
    7220   237319929 :             c_fx_better = local_result_table[el][a]; // q30
    7221   237319929 :             move32();
    7222   237319929 :             response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out
    7223   237319929 :             move32();
    7224             : 
    7225   237319929 :             b1 = b1_2 - m;
    7226   237319929 :             response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out
    7227   237319929 :             move32();
    7228             :         }
    7229             : 
    7230   299970449 :         FOR( m = 1; m < l; m += 2 )
    7231             :         {
    7232   118519240 :             b = b_2 + m;
    7233   118519240 :             a = dirac_gains_P_idx[b];
    7234   118519240 :             c_fx_better = local_result_table[el][a]; // q30
    7235   118519240 :             move32();
    7236   118519240 :             c_fx_better = Mpy_32_32( c_fx_better, e_fac );                   // q30
    7237   118519240 :             response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out
    7238   118519240 :             move32();
    7239             : 
    7240   118519240 :             b1 = b1_2 - m;
    7241   118519240 :             response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out
    7242   118519240 :             move32();
    7243             :         }
    7244             : 
    7245   181451209 :         b = add( b_2, l );
    7246   181451209 :         a = dirac_gains_P_idx[b];
    7247   181451209 :         c_fx_better = local_result_table_2[el][a]; // q30
    7248   181451209 :         move32();
    7249   181451209 :         if ( s_and( l, 0x01 ) )
    7250             :         {
    7251   118800689 :             c_fx_better = Mpy_32_32( c_fx_better, e_fac ); // q30
    7252             :         }
    7253   181451209 :         response_fx[b] = L_shl( c_fx_better, -1 ); // Q_out
    7254   181451209 :         move32();
    7255             :     }
    7256    62931969 :     return;
    7257             : }
    7258             : #endif /*FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx*/
    7259             : /*-----------------------------------------------------------------------------------------*
    7260             :  * Function ivas_get_bits_to_encode
    7261             :  *
    7262             :  * Get number of bits required to encode the input value
    7263             :  *-----------------------------------------------------------------------------------------*/
    7264             : 
    7265      264366 : Word16 ivas_get_bits_to_encode(
    7266             :     Word32 val )
    7267             : {
    7268      264366 :     Word16 bits_req = 0;
    7269      264366 :     move16();
    7270             : 
    7271      264366 :     assert( val >= 0 );
    7272             : 
    7273      535504 :     WHILE( val )
    7274             :     {
    7275      271138 :         bits_req = add( bits_req, 1 );
    7276      271138 :         val = L_shr( val, 1 );
    7277             :     }
    7278             : 
    7279      264366 :     return bits_req;
    7280             : }
    7281             : 
    7282             : 
    7283             : /*-----------------------------------------------------------------------------------------*
    7284             :  * Function ivas_spar_set_bitrate_config()
    7285             :  *
    7286             :  * Set SPAR bitrate config
    7287             :  *-----------------------------------------------------------------------------------------*/
    7288             : 
    7289        5183 : void ivas_spar_set_bitrate_config_fx(
    7290             :     ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle  */
    7291             :     const Word16 table_idx,             /* i  : config. table index     */
    7292             :     const Word16 num_bands,             /* i  : number of bands         */
    7293             :     const Word16 dirac2spar_md_flag,
    7294             :     const Word16 enc_flag,
    7295             :     const Word16 pca_flag,
    7296             :     const Word16 agc_flag )
    7297             : {
    7298             :     Word32 ivas_total_brate;
    7299             :     Word16 i, total_bits, max_bits, code, length;
    7300             :     Word16 sba_order;
    7301             :     Word16 md_coding_bits_header;
    7302             :     Word16 agc_bits, pca_bits, num_PR_bits_dirac_bands;
    7303             :     Word16 bits_PR, bits_C, bits_P;
    7304             :     Word16 wc_coarse_strat;
    7305             :     Word16 n_input, n_dmx, n_dec;
    7306             :     Word16 quant_strat;
    7307             :     Word16 bands_bw;
    7308             : 
    7309        5183 :     pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
    7310        5183 :     move16();
    7311             : 
    7312       16958 :     FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ )
    7313             :     {
    7314       11775 :         pSpar_md_cfg->max_freq_per_chan[i] = ivas_spar_br_table_consts[table_idx].fpcs;
    7315       11775 :         move16();
    7316             :     }
    7317             : 
    7318        5183 :     pSpar_md_cfg->active_w = ivas_spar_br_table_consts[table_idx].active_w;
    7319        5183 :     move16();
    7320        5183 :     pSpar_md_cfg->agc_bits_ch_idx = ivas_spar_br_table_consts[table_idx].agc_bits_ch_idx;
    7321        5183 :     move16();
    7322             : 
    7323        5183 :     ivas_spar_get_uniform_quant_strat_fx( pSpar_md_cfg, table_idx );
    7324             : 
    7325        5183 :     pSpar_md_cfg->quant_strat_bits = ivas_get_bits_to_encode( MAX_QUANT_STRATS );
    7326        5183 :     move16();
    7327             : 
    7328             :     /* BLOCK: getEntropyCoderModels */
    7329             : 
    7330        5183 :     pSpar_md_cfg->remix_unmix_order = ivas_spar_br_table_consts[table_idx].dmx_str;
    7331        5183 :     move16();
    7332             : 
    7333             :     /* bits per block*/
    7334        5183 :     total_bits = 0;
    7335        5183 :     move16();
    7336        5183 :     max_bits = 0;
    7337        5183 :     move16();
    7338             : 
    7339        5183 :     ivas_total_brate = ivas_spar_br_table_consts[table_idx].ivas_total_brate;
    7340        5183 :     move32();
    7341        5183 :     sba_order = ivas_spar_br_table_consts[table_idx].sba_order;
    7342        5183 :     move16();
    7343        5183 :     ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, ivas_spar_br_table_consts[table_idx].bwidth, &length, &code );
    7344             :     Word16 temp;
    7345             :     Word16 div1;
    7346       16958 :     FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ )
    7347             :     {
    7348       11775 :         total_bits = add( total_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ONE_BY_FRAMES_PER_SEC_Q31 ) ) );
    7349       11775 :         max_bits = add( max_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][1], ONE_BY_FRAMES_PER_SEC_Q31 ) ) );
    7350             :     }
    7351             : 
    7352             :     /* (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) */
    7353        5183 :     div1 = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 /*1/FRAMES_PER_SEC Q31*/ ) ); /*31-31=>0*/
    7354        5183 :     pSpar_md_cfg->tgt_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), total_bits ) );
    7355        5183 :     pSpar_md_cfg->max_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), max_bits ) );
    7356        5183 :     move16();
    7357        5183 :     move16();
    7358             : 
    7359        5183 :     md_coding_bits_header = add( SPAR_NUM_CODING_STRAT_BITS, pSpar_md_cfg->quant_strat_bits );
    7360             : 
    7361        5183 :     pSpar_md_cfg->tgt_bits_per_blk = sub( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header );
    7362        5183 :     pSpar_md_cfg->max_bits_per_blk = sub( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header );
    7363        5183 :     move16();
    7364        5183 :     move16();
    7365             : 
    7366        5183 :     IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
    7367             :     {
    7368        1029 :         bands_bw = 2;
    7369        1029 :         move16();
    7370             :     }
    7371             :     ELSE
    7372             :     {
    7373        4154 :         bands_bw = 1;
    7374        4154 :         move16();
    7375             :     }
    7376             : 
    7377        5183 :     pSpar_md_cfg->tgt_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->tgt_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); /*Q0*/
    7378        5183 :     pSpar_md_cfg->max_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->max_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); /*Q0*/
    7379             : 
    7380        5183 :     pSpar_md_cfg->tgt_bits_per_blk = add( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header );
    7381        5183 :     pSpar_md_cfg->max_bits_per_blk = add( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header );
    7382        5183 :     move16();
    7383        5183 :     move16();
    7384        5183 :     move16();
    7385        5183 :     move16();
    7386             : 
    7387        5183 :     IF( enc_flag )
    7388             :     {
    7389             :         /*calculate the actual worst case bits*/
    7390        3419 :         IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) )
    7391             :         {
    7392         672 :             quant_strat = QUANT_STRAT_0;
    7393         672 :             move16();
    7394             :         }
    7395             :         ELSE
    7396             :         {
    7397        2747 :             quant_strat = QUANT_STRAT_2;
    7398        2747 :             move16();
    7399             :         }
    7400             : 
    7401        3419 :         IF( EQ_16( dirac2spar_md_flag, 1 ) )
    7402             :         {
    7403        3229 :             num_PR_bits_dirac_bands = sub( num_bands, SPAR_DIRAC_SPLIT_START_BAND );
    7404        3229 :             move16();
    7405             :         }
    7406             :         ELSE
    7407             :         {
    7408         190 :             num_PR_bits_dirac_bands = 0;
    7409         190 :             move16();
    7410             :         }
    7411        3419 :         div1 = BASOP_Util_Divide3232_Scale( num_PR_bits_dirac_bands, bands_bw, &temp ); /*15-temp*/
    7412        3419 :         num_PR_bits_dirac_bands = shr( div1, sub( 15, temp ) );                         /*q0*/
    7413        3419 :         num_PR_bits_dirac_bands = s_max( 0, num_PR_bits_dirac_bands );
    7414        3419 :         num_PR_bits_dirac_bands = i_mult( num_PR_bits_dirac_bands, DIRAC_TO_SPAR_HBR_PRED_CHS );
    7415             : 
    7416        3419 :         n_input = ivas_sba_get_nchan_metadata_fx( sba_order, ivas_total_brate );
    7417        3419 :         n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport;
    7418        3419 :         move16();
    7419        3419 :         n_dec = sub( n_input, n_dmx );
    7420        3419 :         bits_PR = ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][0];
    7421        3419 :         move16();
    7422        3419 :         num_PR_bits_dirac_bands = i_mult( num_PR_bits_dirac_bands, bits_PR );
    7423        3419 :         bits_PR = i_mult( bits_PR, sub( n_input, 1 ) );
    7424        3419 :         bits_C = i_mult( ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][1], i_mult( sub( n_dmx, 1 ), n_dec ) );
    7425        3419 :         bits_P = i_mult( ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][2], n_dec );
    7426             : 
    7427        3419 :         wc_coarse_strat = add( add( bits_PR, bits_C ), bits_P );
    7428        3419 :         wc_coarse_strat = i_mult( wc_coarse_strat, num_bands );
    7429        3419 :         div1 = BASOP_Util_Divide3232_Scale( wc_coarse_strat, bands_bw, &temp ); // q=15-temp
    7430        3419 :         wc_coarse_strat = shr( div1, sub( 15, temp ) );                         // q0
    7431        3419 :         wc_coarse_strat = sub( wc_coarse_strat, num_PR_bits_dirac_bands );
    7432        3419 :         wc_coarse_strat = add( wc_coarse_strat, md_coding_bits_header );
    7433             : 
    7434        3419 :         if ( LT_16( pSpar_md_cfg->max_bits_per_blk, wc_coarse_strat ) )
    7435             :         {
    7436           0 :             assert( 0 );
    7437             :         }
    7438             : 
    7439        3419 :         IF( agc_flag )
    7440             :         {
    7441        1217 :             IF( EQ_16( pSpar_md_cfg->nchan_transport, 1 ) )
    7442             :             {
    7443        1217 :                 agc_bits = AGC_BITS_PER_CH;
    7444        1217 :                 move16();
    7445             :             }
    7446             :             ELSE
    7447             :             {
    7448           0 :                 agc_bits = add( i_mult( AGC_BITS_PER_CH, pSpar_md_cfg->nchan_transport ), AGC_SIGNALLING_BITS );
    7449             :             }
    7450             :         }
    7451             :         ELSE
    7452             :         {
    7453        2202 :             agc_bits = AGC_SIGNALLING_BITS;
    7454        2202 :             move16();
    7455             :         }
    7456             : 
    7457        3419 :         test();
    7458        3419 :         IF( EQ_32( ivas_total_brate, PCA_BRATE ) && EQ_32( sba_order, SBA_FOA_ORDER ) )
    7459             :         {
    7460          66 :             pca_bits = 1;
    7461          66 :             move16();
    7462          66 :             IF( pca_flag )
    7463             :             {
    7464           8 :                 pca_bits = add( pca_bits, sub( add( IVAS_PCA_QBITS, IVAS_PCA_QBITS ), 1 ) );
    7465             :             }
    7466             :         }
    7467             :         ELSE
    7468             :         {
    7469        3353 :             pca_bits = 0;
    7470        3353 :             move16();
    7471             :         }
    7472             : 
    7473        3419 :         pSpar_md_cfg->max_md_bits_spar = add( add( pSpar_md_cfg->max_bits_per_blk, agc_bits ), pca_bits );
    7474        3419 :         move16();
    7475             :     }
    7476             : 
    7477        5183 :     return;
    7478             : }
    7479             : /*-----------------------------------------------------------------------------------------*
    7480             :  * Function ivas_spar_bitrate_dist()
    7481             :  *
    7482             :  * Set SPAR bitrate distribution
    7483             :  *-----------------------------------------------------------------------------------------*/
    7484             : 
    7485       24650 : void ivas_spar_bitrate_dist_fx(
    7486             :     Word32 core_brates_act[],      /* o  : bitrates per core-coder     */
    7487             :     const Word16 nAvailBits,       /* i  : number of available bits    */
    7488             :     const Word32 ivas_total_brate, /* i  : IVAS total bitrate          */
    7489             :     const Word16 sba_order,        /* i  : Ambisonic (SBA) order       */
    7490             :     const Word16 bwidth            /* i  : audio bandwidth             */
    7491             : )
    7492             : {
    7493             :     Word16 i, nchan_transport, table_idx, bitlen;
    7494             :     Word16 core_bits_act[FOA_CHANNELS], core_range_bits[FOA_CHANNELS];
    7495             :     Word16 sum_core_act_bits, residual_bits, overflow_bits;
    7496             : 
    7497       24650 :     table_idx = ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, bwidth, &bitlen, NULL );
    7498             : 
    7499       24650 :     nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
    7500       24650 :     move16();
    7501             : 
    7502       24650 :     sum_core_act_bits = 0;
    7503       24650 :     move16();
    7504      123250 :     FOR( i = 0; i < nchan_transport; i++ )
    7505             :     {
    7506       98600 :         core_bits_act[i] = extract_l( Mpy_32_16_1( ivas_spar_br_table_consts[table_idx].core_brs[i][0], INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
    7507       98600 :         move16();
    7508             : 
    7509       98600 :         sum_core_act_bits = add( sum_core_act_bits, core_bits_act[i] );
    7510             :     }
    7511             : 
    7512       24650 :     residual_bits = sub( nAvailBits, sum_core_act_bits );
    7513             : 
    7514             :     /* First compute core-coder bits as per bitrate distribution table and MD bitrate*/
    7515       24650 :     IF( residual_bits > 0 )
    7516             :     {
    7517        2200 :         FOR( i = 0; i < nchan_transport; i++ )
    7518             :         {
    7519        2200 :             core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][2], ivas_spar_br_table_consts[table_idx].core_brs[i][0] ), INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
    7520        2200 :             move16();
    7521        2200 :             core_bits_act[i] = add( core_bits_act[i], s_min( residual_bits, core_range_bits[i] ) );
    7522        2200 :             move16();
    7523        2200 :             residual_bits = sub( residual_bits, core_range_bits[i] );
    7524             : 
    7525        2200 :             if ( residual_bits <= 0 )
    7526             :             {
    7527        1835 :                 BREAK;
    7528             :             }
    7529             :         }
    7530             :     }
    7531             :     ELSE
    7532             :     {
    7533      114075 :         FOR( i = 0; i < nchan_transport; i++ )
    7534             :         {
    7535       91260 :             core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ivas_spar_br_table_consts[table_idx].core_brs[i][1] ), INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
    7536       91260 :             move16();
    7537             :         }
    7538             : 
    7539       22815 :         overflow_bits = negate( residual_bits );
    7540             : 
    7541      108718 :         FOR( i = 0; i < nchan_transport; i++ )
    7542             :         {
    7543       87969 :             core_bits_act[nchan_transport - 1 - i] = sub( core_bits_act[nchan_transport - 1 - i], s_min( overflow_bits, core_range_bits[nchan_transport - 1 - i] ) );
    7544       87969 :             move16();
    7545       87969 :             overflow_bits = sub( overflow_bits, core_range_bits[nchan_transport - 1 - i] );
    7546             : 
    7547       87969 :             if ( overflow_bits <= 0 )
    7548             :             {
    7549        2066 :                 BREAK;
    7550             :             }
    7551             :         }
    7552             : 
    7553       22815 :         IF( overflow_bits > 0 )
    7554             :         {
    7555             :             Word16 overflow_bits_ch;
    7556       20749 :             overflow_bits_ch = idiv1616( overflow_bits, nchan_transport );
    7557             : 
    7558      103745 :             FOR( i = 0; i < nchan_transport; i++ )
    7559             :             {
    7560       82996 :                 core_bits_act[i] = sub( core_bits_act[i], overflow_bits_ch );
    7561       82996 :                 move16();
    7562       82996 :                 overflow_bits = sub( overflow_bits, overflow_bits_ch );
    7563             :             }
    7564             : 
    7565       20749 :             core_bits_act[nchan_transport - 1] = sub( core_bits_act[nchan_transport - 1], s_max( 0, overflow_bits ) );
    7566       20749 :             move16();
    7567             :         }
    7568             :     }
    7569             : 
    7570      123250 :     FOR( i = 0; i < nchan_transport; i++ )
    7571             :     {
    7572       98600 :         core_brates_act[i] = L_mult0( core_bits_act[i], FRAMES_PER_SEC );
    7573       98600 :         move32();
    7574             :     }
    7575             : 
    7576       24650 :     return;
    7577             : }

Generated by: LCOV version 1.14