LCOV - code coverage report
Current view: top level - lib_enc - ivas_stereo_dft_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 2431 2499 97.3 %
Date: 2025-05-03 01:55:50 Functions: 24 24 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.q_inp
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "rom_enc.h"
      39             : #include "rom_com.h"
      40             : #include "prot_fx.h"
      41             : #include "ivas_prot_fx.h"
      42             : #include "ivas_cnst.h"
      43             : #include "ivas_rom_com.h"
      44             : #include "ivas_rom_com_fx.h"
      45             : #include "ivas_rom_enc.h"
      46             : #include "wmc_auto.h"
      47             : 
      48             : 
      49             : /*-------------------------------------------------------------------*
      50             :  * Local constants
      51             :  *-------------------------------------------------------------------*/
      52             : 
      53             : #define STEREO_DFT_NRG_PAST_MAX_BAND    9
      54             : #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4
      55             : #define STEREO_DFT_DMX_CROSSOVER        ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */
      56             : #define ITD_VAD_E_BAND_N_INIT           200000
      57             : #define ITD_SID_PREV_FRAMES             5
      58             : 
      59             : 
      60             : /*-------------------------------------------------------------------------
      61             :  * Local function prototypes
      62             :  *------------------------------------------------------------------------*/
      63             : 
      64             : static void stereo_dft_enc_open_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const Word32 input_Fs, const Word16 max_bwidth );
      65             : 
      66             : static void stereo_dft_enc_compute_prm_fx(
      67             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
      68             :     Word32 *DFT_L_fx, // Q(31-DFT_L_fx_e[])
      69             :     Word16 *DFT_L_fx_e,
      70             :     Word32 *DFT_R_fx, // Q(31-DFT_R_fx_e[])
      71             :     Word16 *DFT_R_fx_e,
      72             :     Word16 k_offset,
      73             :     Word16 flag_quant,
      74             :     const Word16 sp_aud_decision0,
      75             :     const Word16 vad_flag,
      76             :     Word32 *bin_nrgL_fx, // Q(31-bin_nrgL_fx_e[])
      77             :     Word16 *bin_nrgL_fx_e,
      78             :     Word32 *bin_nrgR_fx, // Q(31-bin_nrgR_fx_e[])
      79             :     Word16 *bin_nrgR_fx_e,
      80             :     Word32 *dot_prod_nrg_ratio_fx, // Q(31-dot_prod_nrg_ratio_fx_e[])
      81             :     Word16 *dot_prod_nrg_ratio_fx_e );
      82             : 
      83             : static Word32 stereo_dft_calc_mean_bipd_fx( Word32 *pIpd, Word32 ipd_buf[STEREO_DFT_IPD_BUF_LEN] );
      84             : 
      85             : static Word32 stereo_dft_calc_mean_ipd_change_fx(
      86             :     Word32 *pIpd,        /* i  : bandwise IPDs                  Q13  */
      87             :     Word32 *ipd_smooth,  /* i  : mean of previous bandwise IPDs Q13 */
      88             :     Word16 gipd_band_max /* i  : number of IPD bands             */
      89             : );
      90             : 
      91             : static void stereo_dft_gipd_stabilization_fx(
      92             :     Word32 *pgIpd,         /* i/o: global IPD to be stabilized    Q13 */
      93             :     Word32 prev_gipd,      /* i  : previous global IPD            Q13 */
      94             :     Word32 ipd_mean_change /* i  : mean of previous bandwise IPDs Q13 */
      95             : );
      96             : 
      97             : static void stereo_dft_enc_get_nipd_flag_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const Word16 sp_aud_decision0, const Word32 gainIPD );
      98             : 
      99             : static void stereo_dft_enc_get_reverb_flag_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, Word32 *pPredGain, Word32 *sub_nrg_DMX, Word16 *sub_nrg_DMX_e, const Word32 *sub_nrg_L, const Word16 *sub_nrg_L_e, const Word32 *sub_nrg_R, const Word16 *sub_nrg_R_e, const Word16 k_offset, const Word32 *bin_nrgL, const Word16 *bin_nrgL_e, const Word32 *bin_nrgR, const Word16 *bin_nrgR_e );
     100             : 
     101             : static Word32 stereo_dft_gain_offset_fx( const Word32 c, const Word16 c_e, const Word16 itd );
     102             : 
     103             : static void side_gain_mode_decision_fx(
     104             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
     105             :     Word16 encoded_ind_GR[],
     106             :     const Word16 sp_aud_decision0, /* i  : Speech/audio decision 0     */
     107             :     const Word32 last_core_brate   /* i  : Last core bitrate           */
     108             : );
     109             : 
     110             : static void res_pred_gain_mode_decision_fx(
     111             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
     112             :     Word16 encoded_ind_pred_GR[],
     113             :     const Word16 k_offset,       /* i  : Parameter offset            */
     114             :     const Word32 last_core_brate /* i  : Last core bitrate           */
     115             : );
     116             : 
     117             : static void stereo_dft_enc_calculate_nrg_for_icbwe_fx(
     118             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle   */
     119             :     const Word16 *DFT_L_e,
     120             :     const Word16 *DFT_R_e,
     121             :     const Word32 *DMX,    /* i  : DFT Stereo downmix Q(31-DMX_e[]) */
     122             :     const Word16 *DMX_e,  /* i  : DFT Stereo downmix          */
     123             :     const Word32 input_Fs /* i  : input sampling rate         */
     124             : );
     125             : 
     126             : static void stereo_dft_enc_get_res_cod_mode_flag_fx(
     127             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
     128             :     const Word32 res_nrg_all_curr,
     129             :     const Word16 res_nrg_all_curr_e,
     130             :     const Word32 dmx_nrg_all_curr,
     131             :     const Word16 dmx_nrg_all_curr_e,
     132             :     Word32 *res_dmx_ratio,     // Q31
     133             :     Word32 *frame_nrg_ratio ); // Q28
     134             : 
     135             : /*-------------------------------------------------------------------------
     136             :  * stereo_dft_quantize_res_gains()
     137             :  *
     138             :  * Joint quantization routine for residual gains
     139             :  *------------------------------------------------------------------------*/
     140      556644 : void stereo_dft_quantize_res_gains_fx(
     141             :     const Word32 *g, // Q31
     142             :     const Word32 *r, // Q31
     143             :     Word32 *gq,      // Q31
     144             :     Word32 *rq,      // Q31
     145             :     Word16 *ig,
     146             :     Word16 *ir )
     147             : {
     148             :     Word8 sign;
     149             :     Word16 min_ind, i;
     150             :     Word32 min_val, old_val, gg, rr;
     151             :     Word16 level, index;
     152             :     Word32 ild; // Q25
     153             :     Word32 L_tmp;
     154             :     Word16 L_tmp_e;
     155             : 
     156      556644 :     gg = *g;
     157      556644 :     move32();
     158             : 
     159      556644 :     IF( rq != NULL )
     160             :     {
     161      547822 :         rr = *r;
     162      547822 :         move32();
     163             :     }
     164             :     ELSE
     165             :     {
     166        8822 :         rr = 0;
     167        8822 :         move32();
     168             :     }
     169             : 
     170      556644 :     IF( gg < 0 )
     171             :     {
     172      352477 :         gg = L_negate( gg );
     173      352477 :         sign = -1;
     174      352477 :         move16();
     175             :     }
     176             :     ELSE
     177             :     {
     178      204167 :         sign = 1;
     179      204167 :         move16();
     180             :     }
     181             : 
     182             : 
     183             :     // gg = min(gg, 1 - EPSILON);
     184             :     // rr = min(rr, sqrtf(1 - gg * gg) - EPSILON);
     185      556644 :     L_tmp = L_sub( MAX_32, Mpy_32_32( gg, gg ) );
     186      556644 :     L_tmp_e = 0;
     187      556644 :     move16();
     188      556644 :     L_tmp = Sqrt32( L_tmp, &L_tmp_e );
     189      556644 :     L_tmp = L_shl( L_tmp, L_tmp_e ); // Q31
     190      556644 :     rr = L_min( rr, L_tmp );
     191             : 
     192             :     /* we calculate the ILD ... */
     193             :     // ild = 10.f * log10f(((1 + gg) * (1 + gg) + rr * rr) / ((1 - gg) * (1 - gg) + rr * rr));
     194      556644 :     ild = L_add( Mpy_32_32( L_add( ONE_IN_Q30, L_shr( gg, 1 ) ), L_add( ONE_IN_Q30, L_shr( gg, 1 ) ) ), L_shr_r( Mpy_32_32( rr, rr ), 2 ) ); // Q29
     195      556644 :     ild = BASOP_Util_Log10( ild, 2 );                                                                                                        // Q25
     196      556644 :     L_tmp = L_add( L_shr( Mpy_32_32( L_sub( MAX_32, gg ), L_sub( MAX_32, gg ) ), 1 ), L_shr( Mpy_32_32( rr, rr ), 1 ) );                     // Q30
     197      556644 :     L_tmp = BASOP_Util_Log10( L_tmp, 1 );                                                                                                    // Q25
     198      556644 :     ild = L_sub( ild, L_tmp );
     199      556644 :     ild = W_extract_h( W_shl( W_mult0_32_32( 10, ild ), 32 ) );
     200             : 
     201             :     /* ... which is truncated to the range [0,50] ... */
     202             :     // ild = ild > 50 ? 50 : ild;
     203      556644 :     ild = L_min( 1677721600 /*50*/, ild );
     204             : 
     205             :     /* ... and determine the optimal ILD quantization ...*/
     206      556644 :     min_ind = 0;
     207      556644 :     move16();
     208             :     // old_val = fabsf(ild_q[0] - ild);
     209      556644 :     old_val = L_abs( L_sub( ild_q_Q25[0], ild ) );
     210             : 
     211     1595935 :     FOR( i = 1; i < 16; i++ )
     212             :     {
     213             :         // min_val = fabsf(ild_q[i] - ild);
     214     1594475 :         min_val = L_abs( L_sub( ild_q_Q25[i], ild ) );
     215     1594475 :         IF( LT_32( min_val, old_val ) )
     216             :         {
     217     1039291 :             min_ind = i;
     218     1039291 :             move16();
     219             :         }
     220             :         ELSE
     221             :         {
     222      555184 :             BREAK;
     223             :         }
     224     1039291 :         old_val = min_val;
     225     1039291 :         move32();
     226             :     }
     227             : 
     228             :     /* ... which determines the quantization level: */
     229      556644 :     level = min_ind;
     230      556644 :     move16();
     231             : 
     232             :     /* Now we look for the closest quantization point in the corresponding column of res_gain_energy_q*/
     233             :     // old_val = FLT_MAX;
     234      556644 :     old_val = MAX_32;
     235      556644 :     move32();
     236      556644 :     min_ind = 0;
     237      556644 :     move16();
     238      556644 :     index = -1;
     239      556644 :     move16();
     240     5009796 :     FOR( i = 0; i < 8; i++ )
     241             :     {
     242             :         // min_val = (gg - dft_res_gains_q[8 * level + i][0]) * (gg - dft_res_gains_q[8 * level + i][0]) + (rr - dft_res_gains_q[8 * level + i][1]) * (rr - dft_res_gains_q[8 * level + i][1]);
     243     4453152 :         min_val = L_add_sat( Mpy_32_32( L_sub( gg, dft_res_gains_q_fx[8 * level + i][0] ), L_sub( gg, dft_res_gains_q_fx[8 * level + i][0] ) ), Mpy_32_32( L_sub( rr, dft_res_gains_q_fx[8 * level + i][1] ), L_sub( rr, dft_res_gains_q_fx[8 * level + i][1] ) ) ); // saturation is expected
     244             : 
     245             :         // min_ind = min_val < old_val ? i : min_ind;
     246             :         // old_val = min_val < old_val ? min_val : old_val;
     247     4453152 :         IF( LT_32( min_val, old_val ) )
     248             :         {
     249     1981487 :             min_ind = i;
     250     1981487 :             move16();
     251     1981487 :             old_val = min_val;
     252     1981487 :             move32();
     253             :         }
     254             : 
     255     4453152 :         index = min_ind;
     256     4453152 :         move16();
     257             :     }
     258             : 
     259             :     /* and here we are: */
     260      556644 :     IF( rq != NULL )
     261             :     {
     262             :         //*gq = dft_res_gains_q[8 * level + index][0] * sign;
     263      547822 :         *gq = W_extract_l( W_mult0_32_32( dft_res_gains_q_fx[8 * level + index][0], sign ) );
     264      547822 :         move32();
     265             :         //*rq = dft_res_gains_q[8 * level + index][1];
     266      547822 :         *rq = dft_res_gains_q_fx[8 * level + index][1];
     267      547822 :         move32();
     268             : 
     269      547822 :         *ir = index;
     270      547822 :         move16();
     271             :     }
     272             :     //*ig = sign < 0 ? 15 - level : 15 + level;
     273      556644 :     IF( sign < 0 )
     274             :     {
     275      352477 :         *ig = sub( 15, level );
     276      352477 :         move16();
     277             :     }
     278             :     ELSE
     279             :     {
     280      204167 :         *ig = add( 15, level );
     281      204167 :         move16();
     282             :     }
     283             : 
     284      556644 :     return;
     285             : }
     286             : 
     287             : 
     288             : /*-------------------------------------------------------------------------
     289             :  * stereo_dft_quantize_ipd()
     290             :  *
     291             :  * Quantize the IPD between [-PI, PI] on 3 or 4 bits
     292             :  *------------------------------------------------------------------------*/
     293        6560 : static void stereo_dft_quantize_ipd_fx(
     294             :     const Word32 *in, // Q13
     295             :     Word32 *out,      // Q13
     296             :     Word16 *ind,
     297             :     const Word16 bits )
     298             : {
     299             :     Word16 max_ind;
     300             :     Word32 delta;
     301             :     Word16 tmp, tmp_e;
     302             : 
     303        6560 :     IF( EQ_16( bits, 2 ) ) /* New 2-bit phase quantization for the highest frequency band only */
     304             :     {
     305         297 :         delta = EVS_PI_FX / 2;
     306         297 :         move16();
     307         297 :         max_ind = 3;
     308         297 :         move16();
     309             :     }
     310        6263 :     ELSE IF( EQ_16( bits, 3 ) )
     311             :     {
     312           0 :         delta = EVS_PI_FX / 4;
     313           0 :         move16();
     314           0 :         max_ind = 7;
     315           0 :         move16();
     316             :     }
     317        6263 :     ELSE IF( EQ_16( bits, 4 ) )
     318             :     {
     319        6263 :         delta = EVS_PI_FX / 8;
     320        6263 :         move16();
     321        6263 :         max_ind = 15;
     322        6263 :         move16();
     323             :     }
     324             :     ELSE
     325             :     {
     326           0 :         delta = EVS_PI_FX / 4;
     327           0 :         move16();
     328           0 :         max_ind = 7;
     329           0 :         move16();
     330           0 :         assert( 0 );
     331             :     }
     332             : 
     333             :     //*ind = (int16_t)(((*in + EVS_PI) / delta) + 0.5f);
     334        6560 :     tmp = BASOP_Util_Divide3232_Scale( L_add( *in, EVS_PI_FX ), delta, &tmp_e );
     335        6560 :     *ind = shr_r( tmp, sub( 15, tmp_e ) ); // Q0
     336        6560 :     move16();
     337             : 
     338             :     /*modulo 2*PI*/
     339        6560 :     if ( EQ_16( *ind, add( max_ind, 1 ) ) )
     340             :     {
     341         105 :         *ind = 0;
     342         105 :         move16();
     343             :     }
     344             : 
     345             :     /*Sanity check since no saturation can normally happen*/
     346        6560 :     *ind = s_min( s_max( *ind, 0 ), max_ind );
     347        6560 :     move16();
     348             : 
     349        6560 :     *out = L_sub( L_mult0( *ind, extract_l( delta ) ), EVS_PI_FX ); // Q13
     350        6560 :     move32();
     351             : 
     352        6560 :     return;
     353             : }
     354             : 
     355             : /*-------------------------------------------------------------------------
     356             :  * stereo_dft_enc_create()
     357             :  *
     358             :  * Create DFT stereo handle
     359             :  *------------------------------------------------------------------------*/
     360             : 
     361         881 : ivas_error stereo_dft_enc_create_fx(
     362             :     STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* i/o: encoder DFT stereo handle   */
     363             :     const Word32 input_Fs,                  /* i  : input sampling rate         */
     364             :     const Word16 max_bwidth                 /* i  : maximum encoded bandwidth   */
     365             : )
     366             : {
     367             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft_loc;
     368             :     Word16 tmpS;
     369             : 
     370         881 :     IF( *hStereoDft != NULL )
     371             :     {
     372           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
     373             :     }
     374             : 
     375         881 :     IF( ( hStereoDft_loc = (STEREO_DFT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_ENC_DATA ) ) ) == NULL )
     376             :     {
     377           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
     378             :     }
     379             : 
     380         881 :     IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
     381             :     {
     382           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
     383             :     }
     384             : 
     385         881 :     IF( ( hStereoDft_loc->hItd = (ITD_DATA_HANDLE) malloc( sizeof( ITD_DATA ) ) ) == NULL )
     386             :     {
     387           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) );
     388             :     }
     389             : 
     390         881 :     hStereoDft_loc->hConfig->force_mono_transmission = 0;
     391         881 :     move16();
     392             : 
     393         881 :     stereo_dft_config_fx( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS );
     394             : 
     395         881 :     stereo_dft_enc_open_fx( hStereoDft_loc, input_Fs, max_bwidth );
     396             : 
     397         881 :     stereo_dft_hybrid_ITD_flag_fx( hStereoDft_loc->hConfig, input_Fs,
     398         881 :                                    hStereoDft_loc->hItd->hybrid_itd_max );
     399             : 
     400         881 :     *hStereoDft = hStereoDft_loc;
     401             : 
     402         881 :     return IVAS_ERR_OK;
     403             : }
     404             : 
     405             : 
     406             : /*-------------------------------------------------------------------------
     407             :  * stereo_dft_enc_open()
     408             :  *
     409             :  * Initialize DFT stereo handle
     410             :  *------------------------------------------------------------------------*/
     411             : 
     412         881 : static void stereo_dft_enc_open_fx(
     413             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle   */
     414             :     const Word32 input_Fs,                 /* i  : input sampling rate         */
     415             :     const Word16 max_bwidth                /* i  : maximum encoded bandwidth   */
     416             : )
     417             : {
     418             :     Word16 NFFT_inner;
     419             :     PWord16 win_p[STEREO_DFT_OVL_MAX];
     420             :     Word16 win[STEREO_DFT_OVL_MAX];
     421             :     Word32 L_tmp;
     422             :     Word16 tmp, tmp_e;
     423             : 
     424             :     /*Sizes*/
     425             : 
     426         881 :     hStereoDft->N = extract_l( Mpy_32_32( input_Fs, 42949673 /* STEREO_DFT_HOP_MAX_ENC / 48000 in Q31 */ ) );
     427         881 :     move16();
     428         881 :     assert( ( ( input_Fs / FRAMES_PER_SEC ) / hStereoDft->N ) == 1 );
     429             : 
     430             :     /*Init. DFT sizes*/
     431         881 :     hStereoDft->NFFT = extract_l( Mpy_32_32( input_Fs, 85899346 /* STEREO_DFT_N_MAX_ENC / 48000 in Q31 */ ) );
     432         881 :     move16();
     433         881 :     hStereoDft->dft_ovl = extract_l( Mpy_32_32( input_Fs, 18790482 /* STEREO_DFT_OVL_MAX / 48000 in Q31 */ ) );
     434         881 :     move16();
     435         881 :     mdct_window_sine_IVAS_updated( win_p, input_Fs, hStereoDft->dft_ovl, FULL_OVERLAP, IVAS_CPE_DFT ); // win_e = 15
     436      170841 :     FOR( Word16 i = 0; i < ( hStereoDft->dft_ovl / 2 ); i++ )
     437             :     {
     438      169960 :         win[hStereoDft->dft_ovl - 1 - i] = win_p[i].v.re;
     439      169960 :         move16();
     440      169960 :         win[i] = win_p[i].v.im;
     441      169960 :         move16();
     442             :     }
     443             : 
     444         881 :     L_tmp = L_shl( L_sub( hStereoDft->N, hStereoDft->dft_ovl ), Q15 );           /* Q15 */
     445         881 :     L_tmp = L_add( L_tmp, L_shl( sum16_32_fx( win, hStereoDft->dft_ovl ), 1 ) ); /* Q15 */
     446         881 :     tmp = BASOP_Util_Divide3232_Scale( L_tmp, hStereoDft->NFFT, &tmp_e );
     447         881 :     tmp_e = sub( tmp_e, 15 );
     448         881 :     hStereoDft->win_ana_energy_fx = shl( tmp, tmp_e ); /* Q15 */
     449         881 :     move16();
     450             : 
     451         881 :     set32_fx( hStereoDft->output_mem_dmx_32k_fx, 0, STEREO_DFT_OVL_32k );
     452             : 
     453         881 :     hStereoDft->dft_zp = extract_l( Mpy_32_32( input_Fs, 12079596 /* STEREO_DFT_ZP_MAX_ENC / 48000 in Q31 */ ) );
     454         881 :     move16();
     455             : 
     456         881 :     hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx;
     457         881 :     hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx;
     458         881 :     hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx;
     459         881 :     hStereoDft->dft_trigo_32k_fx = dft_trigo_32k_fx;
     460             : 
     461         881 :     hStereoDft->win_ana_8k_fx = win_ana_8k_fx;
     462         881 :     hStereoDft->win_ana_12k8_fx = win_ana_12k8_fx;
     463         881 :     hStereoDft->win_ana_16k_fx = win_ana_16k_fx;
     464         881 :     hStereoDft->win_ana_32k_fx = win_ana_32k_fx;
     465             : 
     466         881 :     hStereoDft->win_8k_fx = win_syn_8k_fx;
     467         881 :     hStereoDft->win_12k8_fx = win_syn_12k8_fx;
     468         881 :     hStereoDft->win_16k_fx = win_syn_16k_fx;
     469         881 :     hStereoDft->win_32k_fx = win_syn_32k_fx;
     470             : 
     471         881 :     IF( EQ_32( input_Fs, 16000 ) )
     472             :     {
     473          25 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;
     474          25 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
     475          25 :         move16();
     476          25 :         hStereoDft->win_ana_fx = win_ana_16k_fx;
     477          25 :         hStereoDft->win_fx = win_syn_16k_fx;
     478             :     }
     479         856 :     ELSE IF( EQ_32( input_Fs, 32000 ) )
     480             :     {
     481         165 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;
     482         165 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
     483         165 :         move16();
     484         165 :         hStereoDft->win_ana_fx = win_ana_32k_fx;
     485         165 :         hStereoDft->win_fx = win_syn_32k_fx;
     486             :     }
     487             :     ELSE
     488             :     {
     489         691 :         assert( EQ_32( input_Fs, 48000 ) );
     490         691 :         hStereoDft->dft_trigo_fx = dft_trigo_48k_fx;
     491         691 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP;
     492         691 :         move16();
     493         691 :         hStereoDft->win_ana_fx = win_ana_48k_fx;
     494         691 :         hStereoDft->win_fx = win_syn_48k_fx;
     495             :     }
     496             : 
     497         881 :     hStereoDft->win_mdct_8k_fx = win_mdct_8k_fx;
     498             : 
     499             :     /*I/O Buffers*/
     500         881 :     set_zero_fx( hStereoDft->output_mem_dmx_fx, STEREO_DFT_OVL_MAX );
     501         881 :     set_zero_fx( hStereoDft->output_mem_dmx_12k8_fx, STEREO_DFT_OVL_12k8 );
     502         881 :     set_zero_fx( hStereoDft->output_mem_dmx_16k_fx, STEREO_DFT_OVL_16k );
     503         881 :     set_zero_fx( hStereoDft->output_mem_dmx_16k_shb_fx, STEREO_DFT_OVL_16k );
     504         881 :     set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k );
     505             : 
     506             :     /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
     507             :     /* NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; */
     508         881 :     NFFT_inner = imult1616( inner_frame_tbl[max_bwidth], STEREO_DFT_N_MAX_ENC / L_FRAME48k );
     509         881 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
     510         881 :     hStereoDft->nbands_dmx = stereo_dft_band_config_fx( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
     511         881 :     move16();
     512         881 :     move16();
     513             : 
     514             :     /*Set configuration*/
     515         881 :     set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_ENC_DFT_NB );
     516         881 :     test();
     517         881 :     IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
     518             :     {
     519             :         /* residual coding is only applied for 16 kHz sampling rate */
     520           0 :         set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->ada_wb_res_cod_mode, STEREO_DFT_ENC_DFT_NB );
     521             :     }
     522             :     ELSE
     523             :     {
     524         881 :         set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_ENC_DFT_NB );
     525             :     }
     526         881 :     set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_ENC_DFT_NB );
     527             : 
     528             :     /* reset DFT stereo memories */
     529         881 :     stereo_dft_enc_reset_fx( hStereoDft );
     530             : 
     531         881 :     return;
     532             : }
     533             : 
     534             : 
     535             : /*-------------------------------------------------------------------------
     536             :  * stereo_dft_enc_reset()
     537             :  *
     538             :  * Reset DFT stereo memories
     539             :  *------------------------------------------------------------------------*/
     540             : 
     541        1663 : void stereo_dft_enc_reset_fx(
     542             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle   */
     543             : )
     544             : {
     545             :     Word16 i;
     546             :     /*reset parameters*/
     547        1663 :     set_zero_fx( hStereoDft->side_gain_fx, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
     548        1663 :     set16_fx( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX );
     549        1663 :     set16_fx( hStereoDft->side_gain_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
     550        1663 :     set16_fx( hStereoDft->side_gain_index_ECprevious, 15, STEREO_DFT_BAND_MAX );
     551        1663 :     hStereoDft->side_gain_counter = 0;
     552        1663 :     move16();
     553        1663 :     hStereoDft->side_gain_bitdiff_lp_fx = STEREO_DFT_BITDIFF_INIT_FX;
     554        1663 :     move16();
     555        1663 :     hStereoDft->q_side_gain_bitdiff_lp = Q10;
     556        1663 :     move16();
     557        1663 :     set_zero_fx( hStereoDft->gipd_fx, STEREO_DFT_ENC_DFT_NB );
     558        1663 :     set_zero_fx( hStereoDft->dot_prod_real_smooth_fx, STEREO_DFT_BAND_MAX );
     559        1663 :     set16_zero_fx( hStereoDft->dot_prod_real_smooth_fx_e, STEREO_DFT_BAND_MAX );
     560        1663 :     set_zero_fx( hStereoDft->dot_prod_img_smooth_fx, STEREO_DFT_BAND_MAX );
     561        1663 :     set16_zero_fx( hStereoDft->dot_prod_img_smooth_fx_e, STEREO_DFT_BAND_MAX );
     562       23282 :     FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
     563             :     {
     564       21619 :         set_zero_fx( hStereoDft->ipd_buf_fx[i], STEREO_DFT_IPD_BUF_LEN );
     565             :     }
     566        1663 :     hStereoDft->prev_gipd_fx = 0;
     567        1663 :     move32();
     568        1663 :     hStereoDft->gipd_index = 0;
     569        1663 :     move16();
     570        1663 :     set_zero_fx( hStereoDft->res_pred_gain_fx, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
     571        1663 :     set16_fx( hStereoDft->res_pred_index_EC, 0, STEREO_DFT_BAND_MAX );
     572        1663 :     set16_fx( hStereoDft->res_pred_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
     573        1663 :     set16_fx( hStereoDft->res_pred_index_ECprevious, 0, STEREO_DFT_BAND_MAX );
     574        1663 :     hStereoDft->res_pred_counter = 0;
     575        1663 :     move16();
     576        1663 :     set_zero_fx( hStereoDft->past_nrgL_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     577        1663 :     set16_zero_fx( hStereoDft->past_nrgL_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     578        1663 :     set_zero_fx( hStereoDft->past_nrgR_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     579        1663 :     set16_zero_fx( hStereoDft->past_nrgR_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     580        1663 :     set_zero_fx( hStereoDft->past_dot_prod_real_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     581        1663 :     set16_zero_fx( hStereoDft->past_dot_prod_real_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     582        1663 :     set_zero_fx( hStereoDft->past_dot_prod_imag_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     583        1663 :     set16_zero_fx( hStereoDft->past_dot_prod_imag_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     584             : 
     585        1663 :     hStereoDft->nrg_past_pos = 0;
     586        1663 :     move16();
     587             : 
     588        1663 :     hStereoDft->res_dmx_ratio_lt_fx = MAX_32;
     589        1663 :     move32();
     590        1663 :     hStereoDft->hangover_cnt0 = 0;
     591        1663 :     move16();
     592        1663 :     hStereoDft->hangover_cnt1 = 0;
     593        1663 :     move16();
     594        1663 :     hStereoDft->dmx_res_all_prev_fx = 1;
     595        1663 :     move32();
     596        1663 :     hStereoDft->dmx_res_all_prev_fx_e = 31;
     597        1663 :     move16();
     598        1663 :     hStereoDft->last_res_cod_mode_modify_flag = 0;
     599        1663 :     move16();
     600        1663 :     hStereoDft->res_cod_sw_flag = 0;
     601        1663 :     move16();
     602        1663 :     hStereoDft->switch_fade_factor_fx = ONE_IN_Q14; // Q15/2
     603        1663 :     move16();
     604        1663 :     hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] = STEREO_DFT_RES_COD_1kHz;
     605        1663 :     move16();
     606       23282 :     FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
     607             :     {
     608       21619 :         hStereoDft->res_cod_NRG_M_fx[i] = 0;
     609       21619 :         move32();
     610       21619 :         hStereoDft->res_cod_NRG_M_fx_e[i] = 0;
     611       21619 :         move16();
     612       21619 :         hStereoDft->res_cod_NRG_S_fx[i] = 0;
     613       21619 :         move32();
     614       21619 :         hStereoDft->res_cod_NRG_S_fx_e[i] = 0;
     615       21619 :         move16();
     616             :     }
     617        1663 :     hStereoDft->old_snr_fx = 0;
     618        1663 :     move32();
     619             : 
     620             : 
     621        1663 :     hStereoDft->reverb_flag = 0;
     622        1663 :     move16();
     623        1663 :     set_zero_fx( hStereoDft->pre_sub_nrg_DMX_fx, STEREO_DFT_BAND_MAX );
     624        1663 :     set16_zero_fx( hStereoDft->pre_sub_nrg_DMX_fx_e, STEREO_DFT_BAND_MAX );
     625        1663 :     hStereoDft->diff_l_h_sm_fx = 0;
     626        1663 :     move32();
     627        1663 :     hStereoDft->diff_l_h_sm_fx_e = 0;
     628        1663 :     move16();
     629        1663 :     hStereoDft->diff_r_h_sm_fx = 0;
     630        1663 :     move32();
     631        1663 :     hStereoDft->diff_r_h_sm_fx_e = 0;
     632        1663 :     move16();
     633        1663 :     hStereoDft->prev_fac2_fx = MAX_32;
     634        1663 :     move32();
     635             : 
     636        1663 :     set_zero_fx( hStereoDft->res_pred_gain_f_fx, STEREO_DFT_BAND_MAX );
     637             : 
     638             :     /*misc*/
     639        1663 :     hStereoDft->no_ipd_flag = 1; /* Initialization of the no IPD variables */
     640        1663 :     move16();
     641        1663 :     hStereoDft->prev_no_ipd_flag = 1;
     642        1663 :     move16();
     643        1663 :     hStereoDft->no_ipd_cnt = 0;
     644        1663 :     move16();
     645        1663 :     hStereoDft->no_ipd_cnt1 = 0;
     646        1663 :     move16();
     647        1663 :     hStereoDft->attackPresent = 0;
     648        1663 :     move16();
     649        1663 :     hStereoDft->wasTransient = 0;
     650        1663 :     move16();
     651        1663 :     hStereoDft->gainIPD_sm_fx = MAX_32;
     652        1663 :     move32();
     653             : 
     654             : 
     655        1663 :     hStereoDft->voicing_lt_fx = 0;
     656        1663 :     move32();
     657             : 
     658        1663 :     hStereoDft->flip_sign = 1;
     659        1663 :     move16();
     660             : 
     661        1663 :     hStereoDft->sfm_fx = 0;
     662        1663 :     move32();
     663        1663 :     hStereoDft->sum_dot_prod_real_fx = 0;
     664        1663 :     move32();
     665        1663 :     hStereoDft->sum_dot_prod_real_fx_e = 0;
     666        1663 :     move16();
     667        1663 :     hStereoDft->sum_dot_prod_img_fx = 0;
     668        1663 :     move32();
     669        1663 :     hStereoDft->sum_dot_prod_img_fx_e = 0;
     670        1663 :     move16();
     671             : 
     672             :     /*Coherence*/
     673        1663 :     set32_fx( hStereoDft->xspec_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC );
     674        1663 :     set16_fx( hStereoDft->xspec_smooth_fx_e, 0, STEREO_DFT_N_32k_ENC );
     675        1663 :     set32_fx( hStereoDft->Spd_L_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC / 2 );
     676        1663 :     hStereoDft->Spd_L_smooth_fx_e = 0;
     677        1663 :     move16();
     678        1663 :     set32_fx( hStereoDft->Spd_R_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC / 2 );
     679        1663 :     hStereoDft->Spd_R_smooth_fx_e = 0;
     680        1663 :     move16();
     681             : 
     682        1663 :     hStereoDft->currentNumUpdates = 0;
     683        1663 :     move16();
     684        1663 :     hStereoDft->expectedNumUpdates = FIXED_SID_RATE;
     685        1663 :     move16();
     686        1663 :     hStereoDft->resetFrames = 0;
     687        1663 :     move16();
     688        1663 :     hStereoDft->sid_gipd_fx = 0;
     689        1663 :     move32();
     690        1663 :     hStereoDft->prev_sid_gipd_fx = 0;
     691        1663 :     move32();
     692        1663 :     hStereoDft->prev_sid_no_ipd_flag = 1;
     693        1663 :     move16();
     694             : 
     695        1663 :     hStereoDft->coh_fade_counter = 0;
     696        1663 :     move16();
     697             : 
     698             :     /* Xtalk classifier */
     699        1663 :     hStereoDft->hItd->prev_m1_fx = 0;
     700        1663 :     move32();
     701        1663 :     hStereoDft->hItd->prev_m2_fx = 0;
     702        1663 :     move32();
     703        1663 :     hStereoDft->hItd->prev_itd1 = 0;
     704        1663 :     move16();
     705        1663 :     hStereoDft->hItd->prev_itd2 = 0;
     706        1663 :     move16();
     707             : 
     708        1663 :     hStereoDft->first_frm_flag = 1;
     709        1663 :     move16();
     710             : 
     711             : 
     712        1663 :     stereo_enc_itd_init_fx( hStereoDft->hItd );
     713             : 
     714        1663 :     return;
     715             : }
     716             : 
     717             : 
     718             : /*-------------------------------------------------------------------------
     719             :  * stereo_enc_itd_init()
     720             :  *
     721             :  * initialize ITD struct
     722             :  *------------------------------------------------------------------------*/
     723             : 
     724        1814 : void stereo_enc_itd_init_fx(
     725             :     ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle               */
     726             : )
     727             : {
     728        1814 :     hItd->prev_itd = 0;
     729        1814 :     move16();
     730        1814 :     set32_fx( hItd->itd_fx, 0, STEREO_DFT_ENC_DFT_NB );
     731        1814 :     set32_fx( hItd->deltaItd_fx, 0, STEREO_DFT_ENC_DFT_NB );
     732        1814 :     set16_fx( hItd->td_itd, 0, STEREO_DFT_ENC_DFT_NB );
     733        1814 :     set16_fx( hItd->td_itd_32k, 0, STEREO_DFT_ENC_DFT_NB );
     734        1814 :     set16_fx( hItd->itd_index, 0, STEREO_DFT_ENC_DFT_NB );
     735        1814 :     set32_fx( hItd->xcorr_smooth_fx, 0, STEREO_DFT_N_32k_ENC );
     736        1814 :     set16_fx( hItd->xcorr_smooth_fx_e, 0, STEREO_DFT_N_32k_ENC );
     737        1814 :     hItd->lp_phat_peak_fx = 0;
     738        1814 :     move32();
     739        1814 :     hItd->itd_hangover = 0;
     740        1814 :     move16();
     741        1814 :     hItd->itd_cnt = 0;
     742        1814 :     move16();
     743        1814 :     hItd->prev_sum_nrg_L_lb_fx = 0;
     744        1814 :     move32();
     745        1814 :     hItd->prev_sum_nrg_L_lb_fx_e = 0;
     746        1814 :     move16();
     747        1814 :     set32_fx( hItd->prev_xcorr_lb_fx, 0, STEREO_DFT_XCORR_LB_MAX );
     748        1814 :     hItd->prev_xcorr_lb_fx_e = 0;
     749        1814 :     move16();
     750        1814 :     set32_fx( hItd->E_band_n_fx, ITD_VAD_E_BAND_N_INIT, STEREO_DFT_ITD_VAD_BAND_NUM );
     751        1814 :     set16_fx( hItd->E_band_n_exp, Q31, STEREO_DFT_ITD_VAD_BAND_NUM );
     752        1814 :     hItd->vad_frm_cnt = 0;
     753        1814 :     move16();
     754        1814 :     hItd->pre_vad = 0;
     755        1814 :     move16();
     756        1814 :     hItd->itd_nonzero_cnt = 0;
     757        1814 :     move16();
     758        1814 :     set32_fx( hItd->acorr_L_fx, 0, STEREO_DFT_BAND_MAX );
     759        1814 :     hItd->acorr_L_fx_e = 0;
     760        1814 :     move16();
     761        1814 :     set32_fx( hItd->acorr_R_fx, 0, STEREO_DFT_BAND_MAX );
     762        1814 :     hItd->acorr_R_fx_e = 0;
     763        1814 :     move16();
     764        1814 :     hItd->cohSNR_fx = 983040; /*Q16*/
     765        1814 :     move32();
     766        1814 :     hItd->itd_thres_fx = 0;
     767        1814 :     move32();
     768        1814 :     hItd->valid_itd_cnt = 0;
     769        1814 :     move16();
     770        1814 :     hItd->detected_itd_flag = 0;
     771        1814 :     move16();
     772        1814 :     hItd->itd_tracking = 0;
     773        1814 :     move16();
     774        1814 :     hItd->prev_max_fx = 0;
     775        1814 :     move32();
     776        1814 :     hItd->prev_index = 0;
     777        1814 :     move16();
     778        1814 :     hItd->prev_avg_max_fx = 0;
     779        1814 :     move32();
     780        1814 :     hItd->prev_avg_max_fx_e = 0;
     781        1814 :     move16();
     782        1814 :     hItd->currFlatness_fx = 0;
     783        1814 :     move16();
     784             :     /* Xtalk classifier */
     785        1814 :     hItd->prev_m1_fx = 0;
     786        1814 :     move32();
     787        1814 :     hItd->prev_m2_fx = 0;
     788        1814 :     move32();
     789        1814 :     hItd->prev_itd1 = 0;
     790        1814 :     move16();
     791        1814 :     hItd->prev_itd2 = 0;
     792        1814 :     move16();
     793        1814 :     hItd->hybrid_itd_max = 0;
     794        1814 :     move16();
     795        1814 :     return;
     796             : }
     797             : 
     798             : 
     799             : /*--------------------------------------------------------------------------
     800             :  * stereo_dft_enc_update()
     801             :  *
     802             :  * Update DFT stereo memories for new frame
     803             :  *--------------------------------------------------------------------------*/
     804             : 
     805       59643 : void stereo_dft_enc_update_fx(
     806             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle     */
     807             :     const Word16 max_bwidth                /* i  : maximum encoded bandwidth */
     808             : )
     809             : {
     810             :     Word16 i, k_offset;
     811             :     Word16 NFFT_inner;
     812             : 
     813             :     /* Initialization */
     814       59643 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
     815       59643 :     move32();
     816             : 
     817             :     /* Update the parameters and serial */
     818      835002 :     FOR( i = 0; i < ( k_offset * STEREO_DFT_BAND_MAX ); i++ )
     819             :     {
     820      775359 :         hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_BAND_MAX + i];
     821      775359 :         move32();
     822      775359 :         hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_BAND_MAX + i];
     823      775359 :         move32();
     824             :     }
     825             : 
     826      119286 :     FOR( i = 0; i < k_offset; i++ )
     827             :     {
     828       59643 :         hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[i + 1];
     829       59643 :         move32();
     830             :     }
     831             : 
     832             :     /*Update configurations*/
     833      119286 :     FOR( i = 0; i < k_offset; i++ )
     834             :     {
     835       59643 :         hStereoDft->band_res[i] = hStereoDft->band_res[i + 1];
     836       59643 :         move16();
     837       59643 :         hStereoDft->hItd->itd_fx[i] = hStereoDft->hItd->itd_fx[i + 1];
     838       59643 :         move32();
     839       59643 :         hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + 1];
     840       59643 :         move16();
     841       59643 :         hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + 1];
     842       59643 :         move16();
     843             :     }
     844             : 
     845             :     /*Set new configurations*/
     846       59643 :     hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
     847       59643 :     move16();
     848             : 
     849       59643 :     IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
     850             :     {
     851        2796 :         hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->ada_wb_res_cod_mode;
     852        2796 :         move16();
     853             :     }
     854             :     ELSE
     855             :     {
     856       56847 :         hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->res_cod_mode;
     857       56847 :         move16();
     858             :     }
     859       59643 :     hStereoDft->res_pred_mode[k_offset] = hStereoDft->hConfig->res_pred_mode;
     860       59643 :     move16();
     861             : 
     862       59643 :     hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag;
     863       59643 :     move16();
     864       59643 :     hStereoDft->res_cod_sw_flag = 0;
     865       59643 :     move16();
     866             : 
     867             :     /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */
     868       59643 :     NFFT_inner = shl( inner_frame_tbl[max_bwidth], 1 ) /* * STEREO_DFT_N_MAX_ENC / L_FRAME48k*/;
     869             : 
     870       59643 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
     871       59643 :     move16();
     872       59643 :     hStereoDft->nbands_dmx = stereo_dft_band_config_fx( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
     873       59643 :     move16();
     874             : 
     875             :     /*Compute main parameters*/
     876       59643 :     hStereoDft->gipd_band_max = dft_band_ipd[1][3];
     877       59643 :     move16();
     878       59643 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
     879       59643 :     move16();
     880             :     // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) );
     881       59643 :     Word32 tmp = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), hStereoDft->N ), 1 );
     882             :     Word16 exp;
     883       59643 :     tmp = BASOP_Util_Divide3232_Scale_newton( tmp, hStereoDft->NFFT, &exp );
     884       59643 :     hStereoDft->res_cod_line_max = extract_l( L_shr( tmp, sub( 31, exp ) ) );
     885       59643 :     move16();
     886             :     // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8);
     887       59643 :     hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 );
     888       59643 :     move16();
     889       59643 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
     890       59643 :     move16();
     891             : 
     892             : 
     893       59643 :     return;
     894             : }
     895             : 
     896             : /*-------------------------------------------------------------------------
     897             :  * stereo_dft_enc_destroy()
     898             :  *
     899             :  * destroy DFT stereo handle
     900             :  *-------------------------------------------------------------------------*/
     901             : 
     902         881 : void stereo_dft_enc_destroy_fx(
     903             :     STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle     */
     904             : )
     905             : {
     906         881 :     IF( ( *hStereoDft )->hConfig != NULL )
     907             :     {
     908         881 :         free( ( *hStereoDft )->hConfig );
     909         881 :         ( *hStereoDft )->hConfig = NULL;
     910             :     }
     911             : 
     912         881 :     IF( ( *hStereoDft )->hItd != NULL )
     913             :     {
     914         881 :         free( ( *hStereoDft )->hItd );
     915         881 :         ( *hStereoDft )->hItd = NULL;
     916             :     }
     917             : 
     918         881 :     free( *hStereoDft );
     919         881 :     *hStereoDft = NULL;
     920             : 
     921         881 :     return;
     922             : }
     923             : 
     924             : 
     925             : /*-------------------------------------------------------------------------
     926             :  * stereo_dft_enc_analyze()
     927             :  *
     928             :  * DFT analysis on a 20ms frame
     929             :  *-------------------------------------------------------------------------*/
     930       74333 : void stereo_dft_enc_analyze_fx(
     931             :     Encoder_State **sts,                            /* i/o: encoder state structure     */
     932             :     const Word16 n_channels,                        /* i  : number of input channels    */
     933             :     const Word16 input_frame,                       /* i  : input frame length          */
     934             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,          /* i/o: encoder stereo handle       */
     935             :     STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,        /* i/o: encoder MDCT stereo handle  */
     936             :     Word32 DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o  : DFT buffers             Q(31-DFT_e)    */
     937             :     Word16 DFT_e[CPE_CHANNELS],                     /* o  : DFT buffers                 */
     938             :     Word16 *input_mem[CPE_CHANNELS],                /* i/o: input buffer memory Q(q_input_mem_        */
     939             :     Word16 *q_input_mem )
     940             : {
     941             :     Word16 i, n;
     942             :     Word32 *pDFT_L, *pDFT_R;
     943             :     Word16 N, NFFT;
     944             :     Word16 dft_zp, dft_ovl;
     945             :     const Word16 *pWin;
     946             :     const Word16 *pTrigo;
     947             :     Word16 offset;
     948             :     Word16 *input[CPE_CHANNELS], *mem[CPE_CHANNELS];
     949             :     Word16 trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1];
     950             :     Word16 trigo_step;
     951             : 
     952             : 
     953       74333 :     push_wmops( "DFT_analysis" );
     954             : 
     955             :     /*-----------------------------------------------------------------*
     956             :      * Initialization
     957             :      *-----------------------------------------------------------------*/
     958             : 
     959      222999 :     FOR( n = 0; n < n_channels; n++ )
     960             :     {
     961      148666 :         input[n] = sts[n]->input_fx;
     962      148666 :         mem[n] = input_mem[n];
     963             :     }
     964             : 
     965             : 
     966             :     /*-----------------------------------------------------------------*
     967             :      * DFT Analysis
     968             :      *-----------------------------------------------------------------*/
     969             : 
     970       74333 :     pDFT_L = DFT[0];
     971       74333 :     pDFT_R = DFT[1];
     972             : 
     973       74333 :     IF( hStereoDft != NULL )
     974             :     {
     975       59643 :         N = hStereoDft->N;
     976       59643 :         move16();
     977       59643 :         NFFT = hStereoDft->NFFT;
     978       59643 :         move16();
     979       59643 :         dft_zp = hStereoDft->dft_zp;
     980       59643 :         move16();
     981       59643 :         dft_ovl = hStereoDft->dft_ovl;
     982       59643 :         move16();
     983       59643 :         offset = negate( dft_ovl );
     984       59643 :         pWin = hStereoDft->win_ana_fx;
     985       59643 :         pTrigo = hStereoDft->dft_trigo_fx;
     986       59643 :         trigo_step = hStereoDft->dft_trigo_step;
     987       59643 :         move16();
     988             :     }
     989             :     ELSE
     990             :     {
     991       14690 :         N = hStereoMdct->hDft_ana->N;
     992       14690 :         move16();
     993       14690 :         NFFT = hStereoMdct->hDft_ana->NFFT;
     994       14690 :         move16();
     995       14690 :         dft_zp = hStereoMdct->hDft_ana->dft_zp;
     996       14690 :         move16();
     997       14690 :         dft_ovl = hStereoMdct->hDft_ana->dft_ovl;
     998       14690 :         move16();
     999       14690 :         offset = negate( dft_ovl );
    1000       14690 :         pWin = hStereoMdct->hDft_ana->win_ana_fx;
    1001       14690 :         pTrigo = hStereoMdct->hDft_ana->dft_trigo_fx;
    1002       14690 :         trigo_step = hStereoMdct->hDft_ana->dft_trigo_step;
    1003       14690 :         move16();
    1004             :     }
    1005             : 
    1006    25103933 :     FOR( i = 0; i < shr( NFFT, 2 ); i++ )
    1007             :     {
    1008    25029600 :         trigo_enc[i] = pTrigo[i * trigo_step];
    1009    25029600 :         move16();
    1010    25029600 :         trigo_enc[( ( NFFT / 2 ) - i )] = pTrigo[L_mult0( i, trigo_step )];
    1011    25029600 :         move16();
    1012             :     }
    1013       74333 :     trigo_enc[NFFT / 4] = pTrigo[( ( NFFT / 4 ) * trigo_step )];
    1014       74333 :     move16();
    1015             : 
    1016             :     /*Forwards FFT:  L and R*/
    1017             :     /*zero padding*/
    1018    14153483 :     FOR( i = 0; i < dft_zp; i++ )
    1019             :     {
    1020    14079150 :         pDFT_L[i] = 0;
    1021    14079150 :         move32();
    1022    14079150 :         pDFT_L[( ( NFFT - 1 ) - i )] = 0;
    1023    14079150 :         move32();
    1024             : 
    1025    14079150 :         pDFT_R[i] = 0;
    1026    14079150 :         move32();
    1027    14079150 :         pDFT_R[( ( NFFT - 1 ) - i )] = 0;
    1028    14079150 :         move32();
    1029             :     }
    1030             : 
    1031      222999 :     FOR( n = 0; n < n_channels; n++ )
    1032             :     {
    1033      148666 :         Scale_sig( &mem[n][0], dft_ovl, sts[n]->q_inp - q_input_mem[n] ); // Q(sts[n]->q_inp)
    1034      148666 :         q_input_mem[n] = sts[n]->q_inp;
    1035      148666 :         move16();
    1036             :     }
    1037             :     /*overlapping parts*/
    1038    21975233 :     FOR( i = 0; i < dft_ovl; i++ )
    1039             :     {
    1040    21900900 :         pDFT_L[( dft_zp + i )] = L_mult0( mem[0][i], pWin[i] );
    1041    21900900 :         move32();
    1042    21900900 :         pDFT_L[( ( ( dft_zp + N ) + dft_ovl ) - 1 - i )] = L_mult0( input[0][offset + N + dft_ovl - 1 - i], pWin[i] );
    1043    21900900 :         move32();
    1044             : 
    1045    21900900 :         pDFT_R[dft_zp + i] = L_mult0( mem[1][i], pWin[i] );
    1046    21900900 :         move32();
    1047    21900900 :         pDFT_R[( ( dft_zp + N ) + dft_ovl ) - 1 - i] = L_mult0( input[1][offset + N + dft_ovl - 1 - i], pWin[i] );
    1048    21900900 :         move32();
    1049             :     }
    1050             : 
    1051             :     /*middle part*/
    1052    28232633 :     FOR( i = 0; i < N - dft_ovl; i++ )
    1053             :     {
    1054    28158300 :         pDFT_L[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[0][offset + dft_ovl + i] ), 1 );
    1055    28158300 :         move32();
    1056             : 
    1057    28158300 :         pDFT_R[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[1][offset + dft_ovl + i] ), 1 );
    1058    28158300 :         move32();
    1059             :     }
    1060       74333 :     DFT_e[0] = sub( 31, add( 15, sts[0]->q_inp ) );
    1061       74333 :     move16();
    1062       74333 :     DFT_e[1] = sub( 31, add( 15, sts[1]->q_inp ) );
    1063       74333 :     move16();
    1064             : 
    1065             :     Word16 q_shift, guarded_bits;
    1066       74333 :     guarded_bits = find_guarded_bits_fx( NFFT );
    1067             : 
    1068       74333 :     q_shift = sub( L_norm_arr( pDFT_L, NFFT ), guarded_bits );
    1069       74333 :     scale_sig32( pDFT_L, NFFT, q_shift );
    1070       74333 :     DFT_e[0] = sub( DFT_e[0], q_shift );
    1071       74333 :     move16();
    1072             : 
    1073       74333 :     q_shift = sub( L_norm_arr( pDFT_R, NFFT ), guarded_bits );
    1074       74333 :     scale_sig32( pDFT_R, NFFT, q_shift );
    1075       74333 :     DFT_e[1] = sub( DFT_e[1], q_shift );
    1076       74333 :     move16();
    1077             : 
    1078       74333 :     rfft_fx( pDFT_L, trigo_enc, NFFT, -1 );
    1079       74333 :     rfft_fx( pDFT_R, trigo_enc, NFFT, -1 );
    1080             : 
    1081             :     /* update pointers to overlap memory */
    1082      222999 :     FOR( n = 0; n < n_channels; n++ )
    1083             :     {
    1084      148666 :         mem[n] = &input[n][sub( N, dft_ovl )];
    1085             :     }
    1086       74333 :     test();
    1087       74333 :     test();
    1088       74333 :     IF( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] )
    1089             :     {
    1090       36384 :         FOR( n = 0; n < n_channels; n++ )
    1091             :         {
    1092       24256 :             Scale_sig( hStereoDft->input_mem_itd_fx[n], dft_ovl, sub( sts[n]->q_inp, hStereoDft->q_input_mem_itd[n] ) ); // Q(sts[n]->q_inp)
    1093       24256 :             hStereoDft->q_input_mem_itd[n] = sts[n]->q_inp;
    1094       24256 :             move16();
    1095       24256 :             Copy( hStereoDft->input_mem_itd_fx[n], input_mem[n], dft_ovl );
    1096             :         }
    1097             :     }
    1098             :     ELSE
    1099             :     {
    1100      186615 :         FOR( n = 0; n < n_channels; n++ )
    1101             :         {
    1102      124410 :             Copy( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl );
    1103             :         }
    1104             :     }
    1105             : 
    1106       74333 :     pop_wmops();
    1107       74333 :     return;
    1108             : }
    1109             : 
    1110             : /*-------------------------------------------------------------------------
    1111             :  * stereo_dft_enc_synthesize()
    1112             :  *
    1113             :  * Inverse DFT on a 20ms frame
    1114             :  *-------------------------------------------------------------------------*/
    1115             : 
    1116      224491 : Word32 stereo_dft_enc_synthesize_fx(
    1117             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle       */
    1118             :     // float *output,                         /* o  : output synthesis            */
    1119             :     Word32 *output_fx, /* o  : output synthesis           Q15 */
    1120             :     Word16 *output_start_index,
    1121             :     Word16 *output_end_index,
    1122             :     const Word16 chan,                 /* i  : channel number              */
    1123             :     const Word32 input_Fs,             /* i  : input sampling rate         */
    1124             :     const Word32 output_sampling_rate, /* i  : output sampling rate        */
    1125             :     const Word16 L_frame,              /* i  : frame length at internal Fs */
    1126             :     Word16 *nrg_out_fx_e )
    1127             : {
    1128             :     Word16 i, j, sign;
    1129             :     // float *pDFT_in;
    1130             :     Word32 *pDFT_in_fx;
    1131             :     Word16 DFT_in_fx_e;
    1132             :     Word16 offset, NFFT, N, ovl, zp;
    1133             :     Word16 temp_exp;
    1134             :     // float fac;
    1135             :     Word32 fac_fx;
    1136             :     // float *mem;
    1137             :     Word32 *mem_fx;
    1138             :     // const float *trigo, *win, *win_ana;
    1139             :     const Word16 *trigo_fx;
    1140             :     const Word32 *win_fx;
    1141             :     const Word16 *win_ana_fx;
    1142             :     // float tmp[STEREO_DFT_N_MAX_ENC];
    1143             :     Word32 tmp_fx[STEREO_DFT_N_MAX_ENC];
    1144             :     // float nrg;
    1145             :     Word32 nrg_fx;
    1146             :     Word16 nrg_fx_e;
    1147             :     // float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1];
    1148             :     Word16 trigo_enc_fx[STEREO_DFT_N_MAX_ENC / 2 + 1];
    1149             :     Word16 trigo_step;
    1150             :     Word16 scal_fac;
    1151             : 
    1152             : 
    1153             :     /*-----------------------------------------------------------------*
    1154             :      * Initialization
    1155             :      *-----------------------------------------------------------------*/
    1156             : 
    1157      224491 :     IF( L_frame > 0 )
    1158             :     {
    1159       35633 :         assert( ( output_sampling_rate == 16000 ) && "High-band generation only possible at 16kHz!" );
    1160             :     }
    1161      224491 :     nrg_fx = 0;
    1162      224491 :     move32();
    1163      224491 :     nrg_fx_e = 0;
    1164      224491 :     move16();
    1165             : 
    1166      224491 :     hStereoDft->icbweRefEner_fx = 0;
    1167      224491 :     move32();
    1168      224491 :     hStereoDft->icbweRefEner_fx_e = 0;
    1169      224491 :     move16();
    1170      224491 :     hStereoDft->lbEner_fx = 0;
    1171      224491 :     move32();
    1172      224491 :     hStereoDft->lbEner_fx_e = 0;
    1173      224491 :     move16();
    1174             : 
    1175      224491 :     IF( chan == 0 )
    1176             :     {
    1177      204570 :         pDFT_in_fx = hStereoDft->DFT_fx[0];
    1178      204570 :         DFT_in_fx_e = hStereoDft->DFT_fx_e[0];
    1179      204570 :         move16();
    1180             :     }
    1181             :     ELSE
    1182             :     {
    1183       19921 :         pDFT_in_fx = hStereoDft->DFT_fx[1];
    1184       19921 :         DFT_in_fx_e = hStereoDft->DFT_fx_e[1];
    1185       19921 :         move16();
    1186             :     }
    1187             : 
    1188      224491 :     IF( EQ_32( output_sampling_rate, input_Fs ) )
    1189             :     {
    1190       59643 :         assert( chan == 0 );
    1191             : 
    1192       59643 :         NFFT = hStereoDft->NFFT;
    1193       59643 :         move16();
    1194       59643 :         fac_fx = MAX_32;
    1195       59643 :         move32();
    1196       59643 :         N = hStereoDft->N;
    1197       59643 :         move16();
    1198       59643 :         ovl = hStereoDft->dft_ovl;
    1199       59643 :         move16();
    1200       59643 :         zp = hStereoDft->dft_zp;
    1201       59643 :         move16();
    1202       59643 :         trigo_fx = hStereoDft->dft_trigo_fx;
    1203       59643 :         trigo_step = hStereoDft->dft_trigo_step;
    1204       59643 :         move16();
    1205       59643 :         IF( L_frame > 0 )
    1206             :         {
    1207           0 :             mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx;
    1208             :         }
    1209             :         ELSE
    1210             :         {
    1211       59643 :             mem_fx = hStereoDft->output_mem_dmx_fx;
    1212             :         }
    1213       59643 :         win_fx = hStereoDft->win_fx;
    1214       59643 :         win_ana_fx = hStereoDft->win_ana_fx;
    1215             : 
    1216       59643 :         push_wmops( "DFT_synth_fs" );
    1217             :     }
    1218      164848 :     ELSE IF( EQ_32( output_sampling_rate, INT_FS_12k8 ) )
    1219             :     {
    1220       59643 :         assert( chan == 0 );
    1221             : 
    1222       59643 :         NFFT = STEREO_DFT_N_12k8_ENC;
    1223       59643 :         move16();
    1224       59643 :         N = STEREO_DFT_HOP_12k8_ENC;
    1225       59643 :         move16();
    1226       59643 :         zp = STEREO_DFT_ZP_12k8_ENC;
    1227       59643 :         move16();
    1228             :         // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1229       59643 :         fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
    1230       59643 :         fac_fx = L_shl( fac_fx, temp_exp );
    1231       59643 :         ovl = STEREO_DFT_OVL_12k8;
    1232       59643 :         move16();
    1233       59643 :         trigo_fx = hStereoDft->dft_trigo_12k8_fx;
    1234       59643 :         trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP;
    1235       59643 :         move16();
    1236       59643 :         mem_fx = hStereoDft->output_mem_dmx_12k8_fx;
    1237       59643 :         win_fx = hStereoDft->win_12k8_fx;
    1238       59643 :         win_ana_fx = hStereoDft->win_ana_12k8_fx;
    1239             : 
    1240       59643 :         push_wmops( "DFT_synth_12k8" );
    1241             :     }
    1242      105205 :     ELSE IF( EQ_32( output_sampling_rate, 16000 ) )
    1243             :     {
    1244       83790 :         assert( chan == 0 );
    1245             : 
    1246       83790 :         NFFT = STEREO_DFT_N_16k_ENC;
    1247       83790 :         move16();
    1248       83790 :         N = STEREO_DFT_HOP_16k_ENC;
    1249       83790 :         move16();
    1250       83790 :         zp = STEREO_DFT_ZP_16k_ENC;
    1251       83790 :         move16();
    1252             :         // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1253       83790 :         fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
    1254       83790 :         fac_fx = L_shl( fac_fx, temp_exp );
    1255       83790 :         ovl = STEREO_DFT_OVL_16k;
    1256       83790 :         move16();
    1257       83790 :         trigo_fx = hStereoDft->dft_trigo_16k_fx;
    1258       83790 :         trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
    1259       83790 :         move16();
    1260       83790 :         IF( L_frame > 0 )
    1261             :         {
    1262       35633 :             mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx;
    1263             : 
    1264       35633 :             push_wmops( "DFT_synth_16k_shb" );
    1265             :         }
    1266             :         ELSE
    1267             :         {
    1268       48157 :             mem_fx = hStereoDft->output_mem_dmx_16k_fx;
    1269             : 
    1270       48157 :             push_wmops( "DFT_synth_16k" );
    1271             :         }
    1272       83790 :         win_fx = hStereoDft->win_16k_fx;
    1273       83790 :         win_ana_fx = hStereoDft->win_ana_16k_fx;
    1274             :     }
    1275       21415 :     ELSE IF( EQ_32( output_sampling_rate, 32000 ) )
    1276             :     {
    1277        1494 :         assert( chan == 0 );
    1278             : 
    1279        1494 :         NFFT = STEREO_DFT_N_32k_ENC;
    1280        1494 :         move16();
    1281        1494 :         N = STEREO_DFT_HOP_32k_ENC;
    1282        1494 :         move16();
    1283        1494 :         zp = STEREO_DFT_ZP_32k_ENC;
    1284        1494 :         move16();
    1285             :         // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1286        1494 :         fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
    1287        1494 :         fac_fx = L_shl( fac_fx, temp_exp );
    1288        1494 :         ovl = STEREO_DFT_OVL_32k;
    1289        1494 :         move16();
    1290        1494 :         trigo_fx = hStereoDft->dft_trigo_32k_fx;
    1291        1494 :         trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
    1292        1494 :         move16();
    1293        1494 :         mem_fx = hStereoDft->output_mem_dmx_32k_fx;
    1294        1494 :         win_fx = hStereoDft->win_32k_fx;
    1295        1494 :         win_ana_fx = hStereoDft->win_ana_32k_fx;
    1296             : 
    1297        1494 :         push_wmops( "DFT_synth_32k" );
    1298             :     }
    1299       19921 :     ELSE IF( EQ_32( output_sampling_rate, 8000 ) )
    1300             :     {
    1301       19921 :         assert( chan == 1 );
    1302             : 
    1303       19921 :         NFFT = STEREO_DFT_N_8k_ENC;
    1304       19921 :         move16();
    1305       19921 :         N = STEREO_DFT_HOP_8k_ENC;
    1306       19921 :         move16();
    1307       19921 :         zp = STEREO_DFT_ZP_8k_ENC;
    1308       19921 :         move16();
    1309             :         // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1310       19921 :         fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
    1311       19921 :         fac_fx = L_shl( fac_fx, temp_exp );
    1312       19921 :         ovl = STEREO_DFT_OVL_8k;
    1313       19921 :         move16();
    1314       19921 :         trigo_fx = hStereoDft->dft_trigo_8k_fx;
    1315       19921 :         trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP;
    1316       19921 :         move16();
    1317       19921 :         mem_fx = hStereoDft->output_mem_res_8k_fx;
    1318       19921 :         win_fx = hStereoDft->win_8k_fx;
    1319       19921 :         win_ana_fx = hStereoDft->win_ana_8k_fx;
    1320             : 
    1321       19921 :         push_wmops( "DFT_synth_8k" );
    1322             :     }
    1323             :     ELSE
    1324             :     {
    1325           0 :         assert( 0 && "DFT stereo: sampling rate not supported!" );
    1326             :         NFFT = -1; /* to avoid compilation warning */
    1327             :         move16();
    1328             :         fac_fx = -1; /* to avoid compilation warning */
    1329             :         move32();
    1330             :         N = -1; /* to avoid compilation warning */
    1331             :         move16();
    1332             :         zp = -1; /* to avoid compilation warning */
    1333             :         move16();
    1334             :         win_fx = NULL;   /* to avoid compilation warning */
    1335             :         trigo_fx = NULL; /* to avoid compilation warning */
    1336             :         trigo_step = -1; /* to avoid compilation warning */
    1337             :         move16();
    1338             :         ovl = -1; /* to avoid compilation warning */
    1339             :         move16();
    1340             :         mem_fx = NULL;     /* to avoid compilation warning */
    1341             :         win_ana_fx = NULL; /* to avoid compilation warning */
    1342             :     }
    1343             : 
    1344      224491 :     offset = 0;
    1345      224491 :     move16();
    1346             : 
    1347    43932955 :     FOR( i = 0; i < NFFT / 4; i++ )
    1348             :     {
    1349    43708464 :         trigo_enc_fx[i] = trigo_fx[i * trigo_step];
    1350    43708464 :         move16();
    1351    43708464 :         trigo_enc_fx[( NFFT / 2 ) - i] = trigo_fx[i * trigo_step];
    1352    43708464 :         move16();
    1353             :     }
    1354      224491 :     trigo_enc_fx[NFFT / 4] = trigo_fx[( NFFT / 4 ) * trigo_step];
    1355      224491 :     move16();
    1356             : 
    1357             :     /*-----------------------------------------------------------------*
    1358             :      * Synthesizing & resampling
    1359             :      *-----------------------------------------------------------------*/
    1360             : 
    1361      224491 :     offset = negate( ovl );
    1362             : 
    1363      224491 :     test();
    1364      224491 :     IF( EQ_16( L_frame, L_FRAME ) || EQ_16( L_frame, L_FRAME16k ) )
    1365             :     {
    1366             :         // for ( i = (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i < (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
    1367    11438193 :         FOR( i = 320; i < 640; i++ )
    1368             :         {
    1369             :             // hStereoDft->icbweRefEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
    1370    11402560 :             hStereoDft->icbweRefEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->icbweRefEner_fx, hStereoDft->icbweRefEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->icbweRefEner_fx_e );
    1371    11402560 :             move32();
    1372             :         }
    1373             :         // for ( i = 0; i < (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
    1374    11438193 :         FOR( i = 0; i < 320; i++ )
    1375             :         {
    1376             :             // hStereoDft->lbEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
    1377    11402560 :             hStereoDft->lbEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->lbEner_fx, hStereoDft->lbEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->lbEner_fx_e );
    1378    11402560 :             move32();
    1379             :         }
    1380       35633 :         hStereoDft->icbweRefEner_fx = Mpy_32_32( hStereoDft->icbweRefEner_fx, fac_fx );
    1381       35633 :         move32();
    1382       35633 :         hStereoDft->lbEner_fx = Mpy_32_32( hStereoDft->lbEner_fx, fac_fx );
    1383       35633 :         move32();
    1384             :     }
    1385             : 
    1386             :     /*Flip?*/
    1387      224491 :     set32_fx( tmp_fx, 0, STEREO_DFT_N_MAX_ENC );
    1388      224491 :     IF( EQ_16( L_frame, L_FRAME ) )
    1389             :     {
    1390             :         /* 6 to 14 kHz SHB target signal*/
    1391       17213 :         j = 2;
    1392       17213 :         move16();
    1393       17213 :         sign = hStereoDft->flip_sign;
    1394       17213 :         move16();
    1395             : 
    1396             :         // for ( i = (int16_t) ( 350 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i >= (int16_t) 150 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
    1397     5542586 :         FOR( i = 560; i >= 240; i-- )
    1398             :         {
    1399             :             /* alternate sign between frames for even starting index */
    1400     5525373 :             tmp_fx[j++] = W_extract_l( W_mult0_32_32( sign, Mpy_32_32( pDFT_in_fx[2 * i], fac_fx ) ) );
    1401     5525373 :             tmp_fx[j++] = W_extract_l( W_mult0_32_32( negate( sign ), Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) ) );
    1402     5525373 :             move32();
    1403     5525373 :             move32();
    1404             :         }
    1405       17213 :         scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
    1406       17213 :         scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
    1407       17213 :         DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
    1408             : 
    1409       17213 :         hStereoDft->flip_sign = negate( sign );
    1410       17213 :         move16();
    1411             : 
    1412             :         // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
    1413     2788506 :         FOR( i = 0; i <= 160; i++ )
    1414             :         {
    1415     2771293 :             nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
    1416     2771293 :             nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
    1417             :         }
    1418             :     }
    1419      207278 :     ELSE IF( EQ_16( L_frame, L_FRAME16k ) )
    1420             :     {
    1421             :         /* 7.5 - 15.5 kHz SHB target signal*/
    1422       18420 :         j = 2;
    1423       18420 :         move16();
    1424             :         // for ( i = (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ) - 1; i >= (int16_t) 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
    1425     5912820 :         FOR( i = 640 - 1; i >= 320; i-- )
    1426             :         {
    1427     5894400 :             tmp_fx[j++] = Mpy_32_32( pDFT_in_fx[2 * i], fac_fx );
    1428     5894400 :             tmp_fx[j++] = L_negate( Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) );
    1429     5894400 :             move32();
    1430     5894400 :             move32();
    1431             :         }
    1432       18420 :         scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
    1433       18420 :         scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
    1434       18420 :         DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
    1435             : 
    1436             :         // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
    1437     2984040 :         FOR( i = 0; i <= 160; i++ )
    1438             :         {
    1439     2965620 :             nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
    1440     2965620 :             nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
    1441             :         }
    1442             :     }
    1443      188858 :     ELSE IF( NE_32( fac_fx, MAX_32 ) )
    1444             :     {
    1445             :         /*Copy and scale*/
    1446      129215 :         tmp_fx[0] = Mpy_32_32( pDFT_in_fx[0], fac_fx );
    1447      129215 :         move32();
    1448      129215 :         tmp_fx[1] = 0;
    1449      129215 :         move32();
    1450    69515521 :         FOR( i = 2; i < NFFT; i++ )
    1451             :         {
    1452    69386306 :             tmp_fx[i] = Mpy_32_32( pDFT_in_fx[i], fac_fx );
    1453    69386306 :             move32();
    1454             :         }
    1455             : 
    1456      129215 :         IF( LT_32( fac_fx, MAX_32 ) )
    1457             :         {
    1458      129215 :             tmp_fx[1] = 0; /*Nyquist is set to 0*/
    1459      129215 :             tmp_fx[0] = 0; /*DC is set to 0*/
    1460      129215 :             move32();
    1461      129215 :             move32();
    1462             :         }
    1463      129215 :         scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
    1464      129215 :         scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
    1465      129215 :         DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
    1466             :     }
    1467             :     ELSE
    1468             :     {
    1469    82443643 :         FOR( i = 0; i < NFFT; i++ )
    1470             :         {
    1471    82384000 :             tmp_fx[i] = pDFT_in_fx[i];
    1472    82384000 :             move32();
    1473             :         }
    1474       59643 :         scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
    1475       59643 :         scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
    1476       59643 :         DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
    1477             :     }
    1478             : 
    1479             :     /*Reconstruct */
    1480             :     /*IFFT*/
    1481      224491 :     scal_fac = sub( 1, find_guarded_bits_fx( NFFT ) );
    1482      224491 :     scale_sig32( tmp_fx, NFFT, scal_fac ); // Q16
    1483      224491 :     rfft_fx( tmp_fx, trigo_enc_fx, NFFT, +1 );
    1484      224491 :     Scale_sig32( tmp_fx, NFFT, sub( sub( DFT_in_fx_e, scal_fac ), 16 ) ); // Q15
    1485             : 
    1486    38469397 :     FOR( i = 0; i < ovl; i++ )
    1487             :     {
    1488             :         // output[offset + i] = mem[i] + tmp[zp + i] * win[i];
    1489    38244906 :         output_fx[offset + i] = L_add_sat( mem_fx[i], Mpy_32_32( tmp_fx[zp + i], win_fx[i] ) ); // Q15
    1490    38244906 :         move32();
    1491             :         // mem[i] = tmp[zp + N + i] * win[ovl - 1 - i];
    1492    38244906 :         mem_fx[i] = Mpy_32_32( tmp_fx[zp + N + i], win_fx[ovl - 1 - i] ); // Q15
    1493    38244906 :         move32();
    1494             :     }
    1495             : 
    1496             :     /*Middle->Copy*/
    1497    49396513 :     FOR( i = 0; i < N - ovl; i++ )
    1498             :     {
    1499             :         // output_fx[offset + ovl + i] = tmp[zp + ovl + i];
    1500    49172022 :         output_fx[offset + ovl + i] = tmp_fx[zp + ovl + i]; // Q15
    1501    49172022 :         move32();
    1502             :     }
    1503             : 
    1504             :     /*-----------------------------------------------------------------*
    1505             :      * Lookahead: redress signal
    1506             :      *-----------------------------------------------------------------*/
    1507             : 
    1508    38469397 :     FOR( i = 0; i < ovl; i++ )
    1509             :     {
    1510    38244906 :         Word32 ifft_deviation = tmp_fx[zp + N + ovl]; // Q15
    1511    38244906 :         move32();
    1512             :         // output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation;
    1513             :         Word16 L_temp_e;
    1514    38244906 :         Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e );
    1515    38244906 :         L_temp = L_shl_sat( L_temp, L_temp_e );
    1516    38244906 :         output_fx[offset + N + i] = L_add_sat( L_temp, ifft_deviation ); // Q15
    1517    38244906 :         move32();
    1518             :     }
    1519             : 
    1520      224491 :     *output_start_index = offset;
    1521      224491 :     move16();
    1522      224491 :     *output_end_index = add( add( offset, ovl ), N );
    1523      224491 :     move16();
    1524      224491 :     IF( nrg_out_fx_e )
    1525             :     {
    1526       35633 :         *nrg_out_fx_e = nrg_fx_e;
    1527       35633 :         move16();
    1528             :     }
    1529      224491 :     pop_wmops();
    1530      224491 :     return ( nrg_fx );
    1531             : }
    1532             : 
    1533             : /*-------------------------------------------------------------------------
    1534             :  * stereo_dft_enc_process()
    1535             :  *
    1536             :  * DFT-based stereo main processing function:
    1537             :  * 1) compute/encode stereo parameters
    1538             :  * 2) Mid/Side computation
    1539             :  *-------------------------------------------------------------------------*/
    1540       59643 : void stereo_dft_enc_process_fx(
    1541             :     CPE_ENC_HANDLE hCPE,           /* i/o: CPE encoder structure       */
    1542             :     const Word16 vad_flag_dtx[],   /* i  : VAD dtx flags               */
    1543             :     const Word16 vad_hover_flag[], /* i  : VAD hangover flags          */
    1544             :     const Word16 input_frame       /* i  : input frame length          */
    1545             : )
    1546             : {
    1547             :     Word16 i, j, b;
    1548             :     Word32 *pDFT_L_fx, *pDFT_R_fx;
    1549             :     Word32 *pDFT_DMX;
    1550             :     Word32 *pDFT_RES;
    1551             :     Word16 k_offset;
    1552             :     Word32 *pgIpd;
    1553             :     Word32 *pSideGain;
    1554             :     Word16 c_fx /*Q15*/, alpha_fx /*Q13*/;
    1555             :     Word32 g_fx; // Q31
    1556             :     Word32 wL, wR;
    1557             :     Word16 wL_e, wR_e;
    1558             :     Word16 wS;
    1559             :     Word16 tmp_fx;
    1560             :     Word32 tmp_32fx;
    1561             :     Word16 s_fx /*Q15*/, c1_fx /*Q15*/, s1_fx /*Q15*/;
    1562             :     Word16 fac_att_fx; // Q15
    1563             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
    1564             :     Word32 DFT_DMX[STEREO_DFT_N_MAX_ENC];
    1565             :     Word16 DFT_DMX_e[STEREO_DFT_N_MAX_ENC];
    1566             :     Word32 DFT_RES[STEREO_DFT_N_8k_ENC];
    1567             :     Word16 DFT_RES_e[STEREO_DFT_N_8k_ENC];
    1568             :     Word32 input_Fs;
    1569             :     Word32 bin_nrgL_fx[STEREO_DFT_N_MAX_ENC];
    1570             :     Word16 bin_nrgL_fx_e[STEREO_DFT_N_MAX_ENC];
    1571             :     Word32 bin_nrgR_fx[STEREO_DFT_N_MAX_ENC];
    1572             :     Word16 bin_nrgR_fx_e[STEREO_DFT_N_MAX_ENC];
    1573             :     Word32 *pNrgL, *pNrgR;
    1574             :     Word32 res_nrg_all_curr, dmx_nrg_all_curr;
    1575             :     Word16 res_nrg_all_curr_e, dmx_nrg_all_curr_e;
    1576             :     Word32 res_dmx_ratio /*Q31*/, frame_nrg_ratio /*Q28*/;
    1577             :     Word32 dot_prod_nrg_ratio_fx[STEREO_DFT_BAND_MAX];   /* contains only dot product for higher bands Q31 */
    1578             :     Word16 dot_prod_nrg_ratio_fx_e[STEREO_DFT_BAND_MAX]; /* contains only dot product for higher bands Q31 */
    1579             :     Word32 sum_nrg_L2, sum_nrg_R2, dot_prod_real2;
    1580             :     Word16 sum_nrg_L2_e, sum_nrg_R2_e, dot_prod_real2_e;
    1581             :     Word32 sum_nrg_Mid, sum_abs;
    1582             :     Word16 sum_nrg_Mid_e, sum_abs_e;
    1583             :     Word16 tmp_e;
    1584             :     Word16 DFT_L_e_tmp[STEREO_DFT_N_MAX_ENC], DFT_R_e_tmp[STEREO_DFT_N_MAX_ENC];
    1585             :     Word32 L_tmp1, L_tmp2, L_tmp3;
    1586             :     Word16 L_tmp1_e, L_tmp2_e, L_tmp3_e;
    1587             : 
    1588             :     /*------------------------------------------------------------------*
    1589             :      * Initialization
    1590             :      *-----------------------------------------------------------------*/
    1591             : 
    1592       59643 :     input_Fs = L_mult0( input_frame, FRAMES_PER_SEC );
    1593             : 
    1594       59643 :     hStereoDft = hCPE->hStereoDft;
    1595             : 
    1596       59643 :     wL = 0; /* avoid compilation warning */
    1597       59643 :     move32();
    1598       59643 :     wL_e = 0; /* avoid compilation warning */
    1599       59643 :     move16();
    1600       59643 :     wR = 0; /* avoid compilation warning */
    1601       59643 :     move32();
    1602       59643 :     wR_e = 0; /* avoid compilation warning */
    1603       59643 :     move16();
    1604             : 
    1605             :     /* Initialization */
    1606       59643 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
    1607       59643 :     move16();
    1608             : 
    1609       59643 :     hStereoDft->gipd_band_max = dft_band_ipd[1][3];
    1610       59643 :     move16();
    1611       59643 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]];
    1612       59643 :     move16();
    1613             :     // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * input_frame / (float) ( hStereoDft->NFFT ) );
    1614       59643 :     tmp_32fx = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), input_frame ), 1 );
    1615       59643 :     tmp_32fx = BASOP_Util_Divide3216_Scale( tmp_32fx, hStereoDft->NFFT, &tmp_e );
    1616       59643 :     hStereoDft->res_cod_line_max = extract_l( L_shr_r( tmp_32fx, sub( -1, tmp_e ) ) ); // 15 - (31 - 15 + tmp_e) = -1 - tmp_e
    1617       59643 :     move16();
    1618             :     // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8);
    1619       59643 :     hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 );
    1620       59643 :     move16();
    1621       59643 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
    1622       59643 :     move16();
    1623             : 
    1624             :     // hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[0];
    1625             :     // hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[1];
    1626             : 
    1627       59643 :     hStereoDft->voicing_lt_fx = L_add( Mpy_32_16_1( hStereoDft->voicing_lt_fx, 24576 ), L_mult( 8192, hCPE->hCoreCoder[0]->voicing_fx[0] ) );
    1628       59643 :     move32();
    1629       59643 :     hStereoDft->voicing_lt_fx = L_add( Mpy_32_16_1( hStereoDft->voicing_lt_fx, 24576 ), L_mult( 8192, hCPE->hCoreCoder[0]->voicing_fx[1] ) );
    1630       59643 :     move32();
    1631             : 
    1632             :     /*------------------------------------------------------------------*
    1633             :      * Compute stereo parameters
    1634             :      *-----------------------------------------------------------------*/
    1635             : 
    1636             :     /*ITD in Frequency domain*/
    1637             :     // fac_att = 1.0f;
    1638       59643 :     fac_att_fx = MAX_16;
    1639       59643 :     move16();
    1640             : 
    1641       59643 :     pDFT_L_fx = hStereoDft->DFT_fx[0];
    1642       59643 :     pDFT_R_fx = hStereoDft->DFT_fx[1];
    1643    82443643 :     FOR( i = 0; i < hStereoDft->NFFT; i++ )
    1644             :     {
    1645    82384000 :         tmp_e = norm_l( hStereoDft->DFT_fx[0][i] );
    1646    82384000 :         pDFT_L_fx[i] = L_shl( hStereoDft->DFT_fx[0][i], tmp_e );
    1647    82384000 :         move32();
    1648    82384000 :         DFT_L_e_tmp[i] = sub( hStereoDft->DFT_fx_e[0], tmp_e );
    1649    82384000 :         move16();
    1650    82384000 :         tmp_e = norm_l( hStereoDft->DFT_fx[1][i] );
    1651    82384000 :         pDFT_R_fx[i] = L_shl( hStereoDft->DFT_fx[1][i], tmp_e );
    1652    82384000 :         move32();
    1653    82384000 :         DFT_R_e_tmp[i] = sub( hStereoDft->DFT_fx_e[1], tmp_e );
    1654    82384000 :         move16();
    1655             :     }
    1656             : 
    1657             :     {
    1658       59643 :         stereo_dft_enc_compute_itd_fx( hCPE, pDFT_L_fx, DFT_L_e_tmp, pDFT_R_fx, DFT_R_e_tmp, k_offset, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e );
    1659             : 
    1660       59643 :         IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
    1661             :         {
    1662           0 :             return;
    1663             :         }
    1664             : 
    1665       59643 :         test();
    1666       59643 :         IF( hStereoDft->hItd->deltaItd_fx[k_offset] != 0 && hStereoDft->hConfig->dmx_active )
    1667             :         {
    1668             :             /*time shift channels*/
    1669             :             // alpha = -2.0f * EVS_PI * hStereoDft->hItd->deltaItd[k_offset] / hStereoDft->NFFT;
    1670       28564 :             alpha_fx = BASOP_Util_Divide3216_Scale( hStereoDft->hItd->deltaItd_fx[k_offset], hStereoDft->NFFT, &tmp_e );
    1671       28564 :             alpha_fx = negate( shl_r( mult_r( EVS_PI_FX, alpha_fx ), add( tmp_e, 1 ) ) ); // Q13*Q15= Q13
    1672             : 
    1673             :             // c = 1.f; /*cos(0)*/
    1674       28564 :             c_fx = MAX_16; /*cos(0)*/
    1675       28564 :             move16();
    1676             :             // s = 0.f; /*sin(0)*/
    1677       28564 :             s_fx = 0; /*sin(0)*/
    1678       28564 :             move16();
    1679             :             // c1 = cosf( alpha );
    1680       28564 :             c1_fx = shl_sat( getCosWord16( alpha_fx ), 1 );
    1681             :             // s1 = sinf( alpha );
    1682       28564 :             s1_fx = getSinWord16( alpha_fx );
    1683             : 
    1684       28564 :             IF( alpha_fx >= 0 )
    1685             :             {
    1686       21225 :                 c_fx = shr( c_fx, 1 );
    1687       21225 :                 s_fx = shr( s_fx, 1 );
    1688    15310720 :                 FOR( i = 1; i < hStereoDft->NFFT / 2; i++ )
    1689             :                 {
    1690             :                     // tmp = s * c1 + c * s1;
    1691    15289495 :                     tmp_fx = add( mult_r( s_fx, c1_fx ), mult_r( c_fx, s1_fx ) );
    1692             :                     // c = c * c1 - s * s1;
    1693    15289495 :                     c_fx = sub( mult_r( c_fx, c1_fx ), mult_r( s_fx, s1_fx ) );
    1694    15289495 :                     s_fx = tmp_fx;
    1695    15289495 :                     move16();
    1696             : 
    1697             :                     /*time shift of L*/
    1698             :                     // tmp = pDFT_L[2 * i] * c - pDFT_L[2 * i + 1] * s;
    1699    15289495 :                     tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], c_fx ), add( DFT_L_e_tmp[2 * i], 1 ), L_negate( Mpy_32_16_1( pDFT_L_fx[2 * i + 1], s_fx ) ), add( DFT_L_e_tmp[2 * i + 1], 1 ), &tmp_e );
    1700             :                     // pDFT_L[2 * i + 1] = pDFT_L[2 * i] * s + pDFT_L[2 * i + 1] * c;
    1701    15289495 :                     pDFT_L_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], s_fx ), add( DFT_L_e_tmp[2 * i], 1 ), Mpy_32_16_1( pDFT_L_fx[2 * i + 1], c_fx ), add( DFT_L_e_tmp[2 * i + 1], 1 ), &DFT_L_e_tmp[2 * i + 1] );
    1702    15289495 :                     move32();
    1703             :                     // pDFT_L[2 * i] = tmp;
    1704    15289495 :                     pDFT_L_fx[2 * i] = tmp_32fx;
    1705    15289495 :                     move32();
    1706    15289495 :                     DFT_L_e_tmp[2 * i] = tmp_e;
    1707    15289495 :                     move16();
    1708             :                 }
    1709             :             }
    1710             :             ELSE
    1711             :             {
    1712     4764160 :                 FOR( i = 1; i < hStereoDft->NFFT / 2; i++ )
    1713             :                 {
    1714             :                     // tmp = s * c1 + c * s1;
    1715     4756821 :                     tmp_fx = add_sat( mult_r( s_fx, c1_fx ), mult_r( c_fx, s1_fx ) ); // saturation expected
    1716             :                     // c = c * c1 - s * s1;
    1717     4756821 :                     c_fx = sub_sat( mult_r( c_fx, c1_fx ), mult_r( s_fx, s1_fx ) ); // saturation expected
    1718     4756821 :                     s_fx = tmp_fx;
    1719     4756821 :                     move16();
    1720             : 
    1721             :                     /*time shift of R*/
    1722             :                     // tmp = pDFT_R[2 * i] * c + pDFT_R[2 * i + 1] * s;
    1723     4756821 :                     tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_R_fx[2 * i], c_fx ), DFT_R_e_tmp[2 * i], Mpy_32_16_1( pDFT_R_fx[2 * i + 1], s_fx ), DFT_R_e_tmp[2 * i + 1], &tmp_e );
    1724             :                     // pDFT_R[2 * i + 1] = -pDFT_R[2 * i] * s + pDFT_R[2 * i + 1] * c;
    1725     4756821 :                     pDFT_R_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( L_negate( Mpy_32_16_1( pDFT_R_fx[2 * i], s_fx ) ), DFT_R_e_tmp[2 * i], Mpy_32_16_1( pDFT_R_fx[2 * i + 1], c_fx ), DFT_R_e_tmp[2 * i + 1], &DFT_R_e_tmp[2 * i + 1] );
    1726     4756821 :                     move32();
    1727             :                     // pDFT_R[2 * i] = tmp;
    1728     4756821 :                     pDFT_R_fx[2 * i] = tmp_32fx;
    1729     4756821 :                     move32();
    1730     4756821 :                     DFT_R_e_tmp[2 * i] = tmp_e;
    1731     4756821 :                     move16();
    1732             :                 }
    1733             :             }
    1734             : 
    1735             :             // if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f )
    1736       28564 :             tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_newton( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) );
    1737       28564 :             tmp_e = add( tmp_e, 15 - 31 );
    1738       28564 :             IF( BASOP_Util_Cmp_Mant32Exp( tmp_32fx, tmp_e, 5368709 /* 80.0f / 32000.f in Q31 */, 0 ) > 0 )
    1739             :             {
    1740             :                 // fac_att = min( 1.0f, max( 0.2f, 2.6f - 0.02f * fabsf( hStereoDft->hItd->deltaItd[1] ) * 32000.f / input_Fs ) );
    1741        5968 :                 tmp_fx = BASOP_Util_Divide3232_Scale( L_abs( hStereoDft->hItd->deltaItd_fx[1] ), input_Fs, &tmp_e );
    1742        5968 :                 tmp_e = add( tmp_e, 15 - 31 );
    1743        5968 :                 tmp_32fx = L_sub( 85197 /*2.6f in Q15*/, L_shl( L_mult0( tmp_fx, 640 /*0.02f * 32000.f in Q0*/ ), tmp_e ) ); // Q15
    1744        5968 :                 fac_att_fx = extract_l( L_min( MAX_16, L_max( 6554 /*0.2f in Q15*/, tmp_32fx ) ) );                          // Q15
    1745             :             }
    1746             :         }
    1747             : 
    1748             :         /* compute remaining binwise energies for FB mode (ITD function only computes energies up to 16 kHz) */
    1749     6755643 :         FOR( i = STEREO_DFT_N_32k_ENC / 2; i < hStereoDft->NFFT / 2; i++ )
    1750             :         {
    1751             :             // bin_nrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    1752     6696000 :             bin_nrgL_fx[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * i], pDFT_L_fx[2 * i] ), shl( DFT_L_e_tmp[2 * i], 1 ), Mpy_32_32( pDFT_L_fx[2 * i + 1], pDFT_L_fx[2 * i + 1] ), shl( DFT_L_e_tmp[2 * i + 1], 1 ), &bin_nrgL_fx_e[i] );
    1753     6696000 :             move32();
    1754             :             // bin_nrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    1755     6696000 :             bin_nrgR_fx[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * i], pDFT_R_fx[2 * i] ), shl( DFT_R_e_tmp[2 * i], 1 ), Mpy_32_32( pDFT_R_fx[2 * i + 1], pDFT_R_fx[2 * i + 1] ), shl( DFT_R_e_tmp[2 * i + 1], 1 ), &bin_nrgR_fx_e[i] );
    1756     6696000 :             move32();
    1757             :         }
    1758             :     }
    1759             : 
    1760             :     /* DFT stereo parameters */
    1761       59643 :     stereo_dft_enc_compute_prm_fx( hStereoDft, pDFT_L_fx, DFT_L_e_tmp, pDFT_R_fx, DFT_R_e_tmp, k_offset, 1, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->vad_flag, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e, dot_prod_nrg_ratio_fx, dot_prod_nrg_ratio_fx_e );
    1762             :     // printf("\n%f ", (float)hStereoDft->res_pred_gain_fx[0] / 0x7fffffff);
    1763             :     // printf("\n%f ", (float)hStereoDft->sum_dot_prod_img_fx / powf(2, 31 - hStereoDft->sum_dot_prod_img_fx_e
    1764             : 
    1765       59643 :     IF( vad_flag_dtx[0] == 0 )
    1766             :     {
    1767       10395 :         test();
    1768       10395 :         IF( hCPE->hStereoCng->cng_counter == 0 && !hCPE->hStereoCng->first_SID_after_TD )
    1769             :         {
    1770         128 :             hStereoDft->sid_gipd_fx = hStereoDft->prev_sid_gipd_fx;
    1771         128 :             move32();
    1772         128 :             hStereoDft->no_ipd_flag = hStereoDft->prev_sid_no_ipd_flag;
    1773         128 :             move16();
    1774             :         }
    1775             : 
    1776       10395 :         IF( GT_16( hCPE->hStereoCng->cng_counter, ITD_SID_PREV_FRAMES ) )
    1777             :         {
    1778        9310 :             hStereoDft->prev_sid_gipd_fx = hStereoDft->sid_gipd_fx;
    1779        9310 :             move32();
    1780        9310 :             hStereoDft->prev_sid_no_ipd_flag = hStereoDft->no_ipd_flag;
    1781        9310 :             move16();
    1782             :         }
    1783             :     }
    1784             : 
    1785             : 
    1786             :     /*----------------------------------------------------------------*
    1787             :      * UNCLR classifier (detection of uncorrelated L and R channels)
    1788             :      *----------------------------------------------------------------*/
    1789             : 
    1790       59643 :     unclr_classifier_dft_fx( hCPE );
    1791             : 
    1792             :     /*------------------------------------------------------------------*
    1793             :      * Channel mapping: computation of DMX and RES
    1794             :      *-----------------------------------------------------------------*/
    1795             : 
    1796       59643 :     res_nrg_all_curr = EPSILON_FX_M;
    1797       59643 :     move32();
    1798       59643 :     res_nrg_all_curr_e = EPSILON_FX_E;
    1799       59643 :     move16();
    1800       59643 :     dmx_nrg_all_curr = EPSILON_FX_M;
    1801       59643 :     move32();
    1802       59643 :     dmx_nrg_all_curr_e = EPSILON_FX_E;
    1803       59643 :     move16();
    1804             : 
    1805       59643 :     pDFT_DMX = DFT_DMX;
    1806       59643 :     pDFT_RES = DFT_RES;
    1807       59643 :     pNrgL = bin_nrgL_fx;
    1808       59643 :     pNrgR = bin_nrgR_fx;
    1809             : 
    1810       59643 :     set_zero_fx( pDFT_DMX, STEREO_DFT_N_MAX_ENC );
    1811       59643 :     set16_zero_fx( DFT_DMX_e, STEREO_DFT_N_MAX_ENC );
    1812       59643 :     set_zero_fx( pDFT_RES, STEREO_DFT_N_8k_ENC );
    1813       59643 :     set16_zero_fx( DFT_RES_e, STEREO_DFT_N_8k_ENC );
    1814             : 
    1815       59643 :     pgIpd = hStereoDft->gipd_fx + k_offset;
    1816       59643 :     pSideGain = hStereoDft->side_gain_fx + k_offset * STEREO_DFT_BAND_MAX;
    1817             : 
    1818             : 
    1819       59643 :     IF( hStereoDft->hConfig->dmx_active )
    1820             :     {
    1821             :         /*Active DMX*/
    1822             :         // alpha = 0; /* to avoid compilation warning */
    1823       59643 :         alpha_fx = 0; /* to avoid compilation warning */
    1824       59643 :         move16();
    1825       59643 :         g_fx = MAX_32;
    1826       59643 :         move32();
    1827             : 
    1828             :         /*Apply active DMX*/
    1829       59643 :         pDFT_DMX[0] = 0;
    1830       59643 :         move32();
    1831       59643 :         DFT_DMX_e[0] = 0;
    1832       59643 :         move16();
    1833       59643 :         pDFT_RES[0] = 0;
    1834       59643 :         move32();
    1835       59643 :         DFT_RES_e[0] = 0;
    1836       59643 :         move16();
    1837      760663 :         FOR( b = 0; b < hStereoDft->nbands_dmx; b++ )
    1838             :         {
    1839      701020 :             g_fx = pSideGain[b];
    1840      701020 :             move32();
    1841             : 
    1842      701020 :             IF( pgIpd[0] != 0 )
    1843             :             {
    1844      212837 :                 Word32 theta = pgIpd[0];
    1845      214025 :                 WHILE( GT_32( theta, EVS_2PI_FX ) )
    1846             :                 {
    1847        1188 :                     theta = L_sub( theta, EVS_2PI_FX ); /* Q13 */
    1848             :                 }
    1849      227567 :                 WHILE( LT_32( theta, -EVS_2PI_FX ) )
    1850             :                 {
    1851       14730 :                     theta = L_add( theta, EVS_2PI_FX ); /* Q13 */
    1852             :                 }
    1853             : 
    1854      212837 :                 IF( GT_32( theta, MAX_16 ) )
    1855             :                 {
    1856        7536 :                     theta = L_sub( theta, EVS_2PI_FX ); /* Q13 */
    1857             :                 }
    1858      205301 :                 ELSE IF( LT_32( theta, MIN_16 ) )
    1859             :                 {
    1860        3666 :                     theta = L_add( theta, EVS_2PI_FX ); /* Q13 */
    1861             :                 }
    1862             : 
    1863      212837 :                 c_fx = shl_sat( getCosWord16( extract_l( theta ) ), 1 );
    1864      212837 :                 s_fx = getSinWord16( extract_l( theta ) );
    1865             : 
    1866    11328025 :                 FOR( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
    1867             :                 {
    1868             :                     /*rotate L*/
    1869             :                     // tmp = pDFT_L[2 * i] * c + pDFT_L[2 * i + 1] * s;
    1870    11115188 :                     tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], c_fx ), DFT_L_e_tmp[2 * i], Mpy_32_16_1( pDFT_L_fx[2 * i + 1], s_fx ), DFT_L_e_tmp[2 * i + 1], &tmp_e );
    1871             :                     // pDFT_L[2 * i + 1] = pDFT_L[2 * i + 1] * c - pDFT_L[2 * i] * s;
    1872    11115188 :                     pDFT_L_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i + 1], c_fx ), DFT_L_e_tmp[2 * i + 1], L_negate( Mpy_32_16_1( pDFT_L_fx[2 * i], s_fx ) ), DFT_L_e_tmp[2 * i], &DFT_L_e_tmp[2 * i + 1] );
    1873    11115188 :                     move32();
    1874             :                     // pDFT_L[2 * i] = tmp;
    1875    11115188 :                     pDFT_L_fx[2 * i] = tmp_32fx;
    1876    11115188 :                     move32();
    1877    11115188 :                     DFT_L_e_tmp[2 * i] = tmp_e;
    1878    11115188 :                     move16();
    1879             :                 }
    1880             :             }
    1881             : 
    1882      701020 :             test();
    1883      701020 :             IF( LT_16( b, hStereoDft->res_cod_band_max ) && vad_flag_dtx[0] )
    1884             :             {
    1885             : 
    1886             :                 /*Get the previous frame energy*/
    1887       86870 :                 IF( hStereoDft->hConfig->ada_wb_res_cod_mode )
    1888             :                 {
    1889             :                     /*Calculate the energy of RES and DMX*/
    1890             :                     /* 90% of old frame ... */
    1891             :                     // dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.9f;
    1892       86870 :                     dmx_nrg_all_curr = BASOP_Util_Add_Mant32Exp( dmx_nrg_all_curr, dmx_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_M_fx[b], 1932735283 /*0.9f*/ ), hStereoDft->res_cod_NRG_M_fx_e[b], &dmx_nrg_all_curr_e );
    1893             :                     // res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.9f;
    1894       86870 :                     res_nrg_all_curr = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_S_fx[b], 1932735283 /*0.9f*/ ), hStereoDft->res_cod_NRG_S_fx_e[b], &res_nrg_all_curr_e );
    1895             :                 }
    1896       86870 :                 hStereoDft->res_cod_NRG_M_fx[b] = EPSILON_FX_M;
    1897       86870 :                 move32();
    1898       86870 :                 hStereoDft->res_cod_NRG_M_fx_e[b] = EPSILON_FX_E;
    1899       86870 :                 move16();
    1900       86870 :                 hStereoDft->res_cod_NRG_S_fx[b] = EPSILON_FX_M;
    1901       86870 :                 move32();
    1902       86870 :                 hStereoDft->res_cod_NRG_S_fx_e[b] = EPSILON_FX_E;
    1903       86870 :                 move16();
    1904             : 
    1905      799204 :                 FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1906             :                 {
    1907             :                     // pDFT_DMX[2 * i] = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * 0.5f;
    1908      712334 :                     pDFT_DMX[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], pDFT_R_fx[2 * i], DFT_R_e_tmp[2 * i], &DFT_DMX_e[2 * i] );
    1909      712334 :                     move32();
    1910      712334 :                     DFT_DMX_e[2 * i] = sub( DFT_DMX_e[2 * i], 1 ); // * 0.5f
    1911      712334 :                     move16();
    1912             :                     // pDFT_DMX[2 * i + 1] = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * 0.5f;
    1913      712334 :                     pDFT_DMX[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], pDFT_R_fx[2 * i + 1], DFT_R_e_tmp[2 * i + 1], &DFT_DMX_e[2 * i + 1] );
    1914      712334 :                     move32();
    1915      712334 :                     DFT_DMX_e[2 * i + 1] = sub( DFT_DMX_e[2 * i + 1], 1 ); // * 0.5f
    1916      712334 :                     move16();
    1917             : 
    1918             :                     // pDFT_RES[2 * i] = ( pDFT_L[2 * i] - pDFT_R[2 * i] ) * 0.5f;
    1919      712334 :                     pDFT_RES[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], L_negate( pDFT_R_fx[2 * i] ), DFT_R_e_tmp[2 * i], &DFT_RES_e[2 * i] );
    1920      712334 :                     move32();
    1921      712334 :                     DFT_RES_e[2 * i] = sub( DFT_RES_e[2 * i], 1 ); // * 0.5f
    1922      712334 :                     move16();
    1923             :                     // pDFT_RES[2 * i + 1] = ( pDFT_L[2 * i + 1] - pDFT_R[2 * i + 1] ) * 0.5f;
    1924      712334 :                     pDFT_RES[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], L_negate( pDFT_R_fx[2 * i + 1] ), DFT_R_e_tmp[2 * i + 1], &DFT_RES_e[2 * i + 1] );
    1925      712334 :                     move32();
    1926      712334 :                     DFT_RES_e[2 * i + 1] = sub( DFT_RES_e[2 * i + 1], 1 ); // * 0.5f
    1927      712334 :                     move16();
    1928             : 
    1929             :                     /*Prediction of RES with DMX*/
    1930             :                     // pDFT_RES[2 * i] = pDFT_RES[2 * i] - g * pDFT_DMX[2 * i];
    1931      712334 :                     pDFT_RES[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_RES[2 * i], DFT_RES_e[2 * i], L_negate( Mpy_32_32( g_fx, pDFT_DMX[2 * i] ) ), DFT_DMX_e[2 * i], &DFT_RES_e[2 * i] );
    1932      712334 :                     move32();
    1933             :                     // pDFT_RES[2 * i + 1] = pDFT_RES[2 * i + 1] - g * pDFT_DMX[2 * i + 1];
    1934      712334 :                     pDFT_RES[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_RES[2 * i + 1], DFT_RES_e[2 * i + 1], L_negate( Mpy_32_32( g_fx, pDFT_DMX[2 * i + 1] ) ), DFT_DMX_e[2 * i + 1], &DFT_RES_e[2 * i + 1] );
    1935      712334 :                     move32();
    1936             : 
    1937             :                     // pDFT_RES[2 * i] *= fac_att;
    1938      712334 :                     pDFT_RES[2 * i] = Mpy_32_16_1( pDFT_RES[2 * i], fac_att_fx );
    1939      712334 :                     move32();
    1940             :                     // pDFT_RES[2 * i + 1] *= fac_att;
    1941      712334 :                     pDFT_RES[2 * i + 1] = Mpy_32_16_1( pDFT_RES[2 * i + 1], fac_att_fx );
    1942      712334 :                     move32();
    1943             : 
    1944             :                     /*Energy of the DMX and RES*/
    1945             :                     // hStereoDft->res_cod_NRG_M[b] += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
    1946      712334 :                     tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), shl( DFT_DMX_e[2 * i], 1 ), Mpy_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ), shl( DFT_DMX_e[2 * i + 1], 1 ), &tmp_e );
    1947      712334 :                     hStereoDft->res_cod_NRG_M_fx[b] = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_M_fx[b], hStereoDft->res_cod_NRG_M_fx_e[b], tmp_32fx, tmp_e, &hStereoDft->res_cod_NRG_M_fx_e[b] );
    1948      712334 :                     move32();
    1949             :                     // hStereoDft->res_cod_NRG_S[b] += pDFT_RES[2 * i] * pDFT_RES[2 * i] + pDFT_RES[2 * i + 1] * pDFT_RES[2 * i + 1];
    1950      712334 :                     tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_RES[2 * i], pDFT_RES[2 * i] ), shl( DFT_RES_e[2 * i], 1 ), Mpy_32_32( pDFT_RES[2 * i + 1], pDFT_RES[2 * i + 1] ), shl( DFT_RES_e[2 * i + 1], 1 ), &tmp_e );
    1951      712334 :                     hStereoDft->res_cod_NRG_S_fx[b] = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], tmp_32fx, tmp_e, &hStereoDft->res_cod_NRG_S_fx_e[b] );
    1952      712334 :                     move32();
    1953             :                 }
    1954             : 
    1955       86870 :                 IF( hStereoDft->hConfig->ada_wb_res_cod_mode )
    1956             :                 {
    1957             :                     /*Calculate the energy of RES and DMX*/
    1958             :                     /* ... + 10% of current frame. */
    1959             :                     // dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.1f;
    1960       86870 :                     dmx_nrg_all_curr = BASOP_Util_Add_Mant32Exp( dmx_nrg_all_curr, dmx_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_M_fx[b], 214748365 /*0.1f*/ ), hStereoDft->res_cod_NRG_M_fx_e[b], &dmx_nrg_all_curr_e );
    1961             :                     // res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.1f;
    1962       86870 :                     res_nrg_all_curr = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_S_fx[b], 214748365 /*0.1f*/ ), hStereoDft->res_cod_NRG_S_fx_e[b], &res_nrg_all_curr_e );
    1963             :                 }
    1964             :             }
    1965             :             ELSE
    1966             :             {
    1967             :                 Word16 upper_border;
    1968             :                 Word16 triple_bin;
    1969             :                 Word32 frac_dot_prod;   /* fraction of dot product according to energy ratio of current bins and whole band */
    1970             :                 Word16 frac_dot_prod_e; /* fraction of dot product according to energy ratio of current bins and whole band */
    1971             :                 Word32 Sr, Si;
    1972             :                 Word16 Sr_e, Si_e;
    1973             :                 Word32 comb_nrgL, comb_nrgR;
    1974             :                 Word16 comb_nrgL_e, comb_nrgR_e;
    1975             : 
    1976      614150 :                 upper_border = s_min( STEREO_DFT_DMX_CROSSOVER, hStereoDft->band_limits_dmx[b + 1] );
    1977             : 
    1978      614150 :                 triple_bin = 0;
    1979      614150 :                 move16();
    1980             : 
    1981      614150 :                 test();
    1982      614150 :                 IF( GT_16( upper_border, hStereoDft->band_limits_dmx[b] ) && sub( upper_border, hStereoDft->band_limits_dmx[b] ) % 2 )
    1983             :                 {
    1984             :                     /* if odd number of bins in band, combine last 3 bins */
    1985      186450 :                     triple_bin = 1;
    1986      186450 :                     move16();
    1987      186450 :                     upper_border = sub( upper_border, 3 );
    1988             :                 }
    1989             : 
    1990     6240823 :                 FOR( i = hStereoDft->band_limits_dmx[b]; i < upper_border; i += 2 )
    1991             :                 {
    1992             :                     // comb_nrgL = pNrgL[i] + pNrgL[i + 1];
    1993     5626673 :                     comb_nrgL = BASOP_Util_Add_Mant32Exp( pNrgL[i], bin_nrgL_fx_e[i], pNrgL[i + 1], bin_nrgL_fx_e[i + 1], &comb_nrgL_e );
    1994             :                     // comb_nrgR = pNrgR[i] + pNrgR[i + 1];
    1995     5626673 :                     comb_nrgR = BASOP_Util_Add_Mant32Exp( pNrgR[i], bin_nrgR_fx_e[i], pNrgR[i + 1], bin_nrgR_fx_e[i + 1], &comb_nrgR_e );
    1996             : 
    1997             :                     // Sr = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * ( pDFT_L[2 * i] + pDFT_R[2 * i] ) + ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] ) * ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] );
    1998     5626673 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], pDFT_R_fx[2 * i], DFT_R_e_tmp[2 * i], &L_tmp1_e );
    1999     5626673 :                     L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 2], DFT_L_e_tmp[2 * i + 2], pDFT_R_fx[2 * i + 2], DFT_R_e_tmp[2 * i + 2], &L_tmp2_e );
    2000     5626673 :                     Sr = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_tmp1, L_tmp1 ), shl( L_tmp1_e, 1 ), Mpy_32_32( L_tmp2, L_tmp2 ), shl( L_tmp2_e, 1 ), &Sr_e );
    2001             : 
    2002             :                     // Si = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) + ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] ) * ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] );
    2003     5626673 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], pDFT_R_fx[2 * i + 1], DFT_R_e_tmp[2 * i + 1], &L_tmp1_e );
    2004     5626673 :                     L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 3], DFT_L_e_tmp[2 * i + 3], pDFT_R_fx[2 * i + 3], DFT_R_e_tmp[2 * i + 3], &L_tmp2_e );
    2005     5626673 :                     Si = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_tmp1, L_tmp1 ), shl( L_tmp1_e, 1 ), Mpy_32_32( L_tmp2, L_tmp2 ), shl( L_tmp2_e, 1 ), &Si_e );
    2006             : 
    2007             :                     // sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
    2008     5626673 :                     L_tmp1 = comb_nrgL;
    2009     5626673 :                     move32();
    2010     5626673 :                     L_tmp1_e = comb_nrgL_e;
    2011     5626673 :                     move16();
    2012     5626673 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2013     5626673 :                     L_tmp2 = comb_nrgR;
    2014     5626673 :                     move32();
    2015     5626673 :                     L_tmp2_e = comb_nrgR_e;
    2016     5626673 :                     move16();
    2017     5626673 :                     L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
    2018     5626673 :                     sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
    2019     5626673 :                     sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
    2020             : 
    2021             :                     // frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
    2022     5626673 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, comb_nrgR, comb_nrgR_e, &L_tmp1_e );
    2023     5626673 :                     frac_dot_prod = Mpy_32_32( L_tmp1, dot_prod_nrg_ratio_fx[b] );
    2024     5626673 :                     frac_dot_prod_e = add( L_tmp1_e, dot_prod_nrg_ratio_fx_e[b] );
    2025             : 
    2026             :                     // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
    2027     5626673 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e );
    2028     5626673 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2029     5626673 :                     wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
    2030     5626673 :                     wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
    2031             : 
    2032             :                     // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
    2033     5626673 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e );
    2034     5626673 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2035     5626673 :                     L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
    2036     5626673 :                     L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
    2037     5626673 :                     L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e );                         // Q31 saturation expected
    2038     5626673 :                     L_tmp1 = L_sub( MAX_32, L_tmp2 );                               // Q31
    2039     5626673 :                     L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
    2040     5626673 :                     wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
    2041             : 
    2042             :                     /*DMX Mapping*/
    2043             :                     // pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
    2044     5626673 :                     pDFT_DMX[2 * i] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i] ), add( wL_e, DFT_L_e_tmp[2 * i] ), Mpy_32_32( wR, pDFT_R_fx[2 * i] ), add( wR_e, DFT_R_e_tmp[2 * i] ), &DFT_DMX_e[2 * i] ), INV_SQRT_2_Q31 );
    2045     5626673 :                     move32();
    2046             :                     // pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
    2047     5626673 :                     pDFT_DMX[2 * i + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 1] ), add( wL_e, DFT_L_e_tmp[2 * i + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 1] ), add( wR_e, DFT_R_e_tmp[2 * i + 1] ), &DFT_DMX_e[2 * i + 1] ), INV_SQRT_2_Q31 );
    2048     5626673 :                     move32();
    2049             :                     // pDFT_DMX[2 * i + 2] = ( wL * pDFT_L[2 * i + 2] + wR * pDFT_R[2 * i + 2] ) * INV_SQRT_2;
    2050     5626673 :                     pDFT_DMX[2 * i + 2] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 2] ), add( wL_e, DFT_L_e_tmp[2 * i + 2] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 2] ), add( wR_e, DFT_R_e_tmp[2 * i + 2] ), &DFT_DMX_e[2 * i + 2] ), INV_SQRT_2_Q31 );
    2051     5626673 :                     move32();
    2052             :                     // pDFT_DMX[2 * i + 3] = ( wL * pDFT_L[2 * i + 3] + wR * pDFT_R[2 * i + 3] ) * INV_SQRT_2;
    2053     5626673 :                     pDFT_DMX[2 * i + 3] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 3] ), add( wL_e, DFT_L_e_tmp[2 * i + 3] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 3] ), add( wR_e, DFT_R_e_tmp[2 * i + 3] ), &DFT_DMX_e[2 * i + 3] ), INV_SQRT_2_Q31 );
    2054     5626673 :                     move32();
    2055             :                 }
    2056             : 
    2057      614150 :                 IF( triple_bin )
    2058             :                 {
    2059      186450 :                     comb_nrgL = comb_nrgR = 0;
    2060      186450 :                     move32();
    2061      186450 :                     move32();
    2062      186450 :                     comb_nrgL_e = comb_nrgR_e = 0;
    2063      186450 :                     move16();
    2064      186450 :                     move16();
    2065      186450 :                     Sr = Si = 0;
    2066      186450 :                     move32();
    2067      186450 :                     move32();
    2068      186450 :                     Sr_e = Si_e = 0;
    2069      186450 :                     move16();
    2070      186450 :                     move16();
    2071      745800 :                     FOR( j = i; j < i + 3; j++ )
    2072             :                     {
    2073             :                         // comb_nrgL += pNrgL[j];
    2074      559350 :                         comb_nrgL = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, pNrgL[j], bin_nrgL_fx_e[j], &comb_nrgL_e );
    2075             : 
    2076             :                         // comb_nrgR += pNrgR[j];
    2077      559350 :                         comb_nrgR = BASOP_Util_Add_Mant32Exp( comb_nrgR, comb_nrgR_e, pNrgR[j], bin_nrgR_fx_e[j], &comb_nrgR_e );
    2078             : 
    2079             :                         // Sr += ( pDFT_L[2 * j] + pDFT_R[2 * j] ) * ( pDFT_L[2 * j] + pDFT_R[2 * j] );
    2080      559350 :                         L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * j], DFT_L_e_tmp[2 * j], pDFT_R_fx[2 * j], DFT_R_e_tmp[2 * j], &L_tmp1_e );
    2081      559350 :                         L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 );
    2082      559350 :                         L_tmp1_e = shl( L_tmp1_e, 1 );
    2083      559350 :                         Sr = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, L_tmp1, L_tmp1_e, &Sr_e );
    2084             : 
    2085             :                         // Si += ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] ) * ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] );
    2086      559350 :                         L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * j + 1], DFT_L_e_tmp[2 * j + 1], pDFT_R_fx[2 * j + 1], DFT_R_e_tmp[2 * j + 1], &L_tmp2_e );
    2087      559350 :                         L_tmp2 = Mpy_32_32( L_tmp2, L_tmp2 );
    2088      559350 :                         L_tmp2_e = shl( L_tmp2_e, 1 );
    2089      559350 :                         Si = BASOP_Util_Add_Mant32Exp( Si, Si_e, L_tmp2, L_tmp2_e, &Si_e );
    2090             :                     }
    2091             : 
    2092             :                     // sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
    2093      186450 :                     L_tmp1 = comb_nrgL;
    2094      186450 :                     move32();
    2095      186450 :                     L_tmp1_e = comb_nrgL_e;
    2096      186450 :                     move16();
    2097      186450 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2098      186450 :                     L_tmp2 = comb_nrgR;
    2099      186450 :                     move32();
    2100      186450 :                     L_tmp2_e = comb_nrgR_e;
    2101      186450 :                     move16();
    2102      186450 :                     L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
    2103      186450 :                     sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
    2104      186450 :                     sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
    2105             : 
    2106             :                     // frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
    2107      186450 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, comb_nrgR, comb_nrgR_e, &L_tmp1_e );
    2108      186450 :                     frac_dot_prod = Mpy_32_32( L_tmp1, dot_prod_nrg_ratio_fx[b] );
    2109      186450 :                     frac_dot_prod_e = add( L_tmp1_e, dot_prod_nrg_ratio_fx_e[b] );
    2110             : 
    2111             :                     // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
    2112      186450 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e );
    2113      186450 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2114      186450 :                     wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
    2115      186450 :                     wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
    2116             : 
    2117             :                     // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
    2118      186450 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e );
    2119      186450 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2120      186450 :                     L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
    2121      186450 :                     L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
    2122      186450 :                     L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e );                         // Q31 saturation expected
    2123      186450 :                     L_tmp1 = L_sub( MAX_32, L_tmp2 );                               // Q31
    2124      186450 :                     L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
    2125      186450 :                     wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
    2126             : 
    2127      745800 :                     FOR( j = i; j < i + 3; j++ )
    2128             :                     {
    2129             :                         // pDFT_DMX[2 * j] = ( wL * pDFT_L[2 * j] + wR * pDFT_R[2 * j] ) * INV_SQRT_2;
    2130      559350 :                         pDFT_DMX[2 * j] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * j] ), add( wL_e, DFT_L_e_tmp[2 * j] ), Mpy_32_32( wR, pDFT_R_fx[2 * j] ), add( wR_e, DFT_R_e_tmp[2 * j] ), &DFT_DMX_e[2 * j] ), INV_SQRT_2_Q31 );
    2131      559350 :                         move32();
    2132             :                         // pDFT_DMX[2 * j + 1] = ( wL * pDFT_L[2 * j + 1] + wR * pDFT_R[2 * j + 1] ) * INV_SQRT_2;
    2133      559350 :                         pDFT_DMX[2 * j + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * j + 1] ), add( wL_e, DFT_L_e_tmp[2 * j + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * j + 1] ), add( wR_e, DFT_R_e_tmp[2 * j + 1] ), &DFT_DMX_e[2 * j + 1] ), INV_SQRT_2_Q31 );
    2134      559350 :                         move32();
    2135             :                     }
    2136      186450 :                     i = add( i, 3 );
    2137             :                 }
    2138             : 
    2139      614150 :                 IF( LT_16( i, hStereoDft->band_limits_dmx[b + 1] ) )
    2140             :                 {
    2141      164233 :                     sum_nrg_L2 = EPSILON_FX_M;
    2142      164233 :                     move32();
    2143      164233 :                     sum_nrg_L2_e = EPSILON_FX_E;
    2144      164233 :                     move16();
    2145      164233 :                     sum_nrg_R2 = EPSILON_FX_M;
    2146      164233 :                     move32();
    2147      164233 :                     sum_nrg_R2_e = EPSILON_FX_E;
    2148      164233 :                     move16();
    2149      164233 :                     dot_prod_real2 = EPSILON_FX_M;
    2150      164233 :                     move32();
    2151      164233 :                     dot_prod_real2_e = EPSILON_FX_E;
    2152      164233 :                     move16();
    2153    25177960 :                     FOR( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
    2154             :                     {
    2155             :                         // sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
    2156    25013727 :                         L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_L_fx[2 * j] ), shl( DFT_L_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_L_fx[2 * j + 1] ), shl( DFT_L_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
    2157    25013727 :                         sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, L_tmp1, L_tmp1_e, &sum_nrg_L2_e );
    2158             :                         // sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
    2159    25013727 :                         L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * j], pDFT_R_fx[2 * j] ), shl( DFT_R_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_R_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), shl( DFT_R_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
    2160    25013727 :                         sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, L_tmp1, L_tmp1_e, &sum_nrg_R2_e );
    2161             :                         // dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
    2162    25013727 :                         L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_R_fx[2 * j] ), add( DFT_L_e_tmp[2 * j], DFT_R_e_tmp[2 * j] ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), add( DFT_L_e_tmp[2 * j + 1], DFT_R_e_tmp[2 * j + 1] ), &L_tmp1_e );
    2163    25013727 :                         dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp1, L_tmp1_e, &dot_prod_real2_e );
    2164             :                     }
    2165             : 
    2166             :                     // sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
    2167      164233 :                     L_tmp3 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp3_e );
    2168      164233 :                     sum_nrg_Mid = BASOP_Util_Add_Mant32Exp( L_tmp3, L_tmp3_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &sum_nrg_Mid_e );
    2169      164233 :                     IF( sum_nrg_Mid < 0 )
    2170             :                     {
    2171           0 :                         sum_nrg_Mid = 0;
    2172           0 :                         move32();
    2173           0 :                         sum_nrg_Mid_e = 0;
    2174           0 :                         move16();
    2175             :                     }
    2176             : 
    2177             :                     // sum_abs = sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) + EPSILON;
    2178      164233 :                     L_tmp1 = sum_nrg_L2;
    2179      164233 :                     move32();
    2180      164233 :                     L_tmp1_e = sum_nrg_L2_e;
    2181      164233 :                     move16();
    2182      164233 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2183      164233 :                     L_tmp2 = sum_nrg_R2;
    2184      164233 :                     move32();
    2185      164233 :                     L_tmp2_e = sum_nrg_R2_e;
    2186      164233 :                     move16();
    2187      164233 :                     L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
    2188      164233 :                     sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
    2189      164233 :                     sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
    2190             : 
    2191             :                     // wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs;
    2192      164233 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp3, sub( L_tmp3_e, 1 ), dot_prod_nrg_ratio_fx[b], dot_prod_nrg_ratio_fx_e[b], &L_tmp1_e );
    2193      164233 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2194      164233 :                     wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
    2195      164233 :                     wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
    2196             : 
    2197             :                     // wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs );
    2198      164233 :                     L_tmp1 = sum_nrg_Mid;
    2199      164233 :                     move32();
    2200      164233 :                     L_tmp1_e = sum_nrg_Mid_e;
    2201      164233 :                     move16();
    2202      164233 :                     L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    2203      164233 :                     L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
    2204      164233 :                     L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
    2205      164233 :                     L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e );                         // Q31 saturation expected
    2206      164233 :                     L_tmp1 = L_sub( MAX_32, L_tmp2 );                               // Q31
    2207      164233 :                     L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
    2208      164233 :                     wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
    2209             :                 }
    2210             : 
    2211    25627877 :                 FOR( ; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
    2212             :                 {
    2213             :                     /*DMX Mapping*/
    2214             :                     // pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
    2215    25013727 :                     pDFT_DMX[2 * i] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i] ), add( wL_e, DFT_L_e_tmp[2 * i] ), Mpy_32_32( wR, pDFT_R_fx[2 * i] ), add( wR_e, DFT_R_e_tmp[2 * i] ), &DFT_DMX_e[2 * i] ), INV_SQRT_2_Q31 );
    2216    25013727 :                     move32();
    2217             :                     // pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
    2218    25013727 :                     pDFT_DMX[2 * i + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 1] ), add( wL_e, DFT_L_e_tmp[2 * i + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 1] ), add( wR_e, DFT_R_e_tmp[2 * i + 1] ), &DFT_DMX_e[2 * i + 1] ), INV_SQRT_2_Q31 );
    2219    25013727 :                     move32();
    2220             :                 }
    2221             :             }
    2222             :         }
    2223             : 
    2224     3653243 :         FOR( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->NFFT / 2; i++ )
    2225             :         {
    2226     3593600 :             pDFT_DMX[2 * i] = 0;
    2227     3593600 :             move32();
    2228     3593600 :             DFT_DMX_e[2 * i] = 0;
    2229     3593600 :             move16();
    2230     3593600 :             pDFT_DMX[2 * i + 1] = 0;
    2231     3593600 :             move32();
    2232     3593600 :             DFT_DMX_e[2 * i + 1] = 0;
    2233     3593600 :             move16();
    2234             :         }
    2235             : 
    2236             :         /*Nyquist Freq.*/
    2237       59643 :         IF( GE_16( hStereoDft->band_limits_dmx[b], shr( hStereoDft->NFFT, 1 ) ) )
    2238             :         {
    2239             :             // pDFT_DMX[1] = ( pDFT_L[1] + pDFT_R[1] ) * 0.5f;
    2240       49452 :             pDFT_DMX[1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[1], DFT_L_e_tmp[1], pDFT_R_fx[1], DFT_R_e_tmp[1], &DFT_DMX_e[1] );
    2241       49452 :             move32();
    2242       49452 :             DFT_DMX_e[1] = sub( DFT_DMX_e[1], 1 );
    2243       49452 :             move16();
    2244             :         }
    2245             :         ELSE
    2246             :         {
    2247       10191 :             pDFT_DMX[1] = 0;
    2248       10191 :             move32();
    2249       10191 :             DFT_DMX_e[1] = 0;
    2250       10191 :             move16();
    2251             :         }
    2252             : 
    2253             :         /* DC component */
    2254             :         // pDFT_DMX[0] = ( pDFT_L[0] + pDFT_R[0] ) * 0.5f;
    2255       59643 :         pDFT_DMX[0] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[0], DFT_L_e_tmp[0], pDFT_R_fx[0], DFT_R_e_tmp[0], &DFT_DMX_e[0] );
    2256       59643 :         move32();
    2257       59643 :         DFT_DMX_e[0] = sub( DFT_DMX_e[0], 1 );
    2258       59643 :         move16();
    2259             :     }
    2260             :     ELSE
    2261             :     {
    2262             :         /*passive DMX*/
    2263           0 :         assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" );
    2264           0 :         FOR( i = 0; i < hStereoDft->band_limits[hStereoDft->res_cod_band_max]; i++ )
    2265             :         {
    2266             :             // pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
    2267           0 :             pDFT_DMX[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], pDFT_R_fx[i], DFT_R_e_tmp[i], &DFT_DMX_e[i] );
    2268           0 :             move32();
    2269           0 :             DFT_DMX_e[i] = sub( DFT_DMX_e[i], 1 );
    2270           0 :             move16();
    2271             :             // pDFT_RES[i] = ( pDFT_L[i] - pDFT_R[i] ) * 0.5f;
    2272           0 :             pDFT_RES[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], L_negate( pDFT_R_fx[i] ), DFT_R_e_tmp[i], &DFT_RES_e[i] );
    2273           0 :             move32();
    2274           0 :             DFT_RES_e[i] = sub( DFT_RES_e[i], 1 );
    2275           0 :             move16();
    2276             :         }
    2277           0 :         FOR( ; i < hStereoDft->NFFT; i++ )
    2278             :         {
    2279             :             // pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
    2280           0 :             pDFT_DMX[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], pDFT_R_fx[i], DFT_R_e_tmp[i], &DFT_DMX_e[i] );
    2281           0 :             move32();
    2282           0 :             DFT_DMX_e[i] = sub( DFT_DMX_e[i], 1 );
    2283           0 :             move16();
    2284             :         }
    2285             :     }
    2286             : 
    2287             :     /*------------------------------------------------------------------*
    2288             :      * Recalculate RES and DMX
    2289             :      *-----------------------------------------------------------------*/
    2290             : 
    2291       59643 :     test();
    2292       59643 :     IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) && hStereoDft->hConfig->ada_wb_res_cod_mode )
    2293             :     {
    2294        2796 :         stereo_dft_enc_get_res_cod_mode_flag_fx( hStereoDft, res_nrg_all_curr, res_nrg_all_curr_e, dmx_nrg_all_curr, dmx_nrg_all_curr_e, &res_dmx_ratio, &frame_nrg_ratio );
    2295             : 
    2296        2796 :         IF( hStereoDft->res_cod_sw_flag )
    2297             :         {
    2298             :             Word16 res_cod_band_max;
    2299             : 
    2300          59 :             res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->hConfig->ada_wb_res_cod_mode];
    2301          59 :             move16();
    2302             : 
    2303             :             /* Recalculate RES and DMX */
    2304         354 :             FOR( b = 0; b < res_cod_band_max; b++ )
    2305             :             {
    2306         295 :                 sum_nrg_L2 = EPSILON_FX_M;
    2307         295 :                 move32();
    2308         295 :                 sum_nrg_L2_e = EPSILON_FX_E;
    2309         295 :                 move16();
    2310         295 :                 sum_nrg_R2 = EPSILON_FX_M;
    2311         295 :                 move32();
    2312         295 :                 sum_nrg_R2_e = EPSILON_FX_E;
    2313         295 :                 move16();
    2314         295 :                 dot_prod_real2 = EPSILON_FX_M;
    2315         295 :                 move32();
    2316         295 :                 dot_prod_real2_e = EPSILON_FX_E;
    2317         295 :                 move16();
    2318        2714 :                 FOR( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
    2319             :                 {
    2320             :                     // sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
    2321        2419 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_L_fx[2 * j] ), shl( DFT_L_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_L_fx[2 * j + 1] ), shl( DFT_L_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
    2322        2419 :                     sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, L_tmp1, L_tmp1_e, &sum_nrg_L2_e );
    2323             : 
    2324             :                     // sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
    2325        2419 :                     L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * j], pDFT_R_fx[2 * j] ), shl( DFT_R_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_R_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), shl( DFT_R_e_tmp[2 * j + 1], 1 ), &L_tmp2_e );
    2326        2419 :                     sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, L_tmp2, L_tmp2_e, &sum_nrg_R2_e );
    2327             : 
    2328             :                     // dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
    2329        2419 :                     L_tmp3 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_R_fx[2 * j] ), add( DFT_L_e_tmp[2 * j], DFT_R_e_tmp[2 * j] ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), add( DFT_L_e_tmp[2 * j + 1], DFT_R_e_tmp[2 * j + 1] ), &L_tmp3_e );
    2330        2419 :                     dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp3, L_tmp3_e, &dot_prod_real2_e );
    2331             :                 }
    2332             : 
    2333             :                 // sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
    2334         295 :                 L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp1_e );
    2335         295 :                 sum_nrg_Mid = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &sum_nrg_Mid_e );
    2336         295 :                 IF( sum_nrg_Mid < 0 )
    2337             :                 {
    2338           0 :                     sum_nrg_Mid = 0;
    2339           0 :                     move32();
    2340           0 :                     sum_nrg_Mid_e = 0;
    2341           0 :                     move16();
    2342             :                 }
    2343             : 
    2344             :                 // wL = 0.5f * max( sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) - sqrtf( sum_nrg_Mid ), 0 ) * inv_sqrt( sum_nrg_L2 + EPSILON );
    2345         295 :                 L_tmp1_e = sum_nrg_L2_e;
    2346         295 :                 move16();
    2347         295 :                 L_tmp1 = Sqrt32( sum_nrg_L2, &L_tmp1_e );
    2348         295 :                 L_tmp2_e = sum_nrg_R2_e;
    2349         295 :                 move16();
    2350         295 :                 L_tmp2 = Sqrt32( sum_nrg_R2, &L_tmp2_e );
    2351         295 :                 L_tmp3_e = sum_nrg_Mid_e;
    2352         295 :                 move16();
    2353         295 :                 L_tmp3 = Sqrt32( sum_nrg_Mid, &L_tmp3_e );
    2354         295 :                 wL = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &wL_e );
    2355         295 :                 wL = BASOP_Util_Add_Mant32Exp( wL, wL_e, L_negate( L_tmp3 ), L_tmp3_e, &wL_e );
    2356         295 :                 IF( wL < 0 )
    2357             :                 {
    2358           0 :                     wL = 0; // Q31
    2359           0 :                     move32();
    2360             :                 }
    2361             :                 ELSE
    2362             :                 {
    2363         295 :                     L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e );
    2364         295 :                     L_tmp1 = ISqrt32( L_tmp1, &L_tmp1_e );
    2365         295 :                     wL = Mpy_32_32( wL, L_tmp1 );
    2366         295 :                     wL_e = sub( add( wL_e, L_tmp1_e ), 1 ); // *0.5f
    2367         295 :                     wL = L_shl( wL, wL_e );                 // Q31
    2368             :                 }
    2369             : 
    2370         295 :                 wS = MAX_16; // Q15
    2371         295 :                 move16();
    2372             : 
    2373         295 :                 IF( hStereoDft->res_cod_sw_flag )
    2374             :                 {
    2375             :                     // wL *= ( 1 - hStereoDft->switch_fade_factor );
    2376         295 :                     wL = Mpy_32_16_1( wL, sub( MAX_16, hStereoDft->switch_fade_factor_fx ) ); // Q31
    2377             :                     // wS = hStereoDft->switch_fade_factor;
    2378         295 :                     wS = hStereoDft->switch_fade_factor_fx; // Q15
    2379         295 :                     move16();
    2380             :                 }
    2381             : 
    2382        2714 :                 FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2383             :                 {
    2384             :                     /*DMX Recalculation*/
    2385             :                     // DFT_DMX[2 * i] += wL * pDFT_L[2 * i];
    2386        2419 :                     DFT_DMX[2 * i] = BASOP_Util_Add_Mant32Exp( DFT_DMX[2 * i], DFT_DMX_e[2 * i], Mpy_32_32( pDFT_L_fx[2 * i], wL ), DFT_L_e_tmp[2 * i], &DFT_DMX_e[2 * i] );
    2387        2419 :                     move32();
    2388             :                     // DFT_DMX[2 * i + 1] += wL * pDFT_L[2 * i + 1];
    2389        2419 :                     DFT_DMX[2 * i + 1] = BASOP_Util_Add_Mant32Exp( DFT_DMX[2 * i + 1], DFT_DMX_e[2 * i + 1], Mpy_32_32( pDFT_L_fx[2 * i + 1], wL ), DFT_L_e_tmp[2 * i + 1], &DFT_DMX_e[2 * i + 1] );
    2390        2419 :                     move32();
    2391             : 
    2392             :                     /*RES Recalculation*/
    2393             :                     // DFT_RES[2 * i] *= wS;
    2394        2419 :                     DFT_RES[2 * i] = Mpy_32_16_1( DFT_RES[2 * i], wS );
    2395        2419 :                     move32();
    2396             :                     // DFT_RES[2 * i + 1] *= wS;
    2397        2419 :                     DFT_RES[2 * i + 1] = Mpy_32_16_1( DFT_RES[2 * i + 1], wS );
    2398        2419 :                     move32();
    2399             :                 }
    2400             :             }
    2401             :         }
    2402             :     }
    2403             : 
    2404       59643 :     IF( GE_32( input_Fs, 32000 ) )
    2405             :     {
    2406       48157 :         stereo_dft_enc_calculate_nrg_for_icbwe_fx( hStereoDft, DFT_L_e_tmp, DFT_R_e_tmp, DFT_DMX, DFT_DMX_e, input_Fs );
    2407             :     }
    2408             : 
    2409             :     // making exp common
    2410       59643 :     Word16 max_exp = MIN_16;
    2411       59643 :     move16();
    2412   114574203 :     FOR( i = 0; i < STEREO_DFT_N_MAX_ENC; i++ )
    2413             :     {
    2414   114514560 :         max_exp = s_max( max_exp, DFT_DMX_e[i] );
    2415             :     }
    2416   114574203 :     FOR( i = 0; i < STEREO_DFT_N_MAX_ENC; i++ )
    2417             :     {
    2418   114514560 :         DFT_DMX[i] = L_shr_r( DFT_DMX[i], sub( max_exp, DFT_DMX_e[i] ) ); // Q(31-max_exp)
    2419   114514560 :         move32();
    2420             :     }
    2421       59643 :     hStereoDft->DFT_fx_e[0] = max_exp;
    2422       59643 :     move16();
    2423             : 
    2424       59643 :     max_exp = MIN_16;
    2425       59643 :     move16();
    2426    19145403 :     FOR( i = 0; i < STEREO_DFT_N_8k_ENC; i++ )
    2427             :     {
    2428    19085760 :         max_exp = s_max( max_exp, DFT_RES_e[i] );
    2429             :     }
    2430    19145403 :     FOR( i = 0; i < STEREO_DFT_N_8k_ENC; i++ )
    2431             :     {
    2432    19085760 :         DFT_RES[i] = L_shr_r( DFT_RES[i], sub( max_exp, DFT_RES_e[i] ) ); // Q(31-max_exp)
    2433    19085760 :         move32();
    2434             :     }
    2435       59643 :     hStereoDft->DFT_fx_e[1] = max_exp;
    2436       59643 :     move16();
    2437             : 
    2438       59643 :     Copy32( DFT_DMX, hStereoDft->DFT_fx[0], STEREO_DFT_N_MAX_ENC );
    2439       59643 :     Copy32( DFT_RES, hStereoDft->DFT_fx[1], STEREO_DFT_N_8k_ENC );
    2440       59643 :     set_zero_fx( hStereoDft->DFT_fx[1] + STEREO_DFT_N_8k_ENC, STEREO_DFT_N_MAX_ENC - STEREO_DFT_N_8k_ENC );
    2441             : 
    2442       59643 :     return;
    2443             : }
    2444             : /*-------------------------------------------------------------------------
    2445             :  * stereo_dft_enc_get_res_cod_mode_flag()
    2446             :  *
    2447             :  * Get the residual signal coding flag
    2448             :  *-------------------------------------------------------------------------*/
    2449        2796 : static void stereo_dft_enc_get_res_cod_mode_flag_fx(
    2450             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    2451             :     const Word32 res_nrg_all_curr, // Q(31-res_nrg_all_curr_e)
    2452             :     const Word16 res_nrg_all_curr_e,
    2453             :     const Word32 dmx_nrg_all_curr, // Q(31-dmx_nrg_all_curr_e)
    2454             :     const Word16 dmx_nrg_all_curr_e,
    2455             :     Word32 *res_dmx_ratio,    // Q31
    2456             :     Word32 *frame_nrg_ratio ) // Q28
    2457             : {
    2458             :     Word16 b, k_offset;
    2459             :     Word32 dmx_res_all, g /*Q31*/;
    2460             :     Word16 dmx_res_all_e;
    2461             :     Word16 fast_update_flag;
    2462             :     Word16 prev_res_cod_mode_flag, res_cod_mode_flag;
    2463             :     Word32 L_tmp1, L_tmp2;
    2464             :     Word16 L_tmp1_e, L_tmp2_e;
    2465             : 
    2466        2796 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
    2467        2796 :     move16();
    2468             : 
    2469             :     /*Calculate energy ratio between residual signal and downmix signal */
    2470        2796 :     *res_dmx_ratio = 0;
    2471        2796 :     move32();
    2472             : 
    2473       16776 :     FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    2474             :     {
    2475             :         // g = fabsf(hStereoDft->side_gain[(k_offset)*STEREO_DFT_BAND_MAX + b]);
    2476       13980 :         g = L_abs( hStereoDft->side_gain_fx[(k_offset) *STEREO_DFT_BAND_MAX + b] );
    2477             :         //*res_dmx_ratio = max(hStereoDft->res_cod_NRG_S[b] / (hStereoDft->res_cod_NRG_S[b] + (1 - g) * (1 - g) * hStereoDft->res_cod_NRG_M[b] + 1), *res_dmx_ratio);
    2478       13980 :         L_tmp1 = L_sub( MAX_32, g ); // Q31
    2479       13980 :         L_tmp2 = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], Mpy_32_32( Mpy_32_32( L_tmp1, L_tmp1 ), hStereoDft->res_cod_NRG_M_fx[b] ), hStereoDft->res_cod_NRG_M_fx_e[b], &L_tmp2_e );
    2480       13980 :         L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e );
    2481       13980 :         L_tmp1 = BASOP_Util_Divide3232_Scale_newton( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e );
    2482       13980 :         L_tmp1_e = add( L_tmp1_e, sub( hStereoDft->res_cod_NRG_S_fx_e[b], L_tmp2_e ) );
    2483       13980 :         L_tmp1 = L_shl( L_tmp1, L_tmp1_e ); // Q31
    2484       13980 :         *res_dmx_ratio = L_max( L_tmp1, *res_dmx_ratio );
    2485       13980 :         move32();
    2486             :     }
    2487             :     //*res_dmx_ratio = check_bounds(*res_dmx_ratio, 0, 1); /*should always be satisfied*/
    2488        2796 :     *res_dmx_ratio = check_bounds_l( *res_dmx_ratio, 0, MAX_32 ); /*should always be satisfied*/
    2489        2796 :     move32();
    2490             : 
    2491             :     /*Calculate the total energy of RES and DMX*/
    2492             :     // dmx_res_all = res_nrg_all_curr + dmx_nrg_all_curr;
    2493        2796 :     dmx_res_all = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, dmx_nrg_all_curr, dmx_nrg_all_curr_e, &dmx_res_all_e );
    2494             : 
    2495             :     /*Calculate the energy ratio of the inter-frame */
    2496             :     //*frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev;
    2497        2796 :     *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_newton( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e );
    2498        2796 :     move32();
    2499        2796 :     L_tmp1_e = add( L_tmp1_e, sub( dmx_res_all_e, hStereoDft->dmx_res_all_prev_fx_e ) );
    2500        2796 :     *frame_nrg_ratio = L_shr_r_sat( *frame_nrg_ratio, sub( 3, L_tmp1_e ) ); // Q28
    2501        2796 :     move32();
    2502             :     //*frame_nrg_ratio = L_min(5.0f, max(0.2f, *frame_nrg_ratio));
    2503        2796 :     *frame_nrg_ratio = L_min( ( 5 << 28 ) /*5.0f*/, L_max( 53687091 /*0.2f*/, *frame_nrg_ratio ) ); // Q28
    2504        2796 :     move32();
    2505             : 
    2506             :     /* Get fast update flag */
    2507        2796 :     fast_update_flag = 0;
    2508        2796 :     move16();
    2509             :     // if ((*frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f) || (*frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f))
    2510        2796 :     test();
    2511        2796 :     test();
    2512        2796 :     test();
    2513        2796 :     if ( ( GT_32( *frame_nrg_ratio, 858993459 /*3.2f*/ ) && LT_32( *res_dmx_ratio, 214748365 /*0.1f*/ ) ) || ( LT_32( *frame_nrg_ratio, 56371446 /*0.21f */ ) && GT_32( *res_dmx_ratio, 858993459 /*0.4f*/ ) ) )
    2514             :     {
    2515          59 :         fast_update_flag = 1;
    2516          59 :         move16();
    2517             :     }
    2518             : 
    2519             :     /* Calculate long term energy ratio between residual signal and downmix signal */
    2520        2796 :     IF( fast_update_flag )
    2521             :     {
    2522             :         // hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f;
    2523          59 :         hStereoDft->res_dmx_ratio_lt_fx = L_add( Mpy_32_32( *res_dmx_ratio, 429496730 /*0.2f*/ ), Mpy_32_32( hStereoDft->res_dmx_ratio_lt_fx, 1717986918 /*0.8f*/ ) );
    2524          59 :         move32();
    2525             :     }
    2526             :     ELSE
    2527             :     {
    2528             :         // hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f;
    2529        2737 :         hStereoDft->res_dmx_ratio_lt_fx = L_add( Mpy_32_32( *res_dmx_ratio, 107374182 /*0.05f*/ ), Mpy_32_32( hStereoDft->res_dmx_ratio_lt_fx, 2040109466 /*0.95f*/ ) );
    2530        2737 :         move32();
    2531             :     }
    2532             : 
    2533             :     /*Get the  residual signal coding initial flag */
    2534             :     // if (hStereoDft->res_dmx_ratio_lt > 0.01f)
    2535        2796 :     IF( GT_32( hStereoDft->res_dmx_ratio_lt_fx, 21474836 /*0.01f*/ ) )
    2536             :     {
    2537        2796 :         res_cod_mode_flag = 1;
    2538        2796 :         move16();
    2539             :     }
    2540             :     ELSE
    2541             :     {
    2542           0 :         res_cod_mode_flag = 0;
    2543           0 :         move16();
    2544             :     }
    2545             : 
    2546             :     /* Get the residual signal coding flag */
    2547        2796 :     IF( hStereoDft->first_frm_flag )
    2548             :     {
    2549           9 :         prev_res_cod_mode_flag = res_cod_mode_flag;
    2550           9 :         move16();
    2551           9 :         hStereoDft->first_frm_flag = 0;
    2552           9 :         move16();
    2553             :     }
    2554             :     ELSE
    2555             :     {
    2556        2787 :         prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1];
    2557        2787 :         move16();
    2558             :     }
    2559        2796 :     IF( NE_16( res_cod_mode_flag, prev_res_cod_mode_flag ) )
    2560             :     {
    2561         347 :         IF( EQ_16( prev_res_cod_mode_flag, 1 ) )
    2562             :         {
    2563           0 :             test();
    2564           0 :             test();
    2565           0 :             IF( LT_16( hStereoDft->hangover_cnt0, 5 ) && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 )
    2566             :             {
    2567           0 :                 res_cod_mode_flag = prev_res_cod_mode_flag;
    2568           0 :                 move16();
    2569           0 :                 hStereoDft->hangover_cnt0 = add( hStereoDft->hangover_cnt0, 1 );
    2570           0 :                 move16();
    2571             :             }
    2572             :             ELSE
    2573             :             {
    2574             :                 /* reset hangover */
    2575           0 :                 hStereoDft->hangover_cnt0 = 0;
    2576           0 :                 move16();
    2577             :             }
    2578             :         }
    2579             :         ELSE
    2580             :         {
    2581             :             // if (*frame_nrg_ratio > 2.5f || *frame_nrg_ratio < 0.21f)
    2582         347 :             test();
    2583         347 :             IF( GT_32( *frame_nrg_ratio, 671088640 /*2.5f*/ ) || LT_32( *frame_nrg_ratio, 56371446 /*0.21f*/ ) )
    2584             :             {
    2585             :                 /* reset hangover */
    2586           7 :                 hStereoDft->hangover_cnt1 = 0;
    2587           7 :                 move16();
    2588             :             }
    2589             :             ELSE
    2590             :             {
    2591         340 :                 IF( LT_16( hStereoDft->hangover_cnt1, 5 ) )
    2592             :                 {
    2593         288 :                     res_cod_mode_flag = prev_res_cod_mode_flag;
    2594         288 :                     move16();
    2595         288 :                     hStereoDft->hangover_cnt1 = add( hStereoDft->hangover_cnt1, 1 );
    2596         288 :                     move16();
    2597             :                 }
    2598             :                 ELSE
    2599             :                 {
    2600             :                     /* reset hangover */
    2601          52 :                     hStereoDft->hangover_cnt1 = 0;
    2602          52 :                     move16();
    2603             :                 }
    2604             :             }
    2605             :         }
    2606             :     }
    2607             : 
    2608             :     /* handle switching frames */
    2609        2796 :     test();
    2610        2796 :     IF( NE_16( res_cod_mode_flag, prev_res_cod_mode_flag ) && hStereoDft->last_res_cod_mode_modify_flag == 0 )
    2611             :     {
    2612          59 :         hStereoDft->res_cod_sw_flag = 1;
    2613          59 :         move16();
    2614             : 
    2615             :         /* Update switch_fade_factor */
    2616             :         // if (*frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f)
    2617          59 :         test();
    2618          59 :         test();
    2619          59 :         IF( GT_32( *frame_nrg_ratio, 858993459 /*3.2f*/ ) && LT_32( *res_dmx_ratio, 214748365 /*0.1f*/ ) )
    2620             :         {
    2621             :             // hStereoDft->switch_fade_factor = 0.75f;
    2622           0 :             hStereoDft->switch_fade_factor_fx = 24576; // 0.75f
    2623           0 :             move16();
    2624             :         }
    2625             :         // else if (*frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f)
    2626          59 :         ELSE IF( LT_32( *frame_nrg_ratio, 56371446 /*0.21f*/ ) && GT_32( *res_dmx_ratio, 858993459 /*0.4f*/ ) )
    2627             :         {
    2628             :             // hStereoDft->switch_fade_factor = 0.25f;
    2629           0 :             hStereoDft->switch_fade_factor_fx = 8192; // 0.25f
    2630           0 :             move16();
    2631             :         }
    2632             :         ELSE
    2633             :         {
    2634             :             // hStereoDft->switch_fade_factor = 0.5f;
    2635          59 :             hStereoDft->switch_fade_factor_fx = 16384; // 0.5f
    2636          59 :             move16();
    2637             :         }
    2638             : 
    2639          59 :         if ( res_cod_mode_flag == 0 )
    2640             :         {
    2641           0 :             res_cod_mode_flag = 1;
    2642           0 :             move16();
    2643             :         }
    2644             :     }
    2645             : 
    2646             :     /*update previous frame's total energy of RES and DMX */
    2647        2796 :     hStereoDft->dmx_res_all_prev_fx = dmx_res_all;
    2648        2796 :     move32();
    2649        2796 :     hStereoDft->dmx_res_all_prev_fx_e = dmx_res_all_e;
    2650        2796 :     move16();
    2651             : 
    2652             :     /* update residual coding mode */
    2653        2796 :     hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] = res_cod_mode_flag;
    2654        2796 :     move16();
    2655        2796 :     IF( !hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
    2656             :     {
    2657         288 :         hStereoDft->res_cod_band_max = 0;
    2658         288 :         move16();
    2659         288 :         hStereoDft->res_cod_line_max = 0;
    2660         288 :         move16();
    2661             :     }
    2662             : 
    2663             :     /*Update residual signal memory when switching from not coding residual signal to coding it*/
    2664        2796 :     test();
    2665        2796 :     IF( prev_res_cod_mode_flag == 0 && EQ_16( res_cod_mode_flag, 1 ) )
    2666             :     {
    2667          59 :         set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k );
    2668             :     }
    2669             : 
    2670        2796 :     return;
    2671             : }
    2672             : /*-------------------------------------------------------------------------
    2673             :  * stereo_dft_enc_res()
    2674             :  *
    2675             :  * Code the residual signal
    2676             :  *-------------------------------------------------------------------------*/
    2677             : 
    2678       59115 : void stereo_dft_enc_res_fx(
    2679             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle       */
    2680             :     const Word32 *input_8k,                /* i  : input buffer sampled at 8kHz Q15 */
    2681             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: bitstream handle            */
    2682             :     Word16 *nb_bits,                       /* o  : number of bits written      */
    2683             :     const Word16 max_bits )
    2684             : {
    2685             :     Word16 i, b;
    2686             :     RangeUniEncState range_uni_enc_state;
    2687             :     ECSQ_instance ecsq_inst;
    2688             :     Word32 MDCT_RES[L_FRAME8k];
    2689             :     Word16 MDCT_RES_e;
    2690             :     Word16 win[L_FRAME8k + STEREO_DFT_OVL_8k]; // Q0
    2691             :     Word16 global_gain_index;
    2692             :     Word16 total_bit_count;
    2693             :     Word32 max_snr; // Q25
    2694             :     Word32 panning_gain, panning_gain_min;
    2695             :     Word32 res_cod_gain[10]; // Q25
    2696             :     Word32 in_phase_ratio;
    2697             :     Word16 in_phase_ratio_e;
    2698             :     Word32 L_tmp1, L_tmp2;
    2699             :     Word16 /*L_tmp1_e,*/ L_tmp2_e;
    2700       59115 :     assert( hStereoDft->res_cod_line_max <= L_FRAME8k );
    2701             : 
    2702       59115 :     IF( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
    2703             :     {
    2704             :         /* Windowing */
    2705             :         /* overlapping parts */
    2706             :         /*input_8k-=STEREO_DFT_OVL_8k;*/
    2707     1235968 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    2708             :         {
    2709             :             // win[i] = input_8k[i] * hStereoDft->win_mdct_8k[i];
    2710     1218560 :             win[i] = extract_h( Mpy_32_32( input_8k[i], hStereoDft->win_mdct_8k_fx[i] /*Q31*/ ) );
    2711     1218560 :             move32();
    2712             :             // win[L_FRAME8k + i] = input_8k[L_FRAME8k + i] * hStereoDft->win_mdct_8k[STEREO_DFT_OVL_8k - 1 - i];
    2713     1218560 :             win[L_FRAME8k + i] = extract_h( Mpy_32_32( input_8k[L_FRAME8k + i], hStereoDft->win_mdct_8k_fx[STEREO_DFT_OVL_8k - 1 - i] /*Q31*/ ) );
    2714     1218560 :             move32();
    2715             :         }
    2716             :         /* middle part */
    2717     1584128 :         FOR( ; i < L_FRAME8k; i++ )
    2718             :         {
    2719     1566720 :             win[i] = extract_h( input_8k[i] );
    2720     1566720 :             move32();
    2721             :         }
    2722             : 
    2723             :         /* MDCT analysis */
    2724             :         // TCX_MDCT_flt( win, MDCT_RES, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    2725       17408 :         MDCT_RES_e = 17;
    2726       17408 :         move16();
    2727       17408 :         TCX_MDCT( win, MDCT_RES, &MDCT_RES_e, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    2728             : 
    2729             :         /*Compute the DMX to RES for each band*/
    2730       17408 :         max_snr = 0; /*minimum gain for residual coding -> no coding*/
    2731       17408 :         move32();
    2732      104448 :         FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    2733             :         {
    2734             :             /*Get side gain information and it is we*/
    2735       87040 :             panning_gain = hStereoDft->side_gain_fx[STEREO_DFT_OFFSET * STEREO_DFT_BAND_MAX + b];
    2736       87040 :             panning_gain_min = L_sub( MAX_32, L_abs( panning_gain ) );
    2737             : 
    2738             :             // in_phase_ratio = ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] ) / ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] + hStereoDft->res_cod_NRG_S[b] + 1 );
    2739       87040 :             L_tmp1 = Mpy_32_32( Mpy_32_32( panning_gain_min, panning_gain_min ), hStereoDft->res_cod_NRG_M_fx[b] );
    2740       87040 :             L_tmp2 = L_tmp1;
    2741       87040 :             L_tmp2_e = hStereoDft->res_cod_NRG_M_fx_e[b];
    2742       87040 :             L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], &L_tmp2_e );
    2743       87040 :             L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e );
    2744       87040 :             in_phase_ratio = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &in_phase_ratio_e );
    2745       87040 :             in_phase_ratio_e = add( in_phase_ratio_e, sub( hStereoDft->res_cod_NRG_M_fx_e[b], L_tmp2_e ) );
    2746       87040 :             in_phase_ratio = L_shl_sat( in_phase_ratio, in_phase_ratio_e ); // Q31 : bound from 0.0 to 1.0
    2747       87040 :             in_phase_ratio = L_max( 0, in_phase_ratio );
    2748             :             // in_phase_ratio = check_bounds(in_phase_ratio, 0, 1);
    2749             : 
    2750             :             // res_cod_gain[b] = in_phase_ratio * STEREO_DFT_RES_COD_SNR_MIN + ( 1 - in_phase_ratio ) * STEREO_DFT_RES_COD_SNR_MAX;
    2751       87040 :             res_cod_gain[b] = L_add( Mpy_32_32( in_phase_ratio, STEREO_DFT_RES_COD_SNR_MIN_Q25 ), Mpy_32_32( L_sub( MAX_32, in_phase_ratio ), STEREO_DFT_RES_COD_SNR_MAX_Q25 ) ); // Q25
    2752       87040 :             move32();
    2753             : 
    2754             :             /*get the maximum through bands*/
    2755       87040 :             if ( GT_32( res_cod_gain[b], max_snr ) )
    2756             :             {
    2757       44361 :                 max_snr = res_cod_gain[b];
    2758       44361 :                 move32();
    2759             :             }
    2760             :         }
    2761             : 
    2762             :         /*Smooth max_snr because of several perturbations in computation*/
    2763       17408 :         hStereoDft->old_snr_fx = L_add( Mpy_32_32( 429496730 /*0.2f*/, max_snr ), Mpy_32_32( 1717986918 /*0.8f*/, hStereoDft->old_snr_fx ) );
    2764       17408 :         move32();
    2765       17408 :         max_snr = hStereoDft->old_snr_fx;
    2766       17408 :         move32();
    2767             : 
    2768       17408 :         if ( LT_32( max_snr, STEREO_DFT_RES_COD_SNR_MIN_Q25 ) )
    2769             :         {
    2770         544 :             max_snr = STEREO_DFT_RES_COD_SNR_MIN_Q25;
    2771         544 :             move32();
    2772             :         }
    2773             : 
    2774       17408 :         push_wmops( "residual_encode" );
    2775             :         /* residual encoding */
    2776       17408 :         ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_enc_state );
    2777       17408 :         rc_uni_enc_init_fx( &range_uni_enc_state );
    2778             : 
    2779       17408 :         ecsq_inst.bit_count_estimate = 0;
    2780       17408 :         move32();
    2781       17408 :         ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET], 1 ), 1 );
    2782       17408 :         move16();
    2783             : 
    2784             :         /* 7 bits (STEREO_DFT_RES_GLOBAL_GAIN_BITS) for global_gain_index, 2 bits for closing of the arithmetic coder, 8 safety bits to account for the size estimation accuracy */
    2785       17408 :         ECSQ_encode_target_SNR_fx( &ecsq_inst, MDCT_RES, MDCT_RES_e, hStereoDft->res_cod_line_max, max_snr, max_bits - ( *nb_bits ) - STEREO_DFT_RES_GLOBAL_GAIN_BITS - 2 - 8, NULL, &global_gain_index );
    2786       17408 :         IF( NE_16( global_gain_index, ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO ) )
    2787             :         {
    2788       16526 :             total_bit_count = rc_uni_enc_finish_fx( &range_uni_enc_state );
    2789             : 
    2790       16526 :             IF( LE_16( total_bit_count, sub( sub( max_bits, *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ) ) )
    2791             :             {
    2792             :                 Word16 idx;
    2793             :                 UWord8 *byte_buffer;
    2794             : 
    2795             :                 /* Global gain */
    2796       16526 :                 push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2797       16526 :                 ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2798       16526 :                 move16();
    2799             : 
    2800             :                 /* Push arithmetic coded bits */
    2801       16526 :                 byte_buffer = range_uni_enc_state.byte_buffer;
    2802      303422 :                 FOR( idx = 0; idx < shr( total_bit_count, 3 ); ++idx )
    2803             :                 {
    2804      286896 :                     push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx], 8 );
    2805             :                 }
    2806       16526 :                 IF( s_and( total_bit_count, 7 ) != 0 )
    2807             :                 {
    2808             :                     /* move the last 1 to 7 bits from the MSB position of the last byte to the LSB postion */
    2809       14407 :                     push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, shr( byte_buffer[idx], sub( 8, s_and( total_bit_count, 7 ) ) ), s_and( total_bit_count, 7 ) );
    2810             :                 }
    2811       16526 :                 ( *nb_bits ) = add( *nb_bits, total_bit_count );
    2812       16526 :                 move16();
    2813             :             }
    2814             :             ELSE
    2815             :             {
    2816             :                 /* Global gain -> 127*/
    2817           0 :                 global_gain_index = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO;
    2818           0 :                 move16();
    2819           0 :                 push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2820           0 :                 ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2821           0 :                 move16();
    2822             :             }
    2823             :         }
    2824             :         ELSE
    2825             :         {
    2826             :             /* Global gain -> 127*/
    2827         882 :             push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2828         882 :             ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2829         882 :             move16();
    2830             :         }
    2831             : 
    2832       17408 :         pop_wmops();
    2833             :     }
    2834             : 
    2835             : 
    2836       59115 :     return;
    2837             : }
    2838             : 
    2839             : /*-------------------------------------------------------------------------
    2840             :  * stereo_dft_enc_write_BS()
    2841             :  *
    2842             :  * Write DFT stereo bitstream
    2843             :  *-------------------------------------------------------------------------*/
    2844       53476 : void stereo_dft_enc_write_BS_fx(
    2845             :     CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure   */
    2846             :     Word16 *nb_bits      /* o  : number of bits written  */
    2847             : )
    2848             : {
    2849             :     Word16 b, k_offset, itd, nb, nbands, sp_aud_decision0;
    2850             :     Word16 NFFT_inner, nbands_full;
    2851             :     Word16 no_GR_ord;
    2852             :     Word16 encoded_ind_GR[STEREO_DFT_BAND_MAX];
    2853             :     Word16 encoded_ind_pred_GR[STEREO_DFT_BAND_MAX];
    2854             :     Word16 sid_gIpd_index, sid_itd;
    2855             :     Word32 cohBand[STEREO_DFT_BAND_MAX / 2];
    2856             :     BSTR_ENC_HANDLE hBstr;
    2857             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
    2858             :     Word32 core_brate;
    2859             : 
    2860             :     /*------------------------------------------------------------------*
    2861             :      * Initialization
    2862             :      *-----------------------------------------------------------------*/
    2863             : 
    2864       53476 :     hStereoDft = hCPE->hStereoDft;
    2865       53476 :     hBstr = hCPE->hMetaData;
    2866       53476 :     core_brate = hCPE->hCoreCoder[0]->core_brate;
    2867       53476 :     move32();
    2868             : 
    2869       53476 :     sp_aud_decision0 = 0;
    2870       53476 :     move16();
    2871       53476 :     if ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) )
    2872             :     {
    2873       53114 :         sp_aud_decision0 = hCPE->hCoreCoder[0]->sp_aud_decision0;
    2874       53114 :         move16();
    2875             :     }
    2876             : 
    2877       53476 :     *nb_bits = 0;
    2878       53476 :     move16();
    2879       53476 :     k_offset = STEREO_DFT_OFFSET;
    2880       53476 :     move16();
    2881             : 
    2882       53476 :     nbands_full = hStereoDft->nbands;
    2883       53476 :     move16();
    2884             : 
    2885       53476 :     test();
    2886       53476 :     IF( ( core_brate == FRAME_NO_DATA ) || EQ_32( core_brate, SID_2k40 ) )
    2887             :     {
    2888        9779 :         NFFT_inner = s_min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k );
    2889        9779 :         hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
    2890        9779 :         move16();
    2891        9779 :         hStereoDft->res_pred_mode[k_offset] = 0;
    2892        9779 :         move16();
    2893        9779 :         hStereoDft->res_cod_mode[k_offset] = 0;
    2894        9779 :         move16();
    2895             :     }
    2896             :     ELSE
    2897             :     {
    2898             :         // NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k;
    2899       43697 :         NFFT_inner = shl( inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth], 1 );
    2900             :     }
    2901             : 
    2902             :     /* set number of bands according to bandwidth after BWD */
    2903       53476 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC );
    2904       53476 :     move16();
    2905             : 
    2906       53476 :     IF( core_brate == FRAME_NO_DATA )
    2907             :     {
    2908             :         /* No data frame */
    2909        8330 :         ( *nb_bits ) = 0;
    2910        8330 :         move16();
    2911        8330 :         return;
    2912             :     }
    2913             : 
    2914             :     /* attack present */
    2915             :     /* attackPresent not sent in inactive frames, receiver assumes = 0  */
    2916       45146 :     IF( NE_32( core_brate, SID_2k40 ) )
    2917             :     {
    2918       43697 :         push_indice( hBstr, IND_STEREO_DFT_ATTACK_PRESENT, hStereoDft->attackPresent, 1 );
    2919       43697 :         ( *nb_bits ) = add( *nb_bits, 1 );
    2920       43697 :         move16();
    2921             :     }
    2922             : 
    2923             :     /* Writing coding residual coding mode into bitstream */
    2924       45146 :     test();
    2925       45146 :     IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hCPE->hCoreCoder[0]->bwidth, WB ) )
    2926             :     {
    2927        3241 :         push_indice( hBstr, IND_STEREO_DFT_RES_COD, hStereoDft->res_cod_mode[k_offset], 1 );
    2928        3241 :         ( *nb_bits ) = add( *nb_bits, 1 );
    2929        3241 :         move16();
    2930        3241 :         hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
    2931        3241 :         move16();
    2932        3241 :         hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
    2933        3241 :         move16();
    2934             :     }
    2935             : 
    2936             : 
    2937       45146 :     if ( LT_16( nbands_full, hStereoDft->nbands ) )
    2938             :     {
    2939           0 :         hStereoDft->reverb_flag = 0;
    2940           0 :         move16();
    2941             :     }
    2942             : 
    2943             :     /* Side gains */
    2944       45146 :     hStereoDft->side_gain_flag_1 = 0; /* EC coding by default */
    2945       45146 :     move16();
    2946       45146 :     side_gain_mode_decision_fx( hStereoDft, encoded_ind_GR, sp_aud_decision0, hCPE->hCoreCoder[0]->last_core_brate );
    2947             : 
    2948             :     /* residual pred. gains */
    2949       45146 :     hStereoDft->res_pred_flag_1 = 0; /* EC coding by default */
    2950       45146 :     move16();
    2951             : 
    2952       45146 :     res_pred_gain_mode_decision_fx( hStereoDft, encoded_ind_pred_GR, k_offset, hCPE->hCoreCoder[0]->last_core_brate );
    2953             : 
    2954             :     /*------------------------------------------------------------------*
    2955             :      * write ITD indices
    2956             :      *-----------------------------------------------------------------*/
    2957             : 
    2958       45146 :     IF( NE_32( core_brate, SID_2k40 ) )
    2959             :     {
    2960       43697 :         push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, ( hStereoDft->hItd->itd_fx[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS );
    2961       43697 :         ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/
    2962       43697 :         move16();
    2963             :     }
    2964             : 
    2965       45146 :     IF( NE_32( core_brate, SID_2k40 ) )
    2966             :     {
    2967       43697 :         IF( hStereoDft->hItd->itd_fx[k_offset] )
    2968             :         {
    2969       26040 :             itd = hStereoDft->hItd->itd_index[k_offset];
    2970       26040 :             move16();
    2971       26040 :             IF( GT_16( itd, 255 ) )
    2972             :             {
    2973       16778 :                 itd = sub( itd, 256 );
    2974             : 
    2975       16778 :                 IF( LT_16( itd, 20 ) )
    2976             :                 {
    2977        9689 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
    2978        9689 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 );  /* negative */
    2979        9689 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
    2980        9689 :                     ( *nb_bits ) = add( *nb_bits, add( dft_len_itd[itd], 2 ) );
    2981        9689 :                     move16();
    2982             :                 }
    2983             :                 ELSE
    2984             :                 {
    2985        7089 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 0, 1 ); /* don't use Huffman */
    2986        7089 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 );  /* negative */
    2987        7089 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS - 1 );
    2988        7089 :                     ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_NBITS + 1 );
    2989        7089 :                     move16();
    2990             :                 }
    2991             :             }
    2992             :             ELSE
    2993             :             {
    2994        9262 :                 IF( LT_16( itd, 20 ) )
    2995             :                 {
    2996        4003 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
    2997        4003 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 );  /* positive */
    2998        4003 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
    2999        4003 :                     ( *nb_bits ) = add( *nb_bits, add( dft_len_itd[itd], 2 ) );
    3000        4003 :                     move16();
    3001             :                 }
    3002             :                 ELSE
    3003             :                 {
    3004             :                     /* don't use Huffman and positive*/
    3005        5259 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS + 1 );
    3006        5259 :                     ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_NBITS + 1 );
    3007        5259 :                     move16();
    3008             :                 }
    3009             :             }
    3010             :         }
    3011             :     }
    3012             : 
    3013             : #ifdef DEBUG_MODE_DFT_BITS
    3014             :     fprintf( ITD_bits, "%d ", *nb_bits );
    3015             : #endif
    3016             : 
    3017             :     /*------------------------------------------------------------------*
    3018             :      * write Side gain indices
    3019             :      *-----------------------------------------------------------------*/
    3020             : 
    3021             :     /* Side Gain flag 1 */
    3022       45146 :     nb = 0;
    3023       45146 :     move16();
    3024       45146 :     IF( hStereoDft->side_gain_flag_1 > 0 )
    3025             :     {
    3026        9985 :         push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, 2 );
    3027        9985 :         nb = add( nb, 2 );
    3028             :     }
    3029             :     ELSE
    3030             :     {
    3031       35161 :         push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, STEREO_DFT_FLAG_BITS );
    3032       35161 :         nb = add( nb, STEREO_DFT_FLAG_BITS );
    3033             :     }
    3034             : 
    3035       45146 :     no_GR_ord = 3;
    3036       45146 :     move16();
    3037             : 
    3038       45146 :     IF( hStereoDft->side_gain_flag_1 == 0 )
    3039             :     {
    3040       35161 :         nb = add( nb, write_bitstream_adapt_GR_fx( hBstr, IND_STEREO_DFT_SIDEGAINS, encoded_ind_GR, hStereoDft->nbands, hStereoDft->side_gain_flag_2, no_GR_ord ) );
    3041             :     }
    3042             :     ELSE{
    3043        9985 :         IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ){
    3044        8903 :             nb = add( nb, write_bitstream_GR_fx( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_ECDiff, hStereoDft->nbands, hStereoDft->side_gain_flag_2 - no_GR_ord ) );
    3045             : }
    3046             : ELSE
    3047             : {
    3048        7338 :     FOR( b = 0; b < hStereoDft->nbands; b++ )
    3049             :     {
    3050             :         /*ILD*/
    3051        6256 :         push_indice( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_EC[b], STEREO_DFT_SIDEGAIN_NBITS );
    3052        6256 :         nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS );
    3053             :     }
    3054             : }
    3055             : }
    3056             : 
    3057             : /* nb bits are used for side gain*/
    3058       45146 : ( *nb_bits ) = add( *nb_bits, nb );
    3059       45146 : move16();
    3060             : #ifdef DEBUG_MODE_DFT_BITS
    3061             : fprintf( SG_bits, "%d ", nb );
    3062             : #endif
    3063       45146 : nb = 0;
    3064       45146 : move16();
    3065             : 
    3066       45146 : IF( EQ_32( core_brate, SID_2k40 ) )
    3067             : {
    3068        1449 :     stereo_dft_enc_sid_calc_coh_fx( hStereoDft, hCPE->hStereoCng->prev_cohBand_fx, &hCPE->hStereoCng->td_active, &hCPE->hStereoCng->first_SID, cohBand );
    3069             : 
    3070        1449 :     IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) ) )
    3071             :     {
    3072        1449 :         IF( NE_32( hStereoDft->hItd->itd_fx[k_offset], 0 ) )
    3073             :         {
    3074             :             /* Re-quantize ITD with lower resolution for Stereo CNG */
    3075          44 :             itd = hStereoDft->hItd->itd_index[k_offset];
    3076          44 :             move16();
    3077          44 :             if ( GT_16( itd, 255 ) )
    3078             :             {
    3079          35 :                 itd = sub( itd, 256 );
    3080             :             }
    3081          44 :             itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
    3082             : 
    3083          44 :             sid_itd = itd && 1;
    3084          44 :             move16();
    3085             :         }
    3086             :         ELSE
    3087             :         {
    3088        1405 :             sid_itd = 0;
    3089        1405 :             move16();
    3090             :         }
    3091             : 
    3092        1449 :         push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, sid_itd, STEREO_DFT_ITD_MODE_NBITS );
    3093        1449 :         ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/
    3094        1449 :         move16();
    3095             : 
    3096        1449 :         IF( sid_itd )
    3097             :         {
    3098          21 :             itd = hStereoDft->hItd->itd_index[k_offset];
    3099          21 :             move16();
    3100          21 :             IF( GT_16( itd, 255 ) )
    3101             :             {
    3102          12 :                 itd = sub( itd, 256 );
    3103          12 :                 itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
    3104             : 
    3105          12 :                 if ( GT_16( itd, ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) )
    3106             :                 {
    3107          12 :                     itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
    3108          12 :                     move16();
    3109             :                 }
    3110             : 
    3111          12 :                 push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */
    3112          12 :                 push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
    3113          12 :                 ( *nb_bits ) = add( *nb_bits, STEREO_DFT_SID_ITD_NBITS + 1 );
    3114          12 :                 move16();
    3115             :             }
    3116             :             ELSE
    3117             :             {
    3118           9 :                 itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
    3119             : 
    3120           9 :                 if ( GT_16( itd, ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) )
    3121             :                 {
    3122           8 :                     itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
    3123           8 :                     move16();
    3124             :                 }
    3125             : 
    3126           9 :                 push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* Positive */
    3127           9 :                 push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
    3128           9 :                 ( *nb_bits ) = add( *nb_bits, STEREO_DFT_SID_ITD_NBITS + 1 );
    3129           9 :                 move16();
    3130             :             }
    3131             :         }
    3132             :     }
    3133             : }
    3134             : 
    3135             : /*------------------------------------------------------------------*
    3136             :  * write IPD indices
    3137             :  *-----------------------------------------------------------------*/
    3138             : 
    3139       45146 : IF( NE_32( core_brate, SID_2k40 ) )
    3140             : {
    3141       43697 :     push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
    3142       43697 :     nb = add( nb, STEREO_DFT_FLAG_BITS ); /*IPD mode flag: 1bit*/
    3143             : 
    3144       43697 :     IF( hStereoDft->no_ipd_flag == 0 )
    3145             :     {
    3146        4086 :         push_indice( hBstr, IND_STEREO_DFT_GIPD, hStereoDft->gipd_index, STEREO_DFT_GIPD_NBITS );
    3147        4086 :         nb = add( nb, STEREO_DFT_GIPD_NBITS );
    3148             :     }
    3149             : }
    3150        1449 : ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) ) )
    3151             : {
    3152        1449 :     push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
    3153        1449 :     nb = add( nb, STEREO_DFT_FLAG_BITS ); /*IPD mode flag: 1bit*/
    3154             : 
    3155        1449 :     IF( hStereoDft->no_ipd_flag == 0 )
    3156             :     {
    3157         297 :         stereo_dft_quantize_ipd_fx( &hStereoDft->sid_gipd_fx, &hStereoDft->sid_gipd_fx, &sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
    3158         297 :         push_indice( hBstr, IND_STEREO_DFT_GIPD, sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
    3159         297 :         nb = add( nb, STEREO_DFT_SID_GIPD_NBITS );
    3160             :     }
    3161             : }
    3162             : 
    3163             : 
    3164             : #ifdef DEBUG_MODE_DFT_BITS
    3165             : fprintf( IPD_bits, "%d ", nb );
    3166             : #endif
    3167       45146 : ( *nb_bits ) = add( *nb_bits, nb );
    3168             : 
    3169             : /*----------------------------------------------------------------*
    3170             :  * Residual prediction
    3171             :  *----------------------------------------------------------------*/
    3172             : 
    3173       45146 : nb = 0; /* bits for residual pred gains */
    3174       45146 : move16();
    3175       45146 : IF( hStereoDft->res_pred_mode[k_offset] )
    3176             : {
    3177       43697 :     IF( hStereoDft->attackPresent == 0 )
    3178             :     {
    3179       42102 :         nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
    3180       42102 :         b = hStereoDft->res_pred_band_min;
    3181       42102 :         move16();
    3182             : 
    3183             :         /*Adaptive SF*/
    3184       42102 :         IF( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
    3185             :         {
    3186             :             /*read flag*/
    3187       25298 :             push_indice( hBstr, IND_STEREO_DFT_REVERB_MODE, hStereoDft->reverb_flag, STEREO_DFT_REVERB_MODE_NBITS );
    3188       25298 :             nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS );
    3189       25298 :             IF( hStereoDft->reverb_flag )
    3190             :             {
    3191        6818 :                 nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
    3192             :             }
    3193             :         }
    3194             : 
    3195             :         /* Res Pred Gain flag 0 */
    3196       42102 :         IF( hStereoDft->res_pred_flag_1 > 0 )
    3197             :         {
    3198       33693 :             push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, 2 );
    3199       33693 :             nb = add( nb, 2 ); /*pred gain mode flag: 2 bits*/
    3200             :         }
    3201             :         ELSE
    3202             :         {
    3203        8409 :             push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, STEREO_DFT_FLAG_BITS );
    3204        8409 :             nb = add( nb, STEREO_DFT_FLAG_BITS ); /*pred gain mode flag: 1bit*/
    3205             :         }
    3206             : 
    3207       42102 :         no_GR_ord = 2;
    3208       42102 :         move16();
    3209       42102 :         IF( hStereoDft->res_pred_flag_1 == 0 )
    3210             :         {
    3211        8409 :             IF( EQ_16( encoded_ind_pred_GR[0], dft_maps_rpg[8 * NO_SYMB_GR_PRED_G] ) )
    3212             :             {
    3213         975 :                 nb = add( nb, write_GR1_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, 1 ) );
    3214             :             }
    3215             :             ELSE
    3216             :             {
    3217        7434 :                 nb = add( nb, write_bitstream_adapt_GR_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2, 2 ) );
    3218             :             }
    3219             :         }
    3220             :         ELSE
    3221             :         {
    3222       33693 :             IF( EQ_16( hStereoDft->res_pred_flag_1, 2 ) )
    3223             :             {
    3224       30296 :                 nb = add( nb, write_bitstream_GR_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2 - no_GR_ord ) );
    3225             :             }
    3226             :             ELSE
    3227             :             {
    3228       23750 :                 FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    3229             :                 {
    3230       20353 :                     push_indice( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, hStereoDft->res_pred_index_EC[b], STEREO_DFT_RES_GAINS_BITS );
    3231       20353 :                     nb = add( nb, STEREO_DFT_RES_GAINS_BITS );
    3232             :                 }
    3233             :             }
    3234             :         }
    3235             :     }
    3236             :     ELSE
    3237             :     {
    3238        1595 :         set16_fx( hStereoDft->res_pred_index_ECprevious, 0, sub( hStereoDft->nbands, hStereoDft->res_pred_band_min ) );
    3239             :     }
    3240             : }
    3241             : ELSE
    3242             : {
    3243        1449 :     set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min );
    3244             : }
    3245             : 
    3246       45146 : ( *nb_bits ) = add( *nb_bits, nb );
    3247       45146 : move16();
    3248             : 
    3249       45146 : IF( EQ_32( core_brate, SID_2k40 ) )
    3250             : {
    3251        1449 :     stereo_dft_enc_sid_coh_fx( hBstr, hCPE->hStereoCng->mem_cohBand_fx, hStereoDft->nbands, nb_bits, cohBand );
    3252             : }
    3253             : 
    3254             : 
    3255       45146 : return;
    3256             : }
    3257             : 
    3258             : /*-------------------------------------------------------------------------
    3259             :  * stereo_dft_enc_compute_prm()
    3260             :  *
    3261             :  * Compute stereo parameters: IPD and SIDE_GAIN
    3262             :  * SIDE_GAIN: Interchannel Level Difference
    3263             :  * IPD: Interchannel Phase Difference: angle(L)-angle(R) = acos(<L,R>/(|L|.|R|)) or atan2(Img(L.R*)/Re(L.R*))
    3264             :  *------------------------------------------------------------------------*/
    3265             : 
    3266       59643 : static void stereo_dft_enc_compute_prm_fx(
    3267             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    3268             :     Word32 *DFT_L_fx, // Q(31-DFT_L_fx_e[])
    3269             :     Word16 *DFT_L_fx_e,
    3270             :     Word32 *DFT_R_fx, // Q(31-DFT_R_fx_e[])
    3271             :     Word16 *DFT_R_fx_e,
    3272             :     Word16 k_offset,
    3273             :     Word16 flag_quant,
    3274             :     const Word16 sp_aud_decision0,
    3275             :     const Word16 vad_flag,
    3276             :     Word32 *bin_nrgL_fx, // Q(31-bin_nrgL_fx_e[])
    3277             :     Word16 *bin_nrgL_fx_e,
    3278             :     Word32 *bin_nrgR_fx, // Q(31-bin_nrgR_fx_e[])
    3279             :     Word16 *bin_nrgR_fx_e,
    3280             :     Word32 *dot_prod_nrg_ratio_fx, // Q(31-dot_prod_nrg_ratio_fx_e[])
    3281             :     Word16 *dot_prod_nrg_ratio_fx_e )
    3282             : {
    3283             :     Word16 b, i;
    3284             :     Word16 b2;
    3285             :     Word32 *pDFT_L, *pDFT_R;
    3286             :     // Word16 DFT_L_e, DFT_R_e;
    3287             :     Word32 sum_nrg_L, sum_nrg_R;
    3288             :     Word16 sum_nrg_L_e, sum_nrg_R_e;
    3289             :     Word32 dot_prod_real, dot_prod_img;
    3290             :     Word16 dot_prod_real_e, dot_prod_img_e;
    3291             :     Word32 sum_nrg_L2, sum_nrg_R2;
    3292             :     Word16 sum_nrg_L2_e, sum_nrg_R2_e;
    3293             :     Word32 dot_prod_real2, dot_prod_img2;
    3294             :     Word16 dot_prod_real2_e, dot_prod_img2_e;
    3295             :     Word32 *pPredGain;
    3296             :     Word32 *pSideGain;
    3297             :     Word32 sum_energy_L, sum_energy_R;
    3298             :     Word16 sum_energy_L_e, sum_energy_R_e;
    3299             :     Word32 g, c;
    3300             :     Word16 /*g,*/ c_e;
    3301             :     Word32 abs_L_R;
    3302             :     Word16 abs_L_R_e;
    3303             :     Word32 abs_L_R2;
    3304             :     Word16 abs_L_R2_e;
    3305             :     Word32 gain_IPD; // Q31
    3306             :     Word32 sub_nrg_DMX[STEREO_DFT_BAND_MAX];
    3307             :     Word16 sub_nrg_DMX_e[STEREO_DFT_BAND_MAX];
    3308             :     Word32 sub_nrg_DMX2;
    3309             :     Word16 sub_nrg_DMX2_e;
    3310             :     Word32 sub_nrg_L[STEREO_DFT_BAND_MAX];
    3311             :     Word16 sub_nrg_L_e[STEREO_DFT_BAND_MAX];
    3312             :     Word32 sub_nrg_R[STEREO_DFT_BAND_MAX];
    3313             :     Word16 sub_nrg_R_e[STEREO_DFT_BAND_MAX];
    3314             :     Word32 diff_ipd;
    3315             :     Word32 *pNrgL, *pNrgR;
    3316             :     Word16 *pNrgL_e, *pNrgR_e;
    3317             :     Word32 reg;
    3318             :     Word16 reg_e;
    3319             :     Word32 *pgIpd, sum_dot_prod_real, sum_dot_prod_img;
    3320             :     Word16 sum_dot_prod_real_e, sum_dot_prod_img_e;
    3321             :     Word32 sum_past_nrgL, sum_past_nrgL2;
    3322             :     Word16 sum_past_nrgL_e, sum_past_nrgL2_e;
    3323             :     Word32 sum_past_nrgR, sum_past_nrgR2;
    3324             :     Word16 sum_past_nrgR_e, sum_past_nrgR2_e;
    3325             :     Word32 sum_past_dpr, sum_past_dpr2;
    3326             :     Word16 sum_past_dpr_e, sum_past_dpr2_e;
    3327             :     Word32 sum_past_dpi, sum_past_dpi2;
    3328             :     Word16 sum_past_dpi_e, sum_past_dpi2_e;
    3329             :     Word32 sum_past_dot_prod_abs, sum_past_dot_prod_abs2;
    3330       59643 :     Word16 sum_past_dot_prod_abs_e, sum_past_dot_prod_abs2_e = 0;
    3331             :     Word32 sum_past_nrg_dmx;
    3332             :     Word16 sum_past_nrg_dmx_e;
    3333             :     Word16 pos;
    3334             :     Word32 pIpd[STEREO_DFT_BAND_MAX];       // Q13
    3335             :     Word32 ipd_smooth[STEREO_DFT_BAND_MAX]; // Q13
    3336             :     Word32 ipd_mean_change;                 // Q13
    3337             : 
    3338             :     Word32 L_tmp;
    3339             :     Word16 L_tmp_e;
    3340             :     Word32 L_tmp1;
    3341             :     Word16 L_tmp1_e;
    3342             :     Word32 L_tmp2;
    3343             :     Word16 L_tmp2_e;
    3344             :     Word64 W_tmp;
    3345             :     Word16 W_shift;
    3346       59643 :     move16();
    3347             : 
    3348             :     /*Word16 past_nrgL_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
    3349             :     Word16 past_nrgR_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
    3350             :     Word16 past_dot_prod_real_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
    3351             :     Word16 past_dot_prod_imag_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
    3352             :     set16_fx(past_nrgL_fx_tmp_e, hStereoDft->past_nrgL_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
    3353             :     set16_fx(past_nrgR_fx_tmp_e, hStereoDft->past_nrgR_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
    3354             :     set16_fx(past_dot_prod_real_fx_tmp_e, hStereoDft->past_dot_prod_real_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
    3355             :     set16_fx(past_dot_prod_imag_fx_tmp_e, hStereoDft->past_dot_prod_imag_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);*/
    3356             : 
    3357             :     /*------------------------------------------------------------------*
    3358             :      * Initialization
    3359             :      *-----------------------------------------------------------------*/
    3360             : 
    3361       59643 :     sum_past_dot_prod_abs2 = 0;
    3362       59643 :     move16();
    3363       59643 :     pos = hStereoDft->nrg_past_pos;
    3364       59643 :     move16();
    3365             : 
    3366       59643 :     set32_fx( sub_nrg_DMX, 0, STEREO_DFT_BAND_MAX );
    3367       59643 :     set16_fx( sub_nrg_DMX_e, 0, STEREO_DFT_BAND_MAX );
    3368       59643 :     set32_fx( sub_nrg_L, 0, STEREO_DFT_BAND_MAX );
    3369       59643 :     set16_fx( sub_nrg_L_e, 0, STEREO_DFT_BAND_MAX );
    3370       59643 :     set32_fx( sub_nrg_R, 0, STEREO_DFT_BAND_MAX );
    3371       59643 :     set16_fx( sub_nrg_R_e, 0, STEREO_DFT_BAND_MAX );
    3372             : 
    3373       59643 :     pSideGain = hStereoDft->side_gain_fx + k_offset * STEREO_DFT_BAND_MAX;     // Q31
    3374       59643 :     pgIpd = hStereoDft->gipd_fx + k_offset;                                    // Q13
    3375       59643 :     pPredGain = hStereoDft->res_pred_gain_fx + k_offset * STEREO_DFT_BAND_MAX; // Q31
    3376             :     // gain_IPD = EPSILON;
    3377       59643 :     gain_IPD = 0;
    3378       59643 :     move32();
    3379       59643 :     sum_energy_L = EPSILON_FX_M; /* Set the accumulations for the no IPD Calculation */
    3380       59643 :     move32();
    3381       59643 :     sum_energy_L_e = EPSILON_FX_E; /* Set the accumulations for the no IPD Calculation */
    3382       59643 :     move16();
    3383       59643 :     sum_energy_R = EPSILON_FX_M;
    3384       59643 :     move32();
    3385       59643 :     sum_energy_R_e = EPSILON_FX_E;
    3386       59643 :     move16();
    3387       59643 :     sum_dot_prod_real = EPSILON_FX_M;
    3388       59643 :     move32();
    3389       59643 :     sum_dot_prod_real_e = EPSILON_FX_E;
    3390       59643 :     move16();
    3391       59643 :     sum_dot_prod_img = EPSILON_FX_M;
    3392       59643 :     move32();
    3393       59643 :     sum_dot_prod_img_e = EPSILON_FX_E;
    3394       59643 :     move16();
    3395       59643 :     sub_nrg_DMX2 = 0;
    3396       59643 :     move32();
    3397       59643 :     sub_nrg_DMX2_e = 0;
    3398       59643 :     move16();
    3399             : 
    3400             :     /*------------------------------------------------------------------*
    3401             :      * Band-wise processing
    3402             :      *-----------------------------------------------------------------*/
    3403             : 
    3404       59643 :     b2 = 0;
    3405       59643 :     move16();
    3406      607465 :     FOR( b = 0; b < hStereoDft->nbands; b++ )
    3407             :     {
    3408      547822 :         pPredGain[b] = MAX_32;
    3409      547822 :         move32();
    3410      547822 :         sum_nrg_L = EPSILON_FX_M;
    3411      547822 :         move32();
    3412      547822 :         sum_nrg_L_e = EPSILON_FX_E;
    3413      547822 :         move16();
    3414      547822 :         sum_nrg_R = EPSILON_FX_M;
    3415      547822 :         move32();
    3416      547822 :         sum_nrg_R_e = EPSILON_FX_E;
    3417      547822 :         move16();
    3418      547822 :         dot_prod_real = EPSILON_FX_M;
    3419      547822 :         move32();
    3420      547822 :         dot_prod_real_e = EPSILON_FX_E;
    3421      547822 :         move16();
    3422      547822 :         dot_prod_img = EPSILON_FX_M;
    3423      547822 :         move32();
    3424      547822 :         dot_prod_img_e = EPSILON_FX_E;
    3425      547822 :         move16();
    3426      547822 :         sum_past_nrgL = 0;
    3427      547822 :         move32();
    3428      547822 :         sum_past_nrgL_e = 0;
    3429      547822 :         move16();
    3430      547822 :         sum_past_nrgR = 0;
    3431      547822 :         move32();
    3432      547822 :         sum_past_nrgR_e = 0;
    3433      547822 :         move16();
    3434      547822 :         sum_past_dpr = 0;
    3435      547822 :         move32();
    3436      547822 :         sum_past_dpr_e = 0;
    3437      547822 :         move16();
    3438      547822 :         sum_past_dpi = 0;
    3439      547822 :         move32();
    3440      547822 :         sum_past_dpi_e = 0;
    3441      547822 :         move16();
    3442             : 
    3443     1248842 :         WHILE( hStereoDft->band_limits_dmx[b2] < hStereoDft->band_limits[b + 1] )
    3444             :         {
    3445      701020 :             pDFT_L = DFT_L_fx;
    3446             :             // DFT_L_e = hStereoDft->DFT_fx_e[0];
    3447      701020 :             pDFT_R = DFT_R_fx;
    3448             :             // DFT_R_e = hStereoDft->DFT_fx_e[1];
    3449      701020 :             pNrgL = bin_nrgL_fx;
    3450      701020 :             pNrgL_e = bin_nrgL_fx_e;
    3451      701020 :             pNrgR = bin_nrgR_fx;
    3452      701020 :             pNrgR_e = bin_nrgR_fx_e;
    3453             : 
    3454      701020 :             sum_nrg_L2 = EPSILON_FX_M;
    3455      701020 :             move32();
    3456      701020 :             sum_nrg_L2_e = EPSILON_FX_E;
    3457      701020 :             move16();
    3458      701020 :             sum_nrg_R2 = EPSILON_FX_M;
    3459      701020 :             move32();
    3460      701020 :             sum_nrg_R2_e = EPSILON_FX_E;
    3461      701020 :             move16();
    3462      701020 :             dot_prod_real2 = EPSILON_FX_M;
    3463      701020 :             move32();
    3464      701020 :             dot_prod_real2_e = EPSILON_FX_E;
    3465      701020 :             move16();
    3466      701020 :             dot_prod_img2 = EPSILON_FX_M;
    3467      701020 :             move32();
    3468      701020 :             dot_prod_img2_e = EPSILON_FX_E;
    3469      701020 :             move16();
    3470             : 
    3471    38239777 :             FOR( i = hStereoDft->band_limits_dmx[b2]; i < hStereoDft->band_limits_dmx[b2 + 1]; i++ )
    3472             :             {
    3473             :                 // sum_nrg_L2 += pNrgL[i];
    3474    37538757 :                 sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, pNrgL[i], pNrgL_e[i], &sum_nrg_L2_e );
    3475             :                 // sum_nrg_R2 += pNrgR[i];
    3476    37538757 :                 sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, pNrgR[i], pNrgR_e[i], &sum_nrg_R2_e );
    3477             : 
    3478             :                 /* compute dot product*/
    3479             :                 // dot_prod_real2 += pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1];
    3480    37538757 :                 L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_R[2 * i] ), add( DFT_L_fx_e[2 * i], DFT_R_fx_e[2 * i] ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_R[2 * i + 1] ), add( DFT_L_fx_e[2 * i + 1], DFT_R_fx_e[2 * i + 1] ), &L_tmp_e );
    3481    37538757 :                 dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp, L_tmp_e, &dot_prod_real2_e );
    3482             :                 // dot_prod_img2 += pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1];
    3483    37538757 :                 L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i + 1], pDFT_R[2 * i] ), add( DFT_L_fx_e[2 * i + 1], DFT_R_fx_e[2 * i] ), L_negate( Mpy_32_32( pDFT_L[2 * i], pDFT_R[2 * i + 1] ) ), add( DFT_L_fx_e[2 * i], DFT_R_fx_e[2 * i + 1] ), &L_tmp_e );
    3484    37538757 :                 dot_prod_img2 = BASOP_Util_Add_Mant32Exp( dot_prod_img2, dot_prod_img2_e, L_tmp, L_tmp_e, &dot_prod_img2_e );
    3485             :             }
    3486             :             // abs_L_R2 = sqrtf(dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2);
    3487      701020 :             abs_L_R2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real2, dot_prod_real2 ), shl( dot_prod_real2_e, 1 ), Mpy_32_32( dot_prod_img2, dot_prod_img2 ), shl( dot_prod_img2_e, 1 ), &abs_L_R2_e );
    3488      701020 :             abs_L_R2 = Sqrt32( abs_L_R2, &abs_L_R2_e );
    3489             :             // sub_nrg_DMX2 = sum_nrg_L2 + sum_nrg_R2 + 2 * abs_L_R2;
    3490      701020 :             L_tmp = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp_e );
    3491      701020 :             sub_nrg_DMX2 = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, abs_L_R2, add( abs_L_R2_e, 1 ), &sub_nrg_DMX2_e );
    3492             : 
    3493      701020 :             IF( LT_16( b2, hStereoDft->gipd_band_max ) )
    3494             :             {
    3495             :                 // hStereoDft->dot_prod_real_smooth[b2] = 0.5f * hStereoDft->dot_prod_real_smooth[b2] + 0.5f * dot_prod_real2;
    3496      477144 :                 hStereoDft->dot_prod_real_smooth_fx[b2] = BASOP_Util_Add_Mant32Exp( hStereoDft->dot_prod_real_smooth_fx[b2], sub( hStereoDft->dot_prod_real_smooth_fx_e[b2], 1 ), dot_prod_real2, sub( dot_prod_real2_e, 1 ), &hStereoDft->dot_prod_real_smooth_fx_e[b2] );
    3497      477144 :                 move32();
    3498             :                 // hStereoDft->dot_prod_img_smooth[b2] = 0.5f * hStereoDft->dot_prod_img_smooth[b2] + 0.5f * dot_prod_img2;
    3499      477144 :                 hStereoDft->dot_prod_img_smooth_fx[b2] = BASOP_Util_Add_Mant32Exp( hStereoDft->dot_prod_img_smooth_fx[b2], sub( hStereoDft->dot_prod_img_smooth_fx_e[b2], 1 ), dot_prod_img2, sub( dot_prod_img2_e, 1 ), &hStereoDft->dot_prod_img_smooth_fx_e[b2] );
    3500      477144 :                 move32();
    3501             :                 // pIpd[b2] = (float) atan2f( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] );
    3502      477144 :                 pIpd[b2] = BASOP_util_atan2( hStereoDft->dot_prod_img_smooth_fx[b2], hStereoDft->dot_prod_real_smooth_fx[b2], sub( hStereoDft->dot_prod_img_smooth_fx_e[b2], hStereoDft->dot_prod_real_smooth_fx_e[b2] ) ); // Q13
    3503      477144 :                 move32();
    3504             : 
    3505      477144 :                 ipd_smooth[b2] = stereo_dft_calc_mean_bipd_fx( &pIpd[b2], hStereoDft->ipd_buf_fx[b2] );
    3506      477144 :                 move32();
    3507             : 
    3508             :                 // gain_IPD += ( sum_nrg_L2 + sum_nrg_R2 + 2 * dot_prod_real2 ) / sub_nrg_DMX2 / hStereoDft->gipd_band_max;
    3509      477144 :                 L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp1_e );
    3510      477144 :                 L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &L_tmp1_e );
    3511      477144 :                 W_tmp = W_mult_32_32( sub_nrg_DMX2, hStereoDft->gipd_band_max );
    3512      477144 :                 W_shift = W_norm( W_tmp );
    3513      477144 :                 L_tmp2 = W_extract_h( W_shl( W_tmp, W_shift ) );
    3514      477144 :                 L_tmp2_e = sub( add( sub_nrg_DMX2_e, 31 ), W_shift );
    3515      477144 :                 L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e );
    3516      477144 :                 L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
    3517      477144 :                 L_tmp = L_shl( L_tmp, L_tmp_e );         // Q31hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_
    3518      477144 :                 gain_IPD = L_add_sat( gain_IPD, L_tmp ); // Q31: saturation expected
    3519             :             }
    3520             : 
    3521      701020 :             sum_past_nrgL2 = EPSILON_FX_M;
    3522      701020 :             move32();
    3523      701020 :             sum_past_nrgL2_e = EPSILON_FX_E;
    3524      701020 :             move16();
    3525      701020 :             sum_past_nrgR2 = EPSILON_FX_M;
    3526      701020 :             move32();
    3527      701020 :             sum_past_nrgR2_e = EPSILON_FX_E;
    3528      701020 :             move16();
    3529      701020 :             sum_past_dpr2 = EPSILON_FX_M;
    3530      701020 :             move32();
    3531      701020 :             sum_past_dpr2_e = EPSILON_FX_E;
    3532      701020 :             move16();
    3533      701020 :             sum_past_dpi2 = EPSILON_FX_M;
    3534      701020 :             move32();
    3535      701020 :             sum_past_dpi2_e = EPSILON_FX_E;
    3536      701020 :             move16();
    3537      701020 :             test();
    3538      701020 :             test();
    3539      701020 :             test();
    3540      701020 :             IF( ( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) && LT_16( b2, STEREO_DFT_NRG_PAST_MAX_BAND ) ) ||
    3541             :                 ( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) && LT_16( b2, 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) ) )
    3542             :             {
    3543      510214 :                 hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2;
    3544      510214 :                 move32();
    3545      510214 :                 hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2_e;
    3546      510214 :                 move16();
    3547      510214 :                 hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2;
    3548      510214 :                 move32();
    3549      510214 :                 hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2_e;
    3550      510214 :                 move16();
    3551      510214 :                 hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2;
    3552      510214 :                 move32();
    3553      510214 :                 hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2_e;
    3554      510214 :                 move16();
    3555      510214 :                 hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2;
    3556      510214 :                 move32();
    3557      510214 :                 hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2_e;
    3558      510214 :                 move16();
    3559             : 
    3560     2040856 :                 FOR( i = 0; i < STEREO_DFT_NRG_PAST_LEN; i++ )
    3561             :                 {
    3562             :                     // sum_past_nrgL2 += hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    3563     1530642 :                     sum_past_nrgL2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_nrgL2_e );
    3564             :                     // sum_past_nrgR2 += hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    3565     1530642 :                     sum_past_nrgR2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgR2, sum_past_nrgR2_e, hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_nrgR2_e );
    3566             :                     // sum_past_dpr2 += hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    3567     1530642 :                     sum_past_dpr2 = BASOP_Util_Add_Mant32Exp( sum_past_dpr2, sum_past_dpr2_e, hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_dpr2_e );
    3568             :                     // sum_past_dpi2 += hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    3569     1530642 :                     sum_past_dpi2 = BASOP_Util_Add_Mant32Exp( sum_past_dpi2, sum_past_dpi2_e, hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_dpi2_e );
    3570             :                 }
    3571             : 
    3572      510214 :                 IF( hStereoDft->attackPresent )
    3573             :                 {
    3574             :                     /* omit transient frames from past part of parameter estimation in following frames */
    3575       15692 :                     Word16 prev_pos = add( pos, STEREO_DFT_NRG_PAST_LEN - 1 ) % STEREO_DFT_NRG_PAST_LEN;
    3576       15692 :                     hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3577       15692 :                     move32();
    3578       15692 :                     hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3579       15692 :                     move16();
    3580       15692 :                     hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3581       15692 :                     move32();
    3582       15692 :                     hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3583       15692 :                     move16();
    3584       15692 :                     hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3585       15692 :                     move32();
    3586       15692 :                     hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3587       15692 :                     move16();
    3588       15692 :                     hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3589       15692 :                     move32();
    3590       15692 :                     hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    3591       15692 :                     move16();
    3592             :                 }
    3593             : 
    3594             :                 // sum_past_dot_prod_abs2 = sqrtf( sum_past_dpr2 * sum_past_dpr2 + sum_past_dpi2 * sum_past_dpi2 );
    3595      510214 :                 sum_past_dot_prod_abs2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( sum_past_dpr2, sum_past_dpr2 ), shl( sum_past_dpr2_e, 1 ), Mpy_32_32( sum_past_dpi2, sum_past_dpi2 ), shl( sum_past_dpi2_e, 1 ), &sum_past_dot_prod_abs2_e );
    3596      510214 :                 sum_past_dot_prod_abs2 = Sqrt32( sum_past_dot_prod_abs2, &sum_past_dot_prod_abs2_e );
    3597             :                 // dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON );
    3598      510214 :                 L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_past_nrgR2, sum_past_nrgR2_e, &L_tmp2_e );
    3599      510214 :                 L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e );
    3600      510214 :                 dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e );
    3601      510214 :                 move32();
    3602      510214 :                 L_tmp_e = add( L_tmp_e, sub( sum_past_dot_prod_abs2_e, L_tmp2_e ) );
    3603      510214 :                 dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31
    3604      510214 :                 move32();
    3605      510214 :                 dot_prod_nrg_ratio_fx_e[b2] = 0;
    3606      510214 :                 move16();
    3607             :                 // printf("\n%f\t", (float)dot_prod_nrg_ratio_fx[b2] / 0x7fffffff);
    3608             :             }
    3609             :             ELSE
    3610             :             {
    3611             :                 // sum_past_nrgL2 += sum_nrg_L2;
    3612      190806 :                 sum_past_nrgL2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_nrg_L2, sum_nrg_L2_e, &sum_past_nrgL2_e );
    3613             :                 // sum_past_nrgR2 += sum_nrg_R2;
    3614      190806 :                 sum_past_nrgR2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgR2, sum_past_nrgR2_e, sum_nrg_R2, sum_nrg_R2_e, &sum_past_nrgR2_e );
    3615             :                 // dot_prod_nrg_ratio[b2] = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 );
    3616      190806 :                 L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real2, dot_prod_real2 ), shl( dot_prod_real2_e, 1 ), Mpy_32_32( dot_prod_img2, dot_prod_img2 ), shl( dot_prod_img2_e, 1 ), &L_tmp_e );
    3617      190806 :                 L_tmp = Sqrt32( L_tmp, &L_tmp_e );
    3618      190806 :                 dot_prod_nrg_ratio_fx[b2] = L_tmp;
    3619      190806 :                 move32();
    3620      190806 :                 dot_prod_nrg_ratio_fx_e[b2] = L_tmp_e;
    3621      190806 :                 move16();
    3622      190806 :                 IF( EQ_16( b2, 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) ) /* hStereoDft->band_res[k_offset] == 2 */
    3623             :                 {
    3624             :                     // dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON );
    3625       26573 :                     L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp2_e );
    3626       26573 :                     L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e );
    3627       26573 :                     dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e );
    3628       26573 :                     move32();
    3629       26573 :                     L_tmp_e = add( L_tmp_e, sub( dot_prod_nrg_ratio_fx_e[b2], L_tmp2_e ) );
    3630       26573 :                     dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31
    3631       26573 :                     move32();
    3632       26573 :                     dot_prod_nrg_ratio_fx_e[b2] = 0;
    3633       26573 :                     move16();
    3634             :                 }
    3635             :             }
    3636             :             // sum_nrg_L += sum_nrg_L2;
    3637      701020 :             sum_nrg_L = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_L2, sum_nrg_L2_e, &sum_nrg_L_e );
    3638             :             // sum_nrg_R += sum_nrg_R2;
    3639      701020 :             sum_nrg_R = BASOP_Util_Add_Mant32Exp( sum_nrg_R, sum_nrg_R_e, sum_nrg_R2, sum_nrg_R2_e, &sum_nrg_R_e );
    3640             :             // dot_prod_real += dot_prod_real2;
    3641      701020 :             dot_prod_real = BASOP_Util_Add_Mant32Exp( dot_prod_real, dot_prod_real_e, dot_prod_real2, dot_prod_real2_e, &dot_prod_real_e );
    3642             :             // dot_prod_img += dot_prod_img2;
    3643      701020 :             dot_prod_img = BASOP_Util_Add_Mant32Exp( dot_prod_img, dot_prod_img_e, dot_prod_img2, dot_prod_img2_e, &dot_prod_img_e );
    3644             : 
    3645             :             // sum_past_nrgL += sum_past_nrgL2;
    3646      701020 :             sum_past_nrgL = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, sum_past_nrgL2, sum_past_nrgL2_e, &sum_past_nrgL_e );
    3647             :             // sum_past_nrgR += sum_past_nrgR2;
    3648      701020 :             sum_past_nrgR = BASOP_Util_Add_Mant32Exp( sum_past_nrgR, sum_past_nrgR_e, sum_past_nrgR2, sum_past_nrgR2_e, &sum_past_nrgR_e );
    3649             :             // sum_past_dpr += sum_past_dpr2;
    3650      701020 :             sum_past_dpr = BASOP_Util_Add_Mant32Exp( sum_past_dpr, sum_past_dpr_e, sum_past_dpr2, sum_past_dpr2_e, &sum_past_dpr_e );
    3651             :             // sum_past_dpi += sum_past_dpi2;
    3652      701020 :             sum_past_dpi = BASOP_Util_Add_Mant32Exp( sum_past_dpi, sum_past_dpi_e, sum_past_dpi2, sum_past_dpi2_e, &sum_past_dpi_e );
    3653             : 
    3654      701020 :             b2++;
    3655             :         }
    3656             :         // sum_energy_L += sum_nrg_L; /* Energies of the individual Band for Left and Right */
    3657      547822 :         sum_energy_L = BASOP_Util_Add_Mant32Exp( sum_energy_L, sum_energy_L_e, sum_nrg_L, sum_nrg_L_e, &sum_energy_L_e ); /* Energies of the individual Band for Left and Right */
    3658             :         // sum_energy_R += sum_nrg_R;
    3659      547822 :         sum_energy_R = BASOP_Util_Add_Mant32Exp( sum_energy_R, sum_energy_R_e, sum_nrg_R, sum_nrg_R_e, &sum_energy_R_e );
    3660             :         // sum_dot_prod_real += dot_prod_real;
    3661      547822 :         sum_dot_prod_real = BASOP_Util_Add_Mant32Exp( sum_dot_prod_real, sum_dot_prod_real_e, dot_prod_real, dot_prod_real_e, &sum_dot_prod_real_e );
    3662             :         // sum_dot_prod_img += dot_prod_img;
    3663      547822 :         sum_dot_prod_img = BASOP_Util_Add_Mant32Exp( sum_dot_prod_img, sum_dot_prod_img_e, dot_prod_img, dot_prod_img_e, &sum_dot_prod_img_e );
    3664             : 
    3665             :         /* compute side and residual gains over two frames */
    3666             :         // abs_L_R = sqrtf( dot_prod_real * dot_prod_real + dot_prod_img * dot_prod_img );
    3667      547822 :         abs_L_R = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real, dot_prod_real ), shl( dot_prod_real_e, 1 ), Mpy_32_32( dot_prod_img, dot_prod_img ), shl( dot_prod_img_e, 1 ), &abs_L_R_e );
    3668      547822 :         abs_L_R = Sqrt32( abs_L_R, &abs_L_R_e );
    3669             : 
    3670      547822 :         test();
    3671      547822 :         test();
    3672      547822 :         IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) && LT_16( b, 4 ) )
    3673             :         {
    3674             :             // sum_past_dot_prod_abs = sqrtf( sum_past_dpr * sum_past_dpr + sum_past_dpi * sum_past_dpi );
    3675      106292 :             sum_past_dot_prod_abs = BASOP_Util_Add_Mant32Exp( Mpy_32_32( sum_past_dpr, sum_past_dpr ), shl( sum_past_dpr_e, 1 ), Mpy_32_32( sum_past_dpi, sum_past_dpi ), shl( sum_past_dpi_e, 1 ), &sum_past_dot_prod_abs_e );
    3676      106292 :             sum_past_dot_prod_abs = Sqrt32( sum_past_dot_prod_abs, &sum_past_dot_prod_abs_e );
    3677             :         }
    3678      441530 :         ELSE IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) && LT_16( b, 9 ) )
    3679             :         {
    3680      297630 :             sum_past_dot_prod_abs = sum_past_dot_prod_abs2;
    3681      297630 :             move32();
    3682      297630 :             sum_past_dot_prod_abs_e = sum_past_dot_prod_abs2_e;
    3683      297630 :             move16();
    3684             :         }
    3685             :         ELSE
    3686             :         {
    3687      143900 :             sum_past_dot_prod_abs = abs_L_R;
    3688      143900 :             move32();
    3689      143900 :             sum_past_dot_prod_abs_e = abs_L_R_e;
    3690      143900 :             move16();
    3691             :         }
    3692             : 
    3693             :         // c = sqrtf( sum_past_nrgL / sum_past_nrgR );
    3694      547822 :         c = BASOP_Util_Divide3232_Scale_newton( sum_past_nrgL, sum_past_nrgR, &c_e );
    3695      547822 :         c_e = add( c_e, sub( sum_past_nrgL_e, sum_past_nrgR_e ) );
    3696      547822 :         c = Sqrt32( c, &c_e );
    3697             :         // sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs;
    3698      547822 :         sum_past_nrg_dmx = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, sum_past_nrgR, sum_past_nrgR_e, &sum_past_nrg_dmx_e );
    3699      547822 :         sum_past_nrg_dmx = BASOP_Util_Add_Mant32Exp( sum_past_nrg_dmx, sum_past_nrg_dmx_e, sum_past_dot_prod_abs, add( sum_past_dot_prod_abs_e, 1 ), &sum_past_nrg_dmx_e );
    3700             :         // sub_nrg_DMX[b] = sum_nrg_L + sum_nrg_R + 2 * abs_L_R;
    3701      547822 :         sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &sub_nrg_DMX_e[b] );
    3702      547822 :         move32();
    3703      547822 :         sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( sub_nrg_DMX[b], sub_nrg_DMX_e[b], abs_L_R, add( abs_L_R_e, 1 ), &sub_nrg_DMX_e[b] );
    3704      547822 :         move32();
    3705             : 
    3706      547822 :         sub_nrg_L[b] = sum_nrg_L;
    3707      547822 :         move32();
    3708      547822 :         sub_nrg_L_e[b] = sum_nrg_L_e;
    3709      547822 :         move16();
    3710      547822 :         sub_nrg_R[b] = sum_nrg_R;
    3711      547822 :         move32();
    3712      547822 :         sub_nrg_R_e[b] = sum_nrg_R_e;
    3713      547822 :         move16();
    3714             : 
    3715      547822 :         test();
    3716      547822 :         test();
    3717      547822 :         IF( ( hStereoDft->res_pred_mode[k_offset] && GE_16( b, hStereoDft->res_pred_band_min ) ) || LT_16( b, hStereoDft->res_cod_band_max ) )
    3718             :         {
    3719             :             // g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx );
    3720      522840 :             L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, L_negate( sum_past_nrgR ), sum_past_nrgR_e, &L_tmp1_e );
    3721      522840 :             L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_past_nrg_dmx, &L_tmp_e );
    3722      522840 :             L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, sum_past_nrg_dmx_e ) );
    3723      522840 :             g = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected
    3724      522840 :             pSideGain[b] = g;
    3725      522840 :             move32();
    3726             :         }
    3727             :         ELSE
    3728             :         {
    3729       24982 :             g = 0; /* to avoid compilation warning */
    3730       24982 :             move32();
    3731             :             // pSideGain[b] = ( c - 1 ) / ( c + 1 );
    3732       24982 :             L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e );
    3733       24982 :             L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e );
    3734       24982 :             L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e );
    3735       24982 :             L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
    3736       24982 :             pSideGain[b] = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected
    3737       24982 :             move32();
    3738             :         }
    3739             : 
    3740      547822 :         test();
    3741      547822 :         test();
    3742      547822 :         IF( hStereoDft->res_pred_mode[k_offset] && GE_16( b, hStereoDft->res_pred_band_min ) && !( hStereoDft->attackPresent ) )
    3743             :         {
    3744             :             /*(1-g)^2*L*L' + (1+g)^2*R*R' - 2(1-g^2)*abs(L*R')*/
    3745             :             // pPredGain[b] = max( 0, ( ( 1 - g ) * sum_past_nrgL + ( 1 + g ) * sum_past_nrgR - 2 * sum_past_dot_prod_abs ) );
    3746      409101 :             L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_negate( g ), 0, &L_tmp1_e );
    3747      409101 :             L_tmp1 = Mpy_32_32( L_tmp1, sum_past_nrgL );
    3748      409101 :             L_tmp1_e = add( L_tmp1_e, sum_past_nrgL_e );
    3749      409101 :             L_tmp2 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, g, 0, &L_tmp2_e );
    3750      409101 :             L_tmp2 = Mpy_32_32( L_tmp2, sum_past_nrgR );
    3751      409101 :             L_tmp2_e = add( L_tmp2_e, sum_past_nrgR_e );
    3752      409101 :             L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &L_tmp_e );
    3753      409101 :             L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, L_negate( sum_past_dot_prod_abs ), add( sum_past_dot_prod_abs_e, 1 ), &L_tmp_e );
    3754      409101 :             IF( L_tmp < 0 )
    3755             :             {
    3756         540 :                 L_tmp = 0;
    3757         540 :                 move32();
    3758         540 :                 L_tmp_e = 0;
    3759         540 :                 move16();
    3760             :             }
    3761             : 
    3762             :             /*Normalized with energy of DMX*/
    3763             : 
    3764             :             /*Regularized gain computation by adding a coherent low energy contribution->avoid singularity for very low energy signals */
    3765             : 
    3766             :             // reg = ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) * sqrtf( STEREO_DFT_N_32k_ENC );
    3767      409101 :             reg = L_mult0( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), 18318 /* sqrtf( STEREO_DFT_N_32k_ENC ) in Q9 */ );
    3768      409101 :             reg_e = norm_l( reg );
    3769      409101 :             reg = L_shl( reg, reg_e );
    3770      409101 :             reg_e = sub( 22, reg_e );
    3771             :             // reg *= reg;
    3772      409101 :             reg = Mpy_32_32( reg, reg );
    3773      409101 :             reg_e = shl( reg_e, 1 );
    3774             : 
    3775             :             // pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) );
    3776      409101 :             L_tmp2 = BASOP_Util_Add_Mant32Exp( reg, reg_e, sum_past_nrg_dmx, sum_past_nrg_dmx_e, &L_tmp2_e );
    3777      409101 :             L_tmp1 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp2, &L_tmp1_e );
    3778      409101 :             L_tmp1_e = add( L_tmp1_e, sub( L_tmp_e, L_tmp2_e ) );
    3779      409101 :             L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
    3780      409101 :             pPredGain[b] = L_shl( L_tmp1, L_tmp1_e ); // Q31
    3781      409101 :             move32();
    3782             : 
    3783      409101 :             IF( hStereoDft->hItd->deltaItd_fx[k_offset] != 0 )
    3784             :             {
    3785             :                 Word32 gain_offset, conversion_factor /*Q30*/;
    3786             :                 Word16 dItd32;
    3787             : 
    3788             :                 /* factor for converting deltaItd to 32kHz */
    3789      182855 :                 conversion_factor = ONE_IN_Q30 /*1.f*/;
    3790      182855 :                 move32();
    3791      182855 :                 IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
    3792             :                 {
    3793       34450 :                     conversion_factor = MAX_32 /*2.f*/;
    3794       34450 :                     move32();
    3795             :                 }
    3796      148405 :                 ELSE IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_MAX_ENC ) )
    3797             :                 {
    3798       69040 :                     conversion_factor = 715827883 /*2.f / 3*/;
    3799       69040 :                     move32();
    3800             :                 }
    3801             :                 // dItd32 = (int16_t) floorf( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f );
    3802      182855 :                 dItd32 = extract_l( L_shr_r( Mpy_32_32( conversion_factor, hStereoDft->hItd->deltaItd_fx[k_offset] ), Q15 ) ); // Q0
    3803             : 
    3804      182855 :                 gain_offset = stereo_dft_gain_offset_fx( c, c_e, dItd32 ); // Q31
    3805      182855 :                 pPredGain[b] = L_max( 0, L_sub( pPredGain[b], gain_offset ) );
    3806      182855 :                 move32();
    3807             :             }
    3808             : 
    3809             :             /*Limiter for active speech*/
    3810      409101 :             test();
    3811      409101 :             IF( sp_aud_decision0 == 0 && vad_flag )
    3812             :             {
    3813             :                 /*Avoid jump of residual prediction gain when ITD is changing*/
    3814      233134 :                 IF( NE_32( hStereoDft->hItd->deltaItd_fx[k_offset], hStereoDft->hItd->deltaItd_fx[0] ) )
    3815             :                 {
    3816       20936 :                     pPredGain[b] = L_min( hStereoDft->res_pred_gain_f_fx[b], pPredGain[b] );
    3817       20936 :                     move32();
    3818             :                 }
    3819             : 
    3820             :                 /*Limiter*/
    3821             :                 // hStereoDft->res_pred_gain_f[b] = 0.9f * hStereoDft->res_pred_gain_f[b] + 0.1f * pPredGain[b];
    3822      233134 :                 hStereoDft->res_pred_gain_f_fx[b] = L_add( Mpy_32_32( 1932735283 /* 0.9f in Q31*/, hStereoDft->res_pred_gain_f_fx[b] ), Mpy_32_32( 214748365 /* 0.1f in Q31*/, pPredGain[b] ) );
    3823      233134 :                 move32();
    3824             :                 // pPredGain[b] = min( 1.1f * hStereoDft->res_pred_gain_f[b], pPredGain[b] );
    3825      233134 :                 pPredGain[b] = L_shl( L_min( Mpy_32_32( 1181116006 /*1.1f in Q30*/, hStereoDft->res_pred_gain_f_fx[b] ), L_shr( pPredGain[b], 1 ) ), 1 );
    3826      233134 :                 move32();
    3827             :             }
    3828             :             ELSE
    3829             :             {
    3830      175967 :                 hStereoDft->res_pred_gain_f_fx[b] = pPredGain[b];
    3831      175967 :                 move32();
    3832             :             }
    3833             :         }
    3834             :         ELSE
    3835             :         {
    3836      138721 :             pPredGain[b] = 0;
    3837      138721 :             move32();
    3838             :         }
    3839             : 
    3840             : 
    3841      547822 :         IF( EQ_16( b2, hStereoDft->gipd_band_max ) )
    3842             :         {
    3843       59643 :             ipd_mean_change = stereo_dft_calc_mean_ipd_change_fx( pIpd, ipd_smooth, hStereoDft->gipd_band_max ); // Q13
    3844             :             // hStereoDft->sum_dot_prod_real = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_real + hStereoDft->sfm * sum_dot_prod_real;
    3845       59643 :             hStereoDft->sum_dot_prod_real_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_sub( MAX_32, hStereoDft->sfm_fx ), hStereoDft->sum_dot_prod_real_fx ), hStereoDft->sum_dot_prod_real_fx_e,
    3846             :                                                                          Mpy_32_32( hStereoDft->sfm_fx, sum_dot_prod_real ), sum_dot_prod_real_e, &hStereoDft->sum_dot_prod_real_fx_e );
    3847       59643 :             move32();
    3848             :             // hStereoDft->sum_dot_prod_img = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_img + hStereoDft->sfm * sum_dot_prod_img;
    3849       59643 :             hStereoDft->sum_dot_prod_img_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_sub( MAX_32, hStereoDft->sfm_fx ), hStereoDft->sum_dot_prod_img_fx ), hStereoDft->sum_dot_prod_img_fx_e,
    3850             :                                                                         Mpy_32_32( hStereoDft->sfm_fx, sum_dot_prod_img ), sum_dot_prod_img_e, &hStereoDft->sum_dot_prod_img_fx_e );
    3851       59643 :             move32();
    3852             : 
    3853             :             // pgIpd[0] = (float) atan2f( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real );
    3854       59643 :             pgIpd[0] = BASOP_util_atan2( hStereoDft->sum_dot_prod_img_fx, hStereoDft->sum_dot_prod_real_fx, sub( hStereoDft->sum_dot_prod_img_fx_e, hStereoDft->sum_dot_prod_real_fx_e ) ); // Q13
    3855       59643 :             move32();
    3856             : 
    3857       59643 :             stereo_dft_gipd_stabilization_fx( &pgIpd[0], hStereoDft->prev_gipd_fx, ipd_mean_change );
    3858       59643 :             hStereoDft->prev_gipd_fx = pgIpd[0];
    3859       59643 :             move32();
    3860             :         }
    3861             :     }
    3862       59643 :     hStereoDft->nrg_past_pos = ( pos + 1 ) % STEREO_DFT_NRG_PAST_LEN;
    3863       59643 :     move16();
    3864             : 
    3865             : 
    3866             :     /*------------------------------------------------------------------*
    3867             :      * Compute IPDs
    3868             :      *-----------------------------------------------------------------*/
    3869             : 
    3870       59643 :     stereo_dft_enc_get_nipd_flag_fx( hStereoDft, sp_aud_decision0, gain_IPD );
    3871             : 
    3872       59643 :     IF( flag_quant )
    3873             :     {
    3874       59643 :         IF( hStereoDft->no_ipd_flag == 0 )
    3875             :         {
    3876        6263 :             hStereoDft->sid_gipd_fx = *pgIpd;
    3877        6263 :             move32();
    3878        6263 :             stereo_dft_quantize_ipd_fx( pgIpd, pgIpd, &( hStereoDft->gipd_index ), STEREO_DFT_GIPD_NBITS );
    3879             :         }
    3880             :         ELSE
    3881             :         {
    3882       53380 :             pgIpd[0] = 0;
    3883       53380 :             move32();
    3884             :         }
    3885             :     }
    3886       59643 :     diff_ipd = L_sub( pgIpd[0], pgIpd[-1] );
    3887             : 
    3888       59643 :     IF( LT_32( diff_ipd, -EVS_PI_FX ) )
    3889             :     {
    3890         887 :         pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX );
    3891         887 :         move32();
    3892             :     }
    3893       58756 :     ELSE IF( GT_32( diff_ipd, EVS_PI_FX ) )
    3894             :     {
    3895        1573 :         pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX );
    3896        1573 :         move32();
    3897             :     }
    3898             : 
    3899       59643 :     IF( !hStereoDft->attackPresent )
    3900             :     {
    3901       57801 :         IF( hStereoDft->wasTransient )
    3902             :         {
    3903             :             // pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-1];
    3904        1736 :             pgIpd[0] = L_add( Mpy_32_32( 1717986918 /*0.8f in Q31*/, pgIpd[0] ), Mpy_32_32( 429496730 /*0.2f in Q31*/, pgIpd[-1] ) );
    3905        1736 :             move32();
    3906             :         }
    3907             :         ELSE
    3908             :         {
    3909             :             // pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-1];
    3910       56065 :             pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-1], 1 ) );
    3911       56065 :             move32();
    3912             :         }
    3913             :     }
    3914             : 
    3915             :     // c = sqrtf( sum_energy_L / sum_energy_R );
    3916       59643 :     c = BASOP_Util_Divide3232_Scale_newton( sum_energy_L, sum_energy_R, &c_e );
    3917       59643 :     c_e = add( c_e, sub( sum_energy_L_e, sum_energy_R_e ) );
    3918       59643 :     c = Sqrt32( c, &c_e );
    3919             : 
    3920             :     // g = fabsf( ( c - 1 ) / ( c + 1 ) );
    3921       59643 :     L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e );
    3922       59643 :     L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e );
    3923       59643 :     g = L_abs( BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ) );
    3924       59643 :     L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
    3925       59643 :     g = L_shl_sat( g, L_tmp_e ); // Q31 saturation expected
    3926       59643 :     IF( GT_32( g, 1717986918 /*0.8f in Q31*/ ) )
    3927             :     {
    3928             :         // g = max( 0.f, -10.f * g + 9.0f );
    3929         651 :         g = L_max( 0, L_sub( 1932735283 /*9.f/10.f in Q31*/, g ) );
    3930         651 :         W_tmp = W_mult0_32_32( g, 10 );
    3931         651 :         if ( GT_64( W_tmp, MAX_32 ) )
    3932             :         {
    3933           0 :             W_tmp = MAX_32;
    3934           0 :             move64();
    3935             :         }
    3936         651 :         g = W_extract_l( W_tmp ); // Q31
    3937        5554 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
    3938             :         {
    3939             :             // pPredGain[b] *= g;
    3940        4903 :             pPredGain[b] = Mpy_32_32( pPredGain[b], g );
    3941        4903 :             move32();
    3942             :         }
    3943             :     }
    3944             : 
    3945       59643 :     IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    3946             :     {
    3947       26573 :         hStereoDft->reverb_flag = 1;
    3948       26573 :         move16();
    3949             :     }
    3950             :     ELSE
    3951             :     {
    3952       33070 :         stereo_dft_enc_get_reverb_flag_fx( hStereoDft, pPredGain, sub_nrg_DMX, sub_nrg_DMX_e, sub_nrg_L, sub_nrg_L_e, sub_nrg_R, sub_nrg_R_e, k_offset, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e );
    3953             :     }
    3954             : 
    3955             : 
    3956             :     /*------------------------------------------------------------------*
    3957             :      * Compute Side gains
    3958             :      *-----------------------------------------------------------------*/
    3959             : 
    3960      607465 :     FOR( b = 0; b < hStereoDft->nbands; b++ )
    3961             :     {
    3962      547822 :         hStereoDft->sidSideGain_fx[b] = *( pSideGain + b );
    3963      547822 :         move32();
    3964             : 
    3965             :         /* Quantization */
    3966      547822 :         IF( flag_quant )
    3967             :         {
    3968      547822 :             stereo_dft_quantize_res_gains_fx( pSideGain + b, pPredGain + b, pSideGain + b, pPredGain + b, hStereoDft->side_gain_index_EC + b, hStereoDft->res_pred_index_EC + b );
    3969             :         }
    3970             : 
    3971             : 
    3972      547822 :         IF( !hStereoDft->attackPresent )
    3973             :         {
    3974      531368 :             IF( LT_16( b, hStereoDft->res_cod_band_max ) )
    3975             :             {
    3976             :                 // pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - STEREO_DFT_BAND_MAX];
    3977       97990 :                 pSideGain[b] = L_add( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ), Mpy_32_16_1( pSideGain[b - STEREO_DFT_BAND_MAX], sub( MAX_16, dft_res_cod_alpha_fx[b] ) ) );
    3978       97990 :                 move32();
    3979             :             }
    3980             :         }
    3981             :     }
    3982             : 
    3983             :     /*------------------------------------------------------------------*
    3984             :      * simulate prediction of parameters at the decoder
    3985             :      *-----------------------------------------------------------------*/
    3986             : 
    3987       59643 :     IF( hStereoDft->reverb_flag )
    3988             :     {
    3989             :         Word16 ipred, bpred0, bpred1, max_dev, sum_abs_dev;
    3990             : 
    3991       38593 :         ipred = 0;
    3992       38593 :         move16();
    3993       38593 :         max_dev = 0;
    3994       38593 :         move16();
    3995       38593 :         sum_abs_dev = 0;
    3996       38593 :         move16();
    3997             : 
    3998             :         /* parameters for bred0 <= b < bpred1 are estimated from parameters of
    3999             :         the remaining bands with ptrans0 <= b < btrans1. */
    4000             :         // bpred1 = ( hStereoDft->nbands > 10 ) ? STEREO_DFT_RES_PRED_BAND_MAX - 2 : hStereoDft->nbands;
    4001       38593 :         IF( GT_16( hStereoDft->nbands, 10 ) )
    4002             :         {
    4003        9070 :             bpred1 = STEREO_DFT_RES_PRED_BAND_MAX - 2;
    4004        9070 :             move16();
    4005             :         }
    4006             :         ELSE
    4007             :         {
    4008       29523 :             bpred1 = hStereoDft->nbands;
    4009       29523 :             move16();
    4010             :         }
    4011             : 
    4012       38593 :         IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) )
    4013             :         {
    4014       26573 :             bpred1 = s_min( bpred1, 6 );
    4015             :         }
    4016       38593 :         bpred0 = sub( bpred1, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
    4017             : 
    4018             :         /* get estimate (currently the maximal index) */
    4019      196212 :         FOR( b = hStereoDft->res_pred_band_min; b < bpred0; b++ )
    4020             :         {
    4021      157619 :             ipred = s_max( ipred, hStereoDft->res_pred_index_EC[b] );
    4022             :         }
    4023             : 
    4024             :         /* check prediction error */
    4025      154372 :         FOR( b = bpred0; b < bpred1; b++ )
    4026             :         {
    4027      115779 :             max_dev = s_max( max_dev, abs_s( sub( ipred, hStereoDft->res_pred_index_EC[b] ) ) );
    4028      115779 :             sum_abs_dev = add( sum_abs_dev, abs_s( sub( ipred, hStereoDft->res_pred_index_EC[b] ) ) );
    4029             :         }
    4030             : 
    4031       38593 :         test();
    4032       38593 :         hStereoDft->reverb_flag = ( LE_16( max_dev, 1 ) && LE_16( sum_abs_dev, 2 ) );
    4033             : 
    4034       38593 :         test();
    4035       38593 :         IF( hStereoDft->reverb_flag && GT_16( hStereoDft->nbands, 10 ) ) /*SWB and FB*/
    4036             :         {
    4037        8763 :             FOR( b = STEREO_DFT_RES_PRED_BAND_MAX - 1; b >= STEREO_DFT_RES_PRED_BAND_MAX - 2; b-- )
    4038             :             {
    4039        5842 :                 hStereoDft->res_pred_index_EC[b - STEREO_DFT_RES_PRED_BAND_MIN_CONST] = hStereoDft->res_pred_index_EC[b];
    4040        5842 :                 move16();
    4041             :             }
    4042             :         }
    4043             :     }
    4044             : 
    4045       59643 :     assert( hStereoDft->nbands <= 13 ); /* always use band_limits_erb4 and not band_limits_erb2 */
    4046             : 
    4047       59643 :     return;
    4048             : }
    4049             : 
    4050             : /*---------------------------------------------------------------------*
    4051             :  * side_gain_mode_decision()
    4052             :  *
    4053             :  *
    4054             :  *---------------------------------------------------------------------*/
    4055       45146 : static void side_gain_mode_decision_fx(
    4056             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
    4057             :     Word16 encoded_ind_GR[],
    4058             :     const Word16 sp_aud_decision0, /* i  : Speech/audio decision 0     */
    4059             :     const Word32 last_core_brate   /* i  : Last core bitrate           */
    4060             : )
    4061             : {
    4062             :     Word16 try_diff, nb_diff, no_GR_ord, n_bits, i;
    4063             : 
    4064       45146 :     try_diff = sp_aud_decision0;
    4065       45146 :     move16();
    4066       45146 :     IF( try_diff )
    4067             :     {
    4068       10886 :         IF( EQ_16( hStereoDft->side_gain_counter, STEREO_DFT_FEC_THRESHOLD ) )
    4069             :         {
    4070         344 :             try_diff = 0;
    4071         344 :             move16();
    4072         344 :             hStereoDft->side_gain_counter = 0;
    4073         344 :             move16();
    4074             :         }
    4075             :     }
    4076             :     ELSE
    4077             :     {
    4078       34260 :         hStereoDft->side_gain_counter = 0;
    4079       34260 :         move16();
    4080             :     }
    4081             : 
    4082             :     /* If last frame SID/NO_DATA do not use differential coding */
    4083       45146 :     if ( LE_32( last_core_brate, SID_2k40 ) )
    4084             :     {
    4085        1417 :         try_diff = 0;
    4086        1417 :         move16();
    4087             :     }
    4088       45146 :     no_GR_ord = 3;
    4089       45146 :     move16();
    4090       90292 :     hStereoDft->side_gain_flag_2 = adapt_GR_ief_fx( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious,
    4091       45146 :                                                     hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff,
    4092       45146 :                                                     hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp_fx, &hStereoDft->q_side_gain_bitdiff_lp, try_diff );
    4093       45146 :     move16();
    4094             : 
    4095      471827 :     FOR( i = 0; i < hStereoDft->nbands; i++ )
    4096             :     {
    4097      426681 :         hStereoDft->side_gain_index_ECprevious[i] = hStereoDft->side_gain_index_EC[i];
    4098      426681 :         move16();
    4099             :     }
    4100             : 
    4101       45146 :     IF( GT_16( n_bits, sub( imult1616( hStereoDft->nbands, STEREO_DFT_SIDE_GAIN_NBITS ), 1 ) ) )
    4102             :     {
    4103             :         /* use fixed rate */
    4104        1082 :         hStereoDft->side_gain_flag_1 = 3;
    4105        1082 :         move16();
    4106        1082 :         hStereoDft->side_gain_counter = 0;
    4107        1082 :         move16();
    4108             :     }
    4109             :     ELSE
    4110             :     {
    4111       44064 :         IF( GE_32( hStereoDft->side_gain_flag_2, no_GR_ord ) )
    4112             :         {
    4113        8903 :             hStereoDft->side_gain_flag_1 = 2;
    4114        8903 :             move16();
    4115        8903 :             hStereoDft->side_gain_counter = add( hStereoDft->side_gain_counter, 1 );
    4116        8903 :             move16();
    4117             :         }
    4118             :         ELSE
    4119             :         {
    4120       35161 :             hStereoDft->side_gain_flag_1 = 0;
    4121       35161 :             move16();
    4122       35161 :             hStereoDft->side_gain_counter = 0;
    4123       35161 :             move16();
    4124             :         }
    4125             :     }
    4126             : 
    4127       45146 :     return;
    4128             : }
    4129             : 
    4130             : /*---------------------------------------------------------------------*
    4131             :  * res_pred_gain_mode_decision()
    4132             :  *
    4133             :  *
    4134             :  *---------------------------------------------------------------------*/
    4135             : 
    4136       45146 : static void res_pred_gain_mode_decision_fx(
    4137             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
    4138             :     Word16 encoded_ind_pred_GR[],
    4139             :     const Word16 k_offset,       /* i  : Parameter offset            */
    4140             :     const Word32 last_core_brate /* i  : Last core bitrate           */
    4141             : )
    4142             : {
    4143             :     Word16 nb_diff, try_diff, no_GR_ord, i, n_bits;
    4144             :     Word16 nbands;
    4145             : 
    4146             :     /* Residual Prediction Gain */
    4147       45146 :     IF( hStereoDft->res_pred_mode[k_offset] )
    4148             :     {
    4149       43697 :         IF( hStereoDft->attackPresent == 0 )
    4150             :         {
    4151       42102 :             nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
    4152             : 
    4153       42102 :             if ( hStereoDft->reverb_flag )
    4154             :             {
    4155        6818 :                 nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
    4156             :             }
    4157             : 
    4158       42102 :             try_diff = 1;
    4159       42102 :             move16();
    4160       42102 :             IF( EQ_16( hStereoDft->res_pred_counter, STEREO_DFT_FEC_THRESHOLD ) )
    4161             :             {
    4162        1643 :                 try_diff = 0;
    4163        1643 :                 move16();
    4164        1643 :                 hStereoDft->res_pred_counter = 0;
    4165        1643 :                 move16();
    4166             :             }
    4167             : 
    4168             :             /* If last frame SID/NO_DATA do not use differential coding */
    4169       42102 :             IF( LE_32( last_core_brate, SID_2k40 ) )
    4170             :             {
    4171         307 :                 try_diff = 0;
    4172         307 :                 move16();
    4173             :             }
    4174             : 
    4175       42102 :             no_GR_ord = 2;
    4176       42102 :             move16();
    4177             : 
    4178       42102 :             hStereoDft->res_pred_flag_2 = adapt_GR_rpg1_ief_fx( &hStereoDft->res_pred_index_EC[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECprevious[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, NO_SYMB_GR_PRED_G, &n_bits, encoded_ind_pred_GR, dft_maps_rpg, &nb_diff, no_GR_ord, try_diff );
    4179       42102 :             move16();
    4180             : 
    4181      416949 :             FOR( i = 0; i < nbands; i++ )
    4182             :             {
    4183      374847 :                 hStereoDft->res_pred_index_ECprevious[i] = hStereoDft->res_pred_index_EC[i];
    4184      374847 :                 move16();
    4185             :             }
    4186             : 
    4187       70686 :             FOR( ; i < hStereoDft->nbands; i++ )
    4188             :             {
    4189       28584 :                 hStereoDft->res_pred_index_ECprevious[i] = 0;
    4190       28584 :                 move16();
    4191             :             }
    4192             : 
    4193       42102 :             IF( GT_16( n_bits, sub( imult1616( sub( nbands, hStereoDft->res_pred_band_min ), STEREO_DFT_RES_GAINS_BITS ), 1 ) ) )
    4194             :             {
    4195        3397 :                 hStereoDft->res_pred_flag_1 = 3;
    4196        3397 :                 move16();
    4197        3397 :                 hStereoDft->res_pred_counter = 0;
    4198        3397 :                 move16();
    4199             :             }
    4200             :             ELSE
    4201             :             {
    4202       38705 :                 IF( GT_16( hStereoDft->res_pred_flag_2, 1 ) )
    4203             :                 {
    4204             :                     /* differential coding */
    4205       30296 :                     hStereoDft->res_pred_flag_1 = 2;
    4206       30296 :                     move16();
    4207       30296 :                     hStereoDft->res_pred_counter = add( hStereoDft->res_pred_counter, 1 );
    4208       30296 :                     move16();
    4209             :                 }
    4210             :                 ELSE
    4211             :                 {
    4212        8409 :                     hStereoDft->res_pred_counter = 0;
    4213        8409 :                     move16();
    4214        8409 :                     hStereoDft->res_pred_flag_1 = 0;
    4215        8409 :                     move16();
    4216             :                 }
    4217             :             }
    4218             :         }
    4219             :         ELSE
    4220             :         {
    4221        1595 :             set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
    4222             :         }
    4223             :     }
    4224             :     ELSE
    4225             :     {
    4226        1449 :         set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
    4227             :     }
    4228             : 
    4229       45146 :     return;
    4230             : }
    4231             : 
    4232             : /*-------------------------------------------------------------------------
    4233             :  * stereo_dft_calc_mean_bipd()
    4234             :  *
    4235             :  * Calculate mean of previous bandwise IPD values
    4236             :  *------------------------------------------------------------------------*/
    4237             : static Word16 ipd_table1[STEREO_DFT_IPD_BUF_LEN] = { 0, 16384, 21845, 24576, 26214 };    //(i / (float)(i + 1))
    4238             : static Word16 ipd_table2[STEREO_DFT_IPD_BUF_LEN] = { MAX_16, 16384, 10923, 8192, 6554 }; //(1 / (float)(i + 1))
    4239      477144 : static Word32 stereo_dft_calc_mean_bipd_fx(
    4240             :     Word32 *pIpd,                          /* i  : current bandwise IPD   Q13 */
    4241             :     Word32 ipd_buf[STEREO_DFT_IPD_BUF_LEN] /* i/o: previous bandwise IPDs Q13 */
    4242             : )
    4243             : {
    4244             :     Word16 i;
    4245             :     Word32 ipd_smooth;
    4246             :     Word32 diff_to_last;
    4247             : 
    4248      477144 :     assert( *pIpd <= EVS_PI_FX && *pIpd >= -EVS_PI_FX );
    4249             : 
    4250      477144 :     ipd_smooth = 0;
    4251      477144 :     move16();
    4252     2862864 :     FOR( i = 0; i < STEREO_DFT_IPD_BUF_LEN; i++ )
    4253             :     {
    4254     2385720 :         IF( i == 0 )
    4255             :         {
    4256      477144 :             diff_to_last = ipd_buf[0];
    4257      477144 :             move32();
    4258             :         }
    4259             :         ELSE
    4260             :         {
    4261     1908576 :             diff_to_last = L_abs( L_sub( ipd_buf[i], ipd_smooth ) );
    4262             :         }
    4263     2385720 :         IF( GT_32( diff_to_last, EVS_PI_FX ) )
    4264             :         {
    4265       52147 :             IF( ipd_buf[i] > 0 )
    4266             :             {
    4267       29830 :                 ipd_buf[i] = L_sub( ipd_buf[i], 2 * EVS_PI_FX );
    4268             :             }
    4269             :             ELSE
    4270             :             {
    4271       22317 :                 ipd_buf[i] = L_add( ipd_buf[i], 2 * EVS_PI_FX );
    4272             :             }
    4273       52147 :             move32();
    4274             :         }
    4275             :         // ipd_smooth = (i / (float)(i + 1)) * ipd_smooth + (1 / (float)(i + 1)) * ipd_buf[i];
    4276     2385720 :         ipd_smooth = L_add( Mpy_32_16_1( ipd_smooth, ipd_table1[i] ), Mpy_32_16_1( ipd_buf[i], ipd_table2[i] ) ); // Q13
    4277     2385720 :         IF( LT_32( ipd_smooth, -EVS_PI_FX ) )
    4278             :         {
    4279       18534 :             ipd_smooth = L_add( ipd_smooth, 2 * EVS_PI_FX );
    4280             :         }
    4281     2367186 :         ELSE IF( GT_32( ipd_smooth, EVS_PI_FX ) )
    4282             :         {
    4283       10937 :             ipd_smooth = L_sub( ipd_smooth, 2 * EVS_PI_FX );
    4284             :         }
    4285             :     }
    4286             : 
    4287     2385720 :     FOR( i = 0; i < STEREO_DFT_IPD_BUF_LEN - 1; i++ )
    4288             :     {
    4289     1908576 :         ipd_buf[i] = ipd_buf[i + 1];
    4290     1908576 :         move32();
    4291             :     }
    4292      477144 :     ipd_buf[STEREO_DFT_IPD_BUF_LEN - 1] = *pIpd;
    4293      477144 :     move32();
    4294             : 
    4295             : 
    4296      477144 :     return ipd_smooth;
    4297             : }
    4298             : 
    4299             : /*-------------------------------------------------------------------------
    4300             :  * stereo_dft_calc_mean_ipd_change()
    4301             :  *
    4302             :  * Calculate mean IPD change over all bands
    4303             :  *------------------------------------------------------------------------*/
    4304       59643 : static Word32 stereo_dft_calc_mean_ipd_change_fx(
    4305             :     Word32 *pIpd,        /* i  : bandwise IPDs                  Q13  */
    4306             :     Word32 *ipd_smooth,  /* i  : mean of previous bandwise IPDs Q13 */
    4307             :     Word16 gipd_band_max /* i  : number of IPD bands             */
    4308             : )
    4309             : {
    4310             :     Word16 b;
    4311             :     Word32 ipd_mean_change; // Q13
    4312             :     Word16 ipd_mean_change_e;
    4313             :     Word32 ipd_change[STEREO_DFT_BAND_MAX]; // Q13
    4314             : 
    4315       59643 :     ipd_mean_change = 0;
    4316       59643 :     move32();
    4317      536787 :     FOR( b = 0; b < gipd_band_max; b++ )
    4318             :     {
    4319      477144 :         ipd_change[b] = L_abs( L_sub( pIpd[b], ipd_smooth[b] ) );
    4320      477144 :         move32();
    4321      477144 :         IF( GT_32( ipd_change[b], EVS_PI_FX ) )
    4322             :         {
    4323       21374 :             ipd_change[b] = L_sub( 2 * EVS_PI_FX, ipd_change[b] );
    4324       21374 :             move32();
    4325             :         }
    4326      477144 :         ipd_mean_change = L_add( ipd_mean_change, ipd_change[b] );
    4327             :     }
    4328             :     // ipd_mean_change /= gipd_band_max;
    4329       59643 :     ipd_mean_change = BASOP_Util_Divide3232_Scale_newton( ipd_mean_change, gipd_band_max, &ipd_mean_change_e );
    4330       59643 :     ipd_mean_change_e = add( ipd_mean_change_e, 18 - 31 );
    4331       59643 :     ipd_mean_change = L_shr( ipd_mean_change, sub( 18, ipd_mean_change_e ) ); // Q13
    4332             : 
    4333       59643 :     return ipd_mean_change;
    4334             : }
    4335             : 
    4336             : /*-------------------------------------------------------------------------
    4337             :  * stereo_dft_gipd_stabilization()
    4338             :  *
    4339             :  * stabilize global IPD based on stability of bandwise IPDs
    4340             :  *------------------------------------------------------------------------*/
    4341       59643 : static void stereo_dft_gipd_stabilization_fx(
    4342             :     Word32 *pgIpd,         /* i/o: global IPD to be stabilized    Q13 */
    4343             :     Word32 prev_gipd,      /* i  : previous global IPD            Q13 */
    4344             :     Word32 ipd_mean_change /* i  : mean of previous bandwise IPDs Q13 */
    4345             : )
    4346             : {
    4347             :     Word32 diff_gipd;
    4348             : 
    4349       59643 :     IF( LT_32( ipd_mean_change, 2458 /*0.3f in Q13*/ ) )
    4350             :     {
    4351       26290 :         *pgIpd = prev_gipd;
    4352       26290 :         move32();
    4353             :     }
    4354             :     ELSE
    4355             :     {
    4356       33353 :         diff_gipd = L_abs( L_sub( *pgIpd, prev_gipd ) );
    4357       33353 :         if ( GT_32( diff_gipd, EVS_PI_FX ) )
    4358             :         {
    4359        1254 :             diff_gipd = L_sub( 2 * EVS_PI_FX, diff_gipd );
    4360             :         }
    4361       33353 :         IF( GT_32( diff_gipd, ipd_mean_change ) )
    4362             :         {
    4363        5445 :             IF( GT_32( *pgIpd, prev_gipd ) )
    4364             :             {
    4365        2595 :                 IF( LT_32( L_sub( *pgIpd, prev_gipd ), EVS_PI_FX ) )
    4366             :                 {
    4367        2169 :                     *pgIpd = L_add( prev_gipd, ipd_mean_change );
    4368        2169 :                     move32();
    4369             :                 }
    4370             :                 ELSE
    4371             :                 {
    4372         426 :                     *pgIpd = L_sub( prev_gipd, ipd_mean_change );
    4373         426 :                     move32();
    4374         426 :                     if ( LT_32( *pgIpd, -EVS_PI_FX ) )
    4375             :                     {
    4376         150 :                         *pgIpd = L_add( *pgIpd, 2 * EVS_PI_FX );
    4377         150 :                         move32();
    4378             :                     }
    4379             :                 }
    4380             :             }
    4381             :             ELSE
    4382             :             {
    4383        2850 :                 IF( LT_32( L_sub( prev_gipd, *pgIpd ), EVS_PI_FX ) )
    4384             :                 {
    4385        2300 :                     *pgIpd = L_sub( prev_gipd, ipd_mean_change );
    4386        2300 :                     move32();
    4387             :                 }
    4388             :                 ELSE
    4389             :                 {
    4390         550 :                     *pgIpd = L_add( prev_gipd, ipd_mean_change );
    4391         550 :                     move32();
    4392         550 :                     if ( GT_32( *pgIpd, EVS_PI_FX ) )
    4393             :                     {
    4394         243 :                         *pgIpd = L_sub( *pgIpd, 2 * EVS_PI_FX );
    4395         243 :                         move32();
    4396             :                     }
    4397             :                 }
    4398             :             }
    4399             :         }
    4400             :     }
    4401       59643 :     return;
    4402             : }
    4403             : 
    4404             : /*-------------------------------------------------------------------------
    4405             :  * stereo_dft_enc_get_nipd_flag()
    4406             :  *
    4407             :  *
    4408             :  *------------------------------------------------------------------------*/
    4409       59643 : static void stereo_dft_enc_get_nipd_flag_fx(
    4410             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    4411             :     const Word16 sp_aud_decision0,
    4412             :     const Word32 gainIPD )
    4413             : {
    4414             :     // hStereoDft->gainIPD_sm = 0.5f * hStereoDft->gainIPD_sm + 0.5f * gainIPD; /* to decide on use of no IPD */
    4415       59643 :     hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_shr( gainIPD, 1 ) ); /* to decide on use of no IPD */
    4416       59643 :     move32();
    4417             : 
    4418       59643 :     hStereoDft->no_ipd_flag = 0; /* Set flag initially to zero - subband IPD */
    4419       59643 :     move16();
    4420             : 
    4421             :     // if (hStereoDft->gainIPD_sm >= 0.75f || (hStereoDft->prev_no_ipd_flag && (sp_aud_decision0 || hStereoDft->voicing_lt > 0.98f)))
    4422       59643 :     test();
    4423       59643 :     test();
    4424       59643 :     test();
    4425       59643 :     if ( GE_32( hStereoDft->gainIPD_sm_fx, 1610612736 /*0.75f in Q31*/ ) || ( hStereoDft->prev_no_ipd_flag && ( sp_aud_decision0 || GT_32( hStereoDft->voicing_lt_fx, 2104533975 /*0.98f in Q31*/ ) ) ) )
    4426             :     {
    4427       51870 :         hStereoDft->no_ipd_flag = 1; /* Set the flag */
    4428       51870 :         move16();
    4429             :     }
    4430             : 
    4431             : 
    4432             :     /* hangover between the group IPD and subband IPD */
    4433       59643 :     test();
    4434       59643 :     IF( NE_16( hStereoDft->prev_no_ipd_flag, hStereoDft->no_ipd_flag ) && LT_16( hStereoDft->no_ipd_cnt, 5 ) )
    4435             :     {
    4436        7056 :         hStereoDft->no_ipd_flag = hStereoDft->prev_no_ipd_flag;
    4437        7056 :         move16();
    4438        7056 :         hStereoDft->no_ipd_cnt = add( hStereoDft->no_ipd_cnt, 1 );
    4439        7056 :         move16();
    4440             :     }
    4441             :     ELSE
    4442             :     {
    4443       52587 :         hStereoDft->no_ipd_cnt = 0;
    4444       52587 :         move16();
    4445             :     }
    4446             : 
    4447       59643 :     hStereoDft->prev_no_ipd_flag = hStereoDft->no_ipd_flag; /* Save the no IPD flag for the next frame */
    4448       59643 :     move16();
    4449             : 
    4450       59643 :     return;
    4451             : }
    4452             : 
    4453             : /*---------------------------------------------------------------
    4454             :  * stereo_dft_enc_get_reverb_flag()
    4455             :  *
    4456             :  *
    4457             :  * ---------------------------------------------------------------*/
    4458       33070 : static void stereo_dft_enc_get_reverb_flag_fx(
    4459             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    4460             :     Word32 *pPredGain,   // Q31
    4461             :     Word32 *sub_nrg_DMX, // Q(31-sub_nrg_DMX_e)
    4462             :     Word16 *sub_nrg_DMX_e,
    4463             :     const Word32 *sub_nrg_L, // Q(31-sub_nrg_L_e[])
    4464             :     const Word16 *sub_nrg_L_e,
    4465             :     const Word32 *sub_nrg_R, // Q(31-sub_nrg_R_e[])
    4466             :     const Word16 *sub_nrg_R_e,
    4467             :     const Word16 k_offset,
    4468             :     const Word32 *bin_nrgL, // Q(31-bin_nrgL_e[])
    4469             :     const Word16 *bin_nrgL_e,
    4470             :     const Word32 *bin_nrgR, // Q(31-bin_nrgR_e[])
    4471             :     const Word16 *bin_nrgR_e )
    4472             : {
    4473             :     Word16 i, b, b1, index_min, nbands;
    4474             :     Word32 nrg_DMX_min;
    4475             :     Word16 nrg_DMX_min_e;
    4476             :     Word32 norm_r, norm_l, norm_dmx;
    4477             :     Word16 norm_r_e, norm_l_e, norm_dmx_e;
    4478             :     Word32 diff_l_l, diff_r_l, diff_l_h, diff_r_h;
    4479             :     Word16 diff_l_l_e, diff_r_l_e, diff_l_h_e, diff_r_h_e;
    4480             :     Word32 ener_l, ener_r, ener_dmx;
    4481             :     Word16 ener_l_e, ener_r_e, ener_dmx_e;
    4482             :     Word32 nrg_DMX_max_avrg, nrg_DMX_min_avrg;
    4483             :     Word16 nrg_DMX_max_avrg_e, nrg_DMX_min_avrg_e;
    4484             :     Word32 fac;
    4485             :     Word32 L_tmp;
    4486             :     Word16 L_tmp_e;
    4487             : 
    4488       33070 :     hStereoDft->reverb_flag = 0;
    4489       33070 :     move16();
    4490       33070 :     test();
    4491       33070 :     IF( hStereoDft->res_pred_mode[k_offset] && EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
    4492             :     {
    4493       12861 :         diff_r_l = EPSILON_FX_M;
    4494       12861 :         move32();
    4495       12861 :         diff_r_l_e = EPSILON_FX_E;
    4496       12861 :         move16();
    4497       12861 :         diff_l_l = EPSILON_FX_M;
    4498       12861 :         move32();
    4499       12861 :         diff_l_l_e = EPSILON_FX_E;
    4500       12861 :         move16();
    4501       12861 :         diff_r_h = EPSILON_FX_M;
    4502       12861 :         move32();
    4503       12861 :         diff_r_h_e = EPSILON_FX_E;
    4504       12861 :         move16();
    4505       12861 :         diff_l_h = EPSILON_FX_M;
    4506       12861 :         move32();
    4507       12861 :         diff_l_h_e = EPSILON_FX_E;
    4508       12861 :         move16();
    4509             : 
    4510      102888 :         FOR( b = 0; b <= s_min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */
    4511             :         {
    4512             :             // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]);
    4513       90027 :             norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e );
    4514       90027 :             norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) );
    4515             :             // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]);
    4516       90027 :             norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e );
    4517       90027 :             norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) );
    4518             :             // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]);
    4519       90027 :             norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e );
    4520       90027 :             norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) );
    4521             : 
    4522     1234656 :             FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
    4523             :             {
    4524     1144629 :                 ener_l = bin_nrgL[i];
    4525     1144629 :                 move32();
    4526     1144629 :                 ener_l_e = bin_nrgL_e[i];
    4527     1144629 :                 move16();
    4528     1144629 :                 ener_r = bin_nrgR[i];
    4529     1144629 :                 move32();
    4530     1144629 :                 ener_r_e = bin_nrgR_e[i];
    4531     1144629 :                 move16();
    4532             :                 // ener_dmx = (ener_l + ener_r + 2 * sqrtf(ener_l * ener_r)) * norm_dmx; /*approximation of nrg of DMX per line*/
    4533     1144629 :                 L_tmp = Mpy_32_32( ener_l, ener_r );
    4534     1144629 :                 L_tmp_e = add( ener_l_e, ener_r_e );
    4535     1144629 :                 L_tmp = Sqrt32( L_tmp, &L_tmp_e );
    4536     1144629 :                 L_tmp = Mpy_32_32( L_tmp, norm_dmx );
    4537     1144629 :                 L_tmp_e = add( add( L_tmp_e, norm_dmx_e ), 1 );
    4538     1144629 :                 L_tmp = BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_tmp, L_tmp_e, &L_tmp_e );
    4539     1144629 :                 L_tmp = BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_tmp, L_tmp_e, &L_tmp_e );
    4540     1144629 :                 ener_dmx = L_tmp;
    4541     1144629 :                 move32();
    4542     1144629 :                 ener_dmx_e = L_tmp_e;
    4543     1144629 :                 move16();
    4544             : 
    4545             :                 // ener_l *= norm_l;
    4546     1144629 :                 ener_l = Mpy_32_32( ener_l, norm_l );
    4547     1144629 :                 ener_l_e = add( ener_l_e, norm_l_e );
    4548             :                 // ener_r *= norm_r;
    4549     1144629 :                 ener_r = Mpy_32_32( ener_r, norm_r );
    4550     1144629 :                 ener_r_e = add( ener_r_e, norm_r_e );
    4551             : 
    4552             :                 // diff_l_l += fabsf(ener_l - ener_dmx);
    4553     1144629 :                 L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
    4554     1144629 :                 diff_l_l = BASOP_Util_Add_Mant32Exp( diff_l_l, diff_l_l_e, L_tmp, L_tmp_e, &diff_l_l_e );
    4555             :                 // diff_r_l += fabsf(ener_r - ener_dmx);
    4556     1144629 :                 L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
    4557     1144629 :                 diff_r_l = BASOP_Util_Add_Mant32Exp( diff_r_l, diff_r_l_e, L_tmp, L_tmp_e, &diff_r_l_e );
    4558             :             }
    4559             :         }
    4560       12861 :         IF( LE_16( hStereoDft->nbands, 10 ) )
    4561             :         {
    4562       11800 :             FOR( ; b < s_min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */
    4563             :             {
    4564             :                 // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]);
    4565        8850 :                 norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e );
    4566        8850 :                 norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) );
    4567             :                 // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]);
    4568        8850 :                 norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e );
    4569        8850 :                 norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) );
    4570             :                 // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]);
    4571        8850 :                 norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e );
    4572        8850 :                 norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) );
    4573             : 
    4574      687350 :                 FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
    4575             :                 {
    4576      678500 :                     ener_l = bin_nrgL[i];
    4577      678500 :                     move32();
    4578      678500 :                     ener_l_e = bin_nrgL_e[i];
    4579      678500 :                     move16();
    4580      678500 :                     ener_r = bin_nrgR[i];
    4581      678500 :                     move32();
    4582      678500 :                     ener_r_e = bin_nrgR_e[i];
    4583      678500 :                     move16();
    4584             :                     // ener_dmx = (ener_l + ener_r + 2 * sqrtf(ener_l * ener_r)) * norm_dmx; /*approximation of nrg of DMX per line*/
    4585      678500 :                     L_tmp = Mpy_32_32( ener_l, ener_r );
    4586      678500 :                     L_tmp_e = add( ener_l_e, ener_r_e );
    4587      678500 :                     L_tmp = Sqrt32( L_tmp, &L_tmp_e );
    4588      678500 :                     L_tmp = Mpy_32_32( L_tmp, norm_dmx );
    4589      678500 :                     L_tmp_e = add( add( L_tmp_e, norm_dmx_e ), 1 );
    4590      678500 :                     L_tmp = BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_tmp, L_tmp_e, &L_tmp_e );
    4591      678500 :                     L_tmp = BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_tmp, L_tmp_e, &L_tmp_e );
    4592      678500 :                     ener_dmx = L_tmp;
    4593      678500 :                     move32();
    4594      678500 :                     ener_dmx_e = L_tmp_e;
    4595      678500 :                     move16();
    4596             : 
    4597             :                     // ener_l *= norm_l;
    4598      678500 :                     ener_l = Mpy_32_32( ener_l, norm_l );
    4599      678500 :                     ener_l_e = add( ener_l_e, norm_l_e );
    4600             :                     // ener_r *= norm_r;
    4601      678500 :                     ener_r = Mpy_32_32( ener_r, norm_r );
    4602      678500 :                     ener_r_e = add( ener_r_e, norm_r_e );
    4603             : 
    4604             :                     // diff_l_h += fabsf(ener_l - ener_dmx);
    4605      678500 :                     L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
    4606      678500 :                     diff_l_h = BASOP_Util_Add_Mant32Exp( diff_l_h, diff_l_h_e, L_tmp, L_tmp_e, &diff_l_h_e );
    4607             :                     // diff_r_h += fabsf(ener_r - ener_dmx);
    4608      678500 :                     L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
    4609      678500 :                     diff_r_h = BASOP_Util_Add_Mant32Exp( diff_r_h, diff_r_h_e, L_tmp, L_tmp_e, &diff_r_h_e );
    4610             :                 }
    4611             :             }
    4612             :         }
    4613             : 
    4614      162251 :         FOR( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */
    4615             :         {
    4616             :             // sub_nrg_DMX[b] /= (hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]);
    4617      149390 :             sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_newton( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e );
    4618      149390 :             move32();
    4619      149390 :             sub_nrg_DMX_e[b] = add( L_tmp_e, sub( sub_nrg_DMX_e[b], 31 ) );
    4620      149390 :             move16();
    4621             :             // sub_nrg_DMX[b] = 0.6f * hStereoDft->pre_sub_nrg_DMX[b] + 0.4f * sub_nrg_DMX[b];
    4622      149390 :             sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1288490189 /*0.6f*/, hStereoDft->pre_sub_nrg_DMX_fx[b] ), hStereoDft->pre_sub_nrg_DMX_fx_e[b], Mpy_32_32( 858993459 /*0.4f*/, sub_nrg_DMX[b] ), sub_nrg_DMX_e[b], &sub_nrg_DMX_e[b] );
    4623      149390 :             move32();
    4624      149390 :             hStereoDft->pre_sub_nrg_DMX_fx[b] = sub_nrg_DMX[b];
    4625      149390 :             move32();
    4626      149390 :             hStereoDft->pre_sub_nrg_DMX_fx_e[b] = sub_nrg_DMX_e[b];
    4627      149390 :             move16();
    4628             :         }
    4629             : 
    4630             :         /* adaptively select the subbands to predict based on the energy */
    4631             :         // nbands = (hStereoDft->nbands > 10) ? (hStereoDft->nbands - 2) : hStereoDft->nbands;
    4632       12861 :         IF( GT_16( hStereoDft->nbands, 10 ) )
    4633             :         {
    4634        9911 :             nbands = sub( hStereoDft->nbands, 2 );
    4635             :         }
    4636             :         ELSE
    4637             :         {
    4638        2950 :             nbands = hStereoDft->nbands;
    4639        2950 :             move16();
    4640             :         }
    4641             : 
    4642       12861 :         nrg_DMX_min_avrg = 0;
    4643       12861 :         move32();
    4644       12861 :         nrg_DMX_min_avrg_e = 0;
    4645       12861 :         move16();
    4646       25722 :         FOR( b = 2; b < STEREO_DFT_RES_PRED_BAND_MIN_RED; b++ )
    4647             :         {
    4648       12861 :             nrg_DMX_min = sub_nrg_DMX[b];
    4649       12861 :             move32();
    4650       12861 :             nrg_DMX_min_e = sub_nrg_DMX_e[b];
    4651       12861 :             move16();
    4652       12861 :             index_min = b;
    4653       12861 :             move16();
    4654             : 
    4655      116707 :             FOR( b1 = 2; b1 < nbands; b1++ )
    4656             :             {
    4657             :                 // if (nrg_DMX_min > sub_nrg_DMX[b1])
    4658      103846 :                 IF( BASOP_Util_Cmp_Mant32Exp( nrg_DMX_min, nrg_DMX_min_e, sub_nrg_DMX[b1], sub_nrg_DMX_e[b1] ) > 0 )
    4659             :                 {
    4660       72616 :                     nrg_DMX_min = sub_nrg_DMX[b1];
    4661       72616 :                     move32();
    4662       72616 :                     nrg_DMX_min_e = sub_nrg_DMX_e[b1];
    4663       72616 :                     move16();
    4664       72616 :                     index_min = b1;
    4665       72616 :                     move16();
    4666             :                 }
    4667             :             }
    4668             : 
    4669             :             // nrg_DMX_min_avrg += nrg_DMX_min;
    4670       12861 :             nrg_DMX_min_avrg = BASOP_Util_Add_Mant32Exp( nrg_DMX_min_avrg, nrg_DMX_min_avrg_e, nrg_DMX_min, nrg_DMX_min_e, &nrg_DMX_min_avrg_e );
    4671             :             // sub_nrg_DMX[index_min] = FLT_MAX;
    4672       12861 :             sub_nrg_DMX[index_min] = MAX_32;
    4673       12861 :             move32();
    4674       12861 :             sub_nrg_DMX_e[index_min] = 128;
    4675       12861 :             move16();
    4676             :         }
    4677             : 
    4678       12861 :         nrg_DMX_max_avrg = 0;
    4679       12861 :         move32();
    4680       12861 :         nrg_DMX_max_avrg_e = 0;
    4681       12861 :         move16();
    4682      116707 :         FOR( ( b = 2, b1 = STEREO_DFT_RES_PRED_BAND_MIN_RED ); b < nbands; b++ )
    4683             :         {
    4684             :             // if (sub_nrg_DMX[b] != FLT_MAX)
    4685      103846 :             IF( BASOP_Util_Cmp_Mant32Exp( sub_nrg_DMX[b], sub_nrg_DMX_e[b], MAX_32, 128 ) != 0 )
    4686             :             {
    4687             :                 // nrg_DMX_max_avrg += sub_nrg_DMX[b];
    4688       90985 :                 nrg_DMX_max_avrg = BASOP_Util_Add_Mant32Exp( nrg_DMX_max_avrg, nrg_DMX_max_avrg_e, sub_nrg_DMX[b], sub_nrg_DMX_e[b], &nrg_DMX_max_avrg_e );
    4689             :             }
    4690             :         }
    4691             : 
    4692       12861 :         IF( LE_16( hStereoDft->nbands, 10 ) ) /*WB*/
    4693             :         {
    4694        2950 :             test();
    4695        2950 :             IF( EQ_16( hStereoDft->res_pred_mode[0], STEREO_DFT_RESPRED_OFF ) || NE_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
    4696             :             {
    4697         710 :                 hStereoDft->diff_l_h_sm_fx = diff_l_h;
    4698         710 :                 move32();
    4699         710 :                 hStereoDft->diff_l_h_sm_fx_e = diff_l_h_e;
    4700         710 :                 move16();
    4701         710 :                 hStereoDft->diff_r_h_sm_fx = diff_r_h;
    4702         710 :                 move32();
    4703         710 :                 hStereoDft->diff_r_h_sm_fx_e = diff_r_h_e;
    4704         710 :                 move16();
    4705             :             }
    4706             :             ELSE
    4707             :             {
    4708             :                 // hStereoDft->diff_l_h_sm = 0.9f * hStereoDft->diff_l_h_sm + 0.1f * diff_l_h;
    4709        2240 :                 hStereoDft->diff_l_h_sm_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1932735283 /*0.9f*/, hStereoDft->diff_l_h_sm_fx ), hStereoDft->diff_l_h_sm_fx_e, Mpy_32_32( 214748365 /*0.1f*/, diff_l_h ), diff_l_h_e, &hStereoDft->diff_l_h_sm_fx_e );
    4710        2240 :                 move32();
    4711             :                 // hStereoDft->diff_r_h_sm = 0.9f * hStereoDft->diff_r_h_sm + 0.1f * diff_r_h;
    4712        2240 :                 hStereoDft->diff_r_h_sm_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1932735283 /*0.9f*/, hStereoDft->diff_r_h_sm_fx ), hStereoDft->diff_r_h_sm_fx_e, Mpy_32_32( 214748365 /*0.1f*/, diff_r_h ), diff_r_h_e, &hStereoDft->diff_r_h_sm_fx_e );
    4713        2240 :                 move32();
    4714             :             }
    4715             : 
    4716             :             // if (hStereoDft->diff_l_h_sm > 120.0f || hStereoDft->diff_r_h_sm > 120.0f)
    4717        2950 :             test();
    4718        2950 :             if ( BASOP_Util_Cmp_Mant32Exp( hStereoDft->diff_l_h_sm_fx, hStereoDft->diff_l_h_sm_fx_e, 120, 31 ) > 0 || BASOP_Util_Cmp_Mant32Exp( hStereoDft->diff_r_h_sm_fx, hStereoDft->diff_r_h_sm_fx_e, 120, 31 ) > 0 )
    4719             :             {
    4720        2950 :                 hStereoDft->reverb_flag = 1;
    4721        2950 :                 move16();
    4722             :             }
    4723             :         }
    4724             :         ELSE /*SWB/FB*/
    4725             :         {
    4726             :             // if (3 * nrg_DMX_max_avrg > 64 * 5 * nrg_DMX_min_avrg)
    4727        9911 :             if ( BASOP_Util_Cmp_Mant32Exp( Mpy_32_32( 1288490189 /*3/5 in Q31*/, nrg_DMX_max_avrg ), nrg_DMX_max_avrg_e, nrg_DMX_min_avrg, add( nrg_DMX_min_avrg_e, 6 /* * 64 */ ) ) > 0 )
    4728             :             {
    4729        9070 :                 hStereoDft->reverb_flag = 1;
    4730        9070 :                 move16();
    4731             :             }
    4732             :         }
    4733             : 
    4734             :         /*Stereo Filling gain damping*/
    4735             :         // fac = ((diff_l_l > diff_r_l) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l);
    4736       12861 :         IF( BASOP_Util_Cmp_Mant32Exp( diff_l_l, diff_l_l_e, diff_r_l, diff_r_l_e ) > 0 )
    4737             :         {
    4738        1815 :             fac = BASOP_Util_Divide3232_Scale_newton( diff_r_l, diff_l_l, &L_tmp_e );
    4739        1815 :             L_tmp_e = add( L_tmp_e, sub( diff_r_l_e, diff_l_l_e ) );
    4740             :         }
    4741             :         ELSE
    4742             :         {
    4743       11046 :             fac = BASOP_Util_Divide3232_Scale_newton( diff_l_l, diff_r_l, &L_tmp_e );
    4744       11046 :             L_tmp_e = add( L_tmp_e, sub( diff_l_l_e, diff_r_l_e ) );
    4745             :         }
    4746       12861 :         fac = L_shl_sat( fac, L_tmp_e ); // Q31
    4747             :         // fac = fac > 0.25f ? 1.0f : 4.f * fac;
    4748       12861 :         fac = L_shl_sat( fac, 2 );
    4749             :         // fac = 0.98f * hStereoDft->prev_fac2 + 0.02f * fac;
    4750       12861 :         fac = L_add( Mpy_32_32( 2104533975 /*0.98f*/, hStereoDft->prev_fac2_fx ), Mpy_32_32( 42949673 /*0.02f*/, fac ) );
    4751       12861 :         hStereoDft->prev_fac2_fx = fac;
    4752       12861 :         move32();
    4753             : 
    4754      162251 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
    4755             :         {
    4756      149390 :             IF( LT_16( b, 5 ) )
    4757             :             {
    4758             :                 // pPredGain[b] *= max(0.5f, fac);
    4759       64305 :                 pPredGain[b] = Mpy_32_32( pPredGain[b], L_max( ONE_IN_Q30, fac ) );
    4760       64305 :                 move32();
    4761             :             }
    4762             :             ELSE
    4763             :             {
    4764             :                 // pPredGain[b] *= min(1.0f, max(0.75f, 0.5f + fac));
    4765       85085 :                 pPredGain[b] = Mpy_32_32( pPredGain[b], L_max( 1610612736 /*0.75f*/, L_add_sat( ONE_IN_Q30, fac ) ) );
    4766       85085 :                 move32();
    4767             :             }
    4768             :         }
    4769             :     }
    4770             : 
    4771             : 
    4772       33070 :     return;
    4773             : }
    4774             : /*---------------------------------------------------------------
    4775             :  * stereo_dft_gain_offset()
    4776             :  *
    4777             :  * c = gain between L and R, itd = itd in samples @ 32kHz
    4778             :  * ---------------------------------------------------------------*/
    4779      182855 : static Word32 stereo_dft_gain_offset_fx(
    4780             :     const Word32 c, // Q(31-c_e)
    4781             :     const Word16 c_e,
    4782             :     const Word16 itd )
    4783             : {
    4784             :     Word32 wnt, go, alpha;
    4785             :     Word16 alpha_e;
    4786             :     Word16 tau, k0;
    4787             :     Word32 L_tmp, L_tmp1, L_tmp2;
    4788             :     Word16 L_tmp_e, L_tmp1_e, L_tmp2_e;
    4789             : 
    4790      182855 :     tau = s_min( abs_s( itd ), 160 ); // Q0
    4791             :     /* Wn_table contains every 8th sample of the window's cross-correlation
    4792             :      * function @ 32kHz from which the values are interpolated:  */
    4793      182855 :     k0 = shr( tau, 3 );
    4794             :     // alpha = s_and(tau, 7) / 8.f;
    4795      182855 :     alpha = BASOP_Util_Divide3232_Scale_newton( s_and( tau, 7 ), 8, &alpha_e );
    4796      182855 :     alpha = L_shl( alpha, alpha_e ); // Q31
    4797             :     // wnt = (1 - alpha) * Wn_table[k0] + alpha * Wn_table[k0 + 1];
    4798      182855 :     wnt = L_add( Mpy_32_32( L_sub( MAX_32, alpha ), Wn_table_fx[k0] ), Mpy_32_32( alpha, Wn_table_fx[k0 + 1] ) ); // Q31
    4799             : 
    4800             :     // go = sqrtf(8 * c * c / ((1 + c) * (1 + c)) * (1 - wnt) / (1 + c * c + 2 * c * wnt));
    4801      182855 :     L_tmp = Mpy_32_32( c, c );
    4802      182855 :     L_tmp_e = shl( c_e, 1 );
    4803      182855 :     L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, c, c_e, &L_tmp1_e );
    4804      182855 :     L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 );
    4805      182855 :     L_tmp1_e = shl( L_tmp1_e, 1 );
    4806      182855 :     L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp1, &L_tmp2_e );
    4807      182855 :     L_tmp2_e = add( add( L_tmp2_e, sub( L_tmp_e, L_tmp1_e ) ), 3 /*multiply by 8*/ );
    4808      182855 :     L_tmp2 = Mpy_32_32( L_tmp2, L_sub( MAX_32, wnt ) );
    4809      182855 :     L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_tmp, L_tmp_e, &L_tmp1_e );
    4810      182855 :     L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, Mpy_32_32( c, wnt ), add( c_e, 1 ), &L_tmp1_e );
    4811      182855 :     L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp2, L_tmp1, &L_tmp_e );
    4812      182855 :     L_tmp_e = add( L_tmp_e, sub( L_tmp2_e, L_tmp1_e ) );
    4813      182855 :     L_tmp = Sqrt32( L_tmp, &L_tmp_e );
    4814      182855 :     go = L_shl( L_tmp, L_tmp_e );
    4815             : 
    4816      182855 :     return go;
    4817             : }
    4818             : 
    4819             : /*---------------------------------------------------------------
    4820             :  * stereo_dft_enc_calculate_nrg_for_icbwe()
    4821             :  *
    4822             :  * calculate energy of downmix and left and right channel in the
    4823             :  * SHB region for later use in ICBWE
    4824             :  * ---------------------------------------------------------------*/
    4825       48157 : static void stereo_dft_enc_calculate_nrg_for_icbwe_fx(
    4826             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle   */
    4827             :     const Word16 *DFT_L_e,
    4828             :     const Word16 *DFT_R_e,
    4829             :     const Word32 *DMX,    /* i  : DFT Stereo downmix Q(31-DMX_e[]) */
    4830             :     const Word16 *DMX_e,  /* i  : DFT Stereo downmix          */
    4831             :     const Word32 input_Fs /* i  : input sampling rate         */
    4832             : )
    4833             : {
    4834             :     Word32 *pDFT_L, *pDFT_R, bandResDft;
    4835             :     Word16 bandResDft_e;
    4836             :     Word16 i, shbBins[3];
    4837             :     Word16 tmp_e;
    4838             :     Word32 tmp;
    4839             : 
    4840             :     // bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT;
    4841       48157 :     bandResDft = BASOP_Util_Divide3232_Scale_newton( input_Fs, hStereoDft->NFFT, &bandResDft_e );
    4842             :     // shbBins[0] = (int16_t) ( 6400 / bandResDft );
    4843       48157 :     shbBins[0] = BASOP_Util_Divide3232_Scale( 6400, bandResDft, &tmp_e );
    4844       48157 :     move16();
    4845       48157 :     tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
    4846       48157 :     shbBins[0] = shr( shbBins[0], sub( 15, tmp_e ) ); // Q0
    4847       48157 :     move16();
    4848             : 
    4849             :     // shbBins[1] = (int16_t) ( 10400 / bandResDft );
    4850       48157 :     shbBins[1] = BASOP_Util_Divide3232_Scale( 10400, bandResDft, &tmp_e );
    4851       48157 :     move16();
    4852       48157 :     tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
    4853       48157 :     shbBins[1] = shr( shbBins[1], sub( 15, tmp_e ) ); // Q0
    4854       48157 :     move16();
    4855             : 
    4856             :     // shbBins[2] = (int16_t) ( 14400 / bandResDft );
    4857       48157 :     shbBins[2] = BASOP_Util_Divide3232_Scale( 14400, bandResDft, &tmp_e );
    4858       48157 :     move16();
    4859       48157 :     tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
    4860       48157 :     shbBins[2] = shr( shbBins[2], sub( 15, tmp_e ) ); // Q0
    4861       48157 :     move16();
    4862             : 
    4863       48157 :     assert( shbBins[1] <= hStereoDft->NFFT / 2 );
    4864             : 
    4865       48157 :     set32_fx( hStereoDft->nrg_L_fx, EPSILON_FX_M, 2 );
    4866       48157 :     set16_fx( hStereoDft->nrg_L_fx_e, EPSILON_FX_E, 2 );
    4867       48157 :     set32_fx( hStereoDft->nrg_R_fx, EPSILON_FX_M, 2 );
    4868       48157 :     set16_fx( hStereoDft->nrg_R_fx_e, EPSILON_FX_E, 2 );
    4869       48157 :     set32_fx( hStereoDft->nrg_DMX_fx, EPSILON_FX_M, 2 );
    4870       48157 :     set16_fx( hStereoDft->nrg_DMX_fx_e, EPSILON_FX_E, 2 );
    4871             : 
    4872       48157 :     pDFT_L = hStereoDft->DFT_fx[0]; // Q(31-DFT_L_e[])
    4873       48157 :     pDFT_R = hStereoDft->DFT_fx[1]; // Q(31-DFT_R_e[])
    4874             : 
    4875     7753277 :     FOR( i = shbBins[0]; i < shbBins[1]; i++ )
    4876             :     {
    4877             :         // hStereoDft->nrg_L[0] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    4878     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_L[2 * i] ), shl( DFT_L_e[2 * i], 1 ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_L[2 * i + 1] ), shl( DFT_L_e[2 * i + 1], 1 ), &tmp_e );
    4879     7705120 :         hStereoDft->nrg_L_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_L_fx[0], hStereoDft->nrg_L_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_L_fx_e[0] );
    4880     7705120 :         move32();
    4881             :         // hStereoDft->nrg_R[0] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    4882     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R[2 * i], pDFT_R[2 * i] ), shl( DFT_R_e[2 * i], 1 ), Mpy_32_32( pDFT_R[2 * i + 1], pDFT_R[2 * i + 1] ), shl( DFT_R_e[2 * i + 1], 1 ), &tmp_e );
    4883     7705120 :         hStereoDft->nrg_R_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_R_fx[0], hStereoDft->nrg_R_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_R_fx_e[0] );
    4884     7705120 :         move32();
    4885             :         // hStereoDft->nrg_DMX[0] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
    4886     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( DMX[2 * i], DMX[2 * i] ), shl( DMX_e[2 * i], 1 ), Mpy_32_32( DMX[2 * i + 1], DMX[2 * i + 1] ), shl( DMX_e[2 * i + 1], 1 ), &tmp_e );
    4887     7705120 :         hStereoDft->nrg_DMX_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_DMX_fx[0], hStereoDft->nrg_DMX_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_DMX_fx_e[0] );
    4888     7705120 :         move32();
    4889             :     }
    4890     7753277 :     FOR( ; i < shbBins[2]; i++ )
    4891             :     {
    4892             :         // hStereoDft->nrg_L[1] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    4893     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_L[2 * i] ), shl( DFT_L_e[2 * i], 1 ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_L[2 * i + 1] ), shl( DFT_L_e[2 * i + 1], 1 ), &tmp_e );
    4894     7705120 :         hStereoDft->nrg_L_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_L_fx[1], hStereoDft->nrg_L_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_L_fx_e[1] );
    4895     7705120 :         move32();
    4896             :         // hStereoDft->nrg_R[1] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    4897     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R[2 * i], pDFT_R[2 * i] ), shl( DFT_R_e[2 * i], 1 ), Mpy_32_32( pDFT_R[2 * i + 1], pDFT_R[2 * i + 1] ), shl( DFT_R_e[2 * i + 1], 1 ), &tmp_e );
    4898     7705120 :         hStereoDft->nrg_R_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_R_fx[1], hStereoDft->nrg_R_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_R_fx_e[1] );
    4899     7705120 :         move32();
    4900             :         // hStereoDft->nrg_DMX[1] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
    4901     7705120 :         tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( DMX[2 * i], DMX[2 * i] ), shl( DMX_e[2 * i], 1 ), Mpy_32_32( DMX[2 * i + 1], DMX[2 * i + 1] ), shl( DMX_e[2 * i + 1], 1 ), &tmp_e );
    4902     7705120 :         hStereoDft->nrg_DMX_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_DMX_fx[1], hStereoDft->nrg_DMX_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_DMX_fx_e[1] );
    4903     7705120 :         move32();
    4904             :     }
    4905             : 
    4906       48157 :     return;
    4907             : }

Generated by: LCOV version 1.14