LCOV - code coverage report
Current view: top level - lib_dec - ivas_stereo_dft_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 2156 2272 94.9 %
Date: 2025-06-27 02:59:36 Functions: 19 19 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "rom_com.h"
      39             : #include "rom_dec.h"
      40             : #include "prot_fx.h"
      41             : #include "ivas_prot_fx.h"
      42             : #include "ivas_cnst.h"
      43             : #include "ivas_rom_com.h"
      44             : #include "ivas_rom_com_fx.h"
      45             : #include "ivas_rom_dec.h"
      46             : #include "wmc_auto.h"
      47             : #include "ivas_prot_fx.h"
      48             : #include "basop_util.h"
      49             : #ifdef DEBUGGING
      50             : #include "debug.h"
      51             : #endif
      52             : 
      53             : 
      54             : /*-------------------------------------------------------------------*
      55             :  * Local constants
      56             :  *-------------------------------------------------------------------*/
      57             : 
      58             : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
      59             : 
      60             : #define STEREO_DFT_RES_RATIO_LIMIT_FX        ( Word32 )( 0x170A3D71 )
      61             : #define STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2 ( Word32 )( 0x228F5C28 )
      62             : #define ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12   ( Word16 )( 0x58E4 )
      63             : #define STEREO_DFT_LT_PREDGAIN_UPD_FX        ( Word16 )( 0x0CCD )
      64             : #define STEREO_DFT_VR_PREDGAIN_UPD_FX        ( Word16 )( 0x0CCD )
      65             : #define STEREO_DFT_STEFFI_PG_THRESHOLD_FX    ( Word32 )( 0x4CCCCCCD )
      66             : #define STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX   ( Word32 )( 0x03D70A3D )
      67             : #define STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX ( Word32 )( 0x06666666 )
      68             : #define STEREO_DFT_STEFFI_RATIO_UP_LOW_FX    ( Word32 )( 0x0CCCCCCC )
      69             : #define STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX  ( Word32 )( 0x0020C49C )
      70             : #define STEREO_DFT_STEFFI_DELAY_SHORT        2
      71             : #define STEREO_DFT_STEFFI_DELAY_LONG         4
      72             : #define STEREO_DFT_STEFFI_DELAY_OFFSET       2
      73             : #define STEREO_DFT_STEFFI_GAIN_REST_AMT_FX   ( Word16 )( 0x4CCD )
      74             : #define STEREO_DFT_STEFFI_GAIN_AMP_FX        ( Word16 )( 0x7FFF )
      75             : 
      76             : 
      77             : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
      78             : 
      79             : /*-------------------------------------------------------------------------
      80             :  * Local function prototypes
      81             :  *-------------------------------------------------------------------------*/
      82             : 
      83             : static void stereo_dft_compute_td_stefi_params_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const Word16 samp_ratio );
      84             : 
      85             : static void stereo_dft_adapt_sf_delay_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, Word32 *pPredGain );
      86             : 
      87             : /*-------------------------------------------------------------------------
      88             :  * stereo_dft_dec_reset_fx()
      89             :  *
      90             :  * Reset DFT stereo memories
      91             :  *------------------------------------------------------------------------*/
      92             : 
      93         908 : void stereo_dft_dec_reset_fx(
      94             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle   */
      95             : )
      96             : {
      97             :     Word16 i;
      98             :     Word16 j, b;
      99         908 :     set_zero_fx( hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );
     100             : 
     101             :     /*Configuration*/
     102         908 :     set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB );
     103             : 
     104             :     /* SIDE_GAIN */
     105         908 :     set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX );
     106         908 :     set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX );
     107             : 
     108             :     /*residual prediction*/
     109         908 :     set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB );
     110        4540 :     FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ )
     111             :     {
     112        3632 :         set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k );
     113        3632 :         set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX );
     114        3632 :         hStereoDft->q_DFT_past_DMX_fx[i] = 0;
     115        3632 :         move16();
     116             :     }
     117             : 
     118         908 :     hStereoDft->past_DMX_pos = 0;
     119         908 :     move16();
     120             : 
     121         908 :     set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX );
     122             : 
     123       24516 :     FOR( i = 0; i < STEREO_DFT_BAND_MAX * 2; i++ )
     124             :     {
     125       23608 :         hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */
     126       23608 :         move32();
     127             :     }
     128             : 
     129         908 :     set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX * 2 );
     130             : 
     131             :     /*residual coding*/
     132         908 :     set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
     133         908 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
     134         908 :     set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
     135         908 :     hStereoDft->q_res_cod_mem_fx = Q15;
     136         908 :     move16();
     137             : 
     138         908 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
     139         908 :     move32();
     140             : 
     141         908 :     hStereoDft->stab_fac_smooth_res_fx = 0;
     142         908 :     move16();
     143         908 :     bass_psfilter_init_fx( hStereoDft->hBpf );
     144             : 
     145         908 :     tcxltp_dec_init_fx( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 );
     146             : 
     147         908 :     hStereoDft->reverb_flag = 0;
     148         908 :     move16();
     149             : 
     150         908 :     hStereoDft->res_hb_nrg_mem_fx = 0;
     151         908 :     move32();
     152         908 :     hStereoDft->bpf_error_signal_last_fx = 0;
     153         908 :     move32();
     154         908 :     hStereoDft->bpf_error_ratio_mem_fx = ONE_IN_Q13;
     155         908 :     move16();
     156             : 
     157             :     /*reset parameters*/
     158         908 :     set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     159         908 :     set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     160         908 :     set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     161         908 :     set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     162             : 
     163         908 :     hStereoDft->wasTransient = 0;
     164         908 :     move16();
     165         908 :     hStereoDft->attackPresent = 0;
     166         908 :     move16();
     167             : 
     168         908 :     hStereoDft->lt_pred_gain_fx = 0;
     169         908 :     move32();
     170         908 :     hStereoDft->lt_pred_gain_variation_fx = 0;
     171         908 :     move32();
     172         908 :     hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX;
     173         908 :     move32();
     174         908 :     hStereoDft->stefi_short_gain_fx = MAX_16;
     175         908 :     move16();
     176         908 :     hStereoDft->stefi_long_gain_fx = 0;
     177         908 :     move16();
     178         908 :     hStereoDft->q_lt_pred_gain = 0;
     179         908 :     move16();
     180             : 
     181         908 :     set16_fx( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX );
     182             : 
     183         908 :     init_basic_allpass_fx( &hStereoDft->ap1, dft_ap_gains_fx[0], dft_ap_delays[0] );
     184         908 :     init_basic_allpass_fx( &hStereoDft->ap2, dft_ap_gains_fx[1], dft_ap_delays[1] );
     185         908 :     init_basic_allpass_fx( &hStereoDft->ap3, dft_ap_gains_fx[2], dft_ap_delays[2] );
     186             : 
     187         908 :     set32_fx( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) );
     188         908 :     set32_fx( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k );
     189         908 :     hStereoDft->q_ap_delay_mem_fx = Q11;
     190         908 :     move16();
     191         908 :     hStereoDft->ap_wasTransient = 0;
     192         908 :     move16();
     193         908 :     set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     194         908 :     set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     195         908 :     hStereoDft->q_smoothed_nrg = 0;
     196         908 :     move16();
     197             : 
     198         908 :     set16_fx( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX );
     199             : 
     200         908 :     set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) );
     201         908 :     set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     202         908 :     set32_fx( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     203         908 :     set16_fx( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX );
     204         908 :     hStereoDft->q_dft = 0;
     205         908 :     move16();
     206             : 
     207             :     /* PLC parameters */
     208         908 :     set32_fx( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX );
     209         908 :     hStereoDft->time_offs = 0;
     210         908 :     move16();
     211         908 :     hStereoDft->past_dmx_nrg_fx = 0;
     212         908 :     move32();
     213         908 :     hStereoDft->sg_mean_fx = 0;
     214         908 :     move32();
     215         908 :     hStereoDft->sg_mem_corrupt = 0;
     216         908 :     move16();
     217         908 :     hStereoDft->recovery_flg = 0;
     218         908 :     move16();
     219             : 
     220       11804 :     FOR( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ )
     221             :     {
     222       10896 :         set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
     223             :     }
     224         908 :     hStereoDft->q_smooth_buf_fx = Q7;
     225         908 :     move16();
     226         908 :     set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     227         908 :     set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     228             : 
     229         908 :     hStereoDft->itd_xfade_target_fx = 0;
     230         908 :     move32();
     231         908 :     hStereoDft->itd_xfade_step_fx = 0;
     232         908 :     move32();
     233         908 :     hStereoDft->itd_xfade_counter = 0;
     234         908 :     move16();
     235         908 :     hStereoDft->itd_xfade_prev_fx = 0;
     236         908 :     move32();
     237         908 :     hStereoDft->last_active_element_brate = 0;
     238         908 :     move32();
     239         908 :     hStereoDft->ipd_xfade_target_fx = 0;
     240         908 :     move32();
     241         908 :     hStereoDft->ipd_xfade_step_fx = 0;
     242         908 :     move32();
     243         908 :     hStereoDft->ipd_xfade_counter = 0;
     244         908 :     move16();
     245         908 :     hStereoDft->ipd_xfade_prev_fx = 0;
     246         908 :     move32();
     247         908 :     hStereoDft->frame_sid_nodata = 0;
     248         908 :     move16();
     249       22700 :     FOR( b = 0; b < 2 * IVAS_MAX_NUM_BANDS; b++ )
     250             :     {
     251       65376 :         FOR( i = 0; i < 2; i++ )
     252             :         {
     253      217920 :             FOR( j = 0; j < 4; j++ )
     254             :             {
     255      174336 :                 hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0;
     256      174336 :                 move32();
     257             :             }
     258             :         }
     259             :     }
     260         908 :     hStereoDft->first_frame = 1;
     261         908 :     move16();
     262         908 :     hStereoDft->g_L_prev_fx = 0;
     263         908 :     move32();
     264         908 :     hStereoDft->g_R_prev_fx = 0;
     265         908 :     move32();
     266             : 
     267         908 :     return;
     268             : }
     269             : 
     270             : /*-------------------------------------------------------------------------
     271             :  * stereo_dft_dec_open_fx()
     272             :  *
     273             :  * Open DFT decoder stereo handle
     274             :  *-------------------------------------------------------------------------*/
     275             : 
     276         908 : static void stereo_dft_dec_open_fx(
     277             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle              */
     278             :     const Word32 output_Fs,                /* i  : output sampling rate                         Q0*/
     279             :     const Word16 nchan_transport           /* i  : number of transport channels         Q0*/
     280             : )
     281             : {
     282             :     /*Sizes*/
     283             :     // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 );
     284         908 :     hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     285         908 :     move16();
     286             : 
     287             :     /*Init. DFT sizes*/
     288         908 :     hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     289         908 :     move16();
     290             : 
     291         908 :     hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx;    /* Q15 */
     292         908 :     hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; /* Q15 */
     293         908 :     hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx;   /* Q15 */
     294             : 
     295         908 :     hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     296         908 :     hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx;                                                                                /* Q15 */
     297         908 :     hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx;                                                                            /* Q15 */
     298         908 :     hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx;                                                                              /* Q15 */
     299             : 
     300         908 :     hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     301         908 :     hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1;                                                                               /* Q15 */
     302         908 :     hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1;                                                                           /* Q15 */
     303         908 :     hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1;                                                                             /* Q15 */
     304             : 
     305         908 :     IF( EQ_32( output_Fs, 16000 ) )
     306             :     {
     307          89 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;                  /* Q15 */
     308          89 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; /* Q0 */
     309          89 :         move16();
     310          89 :         hStereoDft->win232ms_fx = dft_win232ms_16k_fx;    /* Q15 */
     311          89 :         hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; /* Q15 */
     312             :     }
     313         819 :     ELSE IF( EQ_32( output_Fs, 32000 ) )
     314             :     {
     315         212 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;                  /* Q15 */
     316         212 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; /* Q0 */
     317         212 :         move16();
     318         212 :         hStereoDft->win232ms_fx = dft_win232ms_32k_fx;    /* Q15 */
     319         212 :         hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; /* Q15 */
     320             :     }
     321             :     ELSE
     322             :     {
     323         607 :         assert( output_Fs == 48000 );
     324         607 :         hStereoDft->dft_trigo_fx = dft_trigo_48k_fx;                  /* Q15 */
     325         607 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; /* Q0 */
     326         607 :         move16();
     327         607 :         hStereoDft->win232ms_fx = dft_win232ms_48k_fx;    /* Q15 */
     328         607 :         hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; /* Q15 */
     329             :     }
     330             : 
     331         908 :     hStereoDft->win_8k_fx = dft_win_8k_fx; /* Q15 */
     332             : 
     333             :     /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
     334         908 :     set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB );
     335             : 
     336         908 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); /* Q0 */
     337         908 :     move16();
     338         908 :     hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); /* Q0 */
     339         908 :     move16();
     340             : 
     341         908 :     IF( GT_16( nchan_transport, 2 ) )
     342             :     {
     343          44 :         hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; /* Q15 */
     344          44 :         hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; /* Q15 */
     345             :     }
     346             :     ELSE
     347             :     {
     348         864 :         hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; /* Q15 */
     349         864 :         hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; /* Q15 */
     350             :     }
     351         908 :     hStereoDft->q_hb_stefi_sig_fx = Q31;
     352         908 :     move16();
     353         908 :     hStereoDft->q_ap_fade_mem_fx = Q31;
     354         908 :     move16();
     355             : 
     356             :     /* reset DFT stereo memories */
     357         908 :     stereo_dft_dec_reset_fx( hStereoDft );
     358             : 
     359         908 :     return;
     360             : }
     361             : 
     362             : 
     363             : /*-------------------------------------------------------------------------
     364             :  * stereo_dft_dec_create_fx()
     365             :  *
     366             :  * Create DFT stereo handle
     367             :  *------------------------------------------------------------------------*/
     368             : 
     369         908 : ivas_error stereo_dft_dec_create_fx(
     370             :     STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle                     */
     371             :     const Word32 element_brate,             /* i  : element bitrate                                             Q0*/
     372             :     const Word32 output_Fs,                 /* i  : output sampling rate                                Q0*/
     373             :     const Word16 sba_dirac_stereo_flag,     /* i  : signal stereo output for SBA DirAC  Q0*/
     374             :     const Word16 nchan_transport            /* i  : number of transport channels                Q0*/
     375             : )
     376             : {
     377             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc;
     378             :     Word16 tmpS;
     379             : 
     380         908 :     IF( *hStereoDft != NULL )
     381             :     {
     382           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
     383             :     }
     384             : 
     385         908 :     IF( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL )
     386             :     {
     387           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
     388             :     }
     389             : 
     390         908 :     IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
     391             :     {
     392           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
     393             :     }
     394             : 
     395         908 :     IF( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL )
     396             :     {
     397           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) );
     398             :     }
     399             : 
     400         908 :     IF( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
     401             :     {
     402           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
     403             :     }
     404         908 :     set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/
     405         908 :     hStereoDft_loc->q_hb_nrg_subr = Q31;
     406         908 :     move16();
     407             : 
     408         908 :     hStereoDft_loc->hConfig->force_mono_transmission = 0;
     409         908 :     move16();
     410             : 
     411         908 :     IF( sba_dirac_stereo_flag )
     412             :     {
     413          96 :         ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig );
     414             :     }
     415             :     ELSE
     416             :     {
     417         812 :         stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS );
     418             :     }
     419             : 
     420         908 :     stereo_dft_dec_open_fx( hStereoDft_loc, output_Fs, nchan_transport );
     421             : 
     422         908 :     *hStereoDft = hStereoDft_loc;
     423             : 
     424         908 :     return IVAS_ERR_OK;
     425             : }
     426             : 
     427             : 
     428             : /*-------------------------------------------------------------------------
     429             :  * stereo_dft_dequantize_res_gains_fx()
     430             :  *
     431             :  * joint dequantizer for side channel prediction gain and residual energy
     432             :  *-------------------------------------------------------------------------*/
     433             : 
     434      412899 : static void stereo_dft_dequantize_res_gains_fx(
     435             :     Word16 *ind1,  /* Q0 */
     436             :     Word16 *ind2,  /* Q0 */
     437             :     Word32 *gout,  /* Q31 */
     438             :     Word32 *rout,  /* Q31 */
     439             :     const Word16 N /* Q0 */
     440             : )
     441             : {
     442             :     Word16 i, index;
     443             :     Word16 tmp;
     444             : 
     445      825798 :     FOR( i = 0; i < N; i++ )
     446             :     {
     447             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     448      412899 :         ind1[i] = check_bounds_s_fx( ind1[i], 0, 30 ); /* Q0 */
     449      412899 :         move16();
     450      412899 :         ind2[i] = check_bounds_s_fx( ind2[i], 0, 7 ); /* Q0 */
     451      412899 :         move16();
     452      412899 :         IF( LE_16( ind1[i], 15 ) )
     453             :         {
     454      318379 :             tmp = sub( 15, ind1[i] );
     455             :         }
     456             :         ELSE
     457             :         {
     458       94520 :             tmp = sub( ind1[i], 15 );
     459             :         }
     460             :         // index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] );
     461      412899 :         index = add( shl( tmp, 3 ), ind2[i] );
     462             :         // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0];
     463      412899 :         IF( LE_16( ind1[i], 15 ) )
     464             :         {
     465      318379 :             gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); /* Q31 */
     466      318379 :             move16();
     467             :         }
     468             :         ELSE
     469             :         {
     470       94520 :             gout[i] = dft_res_gains_q_fx[index][0]; /* Q31 */
     471       94520 :             move16();
     472             :         }
     473      412899 :         rout[i] = dft_res_gains_q_fx[index][1]; /* Q31 */
     474      412899 :         move16();
     475             :     }
     476             : 
     477      412899 :     return;
     478             : }
     479             : 
     480             : /*---------------------------------------------------------------------------
     481             :  * stereo_dft_dequantize_res_gains_f_fx()
     482             :  *
     483             :  * returns interepolated values for non-integer indices
     484             :  *---------------------------------------------------------------------------*/
     485             : 
     486      258886 : static void stereo_dft_dequantize_res_gains_f_fx(
     487             :     Word32 *ind1,  /* Q26 */
     488             :     Word32 *ind2,  /* Q26 */
     489             :     Word32 *gout,  /* Q31 */
     490             :     Word32 *rout,  /* Q31 */
     491             :     const Word16 N /* Q0 */
     492             : )
     493             : {
     494             :     Word16 i, i1, j1, sign, ji, ij;
     495             :     Word32 L_tmp;
     496             :     Word32 fi, fj;
     497             : 
     498      517772 :     FOR( i = 0; i < N; i++ )
     499             :     {
     500             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     501      258886 :         ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); /* Q26 */
     502      258886 :         move32();
     503      258886 :         ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); /* Q26 */
     504      258886 :         move32();
     505             : 
     506             :         /* compensate for the offset and extract/remove sign of first index */
     507             :         // sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1;
     508      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     509             :         {
     510      151745 :             sign = -1;
     511      151745 :             move16();
     512             :         }
     513             :         ELSE
     514             :         {
     515      107141 :             sign = 1;
     516      107141 :             move16();
     517             :         }
     518      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     519             :         {
     520      151745 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     521             :         }
     522             :         ELSE
     523             :         {
     524      107141 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     525             :         }
     526      258886 :         i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); /* Q0 */
     527      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     528             :         {
     529      151745 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     530             :         }
     531             :         ELSE
     532             :         {
     533      107141 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     534             :         }
     535      258886 :         fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); /* Q26 */
     536      258886 :         move16();
     537      258886 :         j1 = extract_l( L_shr( ind2[i], Q26 ) ); /* Q0 */
     538      258886 :         fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* Q26 */
     539             : 
     540             :         /* choose base indices for interpolation */
     541      258886 :         IF( LT_32( fj, ONE_IN_Q25 ) )
     542             :         {
     543      109241 :             ji = extract_l( L_min( j1, 7 ) ); /* Q0 */
     544             :         }
     545             :         ELSE
     546             :         {
     547      149645 :             ji = extract_l( L_min( add( j1, 1 ), 7 ) ); /* Q0 */
     548             :         }
     549             : 
     550      258886 :         IF( LT_32( fi, ONE_IN_Q25 ) )
     551             :         {
     552      212928 :             ij = extract_l( L_min( i1, 15 ) ); /* Q0 */
     553             :         }
     554             :         ELSE
     555             :         {
     556       45958 :             ij = extract_l( L_min( add( i1, 1 ), 15 ) ); /* Q0 */
     557             :         }
     558             : 
     559             :         /* interpolate values from table */
     560      258886 :         IF( LT_16( i1, 15 ) )
     561             :         {
     562      258240 :             gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); /* Q31 */
     563      258240 :             move32();
     564      258240 :             IF( EQ_16( sign, -1 ) )
     565             :             {
     566      151131 :                 gout[i] = L_negate( gout[i] );
     567      151131 :                 move32();
     568             :             }
     569             :         }
     570             :         ELSE
     571             :         {
     572         646 :             gout[i] = dft_res_gains_q_fx[120 + ji][0]; /* Q31 */
     573         646 :             move32();
     574         646 :             IF( EQ_16( sign, -1 ) )
     575             :             {
     576         614 :                 gout[i] = L_negate( gout[i] );
     577         614 :                 move32();
     578             :             }
     579             :         }
     580             : 
     581      258886 :         IF( LT_16( j1, 7 ) )
     582             :         {
     583      258886 :             rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); /* Q31 */
     584      258886 :             move32();
     585             :         }
     586             :         ELSE
     587             :         {
     588           0 :             rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; /* Q31 */
     589           0 :             move32();
     590             :         }
     591             :     }
     592      258886 :     return;
     593             : }
     594             : 
     595             : /*-------------------------------------------------------------------------
     596             :  * stereo_dft_dec_update_fx()
     597             :  *
     598             :  * Update DFT memories for new frame
     599             :  *-------------------------------------------------------------------------*/
     600             : 
     601       68949 : void stereo_dft_dec_update_fx(
     602             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle                      */
     603             :     const Word16 output_frame,             /* i  : output frame length                                  Q0*/
     604             :     const Word16 sba_dirac_stereo_flag     /* i  : signal stereo output for SBA DirAC   Q0*/
     605             : )
     606             : {
     607             :     Word16 b, i, k_offset;
     608             : 
     609             :     /* Initialization */
     610       68949 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset*/
     611       68949 :     move16();
     612             :     /* Update parameters */
     613      965286 :     FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
     614             :     {
     615      896337 :         hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     616      896337 :         move32();
     617      896337 :         hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     618      896337 :         move32();
     619             :     }
     620             : 
     621      137898 :     FOR( i = 0; i < k_offset; i++ )
     622             :     {
     623       68949 :         hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; /* Q27 */
     624       68949 :         move32();
     625             :     }
     626             : 
     627             :     /* Update configuration memories */
     628      137898 :     FOR( i = 0; i < k_offset; i++ )
     629             :     {
     630       68949 :         hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     631       68949 :         move16();
     632       68949 :         hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     633       68949 :         move16();
     634       68949 :         hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; /* Q15 */
     635       68949 :         move32();
     636       68949 :         hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     637       68949 :         move16();
     638       68949 :         hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     639       68949 :         move16();
     640             :     }
     641             : 
     642             :     /* Load new configurations */
     643       68949 :     set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV );
     644       68949 :     set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV );
     645       68949 :     set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV );
     646       68949 :     set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV );
     647             : 
     648             :     /*Update attack info*/
     649       68949 :     IF( hStereoDft->attackPresent )
     650             :     {
     651        1576 :         hStereoDft->wasTransient = 1;
     652        1576 :         move16();
     653             :     }
     654       67373 :     ELSE IF( hStereoDft->wasTransient )
     655             :     {
     656        1362 :         hStereoDft->wasTransient = 0;
     657        1362 :         move16();
     658             :     }
     659             : 
     660      206847 :     FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- )
     661             :     {
     662      137898 :         hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; /* Q0 */
     663      137898 :         move16();
     664             :     }
     665             : 
     666       68949 :     Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); /* Qx */
     667       68949 :     Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                      /* Qx */
     668       68949 :     Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                    /* q_td_gain */
     669       68949 :     Copy( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
     670             : 
     671       68949 :     IF( sba_dirac_stereo_flag )
     672             :     {
     673             :         /* buffer update, push back by 2 because of 2 subframes */
     674      126010 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
     675             :         {
     676     1152200 :             FOR( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- )
     677             :             {
     678     1036980 :                 hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; /* q_smooth_buf_fx */
     679     1036980 :                 move32();
     680             :             }
     681             :         }
     682             :     }
     683             : 
     684       68949 :     return;
     685             : }
     686             : 
     687             : /*-------------------------------------------------------------------------
     688             :  * stereo_dft_dec_destroy_fx()
     689             :  *
     690             :  * destroy DFT stereo handle
     691             :  *-------------------------------------------------------------------------*/
     692             : 
     693         908 : void stereo_dft_dec_destroy_fx(
     694             :     STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle     */
     695             : )
     696             : {
     697             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
     698             : 
     699         908 :     hStereoDft = *hStereoDft_glob;
     700             : 
     701         908 :     IF( hStereoDft->hConfig != NULL )
     702             :     {
     703         908 :         free( hStereoDft->hConfig );
     704         908 :         hStereoDft->hConfig = NULL;
     705             :     }
     706             : 
     707         908 :     IF( hStereoDft->hBpf != NULL )
     708             :     {
     709         908 :         free( hStereoDft->hBpf );
     710         908 :         hStereoDft->hBpf = NULL;
     711             :     }
     712             : 
     713         908 :     IF( hStereoDft->hTcxLtpDec != NULL )
     714             :     {
     715         908 :         free( hStereoDft->hTcxLtpDec );
     716         908 :         hStereoDft->hTcxLtpDec = NULL;
     717             :     }
     718             : 
     719         908 :     free( hStereoDft );
     720         908 :     hStereoDft = NULL;
     721             : 
     722         908 :     return;
     723             : }
     724             : 
     725             : 
     726             : /*-------------------------------------------------------------------------
     727             :  * stereo_dft_dec_analyze_fx()
     728             :  *
     729             :  * DFT analysis on a 20ms frame
     730             :  *-------------------------------------------------------------------------*/
     731             : 
     732      195208 : void stereo_dft_dec_analyze_fx(
     733             :     CPE_DEC_HANDLE hCPE,                                 /* i/o: CPE decoder structure             */
     734             :     const Word32 *input_fx,                              /* i  : input signal                                                           q*/
     735             :     Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o  : DFT buffers                                            q_out_DFT*/
     736             :     const Word16 chan,                                   /* i  : channel number                                                    Q0*/
     737             :     const Word16 input_frame,                            /* i  : input frame size                                                  Q0*/
     738             :     const Word16 output_frame,                           /* i  : output frame size                                                 Q0*/
     739             :     const DFT_STEREO_DEC_ANA_TYPE ana_type,              /* i  : type of signal to analyse                                       */
     740             :     const Word16 k_offset,                               /* i  : offset of DFT                                                     Q0*/
     741             :     const Word16 delay,                                  /* i  : delay in samples FOR input signal                 Q0*/
     742             :     Word16 *q,
     743             :     Word16 *q_out_DFT )
     744             : {
     745             : 
     746             :     Word16 i, k;
     747             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
     748             :     Word32 *pInput_fx, *pInput_buff_fx;
     749             :     Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k];
     750             :     Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx;
     751             :     Word16 NFFT, NFFT_core, ovl, zp;
     752             :     Word16 offset;
     753             :     Word32 fac_fx;
     754             :     const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx;
     755             :     Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1];
     756             :     Word16 trigo_step;
     757             :     Word32 inputFs;
     758             :     Word16 delay_dec;
     759             :     Word16 mem_size;
     760             :     Word16 ovl2;
     761             : 
     762      195208 :     push_wmops( "DFT_analysis" );
     763             : 
     764      195208 :     hStereoDft = hCPE->hStereoDft;
     765             : 
     766      195208 :     assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
     767             : 
     768             :     /*-----------------------------------------------------------------*
     769             :      * Initialization
     770             :      *-----------------------------------------------------------------*/
     771             : 
     772      195208 :     IF( EQ_16( input_frame, output_frame ) )
     773             :     {
     774       72286 :         trigo_fx = hStereoDft->dft_trigo_fx;
     775       72286 :         trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
     776       72286 :         win_right_fx = hStereoDft->win32ms_fx;                                        /* Q15 */
     777       72286 :         win_left_fx = hStereoDft->win32ms_fx;                                         /* Q15 */
     778       72286 :         win2_fx = hStereoDft->win232ms_fx;                                            /* Q15 */
     779             : 
     780       72286 :         test();
     781       72286 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     782             :         {
     783        5085 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     784        5085 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     785             :         }
     786       67201 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     787             :         {
     788        3436 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     789             :         }
     790             :         ELSE
     791             :         {
     792       63765 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     793             :         }
     794             :     }
     795      122922 :     ELSE IF( EQ_16( input_frame, L_FRAME ) )
     796             :     {
     797       59225 :         trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */
     798       59225 :         trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     799       59225 :         move16();
     800       59225 :         win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
     801       59225 :         win_left_fx = hStereoDft->win32ms_12k8_fx;  /* Q15 */
     802       59225 :         win2_fx = hStereoDft->win232ms_12k8_fx;     /* Q15 */
     803             : 
     804       59225 :         test();
     805       59225 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     806             :         {
     807       20955 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     808       20955 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     809             :         }
     810       38270 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     811             :         {
     812       18516 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     813             :         }
     814             :         ELSE
     815             :         {
     816       19754 :             assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" );
     817       19754 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     818             :         }
     819             :     }
     820       63697 :     ELSE IF( EQ_16( input_frame, L_FRAME16k ) )
     821             :     {
     822       46867 :         trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */
     823       46867 :         trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     824       46867 :         move16();
     825       46867 :         win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
     826       46867 :         win_left_fx = hStereoDft->win32ms_16k_fx;  /* Q15 */
     827       46867 :         win2_fx = hStereoDft->win232ms_16k_fx;     /* Q15 */
     828             : 
     829       46867 :         test();
     830       46867 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     831             :         {
     832       22157 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     833       22157 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     834             :         }
     835       24710 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     836             :         {
     837       14901 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     838             :         }
     839             :         ELSE
     840             :         {
     841        9809 :             assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" );
     842        9809 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     843             :         }
     844             :     }
     845       16830 :     ELSE IF( EQ_16( input_frame, L_FRAME8k ) )
     846             :     {
     847       16830 :         assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" );
     848       16830 :         trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */
     849       16830 :         trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     850       16830 :         move16();
     851       16830 :         win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
     852       16830 :         win_left_fx = hStereoDft->win32ms_8k_fx;  /* Q15 */
     853       16830 :         win2_fx = hStereoDft->win232ms_8k_fx;     /* Q15 */
     854       16830 :         mem_fx = hCPE->input_mem_fx[chan];        /* Q11 */
     855             :     }
     856             :     ELSE
     857             :     {
     858           0 :         IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" );
     859           0 :         mem_fx = NULL;   /* to avoid compilation warning */
     860           0 :         trigo_fx = NULL; /* to avoid compilation warning */
     861           0 :         trigo_step = -1; /* to avoid compilation warning */
     862           0 :         move16();
     863           0 :         win_right_fx = NULL; /* to avoid compilation warning */
     864           0 :         win_left_fx = NULL;  /* to avoid compilation warning */
     865           0 :         win2_fx = NULL;      /* to avoid compilation warning */
     866             :     }
     867             : 
     868      195208 :     inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */
     869      195208 :     delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     870      195208 :     move16();
     871      195208 :     zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS );
     872      195208 :     move16();
     873      195208 :     ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     874      195208 :     move16();
     875      195208 :     NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS );
     876             :     Word16 qfac_fx;
     877      195208 :     fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */
     878      195208 :     qfac_fx = sub( 31, qfac_fx );
     879      195208 :     ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS );
     880      195208 :     move16();
     881             : 
     882             :     /* Offset FOR the time buffers */
     883      195208 :     assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) );
     884      195208 :     mem_size = add( delay_dec, delay );
     885             : 
     886             :     /* Update buffers */
     887      195208 :     Copy32( mem_fx, input_buff_fx, mem_size );                 /* Q11 */
     888      195208 :     Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */
     889      195208 :     Copy32( input_buff_fx + input_frame, mem_fx, mem_size );   /* q */
     890      195208 :     pInput_buff_fx = input_buff_fx;                            /* q */
     891             : 
     892      195208 :     test();
     893      195208 :     IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
     894             :     {
     895       39593 :         pop_wmops();
     896       39593 :         return;
     897             :     }
     898             : 
     899             : 
     900             :     /*-----------------------------------------------------------------*
     901             :      * DFT Analysis: loop over frame
     902             :      *-----------------------------------------------------------------*/
     903             : 
     904      155615 :     assert( ( k_offset <= STEREO_DFT_NBDIV ) );
     905             : 
     906    16215071 :     FOR( i = 0; i < NFFT / 4; i++ )
     907             :     {
     908    16059456 :         trigo_dec_fx[i] = trigo_fx[i * trigo_step];
     909    16059456 :         move16();
     910    16059456 :         trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step];
     911    16059456 :         move16();
     912             :     }
     913      155615 :     trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step];
     914      155615 :     move16();
     915             : 
     916      396608 :     FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
     917             :     {
     918      240993 :         set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX );
     919      240993 :         IF( k == 0 )
     920             :         {
     921      121442 :             offset = 0;
     922      121442 :             move16();
     923             :         }
     924             :         ELSE
     925             :         {
     926             :             /* If OVL2 = OVL offset = 10ms */
     927      119551 :             offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
     928      119551 :             move16();
     929             :         }
     930             : 
     931      240993 :         pInput_fx = pInput_buff_fx + offset;                                /* q */
     932      240993 :         pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */
     933             : 
     934             :         /*Forwards FFT:  L and R*/
     935             :         /* Zero Padding & Flat Portion */
     936      240993 :         Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */
     937             : 
     938             :         /* Overlapping portions */
     939      240993 :         IF( k == 0 )
     940             :         {
     941     7278692 :             FOR( i = 0; i < ovl; i++ )
     942             :             {
     943     7157250 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */
     944     7157250 :                 move32();
     945             :             }
     946    21593192 :             FOR( i = 0; i < ovl2; i++ )
     947             :             {
     948    21471750 :                 DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */
     949    21471750 :                 move32();
     950             :             }
     951             :         }
     952             :         ELSE
     953             :         {
     954    21153421 :             FOR( i = 0; i < ovl2; i++ )
     955             :             {
     956    21033870 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */
     957    21033870 :                 move32();
     958             :             }
     959     7130841 :             FOR( i = 0; i < ovl; i++ )
     960             :             {
     961     7011290 :                 DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */
     962     7011290 :                 move32();
     963             :             }
     964             :         }
     965             :         Word16 q_DFT, q_shift, guarded_bits;
     966      240993 :         q_DFT = *q;
     967      240993 :         move16();
     968      240993 :         guarded_bits = find_guarded_bits_fx( NFFT );
     969      240993 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits );
     970             : 
     971    90919649 :         FOR( Word16 j = 0; j < NFFT; j++ )
     972             :         {
     973    90678656 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/
     974    90678656 :             move32();
     975             :         }
     976             : 
     977      240993 :         q_DFT = add( q_DFT, q_shift );
     978             : 
     979      240993 :         rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 );
     980             : 
     981      240993 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) );
     982    90919649 :         FOR( Word16 j = 0; j < NFFT; j++ )
     983             :         {
     984    90678656 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */
     985    90678656 :             move32();
     986             :         }
     987      240993 :         q_DFT = add( q_DFT, q_shift );
     988      240993 :         IF( sub( q_out_DFT[chan], q_DFT ) > 0 )
     989             :         {
     990           0 :             FOR( Word32 j = 0; j < NFFT; j++ )
     991             :             {
     992           0 :                 out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */
     993           0 :                 move32();
     994             :             }
     995           0 :             q_out_DFT[chan] = q_DFT;
     996           0 :             move16();
     997             :         }
     998             :         ELSE
     999             :         {
    1000    90919649 :             FOR( Word32 j = 0; j < NFFT; j++ )
    1001             :             {
    1002    90678656 :                 DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */
    1003    90678656 :                 move32();
    1004             :             }
    1005      240993 :             q_DFT = q_out_DFT[chan];
    1006      240993 :             move16();
    1007             :         }
    1008             : 
    1009             :         /*Resampling: filtering+scaling*/
    1010      240993 :         test();
    1011      240993 :         test();
    1012      240993 :         IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) )
    1013             :         {
    1014      188526 :             pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */
    1015      188526 :             move32();
    1016      188526 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
    1017             :             {
    1018       63290 :                 pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
    1019       63290 :                 move32();
    1020             :             }
    1021             :             ELSE
    1022             :             {
    1023      125236 :                 pDFT_out_fx[1] = 0;
    1024      125236 :                 move32();
    1025             :             }
    1026    74510738 :             FOR( i = 2; i < NFFT; i++ )
    1027             :             {
    1028    74322212 :                 pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
    1029    74322212 :                 move32();
    1030             :             }
    1031    55163502 :             FOR( i = NFFT; i < hStereoDft->NFFT; i++ )
    1032             :             {
    1033    54974976 :                 pDFT_out_fx[i] = 0; /* qDFT */
    1034    54974976 :                 move32();
    1035             :             }
    1036             :         }
    1037       52467 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
    1038             :         {
    1039       50394 :             pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */
    1040       50394 :             move32();
    1041             : 
    1042     2015760 :             FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
    1043             :             {
    1044     1965366 :                 pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
    1045     1965366 :                 move32();
    1046     1965366 :                 pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
    1047     1965366 :                 move32();
    1048             :             }
    1049             :         }
    1050        2073 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) )
    1051             :         {
    1052          80 :             NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */
    1053          80 :             move16();
    1054             : 
    1055       43536 :             FOR( i = NFFT_core; i < NFFT; i++ )
    1056             :             {
    1057       43456 :                 pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
    1058       43456 :                 move32();
    1059             :             }
    1060             :         }
    1061             :         ELSE
    1062             :         {
    1063        1993 :             pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */
    1064        1993 :             move32();
    1065        1993 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
    1066             :             {
    1067        1101 :                 pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */
    1068        1101 :                 move32();
    1069             :             }
    1070     1039351 :             FOR( i = 2; i < NFFT; i++ )
    1071             :             {
    1072     1037358 :                 pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
    1073     1037358 :                 move32();
    1074             :             }
    1075             :         }
    1076             :     }
    1077             : 
    1078      155615 :     pop_wmops();
    1079      155615 :     return;
    1080             : }
    1081             : 
    1082             : 
    1083             : /*-------------------------------------------------------------------------
    1084             :  * stereo_dft_dec_synthesize_fx()
    1085             :  *
    1086             :  * Inverse DFT on a 20ms frame
    1087             :  *-------------------------------------------------------------------------*/
    1088             : 
    1089       99717 : void stereo_dft_dec_synthesize_fx(
    1090             :     CPE_DEC_HANDLE hCPE,                          /* i/o: CPE decoder structure                 */
    1091             :     Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i  : DFT buffers                           qDFT*/
    1092             :     const Word16 chan,                            /* i  : channel number                          Q0*/
    1093             :     Word32 output[L_FRAME48k],                    /* o  : output synthesis signal       qDFT*/
    1094             :     const Word16 output_frame                     /* i  : output frame length             Q0*/
    1095             : )
    1096             : {
    1097             :     Word16 i, k;
    1098             :     Word16 offset;
    1099             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
    1100             :     Word32 *p_DFT;
    1101             :     const Word16 *win, *win2;
    1102             :     Word16 trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1];
    1103             :     Word16 trigo_step;
    1104             :     Word16 ovl, zp, NFFT;
    1105             :     Word32 outputFs;
    1106             :     Word16 ovl2, flat_portion_end;
    1107             :     Word32 ola_buff[STEREO_DFT32MS_OVL2_MAX];
    1108             :     Word16 moffset;
    1109             :     Word16 scale_dft;
    1110       99717 :     push_wmops( "DFT_synthesis" );
    1111             : 
    1112             :     /*-----------------------------------------------------------------*
    1113             :      * Initialization
    1114             :      *-----------------------------------------------------------------*/
    1115             : 
    1116       99717 :     hStereoDft = hCPE->hStereoDft;
    1117             : 
    1118       99717 :     hCPE->lt_es_em_fx = L_shr( hCPE->lt_es_em_fx, 9 ); // Q24 -> Q15
    1119             : 
    1120       99717 :     outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); /* Q0 */
    1121             : 
    1122       99717 :     zp = NS2SA_FX2( outputFs, STEREO_DFT32MS_ZP_NS );
    1123       99717 :     move16();
    1124       99717 :     ovl = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL_NS );
    1125       99717 :     move16();
    1126       99717 :     win = hStereoDft->win32ms_fx; /* Q15 */
    1127       99717 :     NFFT = NS2SA_FX2( outputFs, STEREO_DFT32MS_N_NS );
    1128       99717 :     move16();
    1129       99717 :     ovl2 = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL2_NS );
    1130       99717 :     move16();
    1131       99717 :     flat_portion_end = NS2SA_FX2( outputFs, L_sub( STEREO_DFT32MS_WIN_CENTER_NS, L_shr( STEREO_DFT32MS_OVL2_NS, 1 ) ) );
    1132       99717 :     move16();
    1133       99717 :     win2 = hStereoDft->win232ms_fx; /* Q15 */
    1134             : 
    1135       99717 :     p_DFT = DFT[chan];
    1136       99717 :     set32_fx( output, 0, NS2SA_FX2( outputFs, FRAME_SIZE_NS ) );
    1137             : 
    1138             :     /* deactivating the spectrum scrambling on active speech */
    1139       99717 :     test();
    1140       99717 :     test();
    1141       99717 :     test();
    1142       99717 :     if ( ( chan == 0 && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) )
    1143             :     {
    1144       58688 :         hCPE->stereo_switching_counter = 10; /* Q0 */
    1145       58688 :         move16();
    1146             :     }
    1147             : 
    1148       99717 :     IF( hCPE->stereo_switching_counter == 0 )
    1149             :     {
    1150             :         /* Set the level of dispersion */
    1151           0 :         Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) );
    1152           0 :         hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ /* Q0 */
    1153           0 :         move16();
    1154             :     }
    1155       99717 :     moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) );
    1156             : 
    1157             :     /*-----------------------------------------------------------------*
    1158             :      * Synthesis
    1159             :      *-----------------------------------------------------------------*/
    1160             : 
    1161       99717 :     trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
    1162    16911797 :     FOR( i = 0; i < NFFT / 4; i++ )
    1163             :     {
    1164    16812080 :         trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
    1165    16812080 :         move16();
    1166    16812080 :         trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
    1167    16812080 :         move16();
    1168             :     }
    1169       99717 :     trigo_dec[NFFT / 4] = hStereoDft->dft_trigo_fx[NFFT / 4 * trigo_step]; /* Q15 */
    1170       99717 :     move16();
    1171             : 
    1172      299151 :     FOR( k = 0; k < STEREO_DFT_NBDIV; k++ )
    1173             :     {
    1174             :         /* scrambling the spectrum */
    1175      199434 :         test();
    1176      199434 :         test();
    1177      199434 :         test();
    1178      199434 :         test();
    1179      199434 :         test();
    1180      199434 :         IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
    1181             :         {
    1182           0 :             FOR( i = 3; i < NFFT - moffset - 1; i++ )
    1183             :             {
    1184           0 :                 p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
    1185           0 :                 move32();
    1186             :             }
    1187             :         }
    1188      199434 :         ELSE IF( LT_16( hCPE->stereo_switching_counter, 7 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0x199A ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
    1189             :         {
    1190           0 :             FOR( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ )
    1191             :             {
    1192           0 :                 p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
    1193           0 :                 move32();
    1194             :             }
    1195             :         }
    1196             : 
    1197             :         /*IFFT*/
    1198      199434 :         scale_dft = getScaleFactor32( p_DFT, NFFT );
    1199      199434 :         scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft );
    1200      199434 :         v_shr( p_DFT, scale_dft, p_DFT, NFFT );
    1201      199434 :         rfft_fx( p_DFT, trigo_dec, NFFT, 1 );
    1202      199434 :         v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT );
    1203             : 
    1204      199434 :         IF( k == 0 )
    1205             :         {
    1206       99717 :             offset = 0;
    1207       99717 :             move16();
    1208             : 
    1209             :             /* Left OLA - 3.125ms */
    1210    10607267 :             FOR( i = 0; i < ovl; i++ )
    1211             :             {
    1212    10507550 :                 output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); /* hCPE->hStereoDft->q_dft */
    1213    10507550 :                 move32();
    1214             :             }
    1215             :             /* Flat Portion */
    1216    12708777 :             FOR( i = ovl; i < flat_portion_end; i++ )
    1217             :             {
    1218    12609060 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
    1219    12609060 :                 move32();
    1220             :             }
    1221             :             /* Right OLA */
    1222    31622367 :             FOR( i = 0; i < ovl2; i++ )
    1223             :             {
    1224    31522650 :                 ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); /* hCPE->hStereoDft->q_dft */
    1225    31522650 :                 move32();
    1226             :             }
    1227             :         }
    1228             :         ELSE
    1229             :         {
    1230             :             /* If OVL2 = OVL offset = 10ms */
    1231       99717 :             offset = flat_portion_end;
    1232       99717 :             move16();
    1233             :             /* Left OLA */
    1234    31622367 :             FOR( i = 0; i < ovl2; i++ )
    1235             :             {
    1236    31522650 :                 output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); /* hCPE->hStereoDft->q_dft */
    1237    31522650 :                 move32();
    1238             :             }
    1239             :             /* Flat Portion */
    1240    12708777 :             FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ )
    1241             :             {
    1242    12609060 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
    1243    12609060 :                 move32();
    1244             :             }
    1245             :             /* Right OLA - 3.125ms */
    1246    10607267 :             FOR( i = 0; i < ovl; i++ )
    1247             :             {
    1248    10507550 :                 hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); /* hCPE->hStereoDft->q_dft */
    1249    10507550 :                 move32();
    1250             :             }
    1251       99717 :             hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft;
    1252       99717 :             move16();
    1253             :         }
    1254      199434 :         p_DFT += STEREO_DFT32MS_N_MAX;
    1255             :     }
    1256             : 
    1257       99717 :     hCPE->lt_es_em_fx = L_shl( hCPE->lt_es_em_fx, 9 ); // Q15 -> Q24
    1258       99717 :     move32();
    1259             : 
    1260       99717 :     pop_wmops();
    1261       99717 :     return;
    1262             : }
    1263             : 
    1264             : /*---------------------------------------------------------------
    1265             :  * stereo_dft_dec_smooth_parameters_fx()
    1266             :  *
    1267             :  *
    1268             :  * ---------------------------------------------------------------*/
    1269             : 
    1270       41500 : void stereo_dft_dec_smooth_parameters_fx(
    1271             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle           */
    1272             :     const Word16 prev_sid_nodata,          /* i  : Previous SID/No data indicator    Q0*/
    1273             :     const Word16 active_frame_counter,     /* i  : Active frame counter              Q0*/
    1274             :     const Word32 element_brate             /* i  : Element bitrate                   Q0*/
    1275             : )
    1276             : {
    1277             :     Word16 k_offset, k, k2, b, N_div;
    1278             :     Word32 *pIpd, *pInterpol;
    1279             :     Word32 *pgIpd;
    1280             :     Word32 *pSideGain;
    1281             :     Word32 diff_ipd;
    1282             :     Word16 nbands;
    1283             :     Word32 max_res_pred_ind;
    1284             :     Word32 PI_round;
    1285             : 
    1286       41500 :     N_div = STEREO_DFT_NBDIV;
    1287       41500 :     move16();
    1288       41500 :     k_offset = STEREO_DFT_OFFSET;
    1289       41500 :     move16();
    1290       41500 :     PI_round = EVS_PI_FX_Q27 + EPSILLON_FX; /*add error corrections when comparing ipds with exactly a difference of pi*/
    1291       41500 :     move32();
    1292             : 
    1293       41500 :     test();
    1294       41500 :     IF( hStereoDft->frame_sid_nodata || prev_sid_nodata )
    1295             :     {
    1296        5706 :         k = 1;
    1297       38266 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
    1298             :         {
    1299       32560 :             *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1300       32560 :             move32();
    1301             :         }
    1302             : 
    1303        5706 :         IF( hStereoDft->frame_sid_nodata )
    1304             :         {
    1305             :             /* set new xfade target if new itd received */
    1306        5470 :             IF( LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
    1307             :             {
    1308             :                 Word16 q_val;
    1309        5349 :                 IF( GT_32( L_sub( hStereoDft->gipd_fx[k + k_offset], hStereoDft->ipd_xfade_prev_fx ), EVS_PI_FX_Q27 ) )
    1310             :                 {
    1311           0 :                     hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
    1312           0 :                     move32();
    1313           0 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
    1314           0 :                     move32();
    1315             : 
    1316           0 :                     q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
    1317           0 :                     move32();
    1318           0 :                     IF( GT_16( q_val, 32 ) )
    1319             :                     {
    1320           0 :                         assert( 0 );
    1321             :                     }
    1322             :                     ELSE
    1323             :                     {
    1324           0 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
    1325           0 :                         move32();
    1326             :                     }
    1327             :                 }
    1328        5349 :                 ELSE IF( GT_32( L_sub( hStereoDft->ipd_xfade_prev_fx, hStereoDft->gipd_fx[k + k_offset] ), EVS_PI_FX_Q27 ) )
    1329             :                 {
    1330          34 :                     hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
    1331          34 :                     move32();
    1332          34 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
    1333          34 :                     q_val = add( q_val, Q9 );                                                                                                                                                                                                       /* Q27 - (Q15 - q_val + (-3))*/
    1334          34 :                     move32();
    1335          34 :                     IF( GT_16( q_val, 32 ) )
    1336             :                     {
    1337           0 :                         assert( 0 );
    1338             :                     }
    1339             :                     ELSE
    1340             :                     {
    1341          34 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
    1342          34 :                         move32();
    1343             :                     }
    1344             :                 }
    1345             :                 ELSE
    1346             :                 {
    1347        5315 :                     hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
    1348        5315 :                     move32();
    1349        5315 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val );
    1350        5315 :                     q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
    1351        5315 :                     move32();
    1352        5315 :                     IF( GT_16( q_val, 32 ) )
    1353             :                     {
    1354           0 :                         assert( 0 );
    1355             :                     }
    1356             :                     ELSE
    1357             :                     {
    1358        5315 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
    1359        5315 :                         move32();
    1360             :                     }
    1361             :                 }
    1362             :             }
    1363             : 
    1364             :             /* xfade */
    1365        5470 :             test();
    1366        5470 :             test();
    1367        5470 :             IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
    1368             :             {
    1369        3354 :                 hStereoDft->gipd_fx[k + k_offset] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); /* Q27 */
    1370        3354 :                 move32();
    1371        3354 :                 hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
    1372        3354 :                 move32();
    1373        3354 :                 hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); /* Q27 */
    1374        3354 :                 move16();
    1375             :             }
    1376             :         }
    1377             :         ELSE
    1378             :         {
    1379             :             /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
    1380         236 :             IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1381             :             {
    1382           0 :                 hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
    1383           0 :                 move32();
    1384           0 :                 hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
    1385           0 :                 move32();
    1386           0 :                 hStereoDft->ipd_xfade_counter = 0;
    1387           0 :                 move16();
    1388             :             }
    1389             :         }
    1390             : 
    1391       11412 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1392             :         {
    1393        5706 :             hStereoDft->gipd_fx[( k + k_offset ) - k2] = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
    1394        5706 :             move32();
    1395             :         }
    1396             : 
    1397        5706 :         IF( hStereoDft->frame_sid_nodata )
    1398             :         {
    1399             :             /* set new xfade target if new itd received */
    1400        5470 :             IF( LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
    1401             :             {
    1402             :                 Word16 q_val;
    1403        5470 :                 hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1404        5470 :                 move32();
    1405        5470 :                 hStereoDft->itd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->itd_xfade_target_fx, hStereoDft->itd_xfade_prev_fx ), L_shl( sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->itd_xfade_counter ), Q15 ), &q_val );
    1406        5470 :                 IF( GT_16( q_val, 16 ) )
    1407             :                 {
    1408           0 :                     assert( 0 );
    1409             :                 }
    1410             :                 ELSE
    1411             :                 {
    1412        5470 :                     hStereoDft->itd_xfade_step_fx = L_shl( hStereoDft->itd_xfade_step_fx, q_val ); /* Q15 */
    1413        5470 :                     move32();
    1414             :                 }
    1415        5470 :                 move32();
    1416             :             }
    1417             : 
    1418             :             /* xfade */
    1419        5470 :             IF( NE_32( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_target_fx ) && LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
    1420             :             {
    1421         640 :                 hStereoDft->itd_fx[k + k_offset] = L_add( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_step_fx ); /* Q15 */
    1422         640 :                 move32();
    1423         640 :                 hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1424         640 :                 move32();
    1425         640 :                 hStereoDft->itd_xfade_counter = add( hStereoDft->itd_xfade_counter, 1 ); /* Q0 */
    1426             :             }
    1427             :         }
    1428             :         ELSE
    1429             :         {
    1430             :             /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
    1431         236 :             IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1432             :             {
    1433           0 :                 hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1434           0 :                 move32();
    1435           0 :                 hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1436           0 :                 move32();
    1437           0 :                 hStereoDft->itd_xfade_counter = 0; /* Q0 */
    1438           0 :                 move32();
    1439             :             }
    1440             : 
    1441         236 :             hStereoDft->last_active_element_brate = element_brate;
    1442         236 :             move32();
    1443             :         }
    1444       11412 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1445             :         {
    1446        5706 :             hStereoDft->itd_fx[( k + k_offset ) - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1447        5706 :             move32();
    1448             :         }
    1449             : 
    1450        5706 :         return;
    1451             :     }
    1452             : 
    1453             :     /* Active frame, "reset" everything "reset" everything if long enough active encoding */
    1454       35794 :     IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1455             :     {
    1456       34683 :         hStereoDft->itd_xfade_counter = 0;
    1457       34683 :         move16();
    1458       34683 :         hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1459       34683 :         move32();
    1460       34683 :         hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1461       34683 :         move32();
    1462       34683 :         hStereoDft->ipd_xfade_counter = 0;
    1463       34683 :         move16();
    1464       34683 :         hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1465       34683 :         move32();
    1466       34683 :         hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1467       34683 :         move32();
    1468             :     }
    1469             : 
    1470       35794 :     hStereoDft->last_active_element_brate = element_brate;
    1471       35794 :     move32();
    1472             : 
    1473       71588 :     FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    1474             :     {
    1475       35794 :         max_res_pred_ind = 0;
    1476       35794 :         move32();
    1477       35794 :         IF( EQ_16( hStereoDft->reverb_flag, 1 ) )
    1478             :         {
    1479        4922 :             nbands = s_min( 10, hStereoDft->nbands_respred );
    1480        4922 :             move16();
    1481             :             /*Shift 2 last bands residual prediction gains for SWB/FB*/
    1482        4922 :             IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) )
    1483             :             {
    1484        5290 :                 FOR( b = sub( hStereoDft->nbands_respred, 1 ); b >= nbands; b-- )
    1485             :                 {
    1486        3282 :                     hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] =
    1487        3282 :                         hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; /* Q26 */
    1488        3282 :                     move32();
    1489        3282 :                     hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    1490        3282 :                     move32();
    1491             :                 }
    1492             :             }
    1493             : 
    1494             :             /* Get maximal index */
    1495       26903 :             FOR( b = hStereoDft->res_pred_band_min; b < nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST; b++ )
    1496             :             {
    1497       21981 :                 IF( LT_32( max_res_pred_ind, hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] ) )
    1498             :                 {
    1499        8781 :                     max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1500        8781 :                     move32();
    1501             :                 }
    1502             :             }
    1503             : 
    1504             :             /* predictive values */
    1505       19688 :             FOR( ; b < nbands; b++ )
    1506             :             {
    1507       14766 :                 assert( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] == 0 );
    1508       14766 :                 hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; /* Q26 */
    1509       14766 :                 move32();
    1510             :             }
    1511             :         }
    1512             : 
    1513       35794 :         FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ )
    1514             :         {
    1515             :             Word32 tmp;
    1516             :             Word16 tmps1, tmps2;
    1517             : 
    1518           0 :             hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1519           0 :             move32();
    1520             :             /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/
    1521           0 :             tmps1 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[0][b], Q26 ); /* Q0 */
    1522           0 :             move16();
    1523           0 :             tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); /* Q0 */
    1524           0 :             move16();
    1525           0 :             stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1526             : 
    1527           0 :             test();
    1528           0 :             test();
    1529           0 :             IF( hStereoDft->attackPresent )
    1530             :             {
    1531           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
    1532           0 :                 move32();
    1533             :             }
    1534           0 :             ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */
    1535             :             {
    1536           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ),
    1537           0 :                                                                  hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); /* Q26 */
    1538           0 :                 move32();
    1539             :             }
    1540             :             ELSE
    1541             :             {
    1542           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
    1543           0 :                                                                  hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1544           0 :                                                                  sub( (Word16) 0x7FFF, dft_alpha_s2_fx[b] ) ); /* Q26 */
    1545           0 :                 move32();
    1546             :             }
    1547             : 
    1548           0 :             stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1549             :         }
    1550             : 
    1551             :         /* Smoothing of prediction gains between ftrames */
    1552      294725 :         FOR( ; b < hStereoDft->nbands; b++ )
    1553             :         {
    1554      258931 :             test();
    1555      258931 :             test();
    1556      258931 :             IF( hStereoDft->attackPresent )
    1557             :             {
    1558        9264 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1559        9264 :                 move32();
    1560        9264 :                 hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
    1561        9264 :                 move32();
    1562             :             }
    1563      249667 :             ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
    1564             :             {
    1565      142505 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1566      142505 :                 move32();
    1567      142505 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1568             :                 {
    1569       32061 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_b2_fx[b] ),
    1570       32061 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); /* Q26 */
    1571       32061 :                     move32();
    1572             :                 }
    1573             :                 ELSE
    1574             :                 {
    1575      110444 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_fx[b] ),
    1576      110444 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); /* Q26 */
    1577      110444 :                     move32();
    1578             :                 }
    1579             :             }
    1580             :             ELSE
    1581             :             {
    1582      107162 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1583             :                 {
    1584       30818 :                     hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_b2_fx[b] ),
    1585       30818 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1586       30818 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); /* Q26 */
    1587       30818 :                     move32();
    1588       30818 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_b2_fx[b] ),
    1589       30818 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1590       30818 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); /* Q26 */
    1591       30818 :                     move32();
    1592             :                 }
    1593             :                 ELSE
    1594             :                 {
    1595       76344 :                     hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_fx[b] ),
    1596       76344 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1597       76344 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); /* Q26 */
    1598       76344 :                     move32();
    1599       76344 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
    1600       76344 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1601       76344 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); /* Q26 */
    1602       76344 :                     move32();
    1603             :                 }
    1604             :             }
    1605             : 
    1606      258931 :             IF( !hStereoDft->recovery_flg )
    1607             :             {
    1608      258886 :                 stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1609             :             }
    1610             :         }
    1611             : 
    1612             :         /* Smoothing of IPDs*/
    1613       35794 :         pgIpd = hStereoDft->gipd_fx + ( add( k, k_offset ) );
    1614       35794 :         diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[k + k_offset]] ); /* Q27 */
    1615       35794 :         IF( LT_32( diff_ipd, -PI_round ) )
    1616             :         {
    1617         727 :             pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
    1618         727 :             move32();
    1619             :         }
    1620       35067 :         ELSE IF( GT_32( diff_ipd, PI_round ) )
    1621             :         {
    1622         238 :             pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
    1623         238 :             move32();
    1624             :         }
    1625             : 
    1626       35794 :         IF( !hStereoDft->attackPresent )
    1627             :         {
    1628       34509 :             IF( hStereoDft->wasTransient )
    1629             :             {
    1630        1251 :                 pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[k + k_offset]], (Word16) ( 0x199A ) ) ); /* Q27 */
    1631        1251 :                 move32();
    1632             :             }
    1633             :             ELSE
    1634             :             {
    1635       33258 :                 pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[k + k_offset]], 1 ) ); /* Q27 */
    1636       33258 :                 move32();
    1637             :             }
    1638             :         }
    1639             : 
    1640             : 
    1641       35794 :         IF( !hStereoDft->attackPresent )
    1642             :         {
    1643       34509 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
    1644      116034 :             FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    1645             :             {
    1646       81525 :                 pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ),
    1647       81525 :                                            pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX],
    1648       81525 :                                            sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); /* Q31 */
    1649       81525 :                 move32();
    1650             :             }
    1651             :         }
    1652             : 
    1653             :         /*Interpolation between DFT slots*/
    1654       71588 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1655             :         {
    1656       35794 :             pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); /* Q27 */
    1657       35794 :             pIpd = hStereoDft->gipd_fx + add( k, k_offset );                 /* Q27 */
    1658       35794 :             IF( hStereoDft->attackPresent )
    1659             :             {
    1660        1285 :                 *( pInterpol ) = *( pIpd );
    1661        1285 :                 move32();
    1662             :             }
    1663             :             ELSE
    1664             :             {
    1665       34509 :                 *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ) );
    1666       34509 :                 move32();
    1667             :             }
    1668             : 
    1669      379085 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    1670             :             {
    1671      343291 :                 *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1672      343291 :                 move32();
    1673      343291 :                 test();
    1674      343291 :                 test();
    1675      343291 :                 test();
    1676      343291 :                 test();
    1677      343291 :                 IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
    1678             :                 {
    1679      236129 :                     *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1680      236129 :                     move32();
    1681             :                 }
    1682             :                 ELSE
    1683             :                 {
    1684      107162 :                     *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1685      107162 :                     move32();
    1686             :                 }
    1687             :             }
    1688             : 
    1689       35794 :             hStereoDft->itd_fx[k + k_offset - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1690       35794 :             move32();
    1691             :         } /*end of interpolation*/
    1692             :     }
    1693             : 
    1694       35794 :     return;
    1695             : }
    1696             : 
    1697             : /*-------------------------------------------------------------------------
    1698             :  * stereo_dft_dec_res_fx()
    1699             :  *
    1700             :  * Decode the residual signal
    1701             :  *-------------------------------------------------------------------------*/
    1702             : 
    1703       16830 : void stereo_dft_dec_res_fx(
    1704             :     CPE_DEC_HANDLE hCPE,             /* i/o: decoder CPE handle                                                 */
    1705             :     Word32 res_buf[STEREO_DFT_N_8k], /* i  : residual buffer                       q_res*/
    1706             :     Word16 q_res,                    /* i  : q fact of residural buffer                                 */
    1707             :     Word32 *output                   /* o  : output                                                                      Q16*/
    1708             : )
    1709             : {
    1710             :     Word16 i;
    1711             :     Word16 win[L_FRAME8k + STEREO_DFT_OVL_8k];
    1712             :     Word16 out_16[L_FRAME8k + STEREO_DFT_OVL_8k];
    1713             :     Word16 bpf_error_signal_8k_16[L_FRAME8k];
    1714             :     Word32 bpf_error_signal_8k[L_FRAME8k];
    1715             :     Word16 prev_bfi;
    1716             :     Word16 fac, step;
    1717             :     Word16 res_bpf_flag;
    1718             : 
    1719       16830 :     prev_bfi = hCPE->hCoreCoder[0]->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
    1720             :                                                      The prev_old_bfi still holds the prev_bfi for the current frame. */
    1721             :                                                   /* Q0 */
    1722       16830 :     move16();
    1723             : 
    1724             :     /* flush memories when switching residual coding on */
    1725       16830 :     IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
    1726             :     {
    1727         133 :         set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
    1728         133 :         hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1729         133 :         move16();
    1730         133 :         set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
    1731         133 :         set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
    1732         133 :         hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
    1733         133 :         move16();
    1734             :     }
    1735             : 
    1736             :     /*Inverse MDCT*/
    1737       16830 :     TCX_MDCT_Inverse( res_buf, q_res, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    1738             : 
    1739       16830 :     scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );
    1740             : 
    1741       16830 :     Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    1742       16830 :     IF( !prev_bfi )
    1743             :     {
    1744             :         /*OLA*/
    1745             :         /*overlapping parts*/
    1746             : 
    1747     1174766 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1748             :         {
    1749     1158220 :             win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
    1750     1158220 :             move16();
    1751     1158220 :             hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
    1752     1158220 :             move32();
    1753             :         }
    1754             : 
    1755             : 
    1756       16546 :         move16();
    1757             :     }
    1758             :     ELSE
    1759             :     {
    1760             :         /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */
    1761         284 :         step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */
    1762         284 :         move16();
    1763         284 :         fac = 0;
    1764         284 :         move16();
    1765       20164 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1766             :         {
    1767       19880 :             win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
    1768       19880 :                                             L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
    1769       19880 :                                             sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
    1770       19880 :             move16();
    1771       19880 :             hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
    1772       19880 :             move32();
    1773       19880 :             fac = add( fac, step );
    1774             :         }
    1775             :     }
    1776             : 
    1777       16830 :     IF( q_shift != 0 )
    1778             :     {
    1779           0 :         v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
    1780             :     }
    1781             : 
    1782       16830 :     hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1783             : 
    1784       16830 :     Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */
    1785             : 
    1786       16830 :     IF( hCPE->hCoreCoder[0]->core == ACELP_CORE )
    1787             :     {
    1788             :         /* bass post-filter */
    1789       10899 :         bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off,
    1790       10899 :                           hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, sub( q_shift, 1 ), bpf_error_signal_8k_16 );
    1791       10899 :         Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */
    1792       10899 :         res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res );
    1793             : 
    1794       10899 :         IF( prev_bfi )
    1795             :         {
    1796             :             /* Ramp up BPF contribution for the first good frame */
    1797         173 :             step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k );        /* Q15 */
    1798         173 :             move16();
    1799         173 :             fac = negate( step );
    1800       27853 :             FOR( i = 0; i < L_FRAME8k; i++ )
    1801             :             {
    1802       27680 :                 fac = add( fac, step );
    1803       27680 :                 bpf_error_signal_8k[i] = Mpy_32_16_1( bpf_error_signal_8k[i], fac ); /* Q15 */
    1804       27680 :                 move32();
    1805             :             }
    1806             :         }
    1807       10899 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1808       10899 :         IF( res_bpf_flag )
    1809             :         {
    1810       10523 :             v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k );
    1811             :         }
    1812             :     }
    1813        5931 :     ELSE IF( hCPE->hCoreCoder[0]->last_core == ACELP_CORE )
    1814             :     {
    1815           0 :         set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
    1816           0 :         hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
    1817           0 :         move16();
    1818           0 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1819             :     }
    1820             :     ELSE
    1821             :     {
    1822             :         /* This step is needed to ensure output is properly populated with scaled values in all cases*/
    1823        5931 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1824             :     }
    1825             : 
    1826       16830 :     return;
    1827             : }
    1828             : 
    1829             : 
    1830             : /*-------------------------------------------------------------------------
    1831             :  * stereo_dft_dec_fx()
    1832             :  *
    1833             :  * DFT-based stereo main processing function
    1834             :  *-------------------------------------------------------------------------*/
    1835             : 
    1836       47491 : void stereo_dft_dec_fx(
    1837             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft,        /* i/o: decoder DFT stereo handle                                */
    1838             :     Decoder_State *st0,                           /* i/o: decoder state structure                                  */
    1839             :     Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers                                              qDFT*/
    1840             :     Word32 *input_mem,                            /* i/o: mem of buffer DFT analysis                       */
    1841             :     STEREO_CNG_DEC_HANDLE hStereoCng,             /* i/o: Stereo CNG data structure                              Q0*/
    1842             :     const Word16 sba_dirac_stereo_flag,           /* i  : signal stereo output for SBA DirAC     Q0*/
    1843             :     const Word16 sba_mono_flag,                   /* i  : signal mono output for SBA DirAC               Q0*/
    1844             :     ivas_spar_md_dec_state_t *hMdDec,             /* i  : SPAR MD handle for upmixing                      */
    1845             :     const Word16 cross_fade_start_offset,         /* i  : SPAR mixer delay compensation                  Q0*/
    1846             :     const Word32 output_Fs,                       /* i  : Fs for delay calculation                               Q0*/
    1847             :     const Word16 nchan_transport,                 /* i  : number of transpor channels                    Q0*/
    1848             :     const Word16 num_md_sub_frames                /* i  : number of MD subframes                                 Q0*/
    1849             : )
    1850             : {
    1851             :     Word16 i, k, b, N_div, stop;
    1852             :     Word32 DFT_L[STEREO_DFT32MS_N_MAX];
    1853             :     Word32 DFT_R[STEREO_DFT32MS_N_MAX];
    1854             :     Word32 DFT_PRED_RES[STEREO_DFT32MS_N_32k];
    1855             :     Word32 *pDFT_DMX;
    1856             :     Word32 *pDFT_DMX1;
    1857             :     Word32 *pDFT_RES;
    1858             :     Word16 g;
    1859             :     Word32 tmp;
    1860             :     Word32 *pPredGain;
    1861             :     Word32 *pSideGain;
    1862             :     Word16 c0, s0;
    1863             :     Word16 k_offset;
    1864             :     Word32 *pgIpd;
    1865             :     Word16 NFFT_inner;
    1866             :     Word16 gamma;
    1867             :     Word16 samp_ratio;
    1868             :     Word16 prev_bfi;
    1869             :     Word32 dmx_nrg;
    1870             :     Word16 idx_k0, idx_k1;
    1871             :     Word16 output_frame;
    1872             :     Word16 plocs[STEREO_DFT_RES_N_PEAKS_MAX];
    1873             :     Word16 num_plocs;
    1874             :     Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX];
    1875             :     Word16 ftmp, coh;
    1876             :     Word32 N1, N2;
    1877             :     Word32 scale_fact0, scale_fact;
    1878             :     Word32 lev1, lev2, cna_level, *ptr_per;
    1879             :     Word16 q_cna_level;
    1880       47491 :     HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec;
    1881       47491 :     HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom;
    1882       47491 :     Word16 *cna_seed = &( hFdCngCom->seed );
    1883             :     Word32 DFT_W, DFT_Y;
    1884             :     Word16 len;
    1885             : 
    1886       47491 :     output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */
    1887             : 
    1888             :     /*------------------------------------------------------------------*
    1889             :      * Initialization
    1890             :      *-----------------------------------------------------------------*/
    1891             : 
    1892       47491 :     samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15
    1893             : 
    1894             : 
    1895       47491 :     stop = shr( STEREO_DFT32MS_N_32k, 1 );
    1896             : 
    1897             :     /* Analyze nature of current frame */
    1898       47491 :     test();
    1899       47491 :     test();
    1900       47491 :     test();
    1901       47491 :     test();
    1902       47491 :     test();
    1903       47491 :     test();
    1904       47491 :     test();
    1905       47491 :     test();
    1906       86457 :     hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) ||
    1907       38966 :                         ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); /* Q0 */
    1908       47491 :     move16();
    1909             : 
    1910             :     /* Initialization */
    1911       47491 :     k_offset = 1;
    1912       47491 :     move16();
    1913       47491 :     N_div = STEREO_DFT_NBDIV;
    1914       47491 :     move16();
    1915       47491 :     prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
    1916             :                                      The prev_old_bfi still holds the prev_bfi for the current frame. */
    1917             :     /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */
    1918       47491 :     move16();
    1919       47491 :     test();
    1920       47491 :     IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) )
    1921             :     {
    1922        6785 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); /* Q0 */
    1923             :     }
    1924             : 
    1925       47491 :     IF( st0->bfi == 0 )
    1926             :     {
    1927             :         /* Smoothing for the current frame */
    1928       46908 :         IF( sba_dirac_stereo_flag )
    1929             :         {
    1930       10753 :             ivas_sba_dirac_stereo_smooth_parameters_fx( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames );
    1931             :         }
    1932             :         ELSE
    1933             :         {
    1934       36155 :             stereo_dft_dec_smooth_parameters_fx( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate );
    1935             :         }
    1936             :     }
    1937             : 
    1938       47491 :     dmx_nrg = 0;
    1939       47491 :     move32();
    1940       47491 :     IF( prev_bfi )
    1941             :     {
    1942         577 :         dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); /* Q0 */
    1943             :     }
    1944             : 
    1945      142473 :     FOR( k = 0; k < N_div; k++ )
    1946             :     {
    1947       94982 :         pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1948       94982 :         pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1949       94982 :         pDFT_DMX1 = 0;
    1950       94982 :         move16();
    1951             : 
    1952       94982 :         IF( GT_16( nchan_transport, 1 ) )
    1953             :         {
    1954       12558 :             pDFT_DMX1 = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1955             :         }
    1956             : 
    1957             :         /*Apply Stereo*/
    1958       94982 :         IF( hStereoDft->hConfig->dmx_active )
    1959             :         {
    1960       94982 :             g = MAX_16;
    1961       94982 :             move16();
    1962       94982 :             c0 = MAX_16;
    1963       94982 :             move16();
    1964       94982 :             s0 = 0;
    1965       94982 :             move16();
    1966             : 
    1967             :             /* since delay is just 3.125ms, the parameters received are used for the second window */
    1968       94982 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX );     /* Q31 */
    1969       94982 :             pgIpd = hStereoDft->gipd_fx + add( k, k_offset );                                             /* Q27 */
    1970       94982 :             pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
    1971             : 
    1972             :             /* Use coarse band partition in inactive frames */
    1973       94982 :             test();
    1974       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    1975             :             {
    1976       10940 :                 NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); /* Q0 */
    1977       10940 :                 hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC );
    1978             :             }
    1979             : 
    1980             : 
    1981       94982 :             IF( st0->bfi )
    1982             :             {
    1983        1166 :                 hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; /* Q0 */
    1984             :             }
    1985             : 
    1986       94982 :             test();
    1987       94982 :             IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) )
    1988             :             {
    1989       82424 :                 stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ), &stop, st0->bfi );
    1990             :             }
    1991             : 
    1992       94982 :             IF( hStereoDft->res_cod_band_max > 0 )
    1993             :             {
    1994       23908 :                 IF( !st0->bfi )
    1995             :                 {
    1996       23242 :                     IF( EQ_16( k, 1 ) )
    1997             :                     {
    1998       11621 :                         Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); /* qDFT */
    1999       11621 :                         hStereoDft->time_offs = 0;
    2000       11621 :                         move16();
    2001             :                     }
    2002             :                 }
    2003             :                 ELSE
    2004             :                 {
    2005         666 :                     stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem );
    2006             :                 }
    2007             :             }
    2008             : 
    2009             :             /* Apply active DMX */
    2010             :             /* pDFT_RES is used for the second channel in inactive frames */
    2011       94982 :             test();
    2012       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    2013             :             {
    2014       10940 :                 DFT_L[0] = pDFT_DMX[0]; /* qDFT */
    2015       10940 :                 move32();
    2016       10940 :                 DFT_R[0] = pDFT_RES[0]; /* qDFT */
    2017       10940 :                 move32();
    2018             :             }
    2019             :             ELSE
    2020             :             {
    2021       84042 :                 DFT_L[0] = pDFT_DMX[0]; /* qDFT */
    2022       84042 :                 move32();
    2023       84042 :                 DFT_R[0] = pDFT_DMX[0]; /* qDFT */
    2024       84042 :                 move32();
    2025             :             }
    2026             : 
    2027       94982 :             test();
    2028       94982 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    2029             :             {
    2030       24302 :                 hFdCngDec->cna_nbands = 0;
    2031       24302 :                 move16();
    2032             :             }
    2033             : 
    2034      970736 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    2035             :             {
    2036      875754 :                 g = extract_h( pSideGain[b] );
    2037      875754 :                 move16();
    2038      875754 :                 test();
    2039      875754 :                 IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    2040             :                 {
    2041       63932 :                     g = hStereoDft->g_state_fx[b]; /* Q15 */
    2042       63932 :                     move16();
    2043             :                 }
    2044             : 
    2045             :                 /* store side gains from inactive frames for later use by the stereo CNA */
    2046      875754 :                 test();
    2047      875754 :                 test();
    2048      875754 :                 IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) )
    2049             :                 {
    2050      206112 :                     hFdCngDec->cna_nbands = add( b, 1 ); /* Q0 */
    2051      206112 :                     move16();
    2052      206112 :                     hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; /* Q0 */
    2053      206112 :                     move16();
    2054      206112 :                     hFdCngDec->cna_g_state_fx[b] = g; /* Q15 */
    2055      206112 :                     move16();
    2056             :                 }
    2057             : 
    2058             :                 /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */
    2059      875754 :                 test();
    2060      875754 :                 test();
    2061      875754 :                 IF( GE_16( b, hStereoDft->res_cod_band_max ) && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) )
    2062             :                 {
    2063             :                     /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/
    2064    19058980 :                     FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2065             :                     {
    2066    18585338 :                         pDFT_RES[2 * i] = 0;
    2067    18585338 :                         move32();
    2068    18585338 :                         pDFT_RES[2 * i + 1] = 0;
    2069    18585338 :                         move32();
    2070             :                     }
    2071             :                 }
    2072             : 
    2073      875754 :                 test();
    2074      875754 :                 test();
    2075      875754 :                 IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    2076             :                 {
    2077             :                     /* Low pass filter coherence */
    2078             :                     /* store coherence from inactive frames for later use by the stereo CNA */
    2079       63932 :                     hFdCngDec->cna_cm_fx[b] = hStereoCng->cm_fx[b]; /* Q15 */
    2080       63932 :                     move16();
    2081             : 
    2082             :                     /* Calculate gamma */
    2083       63932 :                     IF( LT_16( hStereoCng->cm_fx[b], (Word16) 0x7333 ) )
    2084             :                     {
    2085             :                         Word32 op1, op2, l_gamma;
    2086             :                         Word16 q_loc1, q_loc2;
    2087       63932 :                         gamma = hStereoCng->cm_fx[b];
    2088       63932 :                         move16();
    2089       63932 :                         gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); /* q_loc1 */
    2090       63932 :                         l_gamma = L_deposit_l( gamma );
    2091       63932 :                         op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); /* q_loc1 */
    2092       63932 :                         q_loc1 = add( Q16, q_loc1 );
    2093       63932 :                         q_loc2 = q_loc1;
    2094       63932 :                         op1 = Sqrt32( op1, &q_loc1 );
    2095       63932 :                         op2 = Sqrt32( l_gamma, &q_loc2 );
    2096       63932 :                         IF( NE_16( q_loc1, q_loc2 ) )
    2097             :                         {
    2098       51312 :                             op2 = L_shl( op2, sub( q_loc2, q_loc1 ) );
    2099       51312 :                             q_loc2 = q_loc1;
    2100             :                         }
    2101       63932 :                         gamma = extract_h( L_sub( op1, op2 ) ); /* q_loc1 - 16 */
    2102       63932 :                         gamma = shl( gamma, q_loc2 );           /* 2 * q_loc1 - 16 */
    2103             :                     }
    2104             :                     ELSE
    2105             :                     {
    2106           0 :                         gamma = 0;
    2107           0 :                         move16();
    2108             :                     }
    2109             : 
    2110     3280512 :                     FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2111             :                     {
    2112             :                         /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */
    2113     3216580 :                         DFT_L[2 * i] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
    2114     3216580 :                         move32();
    2115     3216580 :                         DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
    2116     3216580 :                         move32();
    2117             : 
    2118     3216580 :                         DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFt */
    2119     3216580 :                         move32();
    2120     3216580 :                         DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFT */
    2121     3216580 :                         move32();
    2122             :                     }
    2123             : 
    2124       63932 :                     IF( pgIpd[0] != 0 )
    2125             :                     {
    2126       43302 :                         Word32 theta = pgIpd[0];
    2127       43806 :                         WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
    2128             :                         {
    2129         504 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2130             :                         }
    2131       43302 :                         WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
    2132             :                         {
    2133           0 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2134             :                         }
    2135       43302 :                         IF( GT_32( theta, EVS_PI_FX_Q27 ) )
    2136             :                         {
    2137        1946 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2138             :                         }
    2139       41356 :                         ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
    2140             :                         {
    2141           0 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2142             :                         }
    2143       43302 :                         c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
    2144       43302 :                         IF( EQ_16( c0, ONE_IN_Q14 ) )
    2145             :                         {
    2146       28212 :                             c0 = MAX_16;
    2147       28212 :                             move16();
    2148             :                         }
    2149             :                         ELSE
    2150             :                         {
    2151       15090 :                             c0 = shl( c0, 1 );
    2152             :                         }
    2153       43302 :                         s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
    2154     2166686 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2155             :                         {
    2156             :                             /*rotate L*/
    2157     2123384 :                             tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 );              /* qDFT */
    2158     2123384 :                             DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
    2159     2123384 :                             move32();
    2160     2123384 :                             DFT_L[2 * i] = tmp; /* qDFT */
    2161     2123384 :                             move32();
    2162             :                         }
    2163             :                     }
    2164             :                 }
    2165      811822 :                 ELSE IF( sba_dirac_stereo_flag && hMdDec )
    2166             :                 {
    2167             : 
    2168      218640 :                     IF( EQ_16( nchan_transport, 1 ) )
    2169             :                     {
    2170       75222 :                         IF( sba_mono_flag )
    2171             :                         {
    2172       14640 :                             IF( b == 0 )
    2173             :                             {
    2174        1220 :                                 i = 0;
    2175        1220 :                                 move16();
    2176        1220 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2177        1220 :                                 move32();
    2178        1220 :                                 DFT_L[2 * i] = DFT_W; /* qDFT */
    2179        1220 :                                 move32();
    2180        1220 :                                 DFT_R[2 * i] = 0;
    2181        1220 :                                 move32();
    2182        1220 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2183        1220 :                                 move32();
    2184        1220 :                                 DFT_L[2 * i + 1] = DFT_W; /* qDFT */
    2185        1220 :                                 move32();
    2186        1220 :                                 DFT_R[2 * i + 1] = 0;
    2187        1220 :                                 move32();
    2188             :                             }
    2189      323564 :                             FOR( i = hStereoDft->band_limits[b]; i < s_min( stop, hStereoDft->band_limits[b + 1] ); i++ )
    2190             :                             {
    2191      308924 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    2192      308924 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    2193      308924 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    2194      308924 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2195      308924 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    2196      308924 :                                 DFT_L[2 * i] = DFT_W;                      /* qDFT */
    2197      308924 :                                 move32();
    2198      308924 :                                 DFT_R[2 * i] = 0;
    2199      308924 :                                 move32();
    2200             : 
    2201      308924 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    2202      308924 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    2203      308924 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    2204      308924 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2205      308924 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    2206      308924 :                                 DFT_L[2 * i + 1] = DFT_W;                      /* qDFT */
    2207      308924 :                                 move32();
    2208      308924 :                                 DFT_R[2 * i + 1] = 0;
    2209      308924 :                                 move32();
    2210             :                             }
    2211      290096 :                             FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    2212             :                             {
    2213      275456 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2214      275456 :                                 DFT_L[2 * i] = DFT_W;                                                                                    /* qDFT */
    2215      275456 :                                 move32();
    2216      275456 :                                 DFT_R[2 * i] = 0;
    2217      275456 :                                 move32();
    2218             : 
    2219      275456 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2220      275456 :                                 DFT_L[2 * i + 1] = DFT_W;                                                                                    /* qDFT */
    2221      275456 :                                 move32();
    2222      275456 :                                 DFT_R[2 * i + 1] = 0;
    2223      275456 :                                 move32();
    2224             :                             }
    2225             :                         }
    2226             :                         ELSE
    2227             :                         {
    2228       60582 :                             IF( b == 0 )
    2229             :                             {
    2230        5442 :                                 i = 0;
    2231        5442 :                                 move16();
    2232        5442 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2233        5442 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2234             : 
    2235        5442 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2236        5442 :                                 move32();
    2237        5442 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2238        5442 :                                 move32();
    2239             : 
    2240        5442 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2241        5442 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2242             : 
    2243        5442 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2244        5442 :                                 move32();
    2245        5442 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2246        5442 :                                 move32();
    2247             :                             }
    2248       60582 :                             len = s_min( stop, hStereoDft->band_limits[b + 1] );
    2249     1276260 :                             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2250             :                             {
    2251     1215678 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    2252     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    2253     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    2254     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2255     1215678 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    2256     1215678 :                                 DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    2257     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
    2258     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
    2259     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2260     1215678 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    2261             : 
    2262     1215678 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2263     1215678 :                                 move32();
    2264     1215678 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2265     1215678 :                                 move32();
    2266             : 
    2267     1215678 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    2268     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    2269     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    2270     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2271     1215678 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    2272     1215678 :                                 DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    2273     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
    2274     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
    2275     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    2276     1215678 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    2277             : 
    2278     1215678 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2279     1215678 :                                 move32();
    2280     1215678 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2281     1215678 :                                 move32();
    2282             :                             }
    2283      696102 :                             FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    2284             :                             {
    2285      635520 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2286      635520 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2287             : 
    2288      635520 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2289      635520 :                                 move32();
    2290      635520 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2291      635520 :                                 move32();
    2292             : 
    2293      635520 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2294      635520 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2295             : 
    2296      635520 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2297      635520 :                                 move32();
    2298      635520 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2299      635520 :                                 move32();
    2300             :                             }
    2301             :                         }
    2302             :                     }
    2303      143418 :                     ELSE IF( GE_16( nchan_transport, 2 ) )
    2304             :                     {
    2305      143418 :                         IF( b == 0 )
    2306             :                         {
    2307       12558 :                             i = 0;
    2308       12558 :                             move32();
    2309             : 
    2310       12558 :                             DFT_W = pDFT_DMX[2 * i]; /* qDFT */
    2311       12558 :                             move32();
    2312       12558 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2313             : 
    2314       12558 :                             DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2315       12558 :                             move32();
    2316       12558 :                             DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2317       12558 :                             move32();
    2318             : 
    2319       12558 :                             DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
    2320       12558 :                             move32();
    2321       12558 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2322             : 
    2323       12558 :                             DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2324       12558 :                             move32();
    2325       12558 :                             DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2326       12558 :                             move32();
    2327             :                         }
    2328     4994220 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2329             :                         {
    2330     4850802 :                             DFT_W = pDFT_DMX[2 * i]; /* qDFT */
    2331     4850802 :                             move32();
    2332     4850802 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    2333             : 
    2334     4850802 :                             DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2335     4850802 :                             move32();
    2336     4850802 :                             DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2337     4850802 :                             move32();
    2338             : 
    2339     4850802 :                             DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
    2340     4850802 :                             move32();
    2341     4850802 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    2342             : 
    2343     4850802 :                             DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    2344     4850802 :                             move32();
    2345     4850802 :                             DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    2346     4850802 :                             move32();
    2347             :                         }
    2348             :                     }
    2349             :                     ELSE
    2350             :                     {
    2351             :                         assert( "nhcan_transport must be 1 or 1!" );
    2352             :                     }
    2353             :                 }
    2354             :                 ELSE
    2355             :                 {
    2356      593182 :                     len = s_min( stop, hStereoDft->band_limits[b + 1] );
    2357    12776424 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2358             :                     {
    2359    12183242 :                         tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); /* qDFT */
    2360             : 
    2361    12183242 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2362    12183242 :                         move32();
    2363    12183242 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2364    12183242 :                         move32();
    2365             : 
    2366    12183242 :                         tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    2367             : 
    2368    12183242 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2369    12183242 :                         move32();
    2370    12183242 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2371    12183242 :                         move32();
    2372             :                     }
    2373             : 
    2374     7473438 :                     FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    2375             :                     {
    2376     6880256 :                         tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); /* qDFT */
    2377             : 
    2378     6880256 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2379     6880256 :                         move32();
    2380     6880256 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2381     6880256 :                         move32();
    2382             : 
    2383     6880256 :                         tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); /* qDFT */
    2384             : 
    2385     6880256 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2386     6880256 :                         move32();
    2387     6880256 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2388     6880256 :                         move32();
    2389             :                     }
    2390             : 
    2391             :                     /* Active Upmix */
    2392      593182 :                     IF( pgIpd[0] != 0 )
    2393             :                     {
    2394       94572 :                         Word32 theta = pgIpd[0];
    2395       94572 :                         move32();
    2396       96420 :                         WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
    2397             :                         {
    2398        1848 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2399             :                         }
    2400       97632 :                         WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
    2401             :                         {
    2402        3060 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2403             :                         }
    2404       94572 :                         IF( GT_32( theta, EVS_PI_FX_Q27 ) )
    2405             :                         {
    2406        5151 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2407             :                         }
    2408       89421 :                         ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
    2409             :                         {
    2410        2688 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2411             :                         }
    2412       94572 :                         c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
    2413       94572 :                         IF( EQ_16( c0, ONE_IN_Q14 ) )
    2414             :                         {
    2415       41162 :                             c0 = MAX_16;
    2416       41162 :                             move16();
    2417             :                         }
    2418             :                         ELSE
    2419             :                         {
    2420       53410 :                             c0 = shl( c0, 1 );
    2421             :                         }
    2422       94572 :                         s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
    2423     2906225 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2424             :                         {
    2425             :                             /*rotate L*/
    2426     2811653 :                             tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 );              /* qDFT */
    2427     2811653 :                             DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
    2428     2811653 :                             move32();
    2429     2811653 :                             DFT_L[2 * i] = tmp; /* qDFT */
    2430     2811653 :                             move32();
    2431             :                         }
    2432             :                     }
    2433             :                 }
    2434             :             }
    2435             : 
    2436       94982 :             test();
    2437       94982 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    2438             :             {
    2439       24302 :                 hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; /* Q0 */
    2440       24302 :                 move16();
    2441             :             }
    2442             : 
    2443       94982 :             test();
    2444       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    2445             :             {
    2446       10940 :                 hStereoCng->first_SID = 0;
    2447       10940 :                 move16();
    2448       10940 :                 hStereoCng->first_SID_after_TD = 0;
    2449       10940 :                 move16();
    2450             :             }
    2451             : 
    2452     2914822 :             FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ )
    2453             :             {
    2454     2819840 :                 DFT_L[2 * i] = 0;
    2455     2819840 :                 move32();
    2456     2819840 :                 DFT_L[2 * i + 1] = 0;
    2457     2819840 :                 move32();
    2458     2819840 :                 DFT_R[2 * i] = 0;
    2459     2819840 :                 move32();
    2460     2819840 :                 DFT_R[2 * i + 1] = 0;
    2461     2819840 :                 move32();
    2462             :             }
    2463             : 
    2464             :             /*Nyquist Freq.*/
    2465       94982 :             IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) )
    2466             :             {
    2467       76084 :                 DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2468       76084 :                 move32();
    2469       76084 :                 DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2470       76084 :                 move32();
    2471       76084 :                 DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2472       76084 :                 move32();
    2473       76084 :                 DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2474       76084 :                 move32();
    2475             :             }
    2476             :             ELSE
    2477             :             {
    2478       18898 :                 DFT_L[1] = 0;
    2479       18898 :                 move32();
    2480       18898 :                 DFT_R[1] = 0;
    2481       18898 :                 move32();
    2482             :             }
    2483             :         }
    2484             :         ELSE
    2485             :         {
    2486           0 :             pPredGain = NULL; /* to avoid compilation warnings */
    2487           0 :             pSideGain = NULL;
    2488             : 
    2489             :             /* Dummy upmix-> mono binauralization */
    2490           0 :             FOR( i = 0; i < hStereoDft->NFFT; i++ )
    2491             :             {
    2492           0 :                 DFT_L[i] = L_add( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
    2493           0 :                 move32();
    2494           0 :                 DFT_R[i] = L_sub( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
    2495           0 :                 move32();
    2496             :             }
    2497             :         }
    2498             : 
    2499             :         /* Comfort Noise Addition */
    2500       94982 :         IF( st0->flag_cna )
    2501             :         {
    2502       78792 :             ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; /* hFdCngDec->smoothed_psd_exp */
    2503             : 
    2504       78792 :             scale_fact0 = 0;
    2505       78792 :             move16();
    2506       78792 :             IF( hFdCngDec->cna_rescale_fact_fx > 0 )
    2507             :             {
    2508       30856 :                 Word16 q_scale_fact0 = 0;
    2509       30856 :                 move16();
    2510       30856 :                 Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 );
    2511       30856 :                 move16();
    2512       30856 :                 scale_fact0 = L_mult0( shr( output_frame, 1 ), op );
    2513       30856 :                 IF( q_scale_fact0 > 0 )
    2514             :                 {
    2515           0 :                     assert( 0 );
    2516             :                 }
    2517             :                 ELSE
    2518             :                 {
    2519       30856 :                     scale_fact0 = L_shl( scale_fact0, q_scale_fact0 );
    2520       30856 :                     move32();
    2521             :                 }
    2522             :             }
    2523             : 
    2524      588380 :             FOR( b = 0; b < hFdCngDec->cna_nbands; b++ )
    2525             :             {
    2526             :                 /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */
    2527      509588 :                 coh = hFdCngDec->cna_cm_fx[b];
    2528      509588 :                 move16();
    2529      509588 :                 g = hFdCngDec->cna_g_state_fx[b];
    2530      509588 :                 move16();
    2531      509588 :                 IF( LT_16( coh, (Word16) ( 0x7333 ) ) )
    2532             :                 {
    2533             :                     Word32 op1, op2, l_gamma;
    2534             :                     Word16 q_loc1, q_loc2, q_gamma;
    2535      488472 :                     gamma = coh;
    2536      488472 :                     move16();
    2537      488472 :                     gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma );
    2538      488472 :                     if ( gamma == 0 )
    2539             :                     {
    2540      247076 :                         q_gamma = 0;
    2541      247076 :                         move16();
    2542             :                     }
    2543      488472 :                     l_gamma = L_deposit_l( gamma );
    2544      488472 :                     op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult_sat( g, g ) ) ), q_gamma ) ); /*The mult_sat function is needed because -0.999979973 is being mapped to -32768. This value, when multiplied by -32768, is causing a crash.*/
    2545      488472 :                     q_loc2 = add( Q16, q_gamma );
    2546      488472 :                     q_loc1 = q_loc2;
    2547      488472 :                     move16();
    2548      488472 :                     op1 = Sqrt32( op1, &q_loc1 );
    2549      488472 :                     op2 = Sqrt32( l_gamma, &q_loc2 );
    2550      488472 :                     IF( op2 != 0 )
    2551             :                     {
    2552      241396 :                         IF( NE_16( q_loc1, q_loc2 ) )
    2553             :                         {
    2554      134667 :                             op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); /* qloc2 */
    2555      134667 :                             q_loc2 = q_loc1;
    2556      134667 :                             move16();
    2557             :                         }
    2558      241396 :                         gamma = extract_h( L_sub( op1, op2 ) ); /* qloc2 - 16 */
    2559      241396 :                         gamma = shl( gamma, q_loc2 );           /* 2 * qloc2 - 16 */
    2560             :                     }
    2561             :                     ELSE
    2562             :                     {
    2563      247076 :                         gamma = extract_h( L_shl( op1, q_loc1 ) ); /* 2 * qloc2 - 16 */
    2564             :                     }
    2565             :                 }
    2566             :                 ELSE
    2567             :                 {
    2568       21116 :                     gamma = 0;
    2569       21116 :                     move16();
    2570             :                 }
    2571      509588 :                 len = s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
    2572    13037516 :                 FOR( i = s_max( hFdCngDec->cna_band_limits[b], ( hFdCngCom->startBand >> 1 ) ); i < len; i++ ) // i < min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
    2573             :                 {
    2574             :                     Word32 l_tmp;
    2575    12527928 :                     lev1 = *ptr_per++;
    2576    12527928 :                     move32();
    2577    12527928 :                     lev2 = *ptr_per++;
    2578    12527928 :                     move32();
    2579             : 
    2580    12527928 :                     test();
    2581    12527928 :                     test();
    2582    12527928 :                     IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) )
    2583             :                     {
    2584             :                         /* take the minimum of two adjacent frequency bins */
    2585      395066 :                         cna_level = L_min( lev1, lev2 ); /* hFdCngDec->smoothed_psd_exp */
    2586             :                     }
    2587             :                     ELSE
    2588             :                     {
    2589             :                         /* take the average of two adjacent frequency bins */
    2590    12132862 :                         cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); /* hFdCngDec->smoothed_psd_exp */
    2591             :                     }
    2592    12527928 :                     q_cna_level = hFdCngDec->smoothed_psd_exp;
    2593    12527928 :                     move16();
    2594    12527928 :                     l_tmp = Sqrt32( cna_level, &q_cna_level );
    2595    12527928 :                     scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* Q = (31-q_cna_level) + Q15 - 31 */
    2596             :                     /*
    2597             :                        scale_fact0 will be in Q15 by the time the above operation is performed
    2598             :                        so the q of scale_fact represented now by q_cna_level has to be updated
    2599             :                     */
    2600    12527928 :                     q_cna_level = sub( Q31, add( q_cna_level, Q16 ) );
    2601             : 
    2602             :                     /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */
    2603    12527928 :                     Word16 shift = sub( q_cna_level, hStereoDft->q_dft );
    2604    12527928 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2605    12527928 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2606    12527928 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma );                       /* q_cna_level */
    2607    12527928 :                     l_tmp = L_shr( l_tmp, shift );                                                  /* q_dft */
    2608    12527928 :                     DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp );                                /* q_dft */
    2609    12527928 :                     move32();
    2610    12527928 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2611    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2612    12527928 :                     DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp );          /* q_dft */
    2613    12527928 :                     move32();
    2614             : 
    2615    12527928 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2616    12527928 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2617    12527928 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma );                       /* q_cna_level */
    2618    12527928 :                     l_tmp = L_shr( l_tmp, shift );                                                  /* q_dft */
    2619    12527928 :                     DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp );                        /* q_dft */
    2620    12527928 :                     move32();
    2621    12527928 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2622    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2623    12527928 :                     DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp );  /* q_dft */
    2624    12527928 :                     move32();
    2625             :                 }
    2626             :             }
    2627             : 
    2628             :             /* update CNA re-scaling factor */
    2629       78792 :             hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); /* q_cna_act */
    2630       78792 :             move16();
    2631             : 
    2632       78792 :             IF( !hFdCngDec->first_cna_noise_updated )
    2633             :             {
    2634       46762 :                 hFdCngDec->cna_rescale_fact_fx = 0;
    2635       46762 :                 move16();
    2636             :             }
    2637             :         }
    2638             : 
    2639             :         /* Update memories */
    2640       94982 :         hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
    2641       94982 :         move16();
    2642       94982 :         Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); /* qDFT */
    2643       94982 :         hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft;
    2644       94982 :         move16();
    2645       94982 :         IF( pPredGain )
    2646             :         {
    2647       94982 :             stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain );
    2648             :         }
    2649             : 
    2650       94982 :         Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2651       94982 :         Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2652             :     }
    2653             : 
    2654       47491 :     IF( st0->bfi && !prev_bfi )
    2655             :     {
    2656             :         Word16 q_shift0;
    2657             :         Word16 q_shift1;
    2658         382 :         idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    2659         382 :         idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 );
    2660         382 :         q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] );
    2661         382 :         q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] );
    2662             :         /*dmx energy memory*/
    2663         382 :         hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_DFT */
    2664             :     }
    2665             : 
    2666       47491 :     stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio );
    2667             : 
    2668       47491 :     return;
    2669             : }
    2670             : 
    2671             : /*-------------------------------------------------------------------------
    2672             :  * stereo_dft_compute_td_stefi_params_fx()
    2673             :  *
    2674             :  *
    2675             :  *-------------------------------------------------------------------------*/
    2676             : 
    2677       47491 : static void stereo_dft_compute_td_stefi_params_fx(
    2678             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle    */
    2679             :     const Word16 samp_ratio                /* i  : sampling ratio            Q13*/
    2680             : )
    2681             : {
    2682             :     Word16 pdmx_ind;
    2683             :     Word32 g2;
    2684             :     Word16 bin0;
    2685             :     Word16 band0;
    2686             :     Word16 b;
    2687             :     Word16 nbands;
    2688             :     Word16 bres;
    2689             :     Word32 wsum;
    2690             :     Word32 pred_gain_avg, pred_g;
    2691             :     Word16 shift_g;
    2692             :     Word16 q_pred_gain_avg;
    2693             :     Word32 nrg_DMX, nrg_pred_DMX;
    2694             :     Word32 op1;
    2695             :     Word16 q_div, q_sqrt;
    2696             : 
    2697       47491 :     pdmx_ind = hStereoDft->past_DMX_pos; /* Q0 */
    2698       47491 :     move16();
    2699       47491 :     bres = hStereoDft->band_res[1]; /* Q0 */
    2700       47491 :     move16();
    2701             : 
    2702       47491 :     test();
    2703       47491 :     IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient )
    2704             :     {
    2705       23218 :         hStereoDft->td_gain_fx[0] = 0;
    2706       23218 :         move32();
    2707       23218 :         hStereoDft->q_td_gain[0] = 0;
    2708       23218 :         move16();
    2709       23218 :         return;
    2710             :     }
    2711             : 
    2712       24273 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2713       24273 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2714       24273 :     b = hStereoDft->nbands;                                            /* Q0 */
    2715       24273 :     move16();
    2716       75653 :     WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) )
    2717             :     {
    2718       51380 :         b--;
    2719             :     }
    2720       24273 :     band0 = b; /* Q0 */
    2721       24273 :     move16();
    2722             : 
    2723             :     /* calculate averages over high bands */
    2724       24273 :     pred_g = pred_gain_avg = 0;
    2725       24273 :     move32();
    2726       24273 :     move32();
    2727       24273 :     nbands = 0;
    2728       24273 :     move16();
    2729       24273 :     wsum = 0;
    2730       24273 :     move32();
    2731       24273 :     shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) );
    2732       74124 :     FOR( b = band0; b < hStereoDft->nbands; b++ )
    2733             :     {
    2734       50509 :         IF( L_min( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ) < 0 )
    2735             :         {
    2736         658 :             hStereoDft->td_gain_fx[0] = 0;
    2737         658 :             move32();
    2738         658 :             hStereoDft->q_td_gain[0] = 0;
    2739         658 :             move16();
    2740         658 :             return;
    2741             :         }
    2742       49851 :         pred_g = L_add( pred_g, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->res_pred_gain_fx[b + STEREO_DFT_BAND_MAX], 1 ),
    2743       49851 :                                                            L_shr( hStereoDft->res_pred_gain_fx[b + 2 * STEREO_DFT_BAND_MAX], 1 ) ),
    2744       49851 :                                                     dft_res_pred_weights_fx[bres][b - band0] ),
    2745             :                                        shift_g ) ); /* Q30 - shift_g */
    2746       49851 :         pred_gain_avg = L_add( pred_gain_avg, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b], 1 ),
    2747       49851 :                                                                          L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], 1 ) ),
    2748       49851 :                                                                   dft_res_pred_weights_fx[bres][b - band0] ),
    2749             :                                                      shift_g ) ); /* Q30 - shift_g */
    2750             : 
    2751       49851 :         nbands = add( nbands, 1 );
    2752       49851 :         wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] );
    2753             : #ifdef DBG_TD_STEFI
    2754             :         printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] );
    2755             : #endif
    2756             :     }
    2757             : 
    2758       23615 :     IF( nbands == 0 )
    2759             :     {
    2760             :         /* apparently, there is nothing to do here */
    2761        2968 :         hStereoDft->td_gain_fx[0] = 0;
    2762        2968 :         move32();
    2763        2968 :         hStereoDft->q_td_gain[0] = 0;
    2764        2968 :         move16();
    2765        2968 :         return;
    2766             :     }
    2767       20647 :     wsum = L_shl( wsum, sub( Q16, shift_g ) );                    /* Q31 - shift_g */
    2768       20647 :     pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); /* q_div */
    2769       20647 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2770             :     {
    2771        4921 :         pred_g = L_shl( pred_g, q_div );
    2772             :     }
    2773             : 
    2774       20647 :     pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); /* q_div */
    2775       20647 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2776             :     {
    2777        4799 :         pred_gain_avg = L_shl( pred_gain_avg, q_div );
    2778        4799 :         q_pred_gain_avg = 15;
    2779        4799 :         move16();
    2780             :     }
    2781             :     ELSE
    2782             :     {
    2783       15848 :         q_pred_gain_avg = sub( 15, q_div );
    2784             :     }
    2785       20647 :     nrg_DMX = hStereoDft->hb_nrg_fx[0];
    2786       20647 :     move32();
    2787       20647 :     nrg_pred_DMX = hStereoDft->hb_nrg_fx[1];
    2788       20647 :     move32();
    2789             : 
    2790       20647 :     op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); /* q_div */
    2791       20647 :     q_sqrt = add( Q16, q_div );
    2792       20647 :     op1 = Sqrt32( op1, &q_sqrt );
    2793       20647 :     g2 = Mpy_32_32( pred_g, op1 ); /* q_div + q_sqrt - 31 */
    2794       20647 :     IF( LT_16( q_sqrt, 0 ) )
    2795             :     {
    2796         877 :         g2 = L_shl( g2, q_sqrt );
    2797         877 :         q_sqrt = 0;
    2798         877 :         move16();
    2799             :     }
    2800       19770 :     ELSE IF( q_sqrt != 0 )
    2801             :     {
    2802       11947 :         IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) )
    2803             :         {
    2804        7522 :             g2 = pred_gain_avg; /* q_pred_gain_avg */
    2805        7522 :             move32();
    2806             :         }
    2807             :         ELSE
    2808             :         {
    2809        4425 :             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2810        4425 :                         Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    2811             :                                     g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg - q_sqrt */
    2812        4425 :             g2 = L_shl( g2, q_sqrt );                                           /* q_pred_gain_avg */
    2813             :         }
    2814             :     }
    2815             :     ELSE
    2816             :     {
    2817        7823 :         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2818        7823 :                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    2819             :                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg */
    2820             :     }
    2821             : 
    2822       20647 :     hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); /* Q16 + q_pred_gain_avg */
    2823       20647 :     hStereoDft->q_td_gain[0] = add( 16, q_pred_gain_avg );
    2824       20647 :     move32();
    2825       20647 :     move16();
    2826             : 
    2827             : #ifdef DBG_TD_STEFI
    2828             :     printf( "frame: %d\tpred_gain: %f\tpred_gain_avg: %f\tg2_0: %f\tgain: %f\n", frame, pred_gain, pred_gain_avg, g2, hStereoDft->td_gain[0] );
    2829             :     printf( "nrg_DMX: %f\tnrd_pred_DMX: %f\tnbands: %d\tbin0: %d\n", nrg_DMX, nrg_pred_DMX, hStereoDft->nbands, bin0 );
    2830             :     /*printf( "td_gain: %f\n", hStereoDft->td_gain[0] );*/
    2831             : #endif
    2832             : 
    2833       20647 :     return;
    2834             : }
    2835             : 
    2836        4224 : static void stereo_dft_dequantize_ipd_fx(
    2837             :     Word16 *ind,      /* Q0 */
    2838             :     Word32 *out_fx,   /* Q27 */
    2839             :     const Word16 bits /* Q0 */
    2840             : )
    2841             : {
    2842             :     Word16 delta_fx;
    2843        4224 :     IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */
    2844             :     {
    2845         271 :         delta_fx = ( EVS_PI_FX ) >> 1; /* Q13 */
    2846         271 :         move16();
    2847             :     }
    2848        3953 :     ELSE IF( EQ_16( bits, 3 ) )
    2849             :     {
    2850           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2851           0 :         move16();
    2852             :     }
    2853        3953 :     ELSE IF( EQ_16( bits, 4 ) )
    2854             :     {
    2855        3953 :         delta_fx = ( EVS_PI_FX ) >> 3; /* Q13 */
    2856        3953 :         move16();
    2857             :     }
    2858             :     ELSE
    2859             :     {
    2860           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2861           0 :         move16();
    2862           0 :         assert( 0 );
    2863             :     }
    2864             : 
    2865        4224 :     *out_fx = L_sub( W_sat_l( W_mult_32_16( L_shl( ind[0], 13 ), delta_fx ) ), EVS_PI_FX_Q27 );
    2866        4224 :     move32();
    2867        4224 :     return;
    2868             : }
    2869             : 
    2870             : /*-------------------------------------------------------------------------
    2871             :  * stereo_dft_generate_res_pred_fx()
    2872             :  *
    2873             :  *
    2874             :  *-------------------------------------------------------------------------*/
    2875       82696 : void stereo_dft_generate_res_pred_fx(
    2876             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle                */
    2877             :     const Word16 samp_ratio,               /* i  : sampling ratio                    Q15*/
    2878             :     Word32 *pDFT_DMX,                      /* i  : downmix signal                   qDFT*/
    2879             :     Word32 *DFT_PRED_RES,                  /* o  : residual prediction signal       qDFT*/
    2880             :     Word32 *pPredGain,                     /* i  : residual prediction gains         Q31*/
    2881             :     const Word16 k,                        /* i  : subframe index                                         Q0*/
    2882             :     Word32 *ap_filt_DMX,                   /* i  : enhanced stereo filling signal       qDFT*/
    2883             :     Word16 *stop,                          /* o  : last FD stereo filling bin         Q0*/
    2884             :     const Word16 bfi                       /* i  : BFI flag                           Q0*/
    2885             : )
    2886             : {
    2887             :     /* general variables */
    2888             :     Word16 i, b;
    2889             :     Word16 begin, end;
    2890             :     Word16 bin0, band0; /* ESF->Stefi crossover bin/band */
    2891             :     Word16 lb_stefi_start_band;
    2892             : 
    2893             :     /* variables for enhanced stereo filling */
    2894             :     Word16 norm_fac, q_norm_fac;
    2895             :     Word16 q_sqrt;
    2896             :     Word16 alpha; // gain_limit;
    2897             : 
    2898             :     /* variables for stereo filling */
    2899             :     Word16 d_long, d_short, d_long_ind, d_short_ind;
    2900             :     Word16 g_short, g_long;
    2901             :     Word32 dmx_nrg, rev_nrg;
    2902             :     Word64 dmx_nrg_64bit, rev_nrg_64bit;
    2903             :     Word16 q_shift, q_com, dmx_nrg_q, rev_nrg_q, q_smoothed_nrg_local[STEREO_DFT_BAND_MAX];
    2904             :     Word32 past_dmx_nrg;
    2905             :     Word32 pred_gain_avg;
    2906             :     Word32 g2;
    2907             :     Word16 nbands_respred;
    2908             :     Word16 q_new, diff;
    2909             :     Word16 len;
    2910       82696 :     push_wmops( "gen_respred" );
    2911             : 
    2912             :     /* smoothing and limiting parameters */
    2913             :     // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */
    2914       82696 :     IF( hStereoDft->wasTransient )
    2915             :     {
    2916        2364 :         alpha = 0;
    2917        2364 :         move16();
    2918             :     }
    2919             :     ELSE
    2920             :     {
    2921       80332 :         alpha = (Word16) ( 0x199A ); /* Q15 */
    2922       80332 :         move16();
    2923             :     }
    2924             :     // gain_limit = 0x7FFF; // 2.0 in Q14
    2925             : 
    2926             :     /* residual prediction only used up to 16 kHz (SWB) */
    2927       82696 :     nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
    2928             : 
    2929             :     /* In ACELP mode the downmix signal is not available in bandwidth extension area. *
    2930             :      * Therefore, the downmix energy in the corresponding subbands is estimated.      */
    2931       82696 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2932       82696 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2933       82696 :     b = hStereoDft->nbands;
    2934       82696 :     move16();
    2935      265800 :     WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) )
    2936             :     {
    2937      183104 :         b--;
    2938             :     }
    2939       82696 :     band0 = b;
    2940       82696 :     move16();
    2941             : 
    2942       82696 :     IF( LT_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
    2943             :     {
    2944             :         /* no ESF signal available, use stereo filling over whole spectrum */
    2945       35120 :         lb_stefi_start_band = s_max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); /* Q0 */
    2946             :     }
    2947             :     ELSE
    2948             :     {
    2949             :         /* ESF signal available, use ESF in lowband, stereo filling in highband */
    2950       47576 :         lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); /* Q0 */
    2951             :     }
    2952             : 
    2953       82696 :     IF( bfi )
    2954             :     {
    2955        1404 :         lb_stefi_start_band = 0;
    2956        1404 :         move16();
    2957             :     }
    2958             : 
    2959             :     /* lowband: use ESF if available, else use stereo filling */
    2960       82696 :     IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
    2961             :     {
    2962             :         /* ESF in lowband */
    2963             :         /* main loop over core region*/
    2964       47576 :         set16_fx( q_smoothed_nrg_local, hStereoDft->q_smoothed_nrg, STEREO_DFT_BAND_MAX );
    2965      385724 :         FOR( b = hStereoDft->res_cod_band_max; b <= band0; b++ )
    2966             :         {
    2967      338148 :             dmx_nrg_64bit = EPSILLON_FX;
    2968      338148 :             move64();
    2969      338148 :             rev_nrg_64bit = EPSILLON_FX;
    2970      338148 :             move64();
    2971             : 
    2972             :             /* calculate band energies (low band only in case of ACELP) */
    2973      338148 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    2974     7010956 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2975             :             {
    2976     6672808 :                 dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ),
    2977     6672808 :                                              pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2978     6672808 :                 rev_nrg_64bit = W_mac_32_32( W_mac_32_32( rev_nrg_64bit, ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ),
    2979     6672808 :                                              ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2980             :             }
    2981             : 
    2982      338148 :             q_new = add( shl( hStereoDft->q_dft, 1 ), 1 );
    2983      338148 :             q_shift = W_norm( dmx_nrg_64bit );
    2984      338148 :             dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2985      338148 :             dmx_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2986      338148 :             q_shift = W_norm( rev_nrg_64bit );
    2987      338148 :             rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2988      338148 :             rev_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2989      338148 :             move16();
    2990             : 
    2991             :             /* Reach a common Q for dmx_nrg and rev_nrg */
    2992      338148 :             q_com = s_min( dmx_nrg_q, rev_nrg_q );
    2993      338148 :             dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */
    2994      338148 :             rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */
    2995             : 
    2996      338148 :             diff = sub( hStereoDft->q_smoothed_nrg, q_com );
    2997      338148 :             IF( diff < 0 )
    2998             :             {
    2999      114877 :                 rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) );
    3000      114877 :                 dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) );
    3001      114877 :                 q_com = hStereoDft->q_smoothed_nrg;
    3002      114877 :                 move16();
    3003             :             }
    3004             :             ELSE
    3005             :             {
    3006      223271 :                 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    3007      223271 :                 move32();
    3008      223271 :                 hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    3009      223271 :                 move32();
    3010      223271 :                 q_smoothed_nrg_local[b] = q_com;
    3011      223271 :                 move16();
    3012             :             }
    3013             :             /* smoothing */
    3014      338148 :             hStereoDft->smooth_res_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_res_nrg_fx[b], alpha ), rev_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
    3015      338148 :             move32();
    3016      338148 :             hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
    3017      338148 :             move32();
    3018             : 
    3019             :             // Compute norm_fac in Q14
    3020      338148 :             norm_fac = MAX_16;
    3021      338148 :             move16();
    3022             :             /* normalization factor */
    3023      338148 :             IF( hStereoDft->smooth_res_nrg_fx[b] != 0 )
    3024             :             {
    3025      333899 :                 norm_fac = 0;
    3026      333899 :                 move16();
    3027      333899 :                 IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 )
    3028             :                 {
    3029             :                     Word16 quo, quo_e;
    3030             :                     Word32 prod;
    3031             : 
    3032      333056 :                     norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */
    3033      333056 :                     norm_fac = Sqrt16( norm_fac, &q_norm_fac );
    3034             : 
    3035      333056 :                     quo = BASOP_Util_Divide1616_Scale( 32767, norm_fac, &quo_e ); /* q_norm_fac */
    3036      333056 :                     quo_e = sub( quo_e, q_norm_fac );
    3037      333056 :                     quo = shl_sat( quo, sub( quo_e, 1 ) ); // Q14
    3038      333056 :                     quo = s_max( 13107 /*0.8 in Q14 */, quo );
    3039      333056 :                     quo = s_min( quo, 20480 /* 1.25 in Q14*/ );
    3040             : 
    3041      333056 :                     prod = L_mult( norm_fac, quo ); // exp:q_norm_fac+1
    3042             :                     // Bring to Q30
    3043      333056 :                     prod = L_shl_sat( prod, q_norm_fac );
    3044             : 
    3045      333056 :                     norm_fac = extract_h( prod );
    3046             :                 }
    3047             :             }
    3048             : 
    3049      338148 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    3050     7010956 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3051             :             {
    3052     6672808 :                 DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), 1 ); /* q_dft */
    3053     6672808 :                 move32();
    3054     6672808 :                 DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), 1 ); /* q_dft */
    3055     6672808 :                 move32();
    3056             :             }
    3057             :         }
    3058             : 
    3059             :         /* Reach a common Q for all the bands */
    3060       47576 :         q_com = Q31;
    3061       47576 :         move16();
    3062      666064 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    3063             :         {
    3064      618488 :             q_com = s_min( q_com, q_smoothed_nrg_local[b] );
    3065             :         }
    3066      666064 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    3067             :         {
    3068      618488 :             hStereoDft->smooth_dmx_nrg_fx[b] = L_shl( hStereoDft->smooth_dmx_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
    3069      618488 :             move32();
    3070             : 
    3071      618488 :             hStereoDft->smooth_res_nrg_fx[b] = L_shl( hStereoDft->smooth_res_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
    3072      618488 :             move32();
    3073             :         }
    3074       47576 :         IF( GT_16( q_com, hStereoDft->q_dft ) )
    3075             :         {
    3076          31 :             scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    3077          31 :             scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    3078          31 :             hStereoDft->q_smoothed_nrg = hStereoDft->q_dft;
    3079          31 :             move16();
    3080             :         }
    3081             :     }
    3082       35120 :     ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) )
    3083             :     {
    3084             :         /* stefi in lowband */
    3085       24180 :         set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) );
    3086             : 
    3087      148410 :         FOR( b = lb_stefi_start_band; b <= band0; b++ )
    3088             :         {
    3089             :             Word16 temp, temp_e;
    3090      124230 :             d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    3091      124230 :             temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e );        /*(float) b / ( hStereoDft->nbands - 1 )*/
    3092      124230 :             IF( temp_e < 0 )
    3093             :             {
    3094        2270 :                 temp = shl( temp, temp_e );
    3095        2270 :                 temp_e = 0;
    3096        2270 :                 move16();
    3097             :             }
    3098      124230 :             temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    3099      124230 :             temp_e = add( temp_e, 3 );
    3100      124230 :             temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
    3101      124230 :             d_long_ind = sub( s_max( 4, temp ), 4 );
    3102             :             /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
    3103             :              * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
    3104      124230 :             d_short_ind = s_max( d_short_ind, d_long_ind );
    3105      124230 :             move16();
    3106             : 
    3107             :             /* Even number of window sliding (assymmetric OLA) */
    3108      124230 :             d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); /* Q0 */
    3109      124230 :             d_long_ind = shl( shr( d_long_ind, 1 ), 1 );   /* Q0 */
    3110             : 
    3111      124230 :             d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    3112      124230 :             d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind );   /* Q0 */
    3113             : 
    3114      124230 :             d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    3115      124230 :             move16();
    3116      124230 :             d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    3117      124230 :             move16();
    3118             : 
    3119      124230 :             g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    3120      124230 :             move16();
    3121      124230 :             g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    3122      124230 :             move16();
    3123             : 
    3124             :             /* change mixing ratio if long and short delay are the same */
    3125      124230 :             IF( EQ_16( d_short, d_long ) )
    3126             :             {
    3127       20614 :                 g_short = MAX_16;
    3128       20614 :                 move16();
    3129       20614 :                 g_long = 0;
    3130       20614 :                 move16();
    3131             :             }
    3132             : 
    3133             :             /* Avoid transient components */
    3134      124230 :             test();
    3135      124230 :             IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) && EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
    3136             :             {
    3137        4884 :                 g_long = 0;
    3138        4884 :                 move16();
    3139        4884 :                 g_short = 0;
    3140        4884 :                 move16();
    3141             :             }
    3142      119346 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) )
    3143             :             {
    3144        3004 :                 g_long = MAX_16;
    3145        3004 :                 move16();
    3146        3004 :                 g_short = 0;
    3147        3004 :                 move16();
    3148             :             }
    3149      116342 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
    3150             :             {
    3151        2944 :                 g_long = 0;
    3152        2944 :                 move16();
    3153        2944 :                 g_short = MAX_16;
    3154        2944 :                 move16();
    3155             :             }
    3156             : 
    3157      124230 :             IF( s_max( g_short, g_long ) > 0 )
    3158             :             {
    3159      119346 :                 Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3160      119346 :                 Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    3161      119346 :                 past_dmx_nrg = EPSILON_FIX;
    3162      119346 :                 move32();
    3163      119346 :                 dmx_nrg = EPSILON_FIX;
    3164      119346 :                 move32();
    3165      119346 :                 len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    3166     3308318 :                 FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3167             :                 {
    3168     3188972 :                     dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft - 31 */
    3169             : 
    3170     3188972 :                     DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
    3171     3188972 :                     move32();
    3172     3188972 :                     DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
    3173     3188972 :                     move32();
    3174     3188972 :                     past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */
    3175             :                 }
    3176      119346 :                 test();
    3177      119346 :                 IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) )
    3178             :                 {
    3179             :                     Word16 q_div;
    3180             :                     Word16 op;
    3181      114656 :                     op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */
    3182      114656 :                     q_sqrt = q_div;
    3183      114656 :                     move16();
    3184      114656 :                     norm_fac = Sqrt16( op, &q_sqrt );
    3185      114656 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */
    3186      114656 :                     IF( LE_32( q_sqrt, norm_l( g2 ) ) )
    3187             :                     {
    3188      103101 :                         g2 = L_shl( g2, q_sqrt );
    3189      103101 :                         pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
    3190             :                                                     hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    3191             : 
    3192      103101 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3193      103101 :                                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    3194             :                                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    3195      103101 :                         q_sqrt = 0;
    3196      103101 :                         move16();
    3197             :                     }
    3198             :                     ELSE
    3199             :                     {
    3200             :                         /* Multiplication with STEREO_DFT_STEFFI_GAIN_AMP_FX is avodided since the float value of
    3201             :                            this constant is 1.0f */
    3202       11555 :                         g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
    3203             :                                          hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    3204       11555 :                         q_sqrt = 0;
    3205       11555 :                         move16();
    3206             :                     }
    3207      114656 :                     len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    3208     3285140 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3209             :                     {
    3210     3170484 :                         DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); /* q_dft */
    3211     3170484 :                         move32();
    3212     3170484 :                         DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); /* q_dft */
    3213     3170484 :                         move32();
    3214             :                     }
    3215             :                 }
    3216             :             }
    3217             :             ELSE
    3218             :             {
    3219        4884 :                 set32_fx( DFT_PRED_RES + shl( hStereoDft->band_limits[b], 1 ), 0, shl( sub( s_min( bin0, hStereoDft->band_limits[b + 1] ), hStereoDft->band_limits[b] ), 1 ) );
    3220             :             }
    3221             :         }
    3222             :     }
    3223             : 
    3224       82696 :     IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) )
    3225             :     {
    3226             :         /* apply stereo filling in ACELP BWE region */
    3227       71954 :         test();
    3228       71954 :         IF( ( hStereoDft->core_hist[0] == ACELP_CORE ) && ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) )
    3229             :         {
    3230             :             /* ACELP -> ACELP: nothing to do */
    3231       42262 :             *stop = bin0;
    3232       42262 :             move16();
    3233             :         }
    3234       29692 :         ELSE IF( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE )
    3235             :         {
    3236             :             /* ACELP -> TCX/HQ core transition */
    3237             :             /* calculate high band energy only */
    3238        1990 :             dmx_nrg = EPSILON_FIX;
    3239        1990 :             move32();
    3240      454918 :             FOR( i = bin0; i < hStereoDft->NFFT / 2; i++ )
    3241             :             {
    3242      452928 :                 dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); /* 2 * q_dft - 31 */
    3243             :             }
    3244             : 
    3245        1990 :             hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); /* Q15 */
    3246        1990 :             move32();
    3247        1990 :             *stop = bin0;
    3248        1990 :             move16();
    3249             :         }
    3250       27702 :         ELSE IF( hStereoDft->core_hist[0] == ACELP_CORE )
    3251             :         {
    3252             :             /* TCX/HQ core -> ACELP transition */
    3253             :             /* apply short delay only and blend to long/short gain */
    3254        1496 :             dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; /* Q15 */
    3255        1496 :             move32();
    3256        1496 :             d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY;
    3257        1496 :             move16();
    3258             : 
    3259        1496 :             d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
    3260             : 
    3261             :             /* calculate high band energy of past dmx */
    3262             :             // past_dmx_nrg = EPSILON_FIX;
    3263        1496 :             past_dmx_nrg = 0;
    3264        1496 :             move32();
    3265        1496 :             len = s_min( shr( hStereoDft->NFFT, 1 ), ( STEREO_DFT32MS_N_32k >> 1 ) );
    3266      220768 :             FOR( i = bin0; i < len; i++ ) // i < min( ( hStereoDft->NFFT / 2 ), ( hStereoDft->NFFT / 2 ) )
    3267             :             {
    3268      219272 :                 past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); /* 2 * hStereoDft->q_DFT_past_DMX_fx[d_short_ind] - 31 */
    3269             :             }
    3270        1496 :             past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); /* 2 * hStereoDft->q_dft - 31*/
    3271        1496 :             IF( past_dmx_nrg == 0 )
    3272             :             {
    3273        1065 :                 past_dmx_nrg = EPSILON_FX;
    3274        1065 :                 move32();
    3275             :             }
    3276             : 
    3277        5168 :             FOR( b = band0; b < nbands_respred; b++ )
    3278             :             {
    3279             :                 // g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
    3280        3672 :                 IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 )
    3281             :                 {
    3282         162 :                     g_short = 0;
    3283         162 :                     move16();
    3284             :                 }
    3285             :                 ELSE
    3286             :                 {
    3287        3510 :                     g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
    3288             :                 }
    3289             : 
    3290        3672 :                 IF( g_short > 0 )
    3291             :                 {
    3292             :                     Word16 q_divide;
    3293        3510 :                     Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide );
    3294        3510 :                     q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr );
    3295        3510 :                     op = Sqrt32( op, &q_norm_fac );
    3296        3510 :                     g2 = Mpy_32_32( pPredGain[b], op );                                                        /* Q31 */
    3297        3510 :                     pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); /* Q31 */
    3298        3510 :                     IF( q_norm_fac < 0 )
    3299             :                     {
    3300        2600 :                         g2 = L_shl( g2, q_norm_fac );
    3301        2600 :                         q_norm_fac = 0;
    3302        2600 :                         move16();
    3303             :                     }
    3304         910 :                     ELSE IF( q_norm_fac != 0 )
    3305             :                     {
    3306         672 :                         IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) )
    3307             :                         {
    3308         569 :                             g2 = pred_gain_avg;
    3309         569 :                             move32();
    3310             :                         }
    3311             :                         ELSE
    3312             :                         {
    3313         103 :                             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3314         103 :                                         Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    3315             :                                                     g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 - q_norm_fac */
    3316         103 :                             g2 = L_shl( g2, q_norm_fac );                                       /* Q31 */
    3317             :                         }
    3318             :                     }
    3319             :                     ELSE
    3320             :                     {
    3321         238 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3322         238 :                                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    3323             :                                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    3324             :                     }
    3325        3510 :                     q_shift = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3326        3510 :                     move16();
    3327        3510 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3328      209660 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3329             :                     {
    3330      206150 :                         DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); /* q_dft */
    3331      206150 :                         move32();
    3332      206150 :                         DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); /* q_dft */
    3333      206150 :                         move32();
    3334             :                     }
    3335             :                 }
    3336             :                 ELSE
    3337             :                 {
    3338         162 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3339         162 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3340         162 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3341             :                 }
    3342             :             }
    3343             :         }
    3344             :         ELSE
    3345             :         {
    3346       85286 :             FOR( b = band0; b < nbands_respred; b++ )
    3347             :             {
    3348             :                 /* TCX/HQ core -> TCX/HQ core: business as usual */
    3349       59080 :                 d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    3350             :                 Word16 temp, temp_e;
    3351       59080 :                 temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/
    3352       59080 :                 IF( temp_e < 0 )
    3353             :                 {
    3354           0 :                     temp = shl( temp, temp_e );
    3355           0 :                     temp_e = 0;
    3356           0 :                     move16();
    3357             :                 }
    3358       59080 :                 temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    3359       59080 :                 temp_e = add( temp_e, 3 );
    3360       59080 :                 temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
    3361       59080 :                 d_long_ind = sub( s_max( 4, temp ), 4 );                                                                                                                                       /* Q0 */
    3362             :                 /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
    3363             :                  * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
    3364       59080 :                 d_short_ind = s_max( d_short_ind, d_long_ind ); /* Q0 */
    3365             : 
    3366             :                 /* Even number of window sliding (assymmetric OLA) */
    3367       59080 :                 d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3368       59080 :                 move16();
    3369       59080 :                 d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3370       59080 :                 move16();
    3371             : 
    3372       59080 :                 d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    3373       59080 :                 move16();
    3374       59080 :                 d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */
    3375       59080 :                 move16();
    3376             : 
    3377             :                 /* Works as long as STEREO_DFT_PAST_MAX is a power of 2*/
    3378       59080 :                 d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3379       59080 :                 move16();
    3380       59080 :                 d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3381       59080 :                 move16();
    3382             : 
    3383       59080 :                 g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    3384       59080 :                 move16();
    3385       59080 :                 g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    3386       59080 :                 move16();
    3387             : 
    3388             :                 /* change mixing ratio if long and short delay are the same */
    3389       59080 :                 IF( EQ_16( d_short, d_long ) )
    3390             :                 {
    3391       55244 :                     g_short = MAX_16;
    3392       55244 :                     move16();
    3393       55244 :                     g_long = 0;
    3394       55244 :                     move16();
    3395             :                 }
    3396             : 
    3397             :                 /* Avoid transient components */
    3398       59080 :                 test();
    3399       59080 :                 IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) &&
    3400             :                     EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
    3401             :                 {
    3402        1822 :                     g_long = 0;
    3403        1822 :                     move16();
    3404        1822 :                     g_short = 0;
    3405        1822 :                     move16();
    3406             :                 }
    3407       57258 :                 ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) )
    3408             :                 {
    3409          42 :                     g_long = MAX_16;
    3410          42 :                     move16();
    3411          42 :                     g_short = 0;
    3412          42 :                     move16();
    3413             :                 }
    3414       57216 :                 ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
    3415             :                 {
    3416          52 :                     g_long = 0;
    3417          52 :                     move16();
    3418          52 :                     g_short = MAX_16;
    3419          52 :                     move16();
    3420             :                 }
    3421       59080 :                 IF( EQ_32( hStereoDft->core_hist[d_short / 2], ACELP_CORE ) )
    3422             :                 {
    3423           0 :                     g_short = 0;
    3424           0 :                     move16();
    3425             :                 }
    3426       59080 :                 IF( EQ_32( hStereoDft->core_hist[d_long / 2], ACELP_CORE ) )
    3427             :                 {
    3428         338 :                     g_long = 0;
    3429         338 :                     move16();
    3430             :                 }
    3431             : 
    3432       59080 :                 IF( s_max( g_short, g_long ) > 0 )
    3433             :                 {
    3434             :                     Word16 q_div;
    3435             :                     Word32 op1;
    3436       57174 :                     Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3437       57174 :                     Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    3438       57174 :                     past_dmx_nrg = EPSILON_FIX;
    3439       57174 :                     move32();
    3440       57174 :                     dmx_nrg = EPSILON_FIX;
    3441       57174 :                     move32();
    3442       57174 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3443     3718032 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3444             :                     {
    3445     3660858 :                         dmx_nrg = L_add( dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 - 1 */
    3446             : 
    3447     3660858 :                         DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
    3448     3660858 :                         move32();
    3449     3660858 :                         DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
    3450     3660858 :                         move32();
    3451             : 
    3452     3660858 :                         past_dmx_nrg = L_add( past_dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 -1 */
    3453             :                     }
    3454       57174 :                     op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); /* q_div + 16 */
    3455       57174 :                     q_norm_fac = q_div;
    3456       57174 :                     move16();
    3457       57174 :                     op1 = Sqrt32( op1, &q_norm_fac );
    3458       57174 :                     IF( GT_16( q_norm_fac, 16 ) )
    3459             :                     {
    3460           0 :                         assert( 0 );
    3461             :                     }
    3462       57174 :                     norm_fac = extract_h( op1 ); /* q_norm_fac - 16 */
    3463       57174 :                     q_norm_fac = sub( q_norm_fac, Q16 );
    3464       57174 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac );                                                                                                                        /* Q31 */
    3465       57174 :                     pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    3466             : 
    3467       57174 :                     g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3468       57174 :                                 Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) ( 0x7FFF ), STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    3469       57174 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3470     3718032 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3471             :                     {
    3472     3660858 :                         DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); /* Q31 */
    3473     3660858 :                         move32();
    3474     3660858 :                         DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); /* Q31 */
    3475     3660858 :                         move32();
    3476             :                     }
    3477             :                 }
    3478             :                 ELSE
    3479             :                 {
    3480        1906 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3481        1906 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3482        1906 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3483             :                 }
    3484             :             }
    3485             :         }
    3486             :     }
    3487             : 
    3488             :     /* update buffers */
    3489      695492 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3490             :     {
    3491      612796 :         test();
    3492      612796 :         IF( hStereoDft->attackPresent || hStereoDft->wasTransient )
    3493             :         {
    3494       32906 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = MIN_32;
    3495       32906 :             move32();
    3496             :         }
    3497             :         ELSE
    3498             :         {
    3499      579890 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b];
    3500      579890 :             move32();
    3501             :         }
    3502             :     }
    3503             : 
    3504       82696 :     pop_wmops();
    3505       82696 :     return;
    3506             : }
    3507             : 
    3508             : /*---------------------------------------------------------------
    3509             :  * stereo_dft_adapt_sf_delay_fx()
    3510             :  *
    3511             :  *
    3512             :  * ---------------------------------------------------------------*/
    3513             : 
    3514       94982 : static void stereo_dft_adapt_sf_delay_fx(
    3515             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft,
    3516             :     Word32 *pPredGain )
    3517             : {
    3518             :     Word32 var_mean_ratio;
    3519             :     Word32 new_variation;
    3520             :     Word32 target_delay;
    3521             :     Word32 max_pg, sum_pg;
    3522             :     Word32 alpha_up, alpha_down;
    3523             :     Word16 b;
    3524             :     Word16 q_sqrt;
    3525             :     Word16 q_div;
    3526             :     Word16 q_guard;
    3527             :     Word16 op;
    3528             : 
    3529       94982 :     max_pg = 0;
    3530       94982 :     move32();
    3531       94982 :     sum_pg = 0;
    3532       94982 :     move32();
    3533       94982 :     q_sqrt = 0;
    3534       94982 :     move32();
    3535       94982 :     q_guard = sub( 15, norm_s( hStereoDft->nbands ) );
    3536             : 
    3537             :     /* find sum and maximum of prediction gains */
    3538      851196 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3539             :     {
    3540      756214 :         IF( GT_32( pPredGain[b], max_pg ) )
    3541             :         {
    3542      204226 :             max_pg = pPredGain[b];
    3543      204226 :             move16();
    3544             :         }
    3545      756214 :         sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); /* q_gurad */
    3546             :     }
    3547       94982 :     IF( GT_16( q_guard, hStereoDft->q_lt_pred_gain ) )
    3548             :     {
    3549         526 :         hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); /* q_guard */
    3550         526 :         hStereoDft->q_lt_pred_gain = q_guard;
    3551         526 :         move16();
    3552             :     }
    3553             :     ELSE
    3554             :     {
    3555       94456 :         sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); /* hStereoDft->q_lt_pred_gain */
    3556       94456 :         q_guard = hStereoDft->q_lt_pred_gain;
    3557       94456 :         move16();
    3558             :     }
    3559       94982 :     IF( sum_pg > 0 )
    3560             :     {
    3561             :         /* Calculate mean of the prediction gain */
    3562       87302 :         hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
    3563             : 
    3564             :         /* Calculate the variation of the prediction gain */
    3565       87302 :         new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) );                                                                                                                                  /* hStereoDft->q_lt_pred_gain */
    3566       87302 :         hStereoDft->lt_pred_gain_variation_fx = Madd_32_16( Mpy_32_16_1( new_variation, STEREO_DFT_VR_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_variation_fx, sub( MAX_16, STEREO_DFT_VR_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
    3567             :     }
    3568             : 
    3569             :     /* Calculate ratio of variation and mean of prediction gain */
    3570       94982 :     var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; /* Q31 */
    3571       94982 :     move16();
    3572             : 
    3573       94982 :     IF( hStereoDft->lt_pred_gain_fx > 0 )
    3574             :     {
    3575       93288 :         Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) );
    3576       93288 :         IF( q_div < 0 )
    3577             :         {
    3578       84041 :             opr2 = L_shl( opr2, q_div );
    3579       84041 :             q_div = 0;
    3580       84041 :             move16();
    3581             :         }
    3582       93288 :         IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) )
    3583             :         {
    3584       12923 :             var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; /* Q31 */
    3585       12923 :             move32();
    3586             :         }
    3587             :         ELSE
    3588             :         {
    3589       80365 :             var_mean_ratio = L_shl( opr2, q_div ); /* Q31 */
    3590             :         }
    3591             :     }
    3592             : 
    3593       94982 :     IF( GT_32( max_pg, STEREO_DFT_STEFFI_PG_THRESHOLD_FX ) )
    3594             :     {
    3595             :         /* slow upwards */
    3596       51293 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; /* Q31 */
    3597       51293 :         move16();
    3598       51293 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; /* Q31 */
    3599       51293 :         move16();
    3600             :     }
    3601             :     ELSE
    3602             :     {
    3603             :         /* slow downwards */
    3604       43689 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; /* Q31 */
    3605       43689 :         move16();
    3606       43689 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; /* Q31 */
    3607       43689 :         move16();
    3608             :     }
    3609             : 
    3610       94982 :     IF( GT_16( extract_h( var_mean_ratio ), extract_h( hStereoDft->lt_var_mean_ratio_fx ) ) )
    3611             :     {
    3612       26537 :         hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_up ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_up ) ); /* Q31 */
    3613       26537 :         move32();
    3614             :     }
    3615             :     ELSE
    3616             :     {
    3617       68445 :         hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_down ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_down ) ); /* Q31 */
    3618       68445 :         move32();
    3619             :     }
    3620             : 
    3621             :     /* Calculate a target delay for the stereo filling. Set the stereo filling delay lower when the prediction gain
    3622             :        variation is relatively high compared to the mean */
    3623       94982 :     IF( GE_16( extract_h( hStereoDft->lt_var_mean_ratio_fx ), extract_h( STEREO_DFT_RES_RATIO_LIMIT_FX ) ) )
    3624             :     {
    3625       35353 :         target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); /* Q15 */
    3626       35353 :         move32();
    3627             :     }
    3628             :     ELSE
    3629             :     {
    3630       59629 :         target_delay = L_min( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ),
    3631             :                               L_add( L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ),
    3632             :                                      L_mult0( ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ),
    3633       59629 :                                               sub( MAX_16, extract_h( L_shl( Mpy_32_16_1( hStereoDft->lt_var_mean_ratio_fx, ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ), Q3 ) ) ) ) ) ); /* Q15 */
    3634             :     }
    3635             : 
    3636             :     /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */
    3637       94982 :     hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); /* Q15 */
    3638       94982 :     q_sqrt = 0;
    3639       94982 :     move16();
    3640       94982 :     IF( EQ_16( hStereoDft->stefi_short_gain_fx, MIN_16 ) )
    3641             :     {
    3642       35353 :         hStereoDft->stefi_short_gain_fx = MAX_16;
    3643       35353 :         move16();
    3644       35353 :         hStereoDft->stefi_long_gain_fx = 0;
    3645       35353 :         move16();
    3646             :     }
    3647             :     ELSE
    3648             :     {
    3649       59629 :         op = hStereoDft->stefi_short_gain_fx;
    3650       59629 :         move16();
    3651       59629 :         hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); /* Q15 */
    3652       59629 :         IF( q_sqrt != 0 )
    3653             :         {
    3654        2667 :             hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); /* Q15 */
    3655             :         }
    3656             :     }
    3657             : 
    3658       94982 :     return;
    3659             : }
    3660        1418 : void stereo_dft_dec_sid_coh_fx(
    3661             :     Decoder_State *st,   /* i/o: decoder state structure     */
    3662             :     const Word16 nbands, /* i  : number of DFT stereo bands             Q0*/
    3663             :     Word16 *coh_fx,      /* i/o: coherence                                         Q15*/
    3664             :     Word16 *nb_bits      /* i/o: number of bits read                    Q0*/
    3665             : )
    3666             : {
    3667             :     Word16 alpha_fx;
    3668             :     Word16 pred_fx;
    3669             :     Word16 pred_err_fx;
    3670             :     Word16 cohBandq_fx[STEREO_DFT_BAND_MAX];
    3671             :     const Word16 *pptr_fx;
    3672             :     Word16 nr_of_sid_stereo_bits;
    3673             :     Word16 i;
    3674             :     Word16 alpha_index;
    3675             :     Word16 alpha_step;
    3676             :     Word16 coh_pred_index;
    3677             :     Word16 res_index;
    3678             :     Word16 bits_tmp;
    3679             :     Word16 b;
    3680             : 
    3681        1418 :     nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
    3682        1418 :     move16();
    3683             :     /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */
    3684             :     /* from the previous frame is used. */
    3685        1418 :     IF( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 )
    3686             :     {
    3687             :         /* Read coherence from bitstream  */
    3688        1418 :         coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index       Q0*/
    3689        1418 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS );
    3690             : 
    3691        1418 :         alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index        Q0*/
    3692        1418 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS );
    3693             : 
    3694        1418 :         alpha_step = 0;
    3695        1418 :         move16();
    3696        7090 :         FOR( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ )
    3697             :         {
    3698        5672 :             IF( GT_16( sub( nr_of_sid_stereo_bits, *nb_bits ), dft_cng_coh_alpha_start[i] ) )
    3699             :             {
    3700        5672 :                 alpha_step = i + 1;
    3701             :             }
    3702             :         }
    3703        1418 :         alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /* Q15 */
    3704        1418 :         move16();
    3705             :     }
    3706             :     ELSE
    3707             :     {
    3708           0 :         alpha_fx = 0;
    3709           0 :         coh_pred_index = 0;
    3710           0 :         move16();
    3711           0 :         move16();
    3712           0 :         FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
    3713             :         {
    3714           0 :             get_next_indice_fx( st, 1 );
    3715           0 :             ( *nb_bits )++;
    3716             :         }
    3717             :     }
    3718             : 
    3719        1418 :     pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q13*/
    3720        1418 :     pred_fx = 3276;                                /*Q13*/
    3721        1418 :     move16();
    3722        1418 :     move16();
    3723        9610 :     FOR( b = 0; b < nbands; b++ )
    3724             :     {
    3725             :         /* Intra-frame prediction */
    3726             : 
    3727       27882 :         FOR( i = 0; i < b; i++ )
    3728             :         {
    3729       19690 :             pred_fx = add( pred_fx, shl( mult( ( *pptr_fx++ ), cohBandq_fx[i] ), 2 ) ); /*q-13*/
    3730             :         }
    3731             :         /* Weighted intra/inter-frame prediction */
    3732        8192 :         pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), shr( coh_fx[b], 2 ) ) ); /*q-13*/
    3733             : 
    3734             :         /* Read residual index from bitstream */
    3735        8192 :         IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */
    3736             :         {
    3737        8192 :             bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); /* Q0 */
    3738        8192 :             *nb_bits = add( *nb_bits, bits_tmp );                                    /* Q0 */
    3739        8192 :             st->next_bit_pos = add( st->next_bit_pos, bits_tmp );                    /* Q0 */
    3740        8192 :             move16();
    3741        8192 :             move16();
    3742             :         }
    3743             :         ELSE
    3744             :         {
    3745           0 :             res_index = 0;
    3746           0 :             move16();
    3747             :         }
    3748             : 
    3749             :         /* Reconstruct */
    3750        8192 :         res_index = dft_cng_coh_u2i[res_index]; /* Q0 */
    3751        8192 :         move16();
    3752        8192 :         pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); /* Q15 */
    3753        8192 :         cohBandq_fx[b] = add( pred_fx, pred_err_fx );                                      /* Store for intra-frame prediction */
    3754        8192 :         IF( GT_16( cohBandq_fx[b], 8192 ) )
    3755             :         {
    3756           0 :             cohBandq_fx[b] = 8192; /* Q13 */
    3757           0 :             move16();
    3758             :         }
    3759        8192 :         ELSE IF( cohBandq_fx[b] < 0 )
    3760             :         {
    3761         178 :             cohBandq_fx[b] = 0;
    3762         178 :             move16();
    3763             :         }
    3764        8192 :         coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ /* Q15 */
    3765        8192 :         move16();
    3766        8192 :         pred_fx = 0;
    3767        8192 :         move16();
    3768             :     }
    3769             : 
    3770             :     /* Remove padding bits */
    3771       25160 :     FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
    3772             :     {
    3773       23742 :         get_next_indice_fx( st, 1 );
    3774       23742 :         ( *nb_bits )++;
    3775             :     }
    3776        1418 :     return;
    3777             : }
    3778       28950 : void stereo_dft_dequantize_itd_fx(
    3779             :     Word16 *ind,           /* Q0 */
    3780             :     Word32 *out_fx,        /* Q15 */
    3781             :     const Word32 output_Fs /* Q0 */
    3782             : )
    3783             : {
    3784             :     Word16 itd;
    3785             :     Word16 mask;
    3786       28950 :     mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; /* Q0 */
    3787       28950 :     move16();
    3788       28950 :     itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; /* Q0 */
    3789             : 
    3790       28950 :     IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) )
    3791             :     {
    3792       18566 :         itd = imult1616( -1, itd ); /* Q0 */
    3793             :     }
    3794       28950 :     assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) );
    3795             : 
    3796             :     /*Convert back @ fs*/
    3797       28950 :     *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q15*/
    3798       28950 :     move32();
    3799       28950 :     return;
    3800             : }
    3801             : /*-------------------------------------------------------------------------
    3802             :  * stereo_dft_dec_read_BS()
    3803             :  *
    3804             :  * Read bitstream
    3805             :  *-------------------------------------------------------------------------*/
    3806             : 
    3807       52733 : void stereo_dft_dec_read_BS_fx(
    3808             :     const Word32 ivas_total_brate,         /* i  : IVAS total bitrate           Q0*/
    3809             :     const Word32 element_brate,            /* i  : element bitrate                      Q0*/
    3810             :     Word32 *total_brate,                   /* o  : total bitrate                        Q0*/
    3811             :     Decoder_State *st,                     /* i/o: decoder state structure        */
    3812             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle          */
    3813             :     const Word16 bwidth,                   /* i  : bandwidth                            Q0*/
    3814             :     const Word16 output_frame,             /* i  : output frame length          Q0*/
    3815             :     Word32 res_buf_fx[STEREO_DFT_N_8k],    /* o  : residual buffer          Q0*/
    3816             :     Word16 *nb_bits,                       /* o  : number of bits read          Q0*/
    3817             :     Word16 *coh_fx,                        /* i/o: Coherence               Q15*/
    3818             :     const Word16 ivas_format               /* i  : ivas format                          Q0*/
    3819             : )
    3820             : {
    3821             :     Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX];
    3822             :     Word32 res_pred_gain_tmp_fx[STEREO_DFT_BAND_MAX];
    3823             :     Word16 b, N_div, nbands;
    3824             :     Word16 NFFT_inner;
    3825             :     Word16 k, k_offset;
    3826             :     Word16 I;
    3827             :     Word16 max_bits;
    3828             :     UWord16 bit_stream_side[800]; /*Max bits per frame for 30kbps*/
    3829             :     RangeUniDecState range_uni_dec_state;
    3830             :     ECSQ_instance ecsq_inst;
    3831             : 
    3832             :     /* needed for provisorial reordering of indices */
    3833             :     Word16 ind1[STEREO_DFT_BAND_MAX];
    3834             :     Word16 n_bits;
    3835             :     Word16 nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX];
    3836             :     Word16 sign_flag;
    3837             :     Word16 itd_mode;
    3838             : 
    3839             :     /*------------------------------------------------------------------*
    3840             :      * Initialization
    3841             :      *-----------------------------------------------------------------*/
    3842             : 
    3843       52733 :     k_offset = STEREO_DFT_OFFSET; /* Q0 */
    3844             : 
    3845       52733 :     move16();
    3846       52733 :     IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
    3847             :     {
    3848        1492 :         IF( EQ_16( ivas_format, MASA_FORMAT ) )
    3849             :         {
    3850          74 :             hStereoDft->frame_nodata = 0;
    3851          74 :             hStereoDft->frame_sid_nodata = 1;
    3852          74 :             hStereoDft->frame_sid = 1;
    3853          74 :             *nb_bits = 0;
    3854             :         }
    3855             :         ELSE
    3856             :         {
    3857        1418 :             hStereoDft->frame_nodata = 0;
    3858        1418 :             hStereoDft->frame_sid_nodata = 1;
    3859        1418 :             hStereoDft->frame_sid = 1;
    3860        1418 :             *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
    3861             :         }
    3862        1492 :         move16();
    3863        1492 :         move16();
    3864        1492 :         move16();
    3865        1492 :         move16();
    3866             :     }
    3867       51241 :     ELSE IF( EQ_32( ivas_total_brate, FRAME_NO_DATA ) )
    3868             :     {
    3869        8859 :         hStereoDft->frame_nodata = 1;
    3870        8859 :         hStereoDft->frame_sid_nodata = 1;
    3871        8859 :         hStereoDft->frame_sid = 0;
    3872        8859 :         *nb_bits = 0;
    3873        8859 :         *total_brate = 0;
    3874        8859 :         hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; /* Q15 */
    3875        8859 :         hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx;    /* Q27 */
    3876             : 
    3877        8859 :         move16();
    3878        8859 :         move16();
    3879        8859 :         move16();
    3880        8859 :         move16();
    3881        8859 :         move32();
    3882        8859 :         move32();
    3883        8859 :         move32();
    3884        8859 :         return;
    3885             :     }
    3886             :     ELSE
    3887             :     {
    3888       42382 :         hStereoDft->frame_nodata = 0;
    3889       42382 :         hStereoDft->frame_sid_nodata = 0;
    3890       42382 :         hStereoDft->frame_sid = 0;
    3891       42382 :         move16();
    3892       42382 :         move16();
    3893       42382 :         move16();
    3894             : 
    3895       42382 :         st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); /* Q0 */
    3896             :     }
    3897             : 
    3898       43874 :     hStereoDft->reverb_flag = 0;
    3899             : 
    3900       43874 :     move16();
    3901             :     /* reverse the bitstream */
    3902     8057535 :     FOR( b = 0; b < *nb_bits; b++ )
    3903             :     {
    3904     8013661 :         bit_stream_side[b] = st->bit_stream[-b]; /* Q0 */
    3905     8013661 :         move16();
    3906             :     }
    3907             : 
    3908             :     /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */
    3909     1447842 :     FOR( ; b < *nb_bits + 32; b++ )
    3910             :     {
    3911     1403968 :         bit_stream_side[b] = 0;
    3912     1403968 :         move16();
    3913             :     }
    3914       43874 :     st->bit_stream = bit_stream_side; /* Q0 */
    3915             : 
    3916             :     /*init*/
    3917       43874 :     max_bits = *nb_bits; /* Q0 */
    3918       43874 :     *nb_bits = 0;
    3919       43874 :     N_div = STEREO_DFT_NBDIV; /* Q0 */
    3920             : 
    3921       43874 :     move16();
    3922       43874 :     move16();
    3923       43874 :     move16();
    3924       43874 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    3925             :     {
    3926       42382 :         Copy32( hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, sg_tmp_fx, STEREO_DFT_BAND_MAX );                /*Q_31*/
    3927       42382 :         Copy32( hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/
    3928             :     }
    3929             : 
    3930             :     /* attackPresent always set to 0 in SID frames */
    3931       43874 :     IF( hStereoDft->frame_sid )
    3932             :     {
    3933        1492 :         hStereoDft->attackPresent = 0;
    3934        1492 :         move16();
    3935             :     }
    3936             :     ELSE
    3937             :     {
    3938       42382 :         hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); /* Q0 */
    3939       42382 :         ( *nb_bits ) = add( ( *nb_bits ), 1 );
    3940       42382 :         move16();
    3941       42382 :         move16();
    3942             :     }
    3943             : 
    3944             :     /* read res_cod_mode from bitstream */
    3945       43874 :     test();
    3946       43874 :     IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode )
    3947             :     {
    3948        3265 :         hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); /* Q0 */
    3949        3265 :         move16();
    3950        3265 :         ( *nb_bits ) = add( ( *nb_bits ), 1 );
    3951        3265 :         move16();
    3952             :     }
    3953             : 
    3954             :     /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */
    3955       43874 :     IF( hStereoDft->frame_sid )
    3956             :     {
    3957        1492 :         NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
    3958             :     }
    3959             :     ELSE
    3960             :     {
    3961       42382 :         NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
    3962             :     }
    3963             : 
    3964             :     /* Use coarse band partition in inactive frames */
    3965       43874 :     IF( hStereoDft->frame_sid )
    3966             :     {
    3967        1492 :         hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW;    /* Q0 */
    3968        1492 :         hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; /* Q0 */
    3969        1492 :         move16();
    3970        1492 :         move16();
    3971        1492 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], s_min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); /* Q0 */
    3972             : 
    3973        1492 :         IF( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND )
    3974             :         {
    3975         225 :             hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; /* Q0 */
    3976         225 :             hStereoDft->nbands = STEREO_DFT_COH_MAXBAND;                                                   /* Q0 */
    3977         225 :             move16();
    3978         225 :             move16();
    3979             :         }
    3980             :     }
    3981             :     ELSE
    3982             :     {
    3983       42382 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); /* Q0 */
    3984       42382 :         move16();
    3985             :     }
    3986             : 
    3987       43874 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; /* Q0 */
    3988       43874 :     move16();
    3989       43874 :     hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); /* Q0 */
    3990       43874 :     move16();
    3991       43874 :     hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); /* Q0 */
    3992       43874 :     move16();
    3993       43874 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); /* Q0 */
    3994       43874 :     move16();
    3995             : 
    3996             : 
    3997             :     /*Copy config. for all DFT frames*/
    3998       43874 :     set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) );
    3999       43874 :     set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) );
    4000       43874 :     set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) );
    4001       43874 :     set16_fx( hStereoDft->res_cod_mode + add( k_offset, 1 ), hStereoDft->res_cod_mode[k_offset], sub( N_div, 1 ) );
    4002             : 
    4003             :     /*------------------------------------------------------------------*
    4004             :      * Read DFT stereo parameters
    4005             :      *-----------------------------------------------------------------*/
    4006             : 
    4007             :     /* Sent from the latest to the oldest */
    4008       87748 :     FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    4009             :     {
    4010             :         /* reset parameters */
    4011       43874 :         set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    4012       43874 :         hStereoDft->gipd_fx[k + k_offset] = 0;
    4013       43874 :         move32();
    4014       43874 :         set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    4015             : 
    4016       43874 :         test();
    4017       43874 :         IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4018             :         {
    4019             :             /*------------------------------------------------------------------*
    4020             :              * read Side gains
    4021             :              *-----------------------------------------------------------------*/
    4022             : 
    4023             :             /* side gain */
    4024             :             /* get coding type */
    4025             :             /* Do not read and decode side gain if a NO_DATA frame */
    4026       43800 :             IF( !hStereoDft->frame_nodata )
    4027             :             {
    4028       43800 :                 n_bits = 0;
    4029       43800 :                 nb = st->next_bit_pos;
    4030       43800 :                 move16();
    4031       43800 :                 move16();
    4032       43800 :                 n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); /* Q0 */
    4033       43800 :                 nb = add( nb, n_bits );
    4034             : 
    4035       43800 :                 IF( hStereoDft->side_gain_flag_1 == 0 )
    4036             :                 {
    4037       34133 :                     b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); /* Q0 */
    4038       34133 :                     n_bits = add( n_bits, b );                                                                                           /* Q0 */
    4039             :                 }
    4040             :                 ELSE
    4041             :                 {
    4042        9667 :                     IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */
    4043             :                     {
    4044        8651 :                         b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); /* Q0 */
    4045        8651 :                         n_bits = add( n_bits, b );                                                                     /* Q0 */
    4046       87841 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    4047             :                         {
    4048       79190 :                             ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); /* Q0 */
    4049             :                         }
    4050             :                     }
    4051             :                     ELSE
    4052             :                     {
    4053        6883 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    4054             :                         {
    4055        5867 :                             ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
    4056        5867 :                             nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS );                             /* Q0 */
    4057        5867 :                             n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS );                     /* Q0 */
    4058             :                         }
    4059             :                     }
    4060             :                 }
    4061             : 
    4062      456699 :                 FOR( b = 0; b < hStereoDft->nbands; b++ )
    4063             :                 {
    4064      412899 :                     hStereoDft->side_gain_index_previous[b] = ind1[b]; /* Q0 */
    4065      412899 :                     move16();
    4066      412899 :                     hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); /* Q26 */
    4067      412899 :                     move32();
    4068             :                 }
    4069             : 
    4070       43800 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4071       43800 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );
    4072       43800 :                 move16();
    4073       43800 :                 move16();
    4074             :             }
    4075             : 
    4076             :             /*------------------------------------------------------------------*
    4077             :              * read ITDs
    4078             :              *-----------------------------------------------------------------*/
    4079             : 
    4080       43800 :             IF( !hStereoDft->frame_sid_nodata )
    4081             :             {
    4082       42382 :                 itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
    4083       42382 :                 ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS );  /*ITD mode flag: 1bit   Q0*/
    4084       42382 :                 move16();
    4085       42382 :                 hStereoDft->itd_fx[k + k_offset] = 0;
    4086       42382 :                 move32();
    4087       42382 :                 IF( itd_mode )
    4088             :                 {
    4089       25539 :                     ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); /* Q0 */
    4090       25539 :                     move16();
    4091       25539 :                     stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
    4092             :                 }
    4093             :             }
    4094        1418 :             ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) )
    4095             :             {
    4096        1418 :                 itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
    4097        1418 :                 ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS );  /*ITD mode flag: 1bit*/
    4098        1418 :                 move16();
    4099             : 
    4100        1418 :                 hStereoDft->itd_fx[k + k_offset] = 0; /* Q0 */
    4101        1418 :                 move32();
    4102        1418 :                 IF( itd_mode )
    4103             :                 {
    4104          23 :                     sign_flag = get_next_indice_fx( st, 1 );                          /* Q0 */
    4105          23 :                     I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS );           /* Q0 */
    4106          23 :                     ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); /* Q0 */
    4107          23 :                     move16();
    4108          23 :                     I = shl( I, STEREO_DFT_SID_ITD_FAC ); /* Q0 */
    4109          23 :                     I = add( I, shl( sign_flag, 8 ) );    /* Q0 */
    4110          23 :                     stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
    4111             :                 }
    4112             :             }
    4113             : 
    4114             :             /*------------------------------------------------------------------*
    4115             :              * read IPDs
    4116             :              *-----------------------------------------------------------------*/
    4117             : 
    4118       43800 :             n_bits = 0;
    4119       43800 :             move16();
    4120       43800 :             nb = st->next_bit_pos; /* Q0 */
    4121       43800 :             move16();
    4122             : 
    4123       43800 :             IF( !hStereoDft->frame_sid_nodata )
    4124             :             {
    4125             :                 /* Active frame */
    4126       42382 :                 hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
    4127       42382 :                 move16();
    4128       42382 :                 nb = add( nb, 1 );         /* Q0 */
    4129       42382 :                 n_bits = add( n_bits, 1 ); /* Q0 */
    4130       42382 :                 IF( hStereoDft->no_ipd_flag == 0 )
    4131             :                 {
    4132        3953 :                     ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); /* Q0 */
    4133        3953 :                     move16();
    4134        3953 :                     nb = add( nb, STEREO_DFT_GIPD_NBITS );         /* Q0 */
    4135        3953 :                     n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); /* Q0 */
    4136        3953 :                     stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_GIPD_NBITS );
    4137             :                 }
    4138             :             }
    4139        1418 :             ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) )
    4140             :             {
    4141             :                 /* SID frame, only read IPD only if enough bits left in bitstream */
    4142        1418 :                 hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
    4143        1418 :                 move16();
    4144        1418 :                 nb = add( nb, 1 );         /* Q0 */
    4145        1418 :                 n_bits = add( n_bits, 1 ); /* Q0 */
    4146        1418 :                 IF( hStereoDft->no_ipd_flag == 0 )
    4147             :                 {
    4148         271 :                     ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
    4149         271 :                     move16();
    4150         271 :                     nb = add( nb, STEREO_DFT_SID_GIPD_NBITS );         /* Q0 */
    4151         271 :                     n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
    4152         271 :                     stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_SID_GIPD_NBITS );
    4153             :                 }
    4154             :             }
    4155             :             ELSE
    4156             :             {
    4157           0 :                 hStereoDft->no_ipd_flag = 1; /* Q0 */
    4158           0 :                 move16();
    4159             :             }
    4160             : 
    4161       43800 :             st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4162       43800 :             ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    4163       43800 :             move16();
    4164       43800 :             move16();
    4165             : 
    4166             :             /*------------------------------------------------------------------*
    4167             :              * read Residual parameters
    4168             :              *-----------------------------------------------------------------*/
    4169             : 
    4170             :             /* Residual prediction */ /* Switch it off if ITD detected */
    4171       43800 :             n_bits = 0;
    4172       43800 :             nb = st->next_bit_pos; /* Q0 */
    4173       43800 :             move16();
    4174       43800 :             move16();
    4175             : 
    4176             :             /* Not used in inactive frames */
    4177       43800 :             IF( !hStereoDft->frame_sid_nodata )
    4178             :             {
    4179       42382 :                 test();
    4180       42382 :                 IF( hStereoDft->res_pred_mode[k + k_offset] && hStereoDft->attackPresent == 0 )
    4181             :                 {
    4182       40860 :                     nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
    4183             : 
    4184       40860 :                     hStereoDft->reverb_flag = 0;
    4185       40860 :                     hStereoDft->nbands_respred = nbands; /* Q0 */
    4186       40860 :                     move16();
    4187       40860 :                     move16();
    4188             : 
    4189             :                     /* Read bit for adaptive SF (WB/SWB & FB) */
    4190       40860 :                     IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
    4191             :                     {
    4192       24611 :                         hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    4193       24611 :                         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS );                 /* Q0 */
    4194       24611 :                         move16();
    4195       24611 :                         move16();
    4196       24611 :                         nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    4197       24611 :                         IF( hStereoDft->reverb_flag )
    4198             :                         {
    4199        6479 :                             nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); /* Q0 */
    4200             :                         }
    4201             :                     }
    4202             : 
    4203             :                     /* get coding type */
    4204       40860 :                     b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); /* Q0 */
    4205       40860 :                     nb = add( nb, b );                                                         /* Q0 */
    4206       40860 :                     n_bits = add( n_bits, b );                                                 /* Q0 */
    4207             : 
    4208       40860 :                     IF( hStereoDft->res_pred_flag_0 == 0 )
    4209             :                     {
    4210        8245 :                         b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); /* Q0 */
    4211        8245 :                         n_bits = add( n_bits, b );                                                                                                      /* Q0 */
    4212             :                     }
    4213             :                     ELSE
    4214             :                     {
    4215       32615 :                         IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) )
    4216             :                         {
    4217       29391 :                             b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); /* Q0 */
    4218             : 
    4219       29391 :                             n_bits = add( n_bits, b ); /* Q0 */
    4220      235575 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4221             :                             {
    4222      206184 :                                 ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); /* Q0 */
    4223      206184 :                                 move16();
    4224             :                             }
    4225             :                         }
    4226             :                         ELSE
    4227             :                         {
    4228       22581 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4229             :                             {
    4230       19357 :                                 ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4231       19357 :                                 move16();
    4232       19357 :                                 nb = add( nb, STEREO_DFT_RES_GAINS_BITS );         /* Q0 */
    4233       19357 :                                 n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4234             :                             }
    4235             :                         }
    4236             :                     }
    4237             : 
    4238      122105 :                     FOR( b = 0; b < hStereoDft->res_pred_band_min; b++ )
    4239             :                     {
    4240       81245 :                         I = 0;
    4241       81245 :                         move16();
    4242       81245 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4243       81245 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4244       81245 :                         move16();
    4245       81245 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4246       81245 :                         move32();
    4247             :                     }
    4248             : 
    4249      323079 :                     FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4250             :                     {
    4251      282219 :                         I = ind1_pred[b]; /* Q0 */
    4252      282219 :                         move16();
    4253      282219 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4254      282219 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4255      282219 :                         move16();
    4256      282219 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4257      282219 :                         move32();
    4258             :                     }
    4259             : 
    4260       67938 :                     FOR( ; b < hStereoDft->nbands; b++ )
    4261             :                     {
    4262       27078 :                         I = 0;
    4263       27078 :                         move16();
    4264       27078 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4265       27078 :                         move16();
    4266       27078 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4267       27078 :                         move16();
    4268       27078 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4269       27078 :                         move32();
    4270             :                     }
    4271             :                 }
    4272             :                 ELSE
    4273             :                 {
    4274       15687 :                     FOR( b = 0; b < hStereoDft->nbands; b++ )
    4275             :                     {
    4276       14165 :                         I = 0;
    4277       14165 :                         move16();
    4278       14165 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4279       14165 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4280       14165 :                         move16();
    4281       14165 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4282       14165 :                         move32();
    4283             :                     }
    4284             :                 }
    4285             : 
    4286       42382 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4287       42382 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    4288       42382 :                 move16();
    4289       42382 :                 move16();
    4290             :             }
    4291             :             ELSE
    4292             :             {
    4293             :                 /* Dequantize sidegain if SID frame */
    4294        1418 :                 IF( hStereoDft->frame_sid )
    4295             :                 {
    4296        9610 :                     FOR( b = 0; b < hStereoDft->nbands; b++ )
    4297             :                     {
    4298        8192 :                         I = 0;
    4299        8192 :                         move16();
    4300        8192 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4301             :                     }
    4302             :                 }
    4303             :             }
    4304             :         }
    4305             :     }
    4306             : 
    4307       43874 :     test();
    4308       43874 :     IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4309             :     {
    4310       43800 :         IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) )
    4311             :         {
    4312       35149 :             hStereoDft->sg_mem_corrupt = 0;
    4313       35149 :             move16();
    4314             :         }
    4315             :     }
    4316             : 
    4317       43874 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    4318             :     {
    4319             :         // hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft );
    4320       42382 :         hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); /* Q0 */
    4321             : 
    4322       42382 :         IF( hStereoDft->recovery_flg )
    4323             :         {
    4324           8 :             Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );                /* Q31 */
    4325           8 :             Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */
    4326             :         }
    4327             :     }
    4328             : 
    4329             :     /*----------------------------------------------------------------*
    4330             :      * Residual decoding: spectral lines
    4331             :      *----------------------------------------------------------------*/
    4332             : 
    4333             :     /* Residual coding not used in inactive frames */
    4334       43874 :     test();
    4335       43874 :     IF( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata )
    4336             :     {
    4337             :         Word16 dec[STEREO_DFT_N_MAX_RES];
    4338             : 
    4339       16830 :         I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS );       /* Q0 */
    4340       16830 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */
    4341       16830 :         move16();
    4342       16830 :         move16();
    4343             : 
    4344       16830 :         push_wmops( "residual_decode" );
    4345       16830 :         IF( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
    4346             :         {
    4347       16373 :             ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state );
    4348             : 
    4349       16373 :             rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits );
    4350             : 
    4351       16373 :             hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); /* Q15 */
    4352       16373 :             move32();
    4353             : #ifdef DEBUGGING
    4354             :             dbgwrite_txt( (const float *) ( &hStereoDft->res_global_gain_fx ), 1, "fixed_res_global_gain.txt", NULL );
    4355             : #endif
    4356             : 
    4357       16373 :             ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */
    4358       16373 :             move16();
    4359             : 
    4360       16373 :             ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec );
    4361             : 
    4362       16373 :             n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */
    4363             : 
    4364             : 
    4365       16373 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4366      671293 :             FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ )
    4367             :             {
    4368      654920 :                 dec[c] = shl_sat( dec[c], 8 ); /* Q0 */
    4369      654920 :                 move16();
    4370             :             }
    4371             : 
    4372       16373 :             ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx );
    4373             : 
    4374             : #ifdef DEBUGGING
    4375             :             dbgwrite_txt( (const float *) res_buf_fx, hStereoDft->res_cod_line_max, "fixed_res_buf.txt", NULL );
    4376             : #endif
    4377             :         }
    4378             :         ELSE
    4379             :         {
    4380         457 :             set16_fx( dec, 0, hStereoDft->res_cod_line_max );
    4381         457 :             hStereoDft->res_global_gain_fx = 0;
    4382         457 :             n_bits = 0;
    4383         457 :             move32();
    4384         457 :             move16();
    4385         457 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4386             :         }
    4387             : 
    4388       16830 :         ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
    4389       16830 :         pop_wmops();
    4390             :     }
    4391             : 
    4392       43874 :     test();
    4393       43874 :     test();
    4394       43874 :     IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4395             :     {
    4396        1418 :         stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits );
    4397             :     }
    4398             : 
    4399       43874 :     test();
    4400       43874 :     IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) )
    4401             :     {
    4402        1418 :         *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40;  Q0*/
    4403        1418 :         move16();
    4404             :     }
    4405             :     {
    4406       43874 :         *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); /* Q0 */
    4407       43874 :         move32();
    4408             :     }
    4409       43874 :     return;
    4410             : }

Generated by: LCOV version 1.14