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

Generated by: LCOV version 1.14