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 -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 2156 2272 94.9 %
Date: 2025-08-23 01:22:27 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         948 : 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         948 :     set_zero_fx( hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );
     100             : 
     101             :     /*Configuration*/
     102         948 :     set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB );
     103             : 
     104             :     /* SIDE_GAIN */
     105         948 :     set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX );
     106         948 :     set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX );
     107             : 
     108             :     /*residual prediction*/
     109         948 :     set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB );
     110        4740 :     FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ )
     111             :     {
     112        3792 :         set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k );
     113        3792 :         set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX );
     114        3792 :         hStereoDft->q_DFT_past_DMX_fx[i] = 0;
     115        3792 :         move16();
     116             :     }
     117             : 
     118         948 :     hStereoDft->past_DMX_pos = 0;
     119         948 :     move16();
     120             : 
     121         948 :     set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX );
     122             : 
     123       25596 :     FOR( i = 0; i < STEREO_DFT_BAND_MAX * 2; i++ )
     124             :     {
     125       24648 :         hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */
     126       24648 :         move32();
     127             :     }
     128             : 
     129         948 :     set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX * 2 );
     130             : 
     131             :     /*residual coding*/
     132         948 :     set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
     133         948 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
     134         948 :     set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
     135         948 :     hStereoDft->q_res_cod_mem_fx = Q15;
     136         948 :     move16();
     137             : 
     138         948 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
     139         948 :     move32();
     140             : 
     141         948 :     hStereoDft->stab_fac_smooth_res_fx = 0;
     142         948 :     move16();
     143         948 :     bass_psfilter_init_fx( hStereoDft->hBpf );
     144             : 
     145         948 :     tcxltp_dec_init_fx( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 );
     146             : 
     147         948 :     hStereoDft->reverb_flag = 0;
     148         948 :     move16();
     149             : 
     150         948 :     hStereoDft->res_hb_nrg_mem_fx = 0;
     151         948 :     move32();
     152         948 :     hStereoDft->bpf_error_signal_last_fx = 0;
     153         948 :     move32();
     154         948 :     hStereoDft->bpf_error_ratio_mem_fx = ONE_IN_Q13;
     155         948 :     move16();
     156             : 
     157             :     /*reset parameters*/
     158         948 :     set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     159         948 :     set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     160         948 :     set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     161         948 :     set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     162             : 
     163         948 :     hStereoDft->wasTransient = 0;
     164         948 :     move16();
     165         948 :     hStereoDft->attackPresent = 0;
     166         948 :     move16();
     167             : 
     168         948 :     hStereoDft->lt_pred_gain_fx = 0;
     169         948 :     move32();
     170         948 :     hStereoDft->lt_pred_gain_variation_fx = 0;
     171         948 :     move32();
     172         948 :     hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX;
     173         948 :     move32();
     174         948 :     hStereoDft->stefi_short_gain_fx = MAX_16;
     175         948 :     move16();
     176         948 :     hStereoDft->stefi_long_gain_fx = 0;
     177         948 :     move16();
     178         948 :     hStereoDft->q_lt_pred_gain = 0;
     179         948 :     move16();
     180             : 
     181         948 :     set16_fx( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX );
     182             : 
     183         948 :     init_basic_allpass_fx( &hStereoDft->ap1, dft_ap_gains_fx[0], dft_ap_delays[0] );
     184         948 :     init_basic_allpass_fx( &hStereoDft->ap2, dft_ap_gains_fx[1], dft_ap_delays[1] );
     185         948 :     init_basic_allpass_fx( &hStereoDft->ap3, dft_ap_gains_fx[2], dft_ap_delays[2] );
     186             : 
     187         948 :     set32_fx( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) );
     188         948 :     set32_fx( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k );
     189         948 :     hStereoDft->q_ap_delay_mem_fx = Q11;
     190         948 :     move16();
     191         948 :     hStereoDft->ap_wasTransient = 0;
     192         948 :     move16();
     193         948 :     set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     194         948 :     set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     195         948 :     hStereoDft->q_smoothed_nrg = 0;
     196         948 :     move16();
     197             : 
     198         948 :     set16_fx( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX );
     199             : 
     200         948 :     set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) );
     201         948 :     set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     202         948 :     set32_fx( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     203         948 :     set16_fx( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX );
     204         948 :     hStereoDft->q_dft = 0;
     205         948 :     move16();
     206             : 
     207             :     /* PLC parameters */
     208         948 :     set32_fx( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX );
     209         948 :     hStereoDft->time_offs = 0;
     210         948 :     move16();
     211         948 :     hStereoDft->past_dmx_nrg_fx = 0;
     212         948 :     move32();
     213         948 :     hStereoDft->sg_mean_fx = 0;
     214         948 :     move32();
     215         948 :     hStereoDft->sg_mem_corrupt = 0;
     216         948 :     move16();
     217         948 :     hStereoDft->recovery_flg = 0;
     218         948 :     move16();
     219             : 
     220       12324 :     FOR( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ )
     221             :     {
     222       11376 :         set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
     223             :     }
     224         948 :     hStereoDft->q_smooth_buf_fx = Q7;
     225         948 :     move16();
     226         948 :     set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     227         948 :     set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     228             : 
     229         948 :     hStereoDft->itd_xfade_target_fx = 0;
     230         948 :     move32();
     231         948 :     hStereoDft->itd_xfade_step_fx = 0;
     232         948 :     move32();
     233         948 :     hStereoDft->itd_xfade_counter = 0;
     234         948 :     move16();
     235         948 :     hStereoDft->itd_xfade_prev_fx = 0;
     236         948 :     move32();
     237         948 :     hStereoDft->last_active_element_brate = 0;
     238         948 :     move32();
     239         948 :     hStereoDft->ipd_xfade_target_fx = 0;
     240         948 :     move32();
     241         948 :     hStereoDft->ipd_xfade_step_fx = 0;
     242         948 :     move32();
     243         948 :     hStereoDft->ipd_xfade_counter = 0;
     244         948 :     move16();
     245         948 :     hStereoDft->ipd_xfade_prev_fx = 0;
     246         948 :     move32();
     247         948 :     hStereoDft->frame_sid_nodata = 0;
     248         948 :     move16();
     249       23700 :     FOR( b = 0; b < 2 * IVAS_MAX_NUM_BANDS; b++ )
     250             :     {
     251       68256 :         FOR( i = 0; i < 2; i++ )
     252             :         {
     253      227520 :             FOR( j = 0; j < 4; j++ )
     254             :             {
     255      182016 :                 hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0;
     256      182016 :                 move32();
     257             :             }
     258             :         }
     259             :     }
     260         948 :     hStereoDft->first_frame = 1;
     261         948 :     move16();
     262         948 :     hStereoDft->g_L_prev_fx = 0;
     263         948 :     move32();
     264         948 :     hStereoDft->g_R_prev_fx = 0;
     265         948 :     move32();
     266             : 
     267         948 :     return;
     268             : }
     269             : 
     270             : /*-------------------------------------------------------------------------
     271             :  * stereo_dft_dec_open_fx()
     272             :  *
     273             :  * Open DFT decoder stereo handle
     274             :  *-------------------------------------------------------------------------*/
     275             : 
     276         948 : 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         948 :     hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     285         948 :     move16();
     286             : 
     287             :     /*Init. DFT sizes*/
     288         948 :     hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     289         948 :     move16();
     290             : 
     291         948 :     hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx;    /* Q15 */
     292         948 :     hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; /* Q15 */
     293         948 :     hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx;   /* Q15 */
     294             : 
     295         948 :     hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     296         948 :     hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx;                                                                                /* Q15 */
     297         948 :     hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx;                                                                            /* Q15 */
     298         948 :     hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx;                                                                              /* Q15 */
     299             : 
     300         948 :     hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     301         948 :     hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1;                                                                               /* Q15 */
     302         948 :     hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1;                                                                           /* Q15 */
     303         948 :     hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1;                                                                             /* Q15 */
     304             : 
     305         948 :     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         859 :     ELSE IF( EQ_32( output_Fs, 32000 ) )
     314             :     {
     315         211 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;                  /* Q15 */
     316         211 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; /* Q0 */
     317         211 :         move16();
     318         211 :         hStereoDft->win232ms_fx = dft_win232ms_32k_fx;    /* Q15 */
     319         211 :         hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; /* Q15 */
     320             :     }
     321             :     ELSE
     322             :     {
     323         648 :         assert( output_Fs == 48000 );
     324         648 :         hStereoDft->dft_trigo_fx = dft_trigo_48k_fx;                  /* Q15 */
     325         648 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; /* Q0 */
     326         648 :         move16();
     327         648 :         hStereoDft->win232ms_fx = dft_win232ms_48k_fx;    /* Q15 */
     328         648 :         hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; /* Q15 */
     329             :     }
     330             : 
     331         948 :     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         948 :     set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB );
     335             : 
     336         948 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); /* Q0 */
     337         948 :     move16();
     338         948 :     hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); /* Q0 */
     339         948 :     move16();
     340             : 
     341         948 :     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         904 :         hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; /* Q15 */
     349         904 :         hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; /* Q15 */
     350             :     }
     351         948 :     hStereoDft->q_hb_stefi_sig_fx = Q31;
     352         948 :     move16();
     353         948 :     hStereoDft->q_ap_fade_mem_fx = Q31;
     354         948 :     move16();
     355             : 
     356             :     /* reset DFT stereo memories */
     357         948 :     stereo_dft_dec_reset_fx( hStereoDft );
     358             : 
     359         948 :     return;
     360             : }
     361             : 
     362             : 
     363             : /*-------------------------------------------------------------------------
     364             :  * stereo_dft_dec_create_fx()
     365             :  *
     366             :  * Create DFT stereo handle
     367             :  *------------------------------------------------------------------------*/
     368             : 
     369         948 : 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         948 :     IF( *hStereoDft != NULL )
     381             :     {
     382           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
     383             :     }
     384             : 
     385         948 :     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         948 :     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         948 :     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         948 :     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         948 :     set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/
     405         948 :     hStereoDft_loc->q_hb_nrg_subr = Q31;
     406         948 :     move16();
     407             : 
     408         948 :     hStereoDft_loc->hConfig->force_mono_transmission = 0;
     409         948 :     move16();
     410             : 
     411         948 :     IF( sba_dirac_stereo_flag )
     412             :     {
     413          96 :         ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig );
     414             :     }
     415             :     ELSE
     416             :     {
     417         852 :         stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS );
     418             :     }
     419             : 
     420         948 :     stereo_dft_dec_open_fx( hStereoDft_loc, output_Fs, nchan_transport );
     421             : 
     422         948 :     *hStereoDft = hStereoDft_loc;
     423             : 
     424         948 :     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      418797 : 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      837594 :     FOR( i = 0; i < N; i++ )
     446             :     {
     447             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     448      418797 :         ind1[i] = check_bounds_s_fx( ind1[i], 0, 30 ); /* Q0 */
     449      418797 :         move16();
     450      418797 :         ind2[i] = check_bounds_s_fx( ind2[i], 0, 7 ); /* Q0 */
     451      418797 :         move16();
     452      418797 :         IF( LE_16( ind1[i], 15 ) )
     453             :         {
     454      323006 :             tmp = sub( 15, ind1[i] );
     455             :         }
     456             :         ELSE
     457             :         {
     458       95791 :             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      418797 :         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      418797 :         IF( LE_16( ind1[i], 15 ) )
     464             :         {
     465      323006 :             gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); /* Q31 */
     466      323006 :             move16();
     467             :         }
     468             :         ELSE
     469             :         {
     470       95791 :             gout[i] = dft_res_gains_q_fx[index][0]; /* Q31 */
     471       95791 :             move16();
     472             :         }
     473      418797 :         rout[i] = dft_res_gains_q_fx[index][1]; /* Q31 */
     474      418797 :         move16();
     475             :     }
     476             : 
     477      418797 :     return;
     478             : }
     479             : 
     480             : /*---------------------------------------------------------------------------
     481             :  * stereo_dft_dequantize_res_gains_f_fx()
     482             :  *
     483             :  * returns interepolated values for non-integer indices
     484             :  *---------------------------------------------------------------------------*/
     485             : 
     486      263789 : 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      527578 :     FOR( i = 0; i < N; i++ )
     499             :     {
     500             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     501      263789 :         ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); /* Q26 */
     502      263789 :         move32();
     503      263789 :         ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); /* Q26 */
     504      263789 :         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      263789 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     509             :         {
     510      154603 :             sign = -1;
     511      154603 :             move16();
     512             :         }
     513             :         ELSE
     514             :         {
     515      109186 :             sign = 1;
     516      109186 :             move16();
     517             :         }
     518      263789 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     519             :         {
     520      154603 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     521             :         }
     522             :         ELSE
     523             :         {
     524      109186 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     525             :         }
     526      263789 :         i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); /* Q0 */
     527      263789 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     528             :         {
     529      154603 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     530             :         }
     531             :         ELSE
     532             :         {
     533      109186 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     534             :         }
     535      263789 :         fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); /* Q26 */
     536      263789 :         move16();
     537      263789 :         j1 = extract_l( L_shr( ind2[i], Q26 ) ); /* Q0 */
     538      263789 :         fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* Q26 */
     539             : 
     540             :         /* choose base indices for interpolation */
     541      263789 :         IF( LT_32( fj, ONE_IN_Q25 ) )
     542             :         {
     543      110868 :             ji = extract_l( L_min( j1, 7 ) ); /* Q0 */
     544             :         }
     545             :         ELSE
     546             :         {
     547      152921 :             ji = extract_l( L_min( add( j1, 1 ), 7 ) ); /* Q0 */
     548             :         }
     549             : 
     550      263789 :         IF( LT_32( fi, ONE_IN_Q25 ) )
     551             :         {
     552      217236 :             ij = extract_l( L_min( i1, 15 ) ); /* Q0 */
     553             :         }
     554             :         ELSE
     555             :         {
     556       46553 :             ij = extract_l( L_min( add( i1, 1 ), 15 ) ); /* Q0 */
     557             :         }
     558             : 
     559             :         /* interpolate values from table */
     560      263789 :         IF( LT_16( i1, 15 ) )
     561             :         {
     562      263092 :             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      263092 :             move32();
     564      263092 :             IF( EQ_16( sign, -1 ) )
     565             :             {
     566      153938 :                 gout[i] = L_negate( gout[i] );
     567      153938 :                 move32();
     568             :             }
     569             :         }
     570             :         ELSE
     571             :         {
     572         697 :             gout[i] = dft_res_gains_q_fx[120 + ji][0]; /* Q31 */
     573         697 :             move32();
     574         697 :             IF( EQ_16( sign, -1 ) )
     575             :             {
     576         665 :                 gout[i] = L_negate( gout[i] );
     577         665 :                 move32();
     578             :             }
     579             :         }
     580             : 
     581      263789 :         IF( LT_16( j1, 7 ) )
     582             :         {
     583      263789 :             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      263789 :             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      263789 :     return;
     593             : }
     594             : 
     595             : /*-------------------------------------------------------------------------
     596             :  * stereo_dft_dec_update_fx()
     597             :  *
     598             :  * Update DFT memories for new frame
     599             :  *-------------------------------------------------------------------------*/
     600             : 
     601       69594 : 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       69594 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset*/
     611       69594 :     move16();
     612             :     /* Update parameters */
     613      974316 :     FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
     614             :     {
     615      904722 :         hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     616      904722 :         move32();
     617      904722 :         hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     618      904722 :         move32();
     619             :     }
     620             : 
     621      139188 :     FOR( i = 0; i < k_offset; i++ )
     622             :     {
     623       69594 :         hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; /* Q27 */
     624       69594 :         move32();
     625             :     }
     626             : 
     627             :     /* Update configuration memories */
     628      139188 :     FOR( i = 0; i < k_offset; i++ )
     629             :     {
     630       69594 :         hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     631       69594 :         move16();
     632       69594 :         hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     633       69594 :         move16();
     634       69594 :         hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; /* Q15 */
     635       69594 :         move32();
     636       69594 :         hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     637       69594 :         move16();
     638       69594 :         hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     639       69594 :         move16();
     640             :     }
     641             : 
     642             :     /* Load new configurations */
     643       69594 :     set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV );
     644       69594 :     set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV );
     645       69594 :     set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV );
     646       69594 :     set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV );
     647             : 
     648             :     /*Update attack info*/
     649       69594 :     IF( hStereoDft->attackPresent )
     650             :     {
     651        1606 :         hStereoDft->wasTransient = 1;
     652        1606 :         move16();
     653             :     }
     654       67988 :     ELSE IF( hStereoDft->wasTransient )
     655             :     {
     656        1383 :         hStereoDft->wasTransient = 0;
     657        1383 :         move16();
     658             :     }
     659             : 
     660      208782 :     FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- )
     661             :     {
     662      139188 :         hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; /* Q0 */
     663      139188 :         move16();
     664             :     }
     665             : 
     666       69594 :     Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); /* Qx */
     667       69594 :     Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                      /* Qx */
     668       69594 :     Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                    /* q_td_gain */
     669       69594 :     Copy( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
     670             : 
     671       69594 :     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       69594 :     return;
     685             : }
     686             : 
     687             : /*-------------------------------------------------------------------------
     688             :  * stereo_dft_dec_destroy_fx()
     689             :  *
     690             :  * destroy DFT stereo handle
     691             :  *-------------------------------------------------------------------------*/
     692             : 
     693         948 : 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         948 :     hStereoDft = *hStereoDft_glob;
     700             : 
     701         948 :     IF( hStereoDft->hConfig != NULL )
     702             :     {
     703         948 :         free( hStereoDft->hConfig );
     704         948 :         hStereoDft->hConfig = NULL;
     705             :     }
     706             : 
     707         948 :     IF( hStereoDft->hBpf != NULL )
     708             :     {
     709         948 :         free( hStereoDft->hBpf );
     710         948 :         hStereoDft->hBpf = NULL;
     711             :     }
     712             : 
     713         948 :     IF( hStereoDft->hTcxLtpDec != NULL )
     714             :     {
     715         948 :         free( hStereoDft->hTcxLtpDec );
     716         948 :         hStereoDft->hTcxLtpDec = NULL;
     717             :     }
     718             : 
     719         948 :     free( hStereoDft );
     720         948 :     hStereoDft = NULL;
     721             : 
     722         948 :     return;
     723             : }
     724             : 
     725             : 
     726             : /*-------------------------------------------------------------------------
     727             :  * stereo_dft_dec_analyze_fx()
     728             :  *
     729             :  * DFT analysis on a 20ms frame
     730             :  *-------------------------------------------------------------------------*/
     731             : 
     732      197313 : 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      197313 :     push_wmops( "DFT_analysis" );
     763             : 
     764      197313 :     hStereoDft = hCPE->hStereoDft;
     765             : 
     766      197313 :     assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
     767             : 
     768             :     /*-----------------------------------------------------------------*
     769             :      * Initialization
     770             :      *-----------------------------------------------------------------*/
     771             : 
     772      197313 :     IF( EQ_16( input_frame, output_frame ) )
     773             :     {
     774       72931 :         trigo_fx = hStereoDft->dft_trigo_fx;
     775       72931 :         trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
     776       72931 :         win_right_fx = hStereoDft->win32ms_fx;                                        /* Q15 */
     777       72931 :         win_left_fx = hStereoDft->win32ms_fx;                                         /* Q15 */
     778       72931 :         win2_fx = hStereoDft->win232ms_fx;                                            /* Q15 */
     779             : 
     780       72931 :         test();
     781       72931 :         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       67846 :         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       64410 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     793             :         }
     794             :     }
     795      124382 :     ELSE IF( EQ_16( input_frame, L_FRAME ) )
     796             :     {
     797       59841 :         trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */
     798       59841 :         trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     799       59841 :         move16();
     800       59841 :         win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
     801       59841 :         win_left_fx = hStereoDft->win32ms_12k8_fx;  /* Q15 */
     802       59841 :         win2_fx = hStereoDft->win232ms_12k8_fx;     /* Q15 */
     803             : 
     804       59841 :         test();
     805       59841 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     806             :         {
     807       21082 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     808       21082 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     809             :         }
     810       38759 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     811             :         {
     812       18736 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     813             :         }
     814             :         ELSE
     815             :         {
     816       20023 :             assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" );
     817       20023 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     818             :         }
     819             :     }
     820       64541 :     ELSE IF( EQ_16( input_frame, L_FRAME16k ) )
     821             :     {
     822       47524 :         trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */
     823       47524 :         trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     824       47524 :         move16();
     825       47524 :         win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
     826       47524 :         win_left_fx = hStereoDft->win32ms_16k_fx;  /* Q15 */
     827       47524 :         win2_fx = hStereoDft->win232ms_16k_fx;     /* Q15 */
     828             : 
     829       47524 :         test();
     830       47524 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     831             :         {
     832       22439 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     833       22439 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     834             :         }
     835       25085 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     836             :         {
     837       15105 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     838             :         }
     839             :         ELSE
     840             :         {
     841        9980 :             assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" );
     842        9980 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     843             :         }
     844             :     }
     845       17017 :     ELSE IF( EQ_16( input_frame, L_FRAME8k ) )
     846             :     {
     847       17017 :         assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" );
     848       17017 :         trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */
     849       17017 :         trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     850       17017 :         move16();
     851       17017 :         win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
     852       17017 :         win_left_fx = hStereoDft->win32ms_8k_fx;  /* Q15 */
     853       17017 :         win2_fx = hStereoDft->win232ms_8k_fx;     /* Q15 */
     854       17017 :         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      197313 :     inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */
     869      197313 :     delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     870      197313 :     move16();
     871      197313 :     zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS );
     872      197313 :     move16();
     873      197313 :     ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     874      197313 :     move16();
     875      197313 :     NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS );
     876             :     Word16 qfac_fx;
     877      197313 :     fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */
     878      197313 :     qfac_fx = sub( 31, qfac_fx );
     879      197313 :     ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS );
     880      197313 :     move16();
     881             : 
     882             :     /* Offset FOR the time buffers */
     883      197313 :     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      197313 :     mem_size = add( delay_dec, delay );
     885             : 
     886             :     /* Update buffers */
     887      197313 :     Copy32( mem_fx, input_buff_fx, mem_size );                 /* Q11 */
     888      197313 :     Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */
     889      197313 :     Copy32( input_buff_fx + input_frame, mem_fx, mem_size );   /* q */
     890      197313 :     pInput_buff_fx = input_buff_fx;                            /* q */
     891             : 
     892      197313 :     test();
     893      197313 :     IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
     894             :     {
     895       39736 :         pop_wmops();
     896       39736 :         return;
     897             :     }
     898             : 
     899             : 
     900             :     /*-----------------------------------------------------------------*
     901             :      * DFT Analysis: loop over frame
     902             :      *-----------------------------------------------------------------*/
     903             : 
     904      157577 :     assert( ( k_offset <= STEREO_DFT_NBDIV ) );
     905             : 
     906    16447761 :     FOR( i = 0; i < NFFT / 4; i++ )
     907             :     {
     908    16290184 :         trigo_dec_fx[i] = trigo_fx[i * trigo_step];
     909    16290184 :         move16();
     910    16290184 :         trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step];
     911    16290184 :         move16();
     912             :     }
     913      157577 :     trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step];
     914      157577 :     move16();
     915             : 
     916      401355 :     FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
     917             :     {
     918      243778 :         set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX );
     919      243778 :         IF( k == 0 )
     920             :         {
     921      122855 :             offset = 0;
     922      122855 :             move16();
     923             :         }
     924             :         ELSE
     925             :         {
     926             :             /* If OVL2 = OVL offset = 10ms */
     927      120923 :             offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
     928      120923 :             move16();
     929             :         }
     930             : 
     931      243778 :         pInput_fx = pInput_buff_fx + offset;                                /* q */
     932      243778 :         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      243778 :         Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */
     937             : 
     938             :         /* Overlapping portions */
     939      243778 :         IF( k == 0 )
     940             :         {
     941     7367080 :             FOR( i = 0; i < ovl; i++ )
     942             :             {
     943     7244225 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */
     944     7244225 :                 move32();
     945             :             }
     946    21855530 :             FOR( i = 0; i < ovl2; i++ )
     947             :             {
     948    21732675 :                 DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */
     949    21732675 :                 move32();
     950             :             }
     951             :         }
     952             :         ELSE
     953             :         {
     954    21402398 :             FOR( i = 0; i < ovl2; i++ )
     955             :             {
     956    21281475 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */
     957    21281475 :                 move32();
     958             :             }
     959     7214748 :             FOR( i = 0; i < ovl; i++ )
     960             :             {
     961     7093825 :                 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     7093825 :                 move32();
     963             :             }
     964             :         }
     965             :         Word16 q_DFT, q_shift, guarded_bits;
     966      243778 :         q_DFT = *q;
     967      243778 :         move16();
     968      243778 :         guarded_bits = find_guarded_bits_fx( NFFT );
     969      243778 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits );
     970             : 
     971    92007298 :         FOR( Word16 j = 0; j < NFFT; j++ )
     972             :         {
     973    91763520 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/
     974    91763520 :             move32();
     975             :         }
     976             : 
     977      243778 :         q_DFT = add( q_DFT, q_shift );
     978             : 
     979      243778 :         rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 );
     980             : 
     981      243778 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) );
     982    92007298 :         FOR( Word16 j = 0; j < NFFT; j++ )
     983             :         {
     984    91763520 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */
     985    91763520 :             move32();
     986             :         }
     987      243778 :         q_DFT = add( q_DFT, q_shift );
     988      243778 :         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    92007298 :             FOR( Word32 j = 0; j < NFFT; j++ )
    1001             :             {
    1002    91763520 :                 DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */
    1003    91763520 :                 move32();
    1004             :             }
    1005      243778 :             q_DFT = q_out_DFT[chan];
    1006      243778 :             move16();
    1007             :         }
    1008             : 
    1009             :         /*Resampling: filtering+scaling*/
    1010      243778 :         test();
    1011      243778 :         test();
    1012      243778 :         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      190910 :             pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */
    1015      190910 :             move32();
    1016      190910 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
    1017             :             {
    1018       63764 :                 pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
    1019       63764 :                 move32();
    1020             :             }
    1021             :             ELSE
    1022             :             {
    1023      127146 :                 pDFT_out_fx[1] = 0;
    1024      127146 :                 move32();
    1025             :             }
    1026    75455490 :             FOR( i = 2; i < NFFT; i++ )
    1027             :             {
    1028    75264580 :                 pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
    1029    75264580 :                 move32();
    1030             :             }
    1031    56417790 :             FOR( i = NFFT; i < hStereoDft->NFFT; i++ )
    1032             :             {
    1033    56226880 :                 pDFT_out_fx[i] = 0; /* qDFT */
    1034    56226880 :                 move32();
    1035             :             }
    1036             :         }
    1037       52868 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
    1038             :         {
    1039       50754 :             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       50754 :             move32();
    1041             : 
    1042     2030160 :             FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
    1043             :             {
    1044     1979406 :                 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     1979406 :                 move32();
    1046     1979406 :                 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     1979406 :                 move32();
    1048             :             }
    1049             :         }
    1050        2114 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) )
    1051             :         {
    1052          89 :             NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */
    1053          89 :             move16();
    1054             : 
    1055       49817 :             FOR( i = NFFT_core; i < NFFT; i++ )
    1056             :             {
    1057       49728 :                 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       49728 :                 move32();
    1059             :             }
    1060             :         }
    1061             :         ELSE
    1062             :         {
    1063        2025 :             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        2025 :             move32();
    1065        2025 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
    1066             :             {
    1067        1117 :                 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        1117 :                 move32();
    1069             :             }
    1070     1059095 :             FOR( i = 2; i < NFFT; i++ )
    1071             :             {
    1072     1057070 :                 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     1057070 :                 move32();
    1074             :             }
    1075             :         }
    1076             :     }
    1077             : 
    1078      157577 :     pop_wmops();
    1079      157577 :     return;
    1080             : }
    1081             : 
    1082             : 
    1083             : /*-------------------------------------------------------------------------
    1084             :  * stereo_dft_dec_synthesize_fx()
    1085             :  *
    1086             :  * Inverse DFT on a 20ms frame
    1087             :  *-------------------------------------------------------------------------*/
    1088             : 
    1089      100899 : 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      100899 :     push_wmops( "DFT_synthesis" );
    1111             : 
    1112             :     /*-----------------------------------------------------------------*
    1113             :      * Initialization
    1114             :      *-----------------------------------------------------------------*/
    1115             : 
    1116      100899 :     hStereoDft = hCPE->hStereoDft;
    1117             : 
    1118      100899 :     hCPE->lt_es_em_fx = L_shr( hCPE->lt_es_em_fx, 9 ); // Q24 -> Q15
    1119             : 
    1120      100899 :     outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); /* Q0 */
    1121             : 
    1122      100899 :     zp = NS2SA_FX2( outputFs, STEREO_DFT32MS_ZP_NS );
    1123      100899 :     move16();
    1124      100899 :     ovl = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL_NS );
    1125      100899 :     move16();
    1126      100899 :     win = hStereoDft->win32ms_fx; /* Q15 */
    1127      100899 :     NFFT = NS2SA_FX2( outputFs, STEREO_DFT32MS_N_NS );
    1128      100899 :     move16();
    1129      100899 :     ovl2 = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL2_NS );
    1130      100899 :     move16();
    1131      100899 :     flat_portion_end = NS2SA_FX2( outputFs, L_sub( STEREO_DFT32MS_WIN_CENTER_NS, L_shr( STEREO_DFT32MS_OVL2_NS, 1 ) ) );
    1132      100899 :     move16();
    1133      100899 :     win2 = hStereoDft->win232ms_fx; /* Q15 */
    1134             : 
    1135      100899 :     p_DFT = DFT[chan];
    1136      100899 :     set32_fx( output, 0, NS2SA_FX2( outputFs, FRAME_SIZE_NS ) );
    1137             : 
    1138             :     /* deactivating the spectrum scrambling on active speech */
    1139      100899 :     test();
    1140      100899 :     test();
    1141      100899 :     test();
    1142      100899 :     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       59247 :         hCPE->stereo_switching_counter = 10; /* Q0 */
    1145       59247 :         move16();
    1146             :     }
    1147             : 
    1148      100899 :     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      100899 :     moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) );
    1156             : 
    1157             :     /*-----------------------------------------------------------------*
    1158             :      * Synthesis
    1159             :      *-----------------------------------------------------------------*/
    1160             : 
    1161      100899 :     trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
    1162    17185459 :     FOR( i = 0; i < NFFT / 4; i++ )
    1163             :     {
    1164    17084560 :         trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
    1165    17084560 :         move16();
    1166    17084560 :         trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
    1167    17084560 :         move16();
    1168             :     }
    1169      100899 :     trigo_dec[NFFT / 4] = hStereoDft->dft_trigo_fx[NFFT / 4 * trigo_step]; /* Q15 */
    1170      100899 :     move16();
    1171             : 
    1172      302697 :     FOR( k = 0; k < STEREO_DFT_NBDIV; k++ )
    1173             :     {
    1174             :         /* scrambling the spectrum */
    1175      201798 :         test();
    1176      201798 :         test();
    1177      201798 :         test();
    1178      201798 :         test();
    1179      201798 :         test();
    1180      201798 :         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      201798 :         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      201798 :         scale_dft = getScaleFactor32( p_DFT, NFFT );
    1199      201798 :         scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft );
    1200      201798 :         v_shr( p_DFT, scale_dft, p_DFT, NFFT );
    1201      201798 :         rfft_fx( p_DFT, trigo_dec, NFFT, 1 );
    1202      201798 :         v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT );
    1203             : 
    1204      201798 :         IF( k == 0 )
    1205             :         {
    1206      100899 :             offset = 0;
    1207      100899 :             move16();
    1208             : 
    1209             :             /* Left OLA - 3.125ms */
    1210    10778749 :             FOR( i = 0; i < ovl; i++ )
    1211             :             {
    1212    10677850 :                 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    10677850 :                 move32();
    1214             :             }
    1215             :             /* Flat Portion */
    1216    12914319 :             FOR( i = ovl; i < flat_portion_end; i++ )
    1217             :             {
    1218    12813420 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
    1219    12813420 :                 move32();
    1220             :             }
    1221             :             /* Right OLA */
    1222    32134449 :             FOR( i = 0; i < ovl2; i++ )
    1223             :             {
    1224    32033550 :                 ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); /* hCPE->hStereoDft->q_dft */
    1225    32033550 :                 move32();
    1226             :             }
    1227             :         }
    1228             :         ELSE
    1229             :         {
    1230             :             /* If OVL2 = OVL offset = 10ms */
    1231      100899 :             offset = flat_portion_end;
    1232      100899 :             move16();
    1233             :             /* Left OLA */
    1234    32134449 :             FOR( i = 0; i < ovl2; i++ )
    1235             :             {
    1236    32033550 :                 output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); /* hCPE->hStereoDft->q_dft */
    1237    32033550 :                 move32();
    1238             :             }
    1239             :             /* Flat Portion */
    1240    12914319 :             FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ )
    1241             :             {
    1242    12813420 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
    1243    12813420 :                 move32();
    1244             :             }
    1245             :             /* Right OLA - 3.125ms */
    1246    10778749 :             FOR( i = 0; i < ovl; i++ )
    1247             :             {
    1248    10677850 :                 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    10677850 :                 move32();
    1250             :             }
    1251      100899 :             hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft;
    1252      100899 :             move16();
    1253             :         }
    1254      201798 :         p_DFT += STEREO_DFT32MS_N_MAX;
    1255             :     }
    1256             : 
    1257      100899 :     hCPE->lt_es_em_fx = L_shl( hCPE->lt_es_em_fx, 9 ); // Q15 -> Q24
    1258      100899 :     move32();
    1259             : 
    1260      100899 :     pop_wmops();
    1261      100899 :     return;
    1262             : }
    1263             : 
    1264             : /*---------------------------------------------------------------
    1265             :  * stereo_dft_dec_smooth_parameters_fx()
    1266             :  *
    1267             :  *
    1268             :  * ---------------------------------------------------------------*/
    1269             : 
    1270       42096 : 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       42096 :     N_div = STEREO_DFT_NBDIV;
    1287       42096 :     move16();
    1288       42096 :     k_offset = STEREO_DFT_OFFSET;
    1289       42096 :     move16();
    1290       42096 :     PI_round = EVS_PI_FX_Q27 + EPSILLON_FX; /*add error corrections when comparing ipds with exactly a difference of pi*/
    1291       42096 :     move32();
    1292             : 
    1293       42096 :     test();
    1294       42096 :     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       36390 :     IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1455             :     {
    1456       35201 :         hStereoDft->itd_xfade_counter = 0;
    1457       35201 :         move16();
    1458       35201 :         hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1459       35201 :         move32();
    1460       35201 :         hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1461       35201 :         move32();
    1462       35201 :         hStereoDft->ipd_xfade_counter = 0;
    1463       35201 :         move16();
    1464       35201 :         hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1465       35201 :         move32();
    1466       35201 :         hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1467       35201 :         move32();
    1468             :     }
    1469             : 
    1470       36390 :     hStereoDft->last_active_element_brate = element_brate;
    1471       36390 :     move32();
    1472             : 
    1473       72780 :     FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    1474             :     {
    1475       36390 :         max_res_pred_ind = 0;
    1476       36390 :         move32();
    1477       36390 :         IF( EQ_16( hStereoDft->reverb_flag, 1 ) )
    1478             :         {
    1479        5079 :             nbands = s_min( 10, hStereoDft->nbands_respred );
    1480        5079 :             move16();
    1481             :             /*Shift 2 last bands residual prediction gains for SWB/FB*/
    1482        5079 :             IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) )
    1483             :             {
    1484        5476 :                 FOR( b = sub( hStereoDft->nbands_respred, 1 ); b >= nbands; b-- )
    1485             :                 {
    1486        3406 :                     hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] =
    1487        3406 :                         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        3406 :                     move32();
    1489        3406 :                     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        3406 :                     move32();
    1491             :                 }
    1492             :             }
    1493             : 
    1494             :             /* Get maximal index */
    1495       27779 :             FOR( b = hStereoDft->res_pred_band_min; b < nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST; b++ )
    1496             :             {
    1497       22700 :                 IF( LT_32( max_res_pred_ind, hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] ) )
    1498             :                 {
    1499        9046 :                     max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1500        9046 :                     move32();
    1501             :                 }
    1502             :             }
    1503             : 
    1504             :             /* predictive values */
    1505       20316 :             FOR( ; b < nbands; b++ )
    1506             :             {
    1507       15237 :                 assert( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] == 0 );
    1508       15237 :                 hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; /* Q26 */
    1509       15237 :                 move32();
    1510             :             }
    1511             :         }
    1512             : 
    1513       36390 :         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      300224 :         FOR( ; b < hStereoDft->nbands; b++ )
    1553             :         {
    1554      263834 :             test();
    1555      263834 :             test();
    1556      263834 :             IF( hStereoDft->attackPresent )
    1557             :             {
    1558        9527 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1559        9527 :                 move32();
    1560        9527 :                 hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
    1561        9527 :                 move32();
    1562             :             }
    1563      254307 :             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      145631 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1566      145631 :                 move32();
    1567      145631 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1568             :                 {
    1569       33010 :                     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       33010 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); /* Q26 */
    1571       33010 :                     move32();
    1572             :                 }
    1573             :                 ELSE
    1574             :                 {
    1575      112621 :                     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      112621 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); /* Q26 */
    1577      112621 :                     move32();
    1578             :                 }
    1579             :             }
    1580             :             ELSE
    1581             :             {
    1582      108676 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1583             :                 {
    1584       31261 :                     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       31261 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1586       31261 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); /* Q26 */
    1587       31261 :                     move32();
    1588       31261 :                     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       31261 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1590       31261 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); /* Q26 */
    1591       31261 :                     move32();
    1592             :                 }
    1593             :                 ELSE
    1594             :                 {
    1595       77415 :                     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       77415 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1597       77415 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); /* Q26 */
    1598       77415 :                     move32();
    1599       77415 :                     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       77415 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1601       77415 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); /* Q26 */
    1602       77415 :                     move32();
    1603             :                 }
    1604             :             }
    1605             : 
    1606      263834 :             IF( !hStereoDft->recovery_flg )
    1607             :             {
    1608      263789 :                 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       36390 :         pgIpd = hStereoDft->gipd_fx + ( add( k, k_offset ) );
    1614       36390 :         diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[k + k_offset]] ); /* Q27 */
    1615       36390 :         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       35663 :         ELSE IF( GT_32( diff_ipd, PI_round ) )
    1621             :         {
    1622         287 :             pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
    1623         287 :             move32();
    1624             :         }
    1625             : 
    1626       36390 :         IF( !hStereoDft->attackPresent )
    1627             :         {
    1628       35076 :             IF( hStereoDft->wasTransient )
    1629             :             {
    1630        1277 :                 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        1277 :                 move32();
    1632             :             }
    1633             :             ELSE
    1634             :             {
    1635       33799 :                 pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[k + k_offset]], 1 ) ); /* Q27 */
    1636       33799 :                 move32();
    1637             :             }
    1638             :         }
    1639             : 
    1640             : 
    1641       36390 :         IF( !hStereoDft->attackPresent )
    1642             :         {
    1643       35076 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
    1644      117511 :             FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    1645             :             {
    1646       82435 :                 pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ),
    1647       82435 :                                            pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX],
    1648       82435 :                                            sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); /* Q31 */
    1649       82435 :                 move32();
    1650             :             }
    1651             :         }
    1652             : 
    1653             :         /*Interpolation between DFT slots*/
    1654       72780 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1655             :         {
    1656       36390 :             pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); /* Q27 */
    1657       36390 :             pIpd = hStereoDft->gipd_fx + add( k, k_offset );                 /* Q27 */
    1658       36390 :             IF( hStereoDft->attackPresent )
    1659             :             {
    1660        1314 :                 *( pInterpol ) = *( pIpd );
    1661        1314 :                 move32();
    1662             :             }
    1663             :             ELSE
    1664             :             {
    1665       35076 :                 *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ) );
    1666       35076 :                 move32();
    1667             :             }
    1668             : 
    1669      385519 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    1670             :             {
    1671      349129 :                 *( 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      349129 :                 move32();
    1673      349129 :                 test();
    1674      349129 :                 test();
    1675      349129 :                 test();
    1676      349129 :                 test();
    1677      349129 :                 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      240453 :                     *( 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      240453 :                     move32();
    1681             :                 }
    1682             :                 ELSE
    1683             :                 {
    1684      108676 :                     *( 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      108676 :                     move32();
    1686             :                 }
    1687             :             }
    1688             : 
    1689       36390 :             hStereoDft->itd_fx[k + k_offset - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1690       36390 :             move32();
    1691             :         } /*end of interpolation*/
    1692             :     }
    1693             : 
    1694       36390 :     return;
    1695             : }
    1696             : 
    1697             : /*-------------------------------------------------------------------------
    1698             :  * stereo_dft_dec_res_fx()
    1699             :  *
    1700             :  * Decode the residual signal
    1701             :  *-------------------------------------------------------------------------*/
    1702             : 
    1703       17017 : 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       17017 :     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       17017 :     move16();
    1723             : 
    1724             :     /* flush memories when switching residual coding on */
    1725       17017 :     IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
    1726             :     {
    1727         140 :         set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
    1728         140 :         hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1729         140 :         move16();
    1730         140 :         set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
    1731         140 :         set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
    1732         140 :         hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
    1733         140 :         move16();
    1734             :     }
    1735             : 
    1736             :     /*Inverse MDCT*/
    1737       17017 :     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       17017 :     scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );
    1740             : 
    1741       17017 :     Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    1742       17017 :     IF( !prev_bfi )
    1743             :     {
    1744             :         /*OLA*/
    1745             :         /*overlapping parts*/
    1746             : 
    1747     1188043 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1748             :         {
    1749     1171310 :             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     1171310 :             move16();
    1751     1171310 :             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     1171310 :             move32();
    1753             :         }
    1754             : 
    1755             : 
    1756       16733 :         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       17017 :     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       17017 :     hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1783             : 
    1784       17017 :     Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */
    1785             : 
    1786       17017 :     IF( hCPE->hCoreCoder[0]->core == ACELP_CORE )
    1787             :     {
    1788             :         /* bass post-filter */
    1789       11013 :         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       11013 :                           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       11013 :         Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */
    1792       11013 :         res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res );
    1793             : 
    1794       11013 :         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       11013 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1808       11013 :         IF( res_bpf_flag )
    1809             :         {
    1810       10625 :             v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k );
    1811             :         }
    1812             :     }
    1813        6004 :     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        6004 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1824             :     }
    1825             : 
    1826       17017 :     return;
    1827             : }
    1828             : 
    1829             : 
    1830             : /*-------------------------------------------------------------------------
    1831             :  * stereo_dft_dec_fx()
    1832             :  *
    1833             :  * DFT-based stereo main processing function
    1834             :  *-------------------------------------------------------------------------*/
    1835             : 
    1836       48077 : 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       48077 :     HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec;
    1881       48077 :     HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom;
    1882       48077 :     Word16 *cna_seed = &( hFdCngCom->seed );
    1883             :     Word32 DFT_W, DFT_Y;
    1884             :     Word16 len;
    1885             : 
    1886       48077 :     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       48077 :     samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15
    1893             : 
    1894             : 
    1895       48077 :     stop = shr( STEREO_DFT32MS_N_32k, 1 );
    1896             : 
    1897             :     /* Analyze nature of current frame */
    1898       48077 :     test();
    1899       48077 :     test();
    1900       48077 :     test();
    1901       48077 :     test();
    1902       48077 :     test();
    1903       48077 :     test();
    1904       48077 :     test();
    1905       48077 :     test();
    1906       87561 :     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       39484 :                         ( ( 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       48077 :     move16();
    1909             : 
    1910             :     /* Initialization */
    1911       48077 :     k_offset = 1;
    1912       48077 :     move16();
    1913       48077 :     N_div = STEREO_DFT_NBDIV;
    1914       48077 :     move16();
    1915       48077 :     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       48077 :     move16();
    1919       48077 :     test();
    1920       48077 :     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       48077 :     IF( st0->bfi == 0 )
    1926             :     {
    1927             :         /* Smoothing for the current frame */
    1928       47494 :         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       36741 :             stereo_dft_dec_smooth_parameters_fx( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate );
    1935             :         }
    1936             :     }
    1937             : 
    1938       48077 :     dmx_nrg = 0;
    1939       48077 :     move32();
    1940       48077 :     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      144231 :     FOR( k = 0; k < N_div; k++ )
    1946             :     {
    1947       96154 :         pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1948       96154 :         pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1949       96154 :         pDFT_DMX1 = 0;
    1950       96154 :         move16();
    1951             : 
    1952       96154 :         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       96154 :         IF( hStereoDft->hConfig->dmx_active )
    1959             :         {
    1960       96154 :             g = MAX_16;
    1961       96154 :             move16();
    1962       96154 :             c0 = MAX_16;
    1963       96154 :             move16();
    1964       96154 :             s0 = 0;
    1965       96154 :             move16();
    1966             : 
    1967             :             /* since delay is just 3.125ms, the parameters received are used for the second window */
    1968       96154 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX );     /* Q31 */
    1969       96154 :             pgIpd = hStereoDft->gipd_fx + add( k, k_offset );                                             /* Q27 */
    1970       96154 :             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       96154 :             test();
    1974       96154 :             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       96154 :             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       96154 :             test();
    1987       96154 :             IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) )
    1988             :             {
    1989       83596 :                 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       96154 :             IF( hStereoDft->res_cod_band_max > 0 )
    1993             :             {
    1994       24262 :                 IF( !st0->bfi )
    1995             :                 {
    1996       23596 :                     IF( EQ_16( k, 1 ) )
    1997             :                     {
    1998       11798 :                         Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); /* qDFT */
    1999       11798 :                         hStereoDft->time_offs = 0;
    2000       11798 :                         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       96154 :             test();
    2012       96154 :             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       85214 :                 DFT_L[0] = pDFT_DMX[0]; /* qDFT */
    2022       85214 :                 move32();
    2023       85214 :                 DFT_R[0] = pDFT_DMX[0]; /* qDFT */
    2024       85214 :                 move32();
    2025             :             }
    2026             : 
    2027       96154 :             test();
    2028       96154 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    2029             :             {
    2030       24382 :                 hFdCngDec->cna_nbands = 0;
    2031       24382 :                 move16();
    2032             :             }
    2033             : 
    2034      983324 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    2035             :             {
    2036      887170 :                 g = extract_h( pSideGain[b] );
    2037      887170 :                 move16();
    2038      887170 :                 test();
    2039      887170 :                 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      887170 :                 test();
    2047      887170 :                 test();
    2048      887170 :                 IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) )
    2049             :                 {
    2050      206856 :                     hFdCngDec->cna_nbands = add( b, 1 ); /* Q0 */
    2051      206856 :                     move16();
    2052      206856 :                     hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; /* Q0 */
    2053      206856 :                     move16();
    2054      206856 :                     hFdCngDec->cna_g_state_fx[b] = g; /* Q15 */
    2055      206856 :                     move16();
    2056             :                 }
    2057             : 
    2058             :                 /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */
    2059      887170 :                 test();
    2060      887170 :                 test();
    2061      887170 :                 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    19478294 :                     FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2065             :                     {
    2066    18995006 :                         pDFT_RES[2 * i] = 0;
    2067    18995006 :                         move32();
    2068    18995006 :                         pDFT_RES[2 * i + 1] = 0;
    2069    18995006 :                         move32();
    2070             :                     }
    2071             :                 }
    2072             : 
    2073      887170 :                 test();
    2074      887170 :                 test();
    2075      887170 :                 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      823238 :                 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      604598 :                     len = s_min( stop, hStereoDft->band_limits[b + 1] );
    2357    13033964 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2358             :                     {
    2359    12429366 :                         tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); /* qDFT */
    2360             : 
    2361    12429366 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2362    12429366 :                         move32();
    2363    12429366 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2364    12429366 :                         move32();
    2365             : 
    2366    12429366 :                         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    12429366 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2369    12429366 :                         move32();
    2370    12429366 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2371    12429366 :                         move32();
    2372             :                     }
    2373             : 
    2374     7655478 :                     FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    2375             :                     {
    2376     7050880 :                         tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); /* qDFT */
    2377             : 
    2378     7050880 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2379     7050880 :                         move32();
    2380     7050880 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    2381     7050880 :                         move32();
    2382             : 
    2383     7050880 :                         tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); /* qDFT */
    2384             : 
    2385     7050880 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2386     7050880 :                         move32();
    2387     7050880 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    2388     7050880 :                         move32();
    2389             :                     }
    2390             : 
    2391             :                     /* Active Upmix */
    2392      604598 :                     IF( pgIpd[0] != 0 )
    2393             :                     {
    2394       96727 :                         Word32 theta = pgIpd[0];
    2395       96727 :                         move32();
    2396       98575 :                         WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
    2397             :                         {
    2398        1848 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2399             :                         }
    2400       99787 :                         WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
    2401             :                         {
    2402        3060 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2403             :                         }
    2404       96727 :                         IF( GT_32( theta, EVS_PI_FX_Q27 ) )
    2405             :                         {
    2406        5151 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2407             :                         }
    2408       91576 :                         ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
    2409             :                         {
    2410        4020 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2411             :                         }
    2412       96727 :                         c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
    2413       96727 :                         IF( EQ_16( c0, ONE_IN_Q14 ) )
    2414             :                         {
    2415       41510 :                             c0 = MAX_16;
    2416       41510 :                             move16();
    2417             :                         }
    2418             :                         ELSE
    2419             :                         {
    2420       55217 :                             c0 = shl( c0, 1 );
    2421             :                         }
    2422       96727 :                         s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
    2423     2966601 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2424             :                         {
    2425             :                             /*rotate L*/
    2426     2869874 :                             tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 );              /* qDFT */
    2427     2869874 :                             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     2869874 :                             move32();
    2429     2869874 :                             DFT_L[2 * i] = tmp; /* qDFT */
    2430     2869874 :                             move32();
    2431             :                         }
    2432             :                     }
    2433             :                 }
    2434             :             }
    2435             : 
    2436       96154 :             test();
    2437       96154 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    2438             :             {
    2439       24382 :                 hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; /* Q0 */
    2440       24382 :                 move16();
    2441             :             }
    2442             : 
    2443       96154 :             test();
    2444       96154 :             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     3038234 :             FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ )
    2453             :             {
    2454     2942080 :                 DFT_L[2 * i] = 0;
    2455     2942080 :                 move32();
    2456     2942080 :                 DFT_L[2 * i + 1] = 0;
    2457     2942080 :                 move32();
    2458     2942080 :                 DFT_R[2 * i] = 0;
    2459     2942080 :                 move32();
    2460     2942080 :                 DFT_R[2 * i + 1] = 0;
    2461     2942080 :                 move32();
    2462             :             }
    2463             : 
    2464             :             /*Nyquist Freq.*/
    2465       96154 :             IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) )
    2466             :             {
    2467       76492 :                 DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2468       76492 :                 move32();
    2469       76492 :                 DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2470       76492 :                 move32();
    2471       76492 :                 DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2472       76492 :                 move32();
    2473       76492 :                 DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2474       76492 :                 move32();
    2475             :             }
    2476             :             ELSE
    2477             :             {
    2478       19662 :                 DFT_L[1] = 0;
    2479       19662 :                 move32();
    2480       19662 :                 DFT_R[1] = 0;
    2481       19662 :                 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       96154 :         IF( st0->flag_cna )
    2501             :         {
    2502       79964 :             ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; /* hFdCngDec->smoothed_psd_exp */
    2503             : 
    2504       79964 :             scale_fact0 = 0;
    2505       79964 :             move16();
    2506       79964 :             IF( hFdCngDec->cna_rescale_fact_fx > 0 )
    2507             :             {
    2508       29941 :                 Word16 q_scale_fact0 = 0;
    2509       29941 :                 move16();
    2510       29941 :                 Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 );
    2511       29941 :                 move16();
    2512       29941 :                 scale_fact0 = L_mult0( shr( output_frame, 1 ), op );
    2513       29941 :                 IF( q_scale_fact0 > 0 )
    2514             :                 {
    2515           0 :                     assert( 0 );
    2516             :                 }
    2517             :                 ELSE
    2518             :                 {
    2519       29941 :                     scale_fact0 = L_shl( scale_fact0, q_scale_fact0 );
    2520       29941 :                     move32();
    2521             :                 }
    2522             :             }
    2523             : 
    2524      598744 :             FOR( b = 0; b < hFdCngDec->cna_nbands; b++ )
    2525             :             {
    2526             :                 /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */
    2527      518780 :                 coh = hFdCngDec->cna_cm_fx[b];
    2528      518780 :                 move16();
    2529      518780 :                 g = hFdCngDec->cna_g_state_fx[b];
    2530      518780 :                 move16();
    2531      518780 :                 IF( LT_16( coh, (Word16) ( 0x7333 ) ) )
    2532             :                 {
    2533             :                     Word32 op1, op2, l_gamma;
    2534             :                     Word16 q_loc1, q_loc2, q_gamma;
    2535      492524 :                     gamma = coh;
    2536      492524 :                     move16();
    2537      492524 :                     gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma );
    2538      492524 :                     if ( gamma == 0 )
    2539             :                     {
    2540      253292 :                         q_gamma = 0;
    2541      253292 :                         move16();
    2542             :                     }
    2543      492524 :                     l_gamma = L_deposit_l( gamma );
    2544      492524 :                     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      492524 :                     q_loc2 = add( Q16, q_gamma );
    2546      492524 :                     q_loc1 = q_loc2;
    2547      492524 :                     move16();
    2548      492524 :                     op1 = Sqrt32( op1, &q_loc1 );
    2549      492524 :                     op2 = Sqrt32( l_gamma, &q_loc2 );
    2550      492524 :                     IF( op2 != 0 )
    2551             :                     {
    2552      239232 :                         IF( NE_16( q_loc1, q_loc2 ) )
    2553             :                         {
    2554      134271 :                             op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); /* qloc2 */
    2555      134271 :                             q_loc2 = q_loc1;
    2556      134271 :                             move16();
    2557             :                         }
    2558      239232 :                         gamma = extract_h( L_sub( op1, op2 ) ); /* qloc2 - 16 */
    2559      239232 :                         gamma = shl( gamma, q_loc2 );           /* 2 * qloc2 - 16 */
    2560             :                     }
    2561             :                     ELSE
    2562             :                     {
    2563      253292 :                         gamma = extract_h( L_shl( op1, q_loc1 ) ); /* 2 * qloc2 - 16 */
    2564             :                     }
    2565             :                 }
    2566             :                 ELSE
    2567             :                 {
    2568       26256 :                     gamma = 0;
    2569       26256 :                     move16();
    2570             :                 }
    2571      518780 :                 len = s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
    2572    13233056 :                 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    12714276 :                     lev1 = *ptr_per++;
    2576    12714276 :                     move32();
    2577    12714276 :                     lev2 = *ptr_per++;
    2578    12714276 :                     move32();
    2579             : 
    2580    12714276 :                     test();
    2581    12714276 :                     test();
    2582    12714276 :                     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      411516 :                         cna_level = L_min( lev1, lev2 ); /* hFdCngDec->smoothed_psd_exp */
    2586             :                     }
    2587             :                     ELSE
    2588             :                     {
    2589             :                         /* take the average of two adjacent frequency bins */
    2590    12302760 :                         cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); /* hFdCngDec->smoothed_psd_exp */
    2591             :                     }
    2592    12714276 :                     q_cna_level = hFdCngDec->smoothed_psd_exp;
    2593    12714276 :                     move16();
    2594    12714276 :                     l_tmp = Sqrt32( cna_level, &q_cna_level );
    2595    12714276 :                     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    12714276 :                     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    12714276 :                     Word16 shift = sub( q_cna_level, hStereoDft->q_dft );
    2604    12714276 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2605    12714276 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2606    12714276 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma );                       /* q_cna_level */
    2607    12714276 :                     l_tmp = L_shr( l_tmp, shift );                                                  /* q_dft */
    2608    12714276 :                     DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp );                                /* q_dft */
    2609    12714276 :                     move32();
    2610    12714276 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2611    12714276 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2612    12714276 :                     DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp );          /* q_dft */
    2613    12714276 :                     move32();
    2614             : 
    2615    12714276 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2616    12714276 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2617    12714276 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma );                       /* q_cna_level */
    2618    12714276 :                     l_tmp = L_shr( l_tmp, shift );                                                  /* q_dft */
    2619    12714276 :                     DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp );                        /* q_dft */
    2620    12714276 :                     move32();
    2621    12714276 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2622    12714276 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2623    12714276 :                     DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp );  /* q_dft */
    2624    12714276 :                     move32();
    2625             :                 }
    2626             :             }
    2627             : 
    2628             :             /* update CNA re-scaling factor */
    2629       79964 :             hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); /* q_cna_act */
    2630       79964 :             move16();
    2631             : 
    2632       79964 :             IF( !hFdCngDec->first_cna_noise_updated )
    2633             :             {
    2634       48504 :                 hFdCngDec->cna_rescale_fact_fx = 0;
    2635       48504 :                 move16();
    2636             :             }
    2637             :         }
    2638             : 
    2639             :         /* Update memories */
    2640       96154 :         hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
    2641       96154 :         move16();
    2642       96154 :         Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); /* qDFT */
    2643       96154 :         hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft;
    2644       96154 :         move16();
    2645       96154 :         IF( pPredGain )
    2646             :         {
    2647       96154 :             stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain );
    2648             :         }
    2649             : 
    2650       96154 :         Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2651       96154 :         Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2652             :     }
    2653             : 
    2654       48077 :     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       48077 :     stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio );
    2667             : 
    2668       48077 :     return;
    2669             : }
    2670             : 
    2671             : /*-------------------------------------------------------------------------
    2672             :  * stereo_dft_compute_td_stefi_params_fx()
    2673             :  *
    2674             :  *
    2675             :  *-------------------------------------------------------------------------*/
    2676             : 
    2677       48077 : 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       48077 :     pdmx_ind = hStereoDft->past_DMX_pos; /* Q0 */
    2698       48077 :     move16();
    2699       48077 :     bres = hStereoDft->band_res[1]; /* Q0 */
    2700       48077 :     move16();
    2701             : 
    2702       48077 :     test();
    2703       48077 :     IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient )
    2704             :     {
    2705       23457 :         hStereoDft->td_gain_fx[0] = 0;
    2706       23457 :         move32();
    2707       23457 :         hStereoDft->q_td_gain[0] = 0;
    2708       23457 :         move16();
    2709       23457 :         return;
    2710             :     }
    2711             : 
    2712       24620 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2713       24620 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2714       24620 :     b = hStereoDft->nbands;                                            /* Q0 */
    2715       24620 :     move16();
    2716       76930 :     WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) )
    2717             :     {
    2718       52310 :         b--;
    2719             :     }
    2720       24620 :     band0 = b; /* Q0 */
    2721       24620 :     move16();
    2722             : 
    2723             :     /* calculate averages over high bands */
    2724       24620 :     pred_g = pred_gain_avg = 0;
    2725       24620 :     move32();
    2726       24620 :     move32();
    2727       24620 :     nbands = 0;
    2728       24620 :     move16();
    2729       24620 :     wsum = 0;
    2730       24620 :     move32();
    2731       24620 :     shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) );
    2732       75371 :     FOR( b = band0; b < hStereoDft->nbands; b++ )
    2733             :     {
    2734       51420 :         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         669 :             hStereoDft->td_gain_fx[0] = 0;
    2737         669 :             move32();
    2738         669 :             hStereoDft->q_td_gain[0] = 0;
    2739         669 :             move16();
    2740         669 :             return;
    2741             :         }
    2742       50751 :         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       50751 :                                                            L_shr( hStereoDft->res_pred_gain_fx[b + 2 * STEREO_DFT_BAND_MAX], 1 ) ),
    2744       50751 :                                                     dft_res_pred_weights_fx[bres][b - band0] ),
    2745             :                                        shift_g ) ); /* Q30 - shift_g */
    2746       50751 :         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       50751 :                                                                          L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], 1 ) ),
    2748       50751 :                                                                   dft_res_pred_weights_fx[bres][b - band0] ),
    2749             :                                                      shift_g ) ); /* Q30 - shift_g */
    2750             : 
    2751       50751 :         nbands = add( nbands, 1 );
    2752       50751 :         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       23951 :     IF( nbands == 0 )
    2759             :     {
    2760             :         /* apparently, there is nothing to do here */
    2761        2969 :         hStereoDft->td_gain_fx[0] = 0;
    2762        2969 :         move32();
    2763        2969 :         hStereoDft->q_td_gain[0] = 0;
    2764        2969 :         move16();
    2765        2969 :         return;
    2766             :     }
    2767       20982 :     wsum = L_shl( wsum, sub( Q16, shift_g ) );                    /* Q31 - shift_g */
    2768       20982 :     pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); /* q_div */
    2769       20982 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2770             :     {
    2771        5059 :         pred_g = L_shl( pred_g, q_div );
    2772             :     }
    2773             : 
    2774       20982 :     pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); /* q_div */
    2775       20982 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2776             :     {
    2777        4924 :         pred_gain_avg = L_shl( pred_gain_avg, q_div );
    2778        4924 :         q_pred_gain_avg = 15;
    2779        4924 :         move16();
    2780             :     }
    2781             :     ELSE
    2782             :     {
    2783       16058 :         q_pred_gain_avg = sub( 15, q_div );
    2784             :     }
    2785       20982 :     nrg_DMX = hStereoDft->hb_nrg_fx[0];
    2786       20982 :     move32();
    2787       20982 :     nrg_pred_DMX = hStereoDft->hb_nrg_fx[1];
    2788       20982 :     move32();
    2789             : 
    2790       20982 :     op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); /* q_div */
    2791       20982 :     q_sqrt = add( Q16, q_div );
    2792       20982 :     op1 = Sqrt32( op1, &q_sqrt );
    2793       20982 :     g2 = Mpy_32_32( pred_g, op1 ); /* q_div + q_sqrt - 31 */
    2794       20982 :     IF( LT_16( q_sqrt, 0 ) )
    2795             :     {
    2796         871 :         g2 = L_shl( g2, q_sqrt );
    2797         871 :         q_sqrt = 0;
    2798         871 :         move16();
    2799             :     }
    2800       20111 :     ELSE IF( q_sqrt != 0 )
    2801             :     {
    2802       12133 :         IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) )
    2803             :         {
    2804        7679 :             g2 = pred_gain_avg; /* q_pred_gain_avg */
    2805        7679 :             move32();
    2806             :         }
    2807             :         ELSE
    2808             :         {
    2809        4454 :             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2810        4454 :                         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        4454 :             g2 = L_shl( g2, q_sqrt );                                           /* q_pred_gain_avg */
    2813             :         }
    2814             :     }
    2815             :     ELSE
    2816             :     {
    2817        7978 :         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2818        7978 :                     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       20982 :     hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); /* Q16 + q_pred_gain_avg */
    2823       20982 :     hStereoDft->q_td_gain[0] = add( 16, q_pred_gain_avg );
    2824       20982 :     move32();
    2825       20982 :     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       20982 :     return;
    2834             : }
    2835             : 
    2836        4309 : 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        4309 :     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        4038 :     ELSE IF( EQ_16( bits, 3 ) )
    2849             :     {
    2850           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2851           0 :         move16();
    2852             :     }
    2853        4038 :     ELSE IF( EQ_16( bits, 4 ) )
    2854             :     {
    2855        4038 :         delta_fx = ( EVS_PI_FX ) >> 3; /* Q13 */
    2856        4038 :         move16();
    2857             :     }
    2858             :     ELSE
    2859             :     {
    2860           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2861           0 :         move16();
    2862           0 :         assert( 0 );
    2863             :     }
    2864             : 
    2865        4309 :     *out_fx = L_sub( W_sat_l( W_mult_32_16( L_shl( ind[0], 13 ), delta_fx ) ), EVS_PI_FX_Q27 );
    2866        4309 :     move32();
    2867        4309 :     return;
    2868             : }
    2869             : 
    2870             : /*-------------------------------------------------------------------------
    2871             :  * stereo_dft_generate_res_pred_fx()
    2872             :  *
    2873             :  *
    2874             :  *-------------------------------------------------------------------------*/
    2875       83868 : 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       83868 :     push_wmops( "gen_respred" );
    2911             : 
    2912             :     /* smoothing and limiting parameters */
    2913             :     // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */
    2914       83868 :     IF( hStereoDft->wasTransient )
    2915             :     {
    2916        2422 :         alpha = 0;
    2917        2422 :         move16();
    2918             :     }
    2919             :     ELSE
    2920             :     {
    2921       81446 :         alpha = (Word16) ( 0x199A ); /* Q15 */
    2922       81446 :         move16();
    2923             :     }
    2924             :     // gain_limit = 0x7FFF; // 2.0 in Q14
    2925             : 
    2926             :     /* residual prediction only used up to 16 kHz (SWB) */
    2927       83868 :     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       83868 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2932       83868 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2933       83868 :     b = hStereoDft->nbands;
    2934       83868 :     move16();
    2935      270270 :     WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) )
    2936             :     {
    2937      186402 :         b--;
    2938             :     }
    2939       83868 :     band0 = b;
    2940       83868 :     move16();
    2941             : 
    2942       83868 :     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       35474 :         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       48394 :         lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); /* Q0 */
    2951             :     }
    2952             : 
    2953       83868 :     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       83868 :     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       48394 :         set16_fx( q_smoothed_nrg_local, hStereoDft->q_smoothed_nrg, STEREO_DFT_BAND_MAX );
    2965      392292 :         FOR( b = hStereoDft->res_cod_band_max; b <= band0; b++ )
    2966             :         {
    2967      343898 :             dmx_nrg_64bit = EPSILLON_FX;
    2968      343898 :             move64();
    2969      343898 :             rev_nrg_64bit = EPSILLON_FX;
    2970      343898 :             move64();
    2971             : 
    2972             :             /* calculate band energies (low band only in case of ACELP) */
    2973      343898 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    2974     7131216 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2975             :             {
    2976     6787318 :                 dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ),
    2977     6787318 :                                              pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2978     6787318 :                 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     6787318 :                                              ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2980             :             }
    2981             : 
    2982      343898 :             q_new = add( shl( hStereoDft->q_dft, 1 ), 1 );
    2983      343898 :             q_shift = W_norm( dmx_nrg_64bit );
    2984      343898 :             dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2985      343898 :             dmx_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2986      343898 :             q_shift = W_norm( rev_nrg_64bit );
    2987      343898 :             rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2988      343898 :             rev_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2989      343898 :             move16();
    2990             : 
    2991             :             /* Reach a common Q for dmx_nrg and rev_nrg */
    2992      343898 :             q_com = s_min( dmx_nrg_q, rev_nrg_q );
    2993      343898 :             dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */
    2994      343898 :             rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */
    2995             : 
    2996      343898 :             diff = sub( hStereoDft->q_smoothed_nrg, q_com );
    2997      343898 :             IF( diff < 0 )
    2998             :             {
    2999      116601 :                 rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) );
    3000      116601 :                 dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) );
    3001      116601 :                 q_com = hStereoDft->q_smoothed_nrg;
    3002      116601 :                 move16();
    3003             :             }
    3004             :             ELSE
    3005             :             {
    3006      227297 :                 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    3007      227297 :                 move32();
    3008      227297 :                 hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    3009      227297 :                 move32();
    3010      227297 :                 q_smoothed_nrg_local[b] = q_com;
    3011      227297 :                 move16();
    3012             :             }
    3013             :             /* smoothing */
    3014      343898 :             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      343898 :             move32();
    3016      343898 :             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      343898 :             move32();
    3018             : 
    3019             :             // Compute norm_fac in Q14
    3020      343898 :             norm_fac = MAX_16;
    3021      343898 :             move16();
    3022             :             /* normalization factor */
    3023      343898 :             IF( hStereoDft->smooth_res_nrg_fx[b] != 0 )
    3024             :             {
    3025      339183 :                 norm_fac = 0;
    3026      339183 :                 move16();
    3027      339183 :                 IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 )
    3028             :                 {
    3029             :                     Word16 quo, quo_e;
    3030             :                     Word32 prod;
    3031             : 
    3032      338259 :                     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      338259 :                     norm_fac = Sqrt16( norm_fac, &q_norm_fac );
    3034             : 
    3035      338259 :                     quo = BASOP_Util_Divide1616_Scale( 32767, norm_fac, &quo_e ); /* q_norm_fac */
    3036      338259 :                     quo_e = sub( quo_e, q_norm_fac );
    3037      338259 :                     quo = shl_sat( quo, sub( quo_e, 1 ) ); // Q14
    3038      338259 :                     quo = s_max( 13107 /*0.8 in Q14 */, quo );
    3039      338259 :                     quo = s_min( quo, 20480 /* 1.25 in Q14*/ );
    3040             : 
    3041      338259 :                     prod = L_mult( norm_fac, quo ); // exp:q_norm_fac+1
    3042             :                     // Bring to Q30
    3043      338259 :                     prod = L_shl_sat( prod, q_norm_fac );
    3044             : 
    3045      338259 :                     norm_fac = extract_h( prod );
    3046             :                 }
    3047             :             }
    3048             : 
    3049      343898 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    3050     7131216 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3051             :             {
    3052     6787318 :                 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     6787318 :                 move32();
    3054     6787318 :                 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     6787318 :                 move32();
    3056             :             }
    3057             :         }
    3058             : 
    3059             :         /* Reach a common Q for all the bands */
    3060       48394 :         q_com = Q31;
    3061       48394 :         move16();
    3062      677516 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    3063             :         {
    3064      629122 :             q_com = s_min( q_com, q_smoothed_nrg_local[b] );
    3065             :         }
    3066      677516 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    3067             :         {
    3068      629122 :             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      629122 :             move32();
    3070             : 
    3071      629122 :             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      629122 :             move32();
    3073             :         }
    3074       48394 :         IF( GT_16( q_com, hStereoDft->q_dft ) )
    3075             :         {
    3076          23 :             scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    3077          23 :             scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    3078          23 :             hStereoDft->q_smoothed_nrg = hStereoDft->q_dft;
    3079          23 :             move16();
    3080             :         }
    3081             :     }
    3082       35474 :     ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) )
    3083             :     {
    3084             :         /* stefi in lowband */
    3085       24534 :         set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) );
    3086             : 
    3087      150534 :         FOR( b = lb_stefi_start_band; b <= band0; b++ )
    3088             :         {
    3089             :             Word16 temp, temp_e;
    3090      126000 :             d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    3091      126000 :             temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e );        /*(float) b / ( hStereoDft->nbands - 1 )*/
    3092      126000 :             IF( temp_e < 0 )
    3093             :             {
    3094        2270 :                 temp = shl( temp, temp_e );
    3095        2270 :                 temp_e = 0;
    3096        2270 :                 move16();
    3097             :             }
    3098      126000 :             temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    3099      126000 :             temp_e = add( temp_e, 3 );
    3100      126000 :             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      126000 :             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      126000 :             d_short_ind = s_max( d_short_ind, d_long_ind );
    3105      126000 :             move16();
    3106             : 
    3107             :             /* Even number of window sliding (assymmetric OLA) */
    3108      126000 :             d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); /* Q0 */
    3109      126000 :             d_long_ind = shl( shr( d_long_ind, 1 ), 1 );   /* Q0 */
    3110             : 
    3111      126000 :             d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    3112      126000 :             d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind );   /* Q0 */
    3113             : 
    3114      126000 :             d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    3115      126000 :             move16();
    3116      126000 :             d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    3117      126000 :             move16();
    3118             : 
    3119      126000 :             g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    3120      126000 :             move16();
    3121      126000 :             g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    3122      126000 :             move16();
    3123             : 
    3124             :             /* change mixing ratio if long and short delay are the same */
    3125      126000 :             IF( EQ_16( d_short, d_long ) )
    3126             :             {
    3127       20748 :                 g_short = MAX_16;
    3128       20748 :                 move16();
    3129       20748 :                 g_long = 0;
    3130       20748 :                 move16();
    3131             :             }
    3132             : 
    3133             :             /* Avoid transient components */
    3134      126000 :             test();
    3135      126000 :             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        4922 :                 g_long = 0;
    3138        4922 :                 move16();
    3139        4922 :                 g_short = 0;
    3140        4922 :                 move16();
    3141             :             }
    3142      121078 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) )
    3143             :             {
    3144        3054 :                 g_long = MAX_16;
    3145        3054 :                 move16();
    3146        3054 :                 g_short = 0;
    3147        3054 :                 move16();
    3148             :             }
    3149      118024 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
    3150             :             {
    3151        2984 :                 g_long = 0;
    3152        2984 :                 move16();
    3153        2984 :                 g_short = MAX_16;
    3154        2984 :                 move16();
    3155             :             }
    3156             : 
    3157      126000 :             IF( s_max( g_short, g_long ) > 0 )
    3158             :             {
    3159      121078 :                 Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3160      121078 :                 Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    3161      121078 :                 past_dmx_nrg = EPSILON_FIX;
    3162      121078 :                 move32();
    3163      121078 :                 dmx_nrg = EPSILON_FIX;
    3164      121078 :                 move32();
    3165      121078 :                 len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    3166     3358168 :                 FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3167             :                 {
    3168     3237090 :                     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     3237090 :                     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     3237090 :                     move32();
    3172     3237090 :                     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     3237090 :                     move32();
    3174     3237090 :                     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      121078 :                 test();
    3177      121078 :                 IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) )
    3178             :                 {
    3179             :                     Word16 q_div;
    3180             :                     Word16 op;
    3181      116388 :                     op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */
    3182      116388 :                     q_sqrt = q_div;
    3183      116388 :                     move16();
    3184      116388 :                     norm_fac = Sqrt16( op, &q_sqrt );
    3185      116388 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */
    3186      116388 :                     IF( LE_32( q_sqrt, norm_l( g2 ) ) )
    3187             :                     {
    3188      104733 :                         g2 = L_shl( g2, q_sqrt );
    3189      104733 :                         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      104733 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3193      104733 :                                     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      104733 :                         q_sqrt = 0;
    3196      104733 :                         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       11655 :                         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       11655 :                         q_sqrt = 0;
    3205       11655 :                         move16();
    3206             :                     }
    3207      116388 :                     len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    3208     3334990 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    3209             :                     {
    3210     3218602 :                         DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); /* q_dft */
    3211     3218602 :                         move32();
    3212     3218602 :                         DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); /* q_dft */
    3213     3218602 :                         move32();
    3214             :                     }
    3215             :                 }
    3216             :             }
    3217             :             ELSE
    3218             :             {
    3219        4922 :                 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       83868 :     IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) )
    3225             :     {
    3226             :         /* apply stereo filling in ACELP BWE region */
    3227       73126 :         test();
    3228       73126 :         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       42926 :             *stop = bin0;
    3232       42926 :             move16();
    3233             :         }
    3234       30200 :         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        2056 :             dmx_nrg = EPSILON_FIX;
    3239        2056 :             move32();
    3240      476232 :             FOR( i = bin0; i < hStereoDft->NFFT / 2; i++ )
    3241             :             {
    3242      474176 :                 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        2056 :             hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); /* Q15 */
    3246        2056 :             move32();
    3247        2056 :             *stop = bin0;
    3248        2056 :             move16();
    3249             :         }
    3250       28144 :         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        1530 :             dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; /* Q15 */
    3255        1530 :             move32();
    3256        1530 :             d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY;
    3257        1530 :             move16();
    3258             : 
    3259        1530 :             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        1530 :             past_dmx_nrg = 0;
    3264        1530 :             move32();
    3265        1530 :             len = s_min( shr( hStereoDft->NFFT, 1 ), ( STEREO_DFT32MS_N_32k >> 1 ) );
    3266      226626 :             FOR( i = bin0; i < len; i++ ) // i < min( ( hStereoDft->NFFT / 2 ), ( hStereoDft->NFFT / 2 ) )
    3267             :             {
    3268      225096 :                 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        1530 :             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        1530 :             IF( past_dmx_nrg == 0 )
    3272             :             {
    3273        1106 :                 past_dmx_nrg = EPSILON_FX;
    3274        1106 :                 move32();
    3275             :             }
    3276             : 
    3277        5292 :             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        3762 :                 IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 )
    3281             :                 {
    3282         174 :                     g_short = 0;
    3283         174 :                     move16();
    3284             :                 }
    3285             :                 ELSE
    3286             :                 {
    3287        3588 :                     g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
    3288             :                 }
    3289             : 
    3290        3762 :                 IF( g_short > 0 )
    3291             :                 {
    3292             :                     Word16 q_divide;
    3293        3588 :                     Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide );
    3294        3588 :                     q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr );
    3295        3588 :                     op = Sqrt32( op, &q_norm_fac );
    3296        3588 :                     g2 = Mpy_32_32( pPredGain[b], op );                                                        /* Q31 */
    3297        3588 :                     pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); /* Q31 */
    3298        3588 :                     IF( q_norm_fac < 0 )
    3299             :                     {
    3300        2661 :                         g2 = L_shl( g2, q_norm_fac );
    3301        2661 :                         q_norm_fac = 0;
    3302        2661 :                         move16();
    3303             :                     }
    3304         927 :                     ELSE IF( q_norm_fac != 0 )
    3305             :                     {
    3306         686 :                         IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) )
    3307             :                         {
    3308         578 :                             g2 = pred_gain_avg;
    3309         578 :                             move32();
    3310             :                         }
    3311             :                         ELSE
    3312             :                         {
    3313         108 :                             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3314         108 :                                         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         108 :                             g2 = L_shl( g2, q_norm_fac );                                       /* Q31 */
    3317             :                         }
    3318             :                     }
    3319             :                     ELSE
    3320             :                     {
    3321         241 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3322         241 :                                     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        3588 :                     q_shift = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3326        3588 :                     move16();
    3327        3588 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3328      214922 :                     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      211334 :                         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      211334 :                         move32();
    3332      211334 :                         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      211334 :                         move32();
    3334             :                     }
    3335             :                 }
    3336             :                 ELSE
    3337             :                 {
    3338         174 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3339         174 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3340         174 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3341             :                 }
    3342             :             }
    3343             :         }
    3344             :         ELSE
    3345             :         {
    3346       86786 :             FOR( b = band0; b < nbands_respred; b++ )
    3347             :             {
    3348             :                 /* TCX/HQ core -> TCX/HQ core: business as usual */
    3349       60172 :                 d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    3350             :                 Word16 temp, temp_e;
    3351       60172 :                 temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/
    3352       60172 :                 IF( temp_e < 0 )
    3353             :                 {
    3354           0 :                     temp = shl( temp, temp_e );
    3355           0 :                     temp_e = 0;
    3356           0 :                     move16();
    3357             :                 }
    3358       60172 :                 temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    3359       60172 :                 temp_e = add( temp_e, 3 );
    3360       60172 :                 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       60172 :                 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       60172 :                 d_short_ind = s_max( d_short_ind, d_long_ind ); /* Q0 */
    3365             : 
    3366             :                 /* Even number of window sliding (assymmetric OLA) */
    3367       60172 :                 d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3368       60172 :                 move16();
    3369       60172 :                 d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3370       60172 :                 move16();
    3371             : 
    3372       60172 :                 d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    3373       60172 :                 move16();
    3374       60172 :                 d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */
    3375       60172 :                 move16();
    3376             : 
    3377             :                 /* Works as long as STEREO_DFT_PAST_MAX is a power of 2*/
    3378       60172 :                 d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3379       60172 :                 move16();
    3380       60172 :                 d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3381       60172 :                 move16();
    3382             : 
    3383       60172 :                 g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    3384       60172 :                 move16();
    3385       60172 :                 g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    3386       60172 :                 move16();
    3387             : 
    3388             :                 /* change mixing ratio if long and short delay are the same */
    3389       60172 :                 IF( EQ_16( d_short, d_long ) )
    3390             :                 {
    3391       56202 :                     g_short = MAX_16;
    3392       56202 :                     move16();
    3393       56202 :                     g_long = 0;
    3394       56202 :                     move16();
    3395             :                 }
    3396             : 
    3397             :                 /* Avoid transient components */
    3398       60172 :                 test();
    3399       60172 :                 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        1910 :                     g_long = 0;
    3403        1910 :                     move16();
    3404        1910 :                     g_short = 0;
    3405        1910 :                     move16();
    3406             :                 }
    3407       58262 :                 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       58220 :                 ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
    3415             :                 {
    3416          58 :                     g_long = 0;
    3417          58 :                     move16();
    3418          58 :                     g_short = MAX_16;
    3419          58 :                     move16();
    3420             :                 }
    3421       60172 :                 IF( EQ_32( hStereoDft->core_hist[d_short / 2], ACELP_CORE ) )
    3422             :                 {
    3423           0 :                     g_short = 0;
    3424           0 :                     move16();
    3425             :                 }
    3426       60172 :                 IF( EQ_32( hStereoDft->core_hist[d_long / 2], ACELP_CORE ) )
    3427             :                 {
    3428         366 :                     g_long = 0;
    3429         366 :                     move16();
    3430             :                 }
    3431             : 
    3432       60172 :                 IF( s_max( g_short, g_long ) > 0 )
    3433             :                 {
    3434             :                     Word16 q_div;
    3435             :                     Word32 op1;
    3436       58178 :                     Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3437       58178 :                     Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    3438       58178 :                     past_dmx_nrg = EPSILON_FIX;
    3439       58178 :                     move32();
    3440       58178 :                     dmx_nrg = EPSILON_FIX;
    3441       58178 :                     move32();
    3442       58178 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3443     3782140 :                     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     3723962 :                         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     3723962 :                         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     3723962 :                         move32();
    3449     3723962 :                         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     3723962 :                         move32();
    3451             : 
    3452     3723962 :                         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       58178 :                     op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); /* q_div + 16 */
    3455       58178 :                     q_norm_fac = q_div;
    3456       58178 :                     move16();
    3457       58178 :                     op1 = Sqrt32( op1, &q_norm_fac );
    3458       58178 :                     IF( GT_16( q_norm_fac, 16 ) )
    3459             :                     {
    3460           0 :                         assert( 0 );
    3461             :                     }
    3462       58178 :                     norm_fac = extract_h( op1 ); /* q_norm_fac - 16 */
    3463       58178 :                     q_norm_fac = sub( q_norm_fac, Q16 );
    3464       58178 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac );                                                                                                                        /* Q31 */
    3465       58178 :                     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       58178 :                     g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3468       58178 :                                 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       58178 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3470     3782140 :                     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     3723962 :                         DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); /* Q31 */
    3473     3723962 :                         move32();
    3474     3723962 :                         DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); /* Q31 */
    3475     3723962 :                         move32();
    3476             :                     }
    3477             :                 }
    3478             :                 ELSE
    3479             :                 {
    3480        1994 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3481        1994 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3482        1994 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3483             :                 }
    3484             :             }
    3485             :         }
    3486             :     }
    3487             : 
    3488             :     /* update buffers */
    3489      706310 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3490             :     {
    3491      622442 :         test();
    3492      622442 :         IF( hStereoDft->attackPresent || hStereoDft->wasTransient )
    3493             :         {
    3494       33886 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = MIN_32;
    3495       33886 :             move32();
    3496             :         }
    3497             :         ELSE
    3498             :         {
    3499      588556 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b];
    3500      588556 :             move32();
    3501             :         }
    3502             :     }
    3503             : 
    3504       83868 :     pop_wmops();
    3505       83868 :     return;
    3506             : }
    3507             : 
    3508             : /*---------------------------------------------------------------
    3509             :  * stereo_dft_adapt_sf_delay_fx()
    3510             :  *
    3511             :  *
    3512             :  * ---------------------------------------------------------------*/
    3513             : 
    3514       96154 : 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       96154 :     max_pg = 0;
    3530       96154 :     move32();
    3531       96154 :     sum_pg = 0;
    3532       96154 :     move32();
    3533       96154 :     q_sqrt = 0;
    3534       96154 :     move32();
    3535       96154 :     q_guard = sub( 15, norm_s( hStereoDft->nbands ) );
    3536             : 
    3537             :     /* find sum and maximum of prediction gains */
    3538      862014 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3539             :     {
    3540      765860 :         IF( GT_32( pPredGain[b], max_pg ) )
    3541             :         {
    3542      207668 :             max_pg = pPredGain[b];
    3543      207668 :             move16();
    3544             :         }
    3545      765860 :         sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); /* q_gurad */
    3546             :     }
    3547       96154 :     IF( GT_16( q_guard, hStereoDft->q_lt_pred_gain ) )
    3548             :     {
    3549         564 :         hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); /* q_guard */
    3550         564 :         hStereoDft->q_lt_pred_gain = q_guard;
    3551         564 :         move16();
    3552             :     }
    3553             :     ELSE
    3554             :     {
    3555       95590 :         sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); /* hStereoDft->q_lt_pred_gain */
    3556       95590 :         q_guard = hStereoDft->q_lt_pred_gain;
    3557       95590 :         move16();
    3558             :     }
    3559       96154 :     IF( sum_pg > 0 )
    3560             :     {
    3561             :         /* Calculate mean of the prediction gain */
    3562       88418 :         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       88418 :         new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) );                                                                                                                                  /* hStereoDft->q_lt_pred_gain */
    3566       88418 :         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       96154 :     var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; /* Q31 */
    3571       96154 :     move16();
    3572             : 
    3573       96154 :     IF( hStereoDft->lt_pred_gain_fx > 0 )
    3574             :     {
    3575       94405 :         Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) );
    3576       94405 :         IF( q_div < 0 )
    3577             :         {
    3578       84569 :             opr2 = L_shl( opr2, q_div );
    3579       84569 :             q_div = 0;
    3580       84569 :             move16();
    3581             :         }
    3582       94405 :         IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) )
    3583             :         {
    3584       13637 :             var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; /* Q31 */
    3585       13637 :             move32();
    3586             :         }
    3587             :         ELSE
    3588             :         {
    3589       80768 :             var_mean_ratio = L_shl( opr2, q_div ); /* Q31 */
    3590             :         }
    3591             :     }
    3592             : 
    3593       96154 :     IF( GT_32( max_pg, STEREO_DFT_STEFFI_PG_THRESHOLD_FX ) )
    3594             :     {
    3595             :         /* slow upwards */
    3596       51615 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; /* Q31 */
    3597       51615 :         move16();
    3598       51615 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; /* Q31 */
    3599       51615 :         move16();
    3600             :     }
    3601             :     ELSE
    3602             :     {
    3603             :         /* slow downwards */
    3604       44539 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; /* Q31 */
    3605       44539 :         move16();
    3606       44539 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; /* Q31 */
    3607       44539 :         move16();
    3608             :     }
    3609             : 
    3610       96154 :     IF( GT_16( extract_h( var_mean_ratio ), extract_h( hStereoDft->lt_var_mean_ratio_fx ) ) )
    3611             :     {
    3612       27310 :         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       27310 :         move32();
    3614             :     }
    3615             :     ELSE
    3616             :     {
    3617       68844 :         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       68844 :         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       96154 :     IF( GE_16( extract_h( hStereoDft->lt_var_mean_ratio_fx ), extract_h( STEREO_DFT_RES_RATIO_LIMIT_FX ) ) )
    3624             :     {
    3625       36392 :         target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); /* Q15 */
    3626       36392 :         move32();
    3627             :     }
    3628             :     ELSE
    3629             :     {
    3630       59762 :         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       59762 :                                               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       96154 :     hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); /* Q15 */
    3638       96154 :     q_sqrt = 0;
    3639       96154 :     move16();
    3640       96154 :     IF( EQ_16( hStereoDft->stefi_short_gain_fx, MIN_16 ) )
    3641             :     {
    3642       36392 :         hStereoDft->stefi_short_gain_fx = MAX_16;
    3643       36392 :         move16();
    3644       36392 :         hStereoDft->stefi_long_gain_fx = 0;
    3645       36392 :         move16();
    3646             :     }
    3647             :     ELSE
    3648             :     {
    3649       59762 :         op = hStereoDft->stefi_short_gain_fx;
    3650       59762 :         move16();
    3651       59762 :         hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); /* Q15 */
    3652       59762 :         IF( q_sqrt != 0 )
    3653             :         {
    3654        2668 :             hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); /* Q15 */
    3655             :         }
    3656             :     }
    3657             : 
    3658       96154 :     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       29278 : 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       29278 :     mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; /* Q0 */
    3787       29278 :     move16();
    3788       29278 :     itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; /* Q0 */
    3789             : 
    3790       29278 :     IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) )
    3791             :     {
    3792       18835 :         itd = imult1616( -1, itd ); /* Q0 */
    3793             :     }
    3794       29278 :     assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) );
    3795             : 
    3796             :     /*Convert back @ fs*/
    3797       29278 :     *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q15*/
    3798       29278 :     move32();
    3799       29278 :     return;
    3800             : }
    3801             : /*-------------------------------------------------------------------------
    3802             :  * stereo_dft_dec_read_BS()
    3803             :  *
    3804             :  * Read bitstream
    3805             :  *-------------------------------------------------------------------------*/
    3806             : 
    3807       53334 : 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       53334 :     k_offset = STEREO_DFT_OFFSET; /* Q0 */
    3844             : 
    3845       53334 :     move16();
    3846       53334 :     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       51842 :     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       42983 :         hStereoDft->frame_nodata = 0;
    3889       42983 :         hStereoDft->frame_sid_nodata = 0;
    3890       42983 :         hStereoDft->frame_sid = 0;
    3891       42983 :         move16();
    3892       42983 :         move16();
    3893       42983 :         move16();
    3894             : 
    3895       42983 :         st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); /* Q0 */
    3896             :     }
    3897             : 
    3898       44475 :     hStereoDft->reverb_flag = 0;
    3899             : 
    3900       44475 :     move16();
    3901             :     /* reverse the bitstream */
    3902     8173074 :     FOR( b = 0; b < *nb_bits; b++ )
    3903             :     {
    3904     8128599 :         bit_stream_side[b] = st->bit_stream[-b]; /* Q0 */
    3905     8128599 :         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     1467675 :     FOR( ; b < *nb_bits + 32; b++ )
    3910             :     {
    3911     1423200 :         bit_stream_side[b] = 0;
    3912     1423200 :         move16();
    3913             :     }
    3914       44475 :     st->bit_stream = bit_stream_side; /* Q0 */
    3915             : 
    3916             :     /*init*/
    3917       44475 :     max_bits = *nb_bits; /* Q0 */
    3918       44475 :     *nb_bits = 0;
    3919       44475 :     N_div = STEREO_DFT_NBDIV; /* Q0 */
    3920             : 
    3921       44475 :     move16();
    3922       44475 :     move16();
    3923       44475 :     move16();
    3924       44475 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    3925             :     {
    3926       42983 :         Copy32( hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, sg_tmp_fx, STEREO_DFT_BAND_MAX );                /*Q_31*/
    3927       42983 :         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       44475 :     IF( hStereoDft->frame_sid )
    3932             :     {
    3933        1492 :         hStereoDft->attackPresent = 0;
    3934        1492 :         move16();
    3935             :     }
    3936             :     ELSE
    3937             :     {
    3938       42983 :         hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); /* Q0 */
    3939       42983 :         ( *nb_bits ) = add( ( *nb_bits ), 1 );
    3940       42983 :         move16();
    3941       42983 :         move16();
    3942             :     }
    3943             : 
    3944             :     /* read res_cod_mode from bitstream */
    3945       44475 :     test();
    3946       44475 :     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       44475 :     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       42983 :         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       44475 :     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       42983 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); /* Q0 */
    3984       42983 :         move16();
    3985             :     }
    3986             : 
    3987       44475 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; /* Q0 */
    3988       44475 :     move16();
    3989       44475 :     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       44475 :     move16();
    3991       44475 :     hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); /* Q0 */
    3992       44475 :     move16();
    3993       44475 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); /* Q0 */
    3994       44475 :     move16();
    3995             : 
    3996             : 
    3997             :     /*Copy config. for all DFT frames*/
    3998       44475 :     set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) );
    3999       44475 :     set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) );
    4000       44475 :     set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) );
    4001       44475 :     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       88950 :     FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    4009             :     {
    4010             :         /* reset parameters */
    4011       44475 :         set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    4012       44475 :         hStereoDft->gipd_fx[k + k_offset] = 0;
    4013       44475 :         move32();
    4014       44475 :         set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    4015             : 
    4016       44475 :         test();
    4017       44475 :         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       44401 :             IF( !hStereoDft->frame_nodata )
    4027             :             {
    4028       44401 :                 n_bits = 0;
    4029       44401 :                 nb = st->next_bit_pos;
    4030       44401 :                 move16();
    4031       44401 :                 move16();
    4032       44401 :                 n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); /* Q0 */
    4033       44401 :                 nb = add( nb, n_bits );
    4034             : 
    4035       44401 :                 IF( hStereoDft->side_gain_flag_1 == 0 )
    4036             :                 {
    4037       34648 :                     b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); /* Q0 */
    4038       34648 :                     n_bits = add( n_bits, b );                                                                                           /* Q0 */
    4039             :                 }
    4040             :                 ELSE
    4041             :                 {
    4042        9753 :                     IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */
    4043             :                     {
    4044        8735 :                         b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); /* Q0 */
    4045        8735 :                         n_bits = add( n_bits, b );                                                                     /* Q0 */
    4046       88673 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    4047             :                         {
    4048       79938 :                             ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); /* Q0 */
    4049             :                         }
    4050             :                     }
    4051             :                     ELSE
    4052             :                     {
    4053        6897 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    4054             :                         {
    4055        5879 :                             ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
    4056        5879 :                             nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS );                             /* Q0 */
    4057        5879 :                             n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS );                     /* Q0 */
    4058             :                         }
    4059             :                     }
    4060             :                 }
    4061             : 
    4062      463198 :                 FOR( b = 0; b < hStereoDft->nbands; b++ )
    4063             :                 {
    4064      418797 :                     hStereoDft->side_gain_index_previous[b] = ind1[b]; /* Q0 */
    4065      418797 :                     move16();
    4066      418797 :                     hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); /* Q26 */
    4067      418797 :                     move32();
    4068             :                 }
    4069             : 
    4070       44401 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4071       44401 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );
    4072       44401 :                 move16();
    4073       44401 :                 move16();
    4074             :             }
    4075             : 
    4076             :             /*------------------------------------------------------------------*
    4077             :              * read ITDs
    4078             :              *-----------------------------------------------------------------*/
    4079             : 
    4080       44401 :             IF( !hStereoDft->frame_sid_nodata )
    4081             :             {
    4082       42983 :                 itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
    4083       42983 :                 ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS );  /*ITD mode flag: 1bit   Q0*/
    4084       42983 :                 move16();
    4085       42983 :                 hStereoDft->itd_fx[k + k_offset] = 0;
    4086       42983 :                 move32();
    4087       42983 :                 IF( itd_mode )
    4088             :                 {
    4089       25774 :                     ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); /* Q0 */
    4090       25774 :                     move16();
    4091       25774 :                     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       44401 :             n_bits = 0;
    4119       44401 :             move16();
    4120       44401 :             nb = st->next_bit_pos; /* Q0 */
    4121       44401 :             move16();
    4122             : 
    4123       44401 :             IF( !hStereoDft->frame_sid_nodata )
    4124             :             {
    4125             :                 /* Active frame */
    4126       42983 :                 hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
    4127       42983 :                 move16();
    4128       42983 :                 nb = add( nb, 1 );         /* Q0 */
    4129       42983 :                 n_bits = add( n_bits, 1 ); /* Q0 */
    4130       42983 :                 IF( hStereoDft->no_ipd_flag == 0 )
    4131             :                 {
    4132        4038 :                     ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); /* Q0 */
    4133        4038 :                     move16();
    4134        4038 :                     nb = add( nb, STEREO_DFT_GIPD_NBITS );         /* Q0 */
    4135        4038 :                     n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); /* Q0 */
    4136        4038 :                     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       44401 :             st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4162       44401 :             ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    4163       44401 :             move16();
    4164       44401 :             move16();
    4165             : 
    4166             :             /*------------------------------------------------------------------*
    4167             :              * read Residual parameters
    4168             :              *-----------------------------------------------------------------*/
    4169             : 
    4170             :             /* Residual prediction */ /* Switch it off if ITD detected */
    4171       44401 :             n_bits = 0;
    4172       44401 :             nb = st->next_bit_pos; /* Q0 */
    4173       44401 :             move16();
    4174       44401 :             move16();
    4175             : 
    4176             :             /* Not used in inactive frames */
    4177       44401 :             IF( !hStereoDft->frame_sid_nodata )
    4178             :             {
    4179       42983 :                 test();
    4180       42983 :                 IF( hStereoDft->res_pred_mode[k + k_offset] && hStereoDft->attackPresent == 0 )
    4181             :                 {
    4182       41432 :                     nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
    4183             : 
    4184       41432 :                     hStereoDft->reverb_flag = 0;
    4185       41432 :                     hStereoDft->nbands_respred = nbands; /* Q0 */
    4186       41432 :                     move16();
    4187       41432 :                     move16();
    4188             : 
    4189             :                     /* Read bit for adaptive SF (WB/SWB & FB) */
    4190       41432 :                     IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
    4191             :                     {
    4192       25001 :                         hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    4193       25001 :                         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS );                 /* Q0 */
    4194       25001 :                         move16();
    4195       25001 :                         move16();
    4196       25001 :                         nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    4197       25001 :                         IF( hStereoDft->reverb_flag )
    4198             :                         {
    4199        6636 :                             nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); /* Q0 */
    4200             :                         }
    4201             :                     }
    4202             : 
    4203             :                     /* get coding type */
    4204       41432 :                     b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); /* Q0 */
    4205       41432 :                     nb = add( nb, b );                                                         /* Q0 */
    4206       41432 :                     n_bits = add( n_bits, b );                                                 /* Q0 */
    4207             : 
    4208       41432 :                     IF( hStereoDft->res_pred_flag_0 == 0 )
    4209             :                     {
    4210        8355 :                         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        8355 :                         n_bits = add( n_bits, b );                                                                                                      /* Q0 */
    4212             :                     }
    4213             :                     ELSE
    4214             :                     {
    4215       33077 :                         IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) )
    4216             :                         {
    4217       29805 :                             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       29805 :                             n_bits = add( n_bits, b ); /* Q0 */
    4220      238953 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4221             :                             {
    4222      209148 :                                 ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); /* Q0 */
    4223      209148 :                                 move16();
    4224             :                             }
    4225             :                         }
    4226             :                         ELSE
    4227             :                         {
    4228       22955 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4229             :                             {
    4230       19683 :                                 ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4231       19683 :                                 move16();
    4232       19683 :                                 nb = add( nb, STEREO_DFT_RES_GAINS_BITS );         /* Q0 */
    4233       19683 :                                 n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4234             :                             }
    4235             :                         }
    4236             :                     }
    4237             : 
    4238      123587 :                     FOR( b = 0; b < hStereoDft->res_pred_band_min; b++ )
    4239             :                     {
    4240       82155 :                         I = 0;
    4241       82155 :                         move16();
    4242       82155 :                         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       82155 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4244       82155 :                         move16();
    4245       82155 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4246       82155 :                         move32();
    4247             :                     }
    4248             : 
    4249      327742 :                     FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4250             :                     {
    4251      286310 :                         I = ind1_pred[b]; /* Q0 */
    4252      286310 :                         move16();
    4253      286310 :                         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      286310 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4255      286310 :                         move16();
    4256      286310 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4257      286310 :                         move32();
    4258             :                     }
    4259             : 
    4260       69119 :                     FOR( ; b < hStereoDft->nbands; b++ )
    4261             :                     {
    4262       27687 :                         I = 0;
    4263       27687 :                         move16();
    4264       27687 :                         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       27687 :                         move16();
    4266       27687 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4267       27687 :                         move16();
    4268       27687 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4269       27687 :                         move32();
    4270             :                     }
    4271             :                 }
    4272             :                 ELSE
    4273             :                 {
    4274       16004 :                     FOR( b = 0; b < hStereoDft->nbands; b++ )
    4275             :                     {
    4276       14453 :                         I = 0;
    4277       14453 :                         move16();
    4278       14453 :                         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       14453 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4280       14453 :                         move16();
    4281       14453 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4282       14453 :                         move32();
    4283             :                     }
    4284             :                 }
    4285             : 
    4286       42983 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4287       42983 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    4288       42983 :                 move16();
    4289       42983 :                 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       44475 :     test();
    4308       44475 :     IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4309             :     {
    4310       44401 :         IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) )
    4311             :         {
    4312       35666 :             hStereoDft->sg_mem_corrupt = 0;
    4313       35666 :             move16();
    4314             :         }
    4315             :     }
    4316             : 
    4317       44475 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    4318             :     {
    4319             :         // hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft );
    4320       42983 :         hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); /* Q0 */
    4321             : 
    4322       42983 :         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       44475 :     test();
    4335       44475 :     IF( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata )
    4336             :     {
    4337             :         Word16 dec[STEREO_DFT_N_MAX_RES];
    4338             : 
    4339       17017 :         I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS );       /* Q0 */
    4340       17017 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */
    4341       17017 :         move16();
    4342       17017 :         move16();
    4343             : 
    4344       17017 :         push_wmops( "residual_decode" );
    4345       17017 :         IF( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
    4346             :         {
    4347       16556 :             ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state );
    4348             : 
    4349       16556 :             rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits );
    4350             : 
    4351       16556 :             hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); /* Q15 */
    4352       16556 :             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       16556 :             ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */
    4358       16556 :             move16();
    4359             : 
    4360       16556 :             ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec );
    4361             : 
    4362       16556 :             n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */
    4363             : 
    4364             : 
    4365       16556 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4366      678796 :             FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ )
    4367             :             {
    4368      662240 :                 dec[c] = shl_sat( dec[c], 8 ); /* Q0 */
    4369      662240 :                 move16();
    4370             :             }
    4371             : 
    4372       16556 :             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         461 :             set16_fx( dec, 0, hStereoDft->res_cod_line_max );
    4381         461 :             hStereoDft->res_global_gain_fx = 0;
    4382         461 :             n_bits = 0;
    4383         461 :             move32();
    4384         461 :             move16();
    4385         461 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4386             :         }
    4387             : 
    4388       17017 :         ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
    4389       17017 :         pop_wmops();
    4390             :     }
    4391             : 
    4392       44475 :     test();
    4393       44475 :     test();
    4394       44475 :     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       44475 :     test();
    4400       44475 :     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       44475 :         *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); /* Q0 */
    4407       44475 :         move32();
    4408             :     }
    4409       44475 :     return;
    4410             : }

Generated by: LCOV version 1.14