LCOV - code coverage report
Current view: top level - lib_enc - ivas_stereo_dft_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main -- merged total coverage @ 0c62f5312a76f89f3e6d6ab9a8d50516c9ab4059 Lines: 1266 1286 98.4 %
Date: 2025-12-17 10:49:08 Functions: 24 24 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "rom_enc.h"
      39             : #include "rom_com.h"
      40             : #include "prot.h"
      41             : #include "ivas_prot.h"
      42             : #include "ivas_cnst.h"
      43             : #include "ivas_rom_com.h"
      44             : #include "ivas_rom_enc.h"
      45             : #ifdef DEBUGGING
      46             : #include "debug.h"
      47             : #endif
      48             : #include "wmc_auto.h"
      49             : #ifdef DEBUG_PLOT
      50             : #include "deb_out.h"
      51             : #endif
      52             : #ifdef DEBUG_MODE_DFT
      53             : static FILE *pF = NULL;
      54             : #endif
      55             : 
      56             : 
      57             : /*-------------------------------------------------------------------*
      58             :  * Local constants
      59             :  *-------------------------------------------------------------------*/
      60             : 
      61             : #define STEREO_DFT_NRG_PAST_MAX_BAND    9
      62             : #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4
      63             : #define STEREO_DFT_DMX_CROSSOVER        ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */
      64             : #define ITD_VAD_E_BAND_N_INIT           200000
      65             : #define ITD_SID_PREV_FRAMES             5
      66             : 
      67             : 
      68             : /*-------------------------------------------------------------------------
      69             :  * Local function prototypes
      70             :  *------------------------------------------------------------------------*/
      71             : 
      72             : static void stereo_dft_enc_open( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const int32_t input_Fs, const int16_t max_bwidth );
      73             : 
      74             : static void stereo_dft_enc_compute_prm( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, float *DFT_L, float *DFT_R, int16_t k_offset, int16_t flag_quant, const int16_t sp_aud_decision0, const int16_t vad_flag, float *bin_nrgL, float *bin_nrgR, float *dot_prod_nrg_ratio );
      75             : 
      76             : static float stereo_dft_calc_mean_bipd( float *pIpd, float ipd_buf[STEREO_DFT_IPD_BUF_LEN] );
      77             : 
      78             : static float stereo_dft_calc_mean_ipd_change( float *pIpd, float *ipd_smooth, int16_t gipd_band_max );
      79             : 
      80             : static void stereo_dft_gipd_stabilization( float *pgIpd, float prev_gipd, float ipd_mean_change );
      81             : 
      82             : #ifdef DEBUG_MODE_DFT
      83             : static void stereo_dft_enc_get_nipd_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, float *pgIpd, const int16_t sp_aud_decision0, const float gainIPD );
      84             : #else
      85             : static void stereo_dft_enc_get_nipd_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const int16_t sp_aud_decision0, const float gainIPD );
      86             : #endif
      87             : 
      88             : static void stereo_dft_enc_get_reverb_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, float *pPredGain, float *sub_nrg_DMX, const float *sub_nrg_L, const float *sub_nrg_R, const int16_t k_offset, const float *bin_nrgL, const float *bin_nrgR );
      89             : 
      90             : static float stereo_dft_gain_offset( const float c, const int16_t itd );
      91             : 
      92             : static void side_gain_mode_decision( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, int16_t encoded_ind_GR[], const int16_t sp_aud_decision0, const int32_t last_core_brate );
      93             : 
      94             : static void res_pred_gain_mode_decision( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, int16_t encoded_ind_pred_GR[], const int16_t k_offset, const int32_t last_core_brate );
      95             : 
      96             : static void stereo_dft_enc_calculate_nrg_for_icbwe( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const float *DMX, const int32_t input_Fs );
      97             : 
      98             : static void stereo_dft_enc_get_res_cod_mode_flag( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const float res_nrg_all_curr, const float dmx_nrg_all_curr, float *res_dmx_ratio, float *frame_nrg_ratio );
      99             : 
     100             : 
     101             : /*-------------------------------------------------------------------------
     102             :  * stereo_dft_quantize_res_gains()
     103             :  *
     104             :  * Joint quantization routine for residual gains
     105             :  *------------------------------------------------------------------------*/
     106             : 
     107     8452686 : void stereo_dft_quantize_res_gains(
     108             :     const float *g,
     109             :     const float *r,
     110             :     float *gq,
     111             :     float *rq,
     112             :     int16_t *ig,
     113             :     int16_t *ir )
     114             : {
     115             :     int8_t sign;
     116             :     int16_t min_ind, i;
     117             :     float min_val, old_val, gg, rr;
     118             :     int16_t level, index;
     119             :     float ild;
     120             : 
     121     8452686 :     gg = *g;
     122             : 
     123     8452686 :     if ( rq != NULL )
     124             :     {
     125     8415635 :         rr = *r;
     126             :     }
     127             :     else
     128             :     {
     129       37051 :         rr = 0;
     130             :     }
     131             : 
     132     8452686 :     if ( gg < 0 )
     133             :     {
     134     4044771 :         gg = -gg;
     135     4044771 :         sign = -1;
     136             :     }
     137             :     else
     138             :     {
     139     4407915 :         sign = 1;
     140             :     }
     141             : 
     142             : #ifdef DEBUGGING
     143             :     /* the following assertions should be satisfied by the input data: */
     144             :     assert( 1 - gg * gg + EPSILON >= rr * rr / 2 );
     145             :     assert( gg <= 1 );
     146             : #endif
     147             : 
     148     8452686 :     gg = min( gg, 1 - EPSILON );
     149     8452686 :     rr = min( rr, sqrtf( 1 - gg * gg ) - EPSILON );
     150             : 
     151             :     /* we calculate the ILD ... */
     152     8452686 :     ild = 10.f * log10f( ( ( 1 + gg ) * ( 1 + gg ) + rr * rr ) / ( ( 1 - gg ) * ( 1 - gg ) + rr * rr ) );
     153             : 
     154             :     /* ... which is truncated to the range [0,50] ... */
     155     8452686 :     ild = ild > 50 ? 50 : ild;
     156             : 
     157             :     /* ... and determine the optimal ILD quantization ...*/
     158     8452686 :     min_ind = 0;
     159     8452686 :     old_val = fabsf( ild_q[0] - ild );
     160             : 
     161    27549616 :     for ( i = 1; i < 16; i++ )
     162             :     {
     163    27337325 :         min_val = fabsf( ild_q[i] - ild );
     164    27337325 :         if ( min_val < old_val )
     165             :         {
     166    19096930 :             min_ind = i;
     167             :         }
     168             :         else
     169             :         {
     170     8240395 :             break;
     171             :         }
     172    19096930 :         old_val = min_val;
     173             :     }
     174             : 
     175             :     /* ... which determines the quantization level: */
     176     8452686 :     level = min_ind;
     177             : 
     178             :     /* Now we look for the closest quantization point in the corresponding column of res_gain_energy_q*/
     179     8452686 :     old_val = FLT_MAX;
     180     8452686 :     min_ind = 0;
     181     8452686 :     index = -1;
     182    76074174 :     for ( i = 0; i < 8; i++ )
     183             :     {
     184    67621488 :         min_val = ( gg - dft_res_gains_q[8 * level + i][0] ) * ( gg - dft_res_gains_q[8 * level + i][0] ) + ( rr - dft_res_gains_q[8 * level + i][1] ) * ( rr - dft_res_gains_q[8 * level + i][1] );
     185             : 
     186    67621488 :         min_ind = min_val < old_val ? i : min_ind;
     187    67621488 :         old_val = min_val < old_val ? min_val : old_val;
     188             : 
     189    67621488 :         index = min_ind;
     190             :     }
     191             : 
     192             :     /* and here we are: */
     193     8452686 :     if ( rq != NULL )
     194             :     {
     195     8415635 :         *gq = dft_res_gains_q[8 * level + index][0] * sign;
     196     8415635 :         *rq = dft_res_gains_q[8 * level + index][1];
     197             : 
     198     8415635 :         *ir = index;
     199             :     }
     200     8452686 :     *ig = sign < 0 ? 15 - level : 15 + level;
     201             : 
     202     8452686 :     return;
     203             : }
     204             : 
     205             : /*-------------------------------------------------------------------------
     206             :  * stereo_dft_quantize_ipd()
     207             :  *
     208             :  * Quantize the IPD between [-PI, PI] on 3 or 4 bits
     209             :  *------------------------------------------------------------------------*/
     210             : 
     211       31225 : static void stereo_dft_quantize_ipd(
     212             :     const float *in,
     213             :     float *out,
     214             :     int16_t *ind,
     215             :     const int16_t bits )
     216             : {
     217             :     int16_t max_ind;
     218             :     float delta;
     219             : 
     220       31225 :     if ( bits == 2 ) /* New 2-bit phase quantization for the highest frequency band only */
     221             :     {
     222         850 :         delta = EVS_PI / 2.0f;
     223         850 :         max_ind = 3;
     224             :     }
     225       30375 :     else if ( bits == 3 )
     226             :     {
     227           0 :         delta = EVS_PI / 4.f;
     228           0 :         max_ind = 7;
     229             :     }
     230       30375 :     else if ( bits == 4 )
     231             :     {
     232       30375 :         delta = EVS_PI / 8.f;
     233       30375 :         max_ind = 15;
     234             :     }
     235             :     else
     236             :     {
     237           0 :         delta = EVS_PI / 4.f;
     238           0 :         max_ind = 7;
     239           0 :         assert( 0 );
     240             :     }
     241             : 
     242       31225 :     *ind = (int16_t) ( ( ( *in + EVS_PI ) / delta ) + 0.5f );
     243             : 
     244             :     /*modulo 2*PI*/
     245       31225 :     if ( *ind == max_ind + 1 )
     246             :     {
     247         496 :         *ind = 0;
     248             :     }
     249             : 
     250             :     /*Sanity check since no saturation can normally happen*/
     251       31225 :     *ind = min( max( *ind, 0 ), max_ind );
     252             : 
     253       31225 :     *out = *ind * delta - EVS_PI;
     254             : 
     255       31225 :     return;
     256             : }
     257             : 
     258             : 
     259             : /*-------------------------------------------------------------------------
     260             :  * stereo_dft_enc_create()
     261             :  *
     262             :  * Create DFT stereo handle
     263             :  *------------------------------------------------------------------------*/
     264             : 
     265       22777 : ivas_error stereo_dft_enc_create(
     266             :     STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* i/o: encoder DFT stereo handle   */
     267             :     const int32_t input_Fs,                 /* i  : input sampling rate         */
     268             :     const int16_t max_bwidth                /* i  : maximum encoded bandwidth   */
     269             : )
     270             : {
     271             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft_loc;
     272             :     int16_t tmpS;
     273             : 
     274       22777 :     if ( *hStereoDft != NULL )
     275             :     {
     276           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
     277             :     }
     278             : 
     279       22777 :     if ( ( hStereoDft_loc = (STEREO_DFT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_ENC_DATA ) ) ) == NULL )
     280             :     {
     281           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
     282             :     }
     283             : 
     284       22777 :     if ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
     285             :     {
     286           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
     287             :     }
     288             : 
     289       22777 :     if ( ( hStereoDft_loc->hItd = (ITD_DATA_HANDLE) malloc( sizeof( ITD_DATA ) ) ) == NULL )
     290             :     {
     291           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) );
     292             :     }
     293             : 
     294       22777 :     hStereoDft_loc->hConfig->force_mono_transmission = 0;
     295             : 
     296       22777 :     stereo_dft_config( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS );
     297             : 
     298       22777 :     stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth );
     299             : 
     300       22777 :     stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs,
     301       22777 :                                 hStereoDft_loc->hItd->hybrid_itd_max );
     302             : 
     303       22777 :     *hStereoDft = hStereoDft_loc;
     304             : 
     305       22777 :     return IVAS_ERR_OK;
     306             : }
     307             : 
     308             : 
     309             : /*-------------------------------------------------------------------------
     310             :  * stereo_dft_enc_open()
     311             :  *
     312             :  * Initialize DFT stereo handle
     313             :  *------------------------------------------------------------------------*/
     314             : 
     315       22777 : static void stereo_dft_enc_open(
     316             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle   */
     317             :     const int32_t input_Fs,                /* i  : input sampling rate         */
     318             :     const int16_t max_bwidth               /* i  : maximum encoded bandwidth   */
     319             : )
     320             : {
     321             :     int16_t NFFT_inner;
     322             :     float win[STEREO_DFT_OVL_MAX];
     323             : 
     324             :     /*Sizes*/
     325       22777 :     hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX_ENC * input_Fs / 48000 );
     326       22777 :     assert( ( ( input_Fs / FRAMES_PER_SEC ) / hStereoDft->N ) == 1 );
     327             : 
     328             :     /*Init. DFT sizes*/
     329       22777 :     hStereoDft->NFFT = (int16_t) ( STEREO_DFT_N_MAX_ENC * input_Fs / 48000 );
     330       22777 :     hStereoDft->dft_ovl = (int16_t) ( STEREO_DFT_OVL_MAX * input_Fs / 48000 );
     331       22777 :     mdct_window_sine( win, input_Fs, hStereoDft->dft_ovl, FULL_OVERLAP, IVAS_CPE_DFT );
     332             : 
     333       22777 :     hStereoDft->win_ana_energy = (float) hStereoDft->N - hStereoDft->dft_ovl;
     334       22777 :     hStereoDft->win_ana_energy += 2 * sum_f( win, hStereoDft->dft_ovl );
     335       22777 :     hStereoDft->win_ana_energy = hStereoDft->win_ana_energy / hStereoDft->NFFT;
     336       22777 :     set_f( hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k );
     337             : 
     338       22777 :     hStereoDft->dft_zp = (int16_t) ( STEREO_DFT_ZP_MAX_ENC * input_Fs / 48000 );
     339             : 
     340       22777 :     hStereoDft->dft_trigo_8k = dft_trigo_32k;
     341       22777 :     hStereoDft->dft_trigo_12k8 = dft_trigo_12k8;
     342       22777 :     hStereoDft->dft_trigo_16k = dft_trigo_32k;
     343       22777 :     hStereoDft->dft_trigo_32k = dft_trigo_32k;
     344             : 
     345       22777 :     hStereoDft->win_ana_8k = win_ana_8k;
     346       22777 :     hStereoDft->win_ana_12k8 = win_ana_12k8;
     347       22777 :     hStereoDft->win_ana_16k = win_ana_16k;
     348       22777 :     hStereoDft->win_ana_32k = win_ana_32k;
     349             : 
     350       22777 :     hStereoDft->win_8k = win_syn_8k;
     351       22777 :     hStereoDft->win_12k8 = win_syn_12k8;
     352       22777 :     hStereoDft->win_16k = win_syn_16k;
     353       22777 :     hStereoDft->win_32k = win_syn_32k;
     354             : 
     355       22777 :     if ( input_Fs == 16000 )
     356             :     {
     357         155 :         hStereoDft->dft_trigo = dft_trigo_32k;
     358         155 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
     359         155 :         hStereoDft->win_ana = win_ana_16k;
     360         155 :         hStereoDft->win = win_syn_16k;
     361             :     }
     362       22622 :     else if ( input_Fs == 32000 )
     363             :     {
     364        2526 :         hStereoDft->dft_trigo = dft_trigo_32k;
     365        2526 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
     366        2526 :         hStereoDft->win_ana = win_ana_32k;
     367        2526 :         hStereoDft->win = win_syn_32k;
     368             :     }
     369             :     else
     370             :     {
     371       20096 :         assert( input_Fs == 48000 );
     372       20096 :         hStereoDft->dft_trigo = dft_trigo_48k;
     373       20096 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP;
     374       20096 :         hStereoDft->win_ana = win_ana_48k;
     375       20096 :         hStereoDft->win = win_syn_48k;
     376             :     }
     377             : 
     378       22777 :     hStereoDft->win_mdct_8k = win_mdct_8k;
     379             : 
     380             :     /*I/O Buffers*/
     381       22777 :     set_zero( hStereoDft->output_mem_dmx, STEREO_DFT_OVL_MAX );
     382       22777 :     set_zero( hStereoDft->output_mem_dmx_12k8, STEREO_DFT_OVL_12k8 );
     383       22777 :     set_zero( hStereoDft->output_mem_dmx_16k, STEREO_DFT_OVL_16k );
     384       22777 :     set_zero( hStereoDft->output_mem_dmx_16k_shb, STEREO_DFT_OVL_16k );
     385       22777 :     set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k );
     386             : 
     387             :     /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
     388       22777 :     NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k;
     389       22777 :     hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
     390       22777 :     hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
     391             : 
     392             :     /*Set configuration*/
     393       22777 :     set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_ENC_DFT_NB );
     394       22777 :     if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hStereoDft->NFFT == STEREO_DFT_N_16k_ENC )
     395             :     {
     396             :         /* residual coding is only applied for 16 kHz sampling rate */
     397           0 :         set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->ada_wb_res_cod_mode, STEREO_DFT_ENC_DFT_NB );
     398             :     }
     399             :     else
     400             :     {
     401       22777 :         set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_ENC_DFT_NB );
     402             :     }
     403       22777 :     set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_ENC_DFT_NB );
     404             : 
     405             :     /* reset DFT stereo memories */
     406       22777 :     stereo_dft_enc_reset( hStereoDft );
     407             : 
     408       22777 :     return;
     409             : }
     410             : 
     411             : /*-------------------------------------------------------------------------
     412             :  * stereo_dft_enc_reset()
     413             :  *
     414             :  * Reset DFT stereo memories
     415             :  *------------------------------------------------------------------------*/
     416             : 
     417       44734 : void stereo_dft_enc_reset(
     418             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle   */
     419             : )
     420             : {
     421             :     int16_t i;
     422             :     /*reset parameters*/
     423       44734 :     set_zero( hStereoDft->side_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
     424       44734 :     set_s( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX );
     425       44734 :     set_s( hStereoDft->side_gain_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
     426       44734 :     set_s( hStereoDft->side_gain_index_ECprevious, 15, STEREO_DFT_BAND_MAX );
     427       44734 :     hStereoDft->side_gain_counter = 0;
     428       44734 :     hStereoDft->side_gain_bitdiff_lp = STEREO_DFT_BITDIFF_INIT;
     429       44734 :     set_zero( hStereoDft->gipd, STEREO_DFT_ENC_DFT_NB );
     430       44734 :     set_zero( hStereoDft->dot_prod_real_smooth, STEREO_DFT_BAND_MAX );
     431       44734 :     set_zero( hStereoDft->dot_prod_img_smooth, STEREO_DFT_BAND_MAX );
     432      626276 :     for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
     433             :     {
     434      581542 :         set_zero( hStereoDft->ipd_buf[i], STEREO_DFT_IPD_BUF_LEN );
     435             :     }
     436       44734 :     hStereoDft->prev_gipd = 0.f;
     437       44734 :     hStereoDft->gipd_index = 0;
     438       44734 :     set_zero( hStereoDft->res_pred_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
     439       44734 :     set_s( hStereoDft->res_pred_index_EC, 0, STEREO_DFT_BAND_MAX );
     440       44734 :     set_s( hStereoDft->res_pred_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
     441       44734 :     set_s( hStereoDft->res_pred_index_ECprevious, 0, STEREO_DFT_BAND_MAX );
     442       44734 :     hStereoDft->res_pred_counter = 0;
     443       44734 :     set_zero( hStereoDft->past_nrgL, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     444       44734 :     set_zero( hStereoDft->past_nrgR, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     445       44734 :     set_zero( hStereoDft->past_dot_prod_real, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     446       44734 :     set_zero( hStereoDft->past_dot_prod_imag, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
     447       44734 :     hStereoDft->nrg_past_pos = 0;
     448             : 
     449       44734 :     hStereoDft->res_dmx_ratio_lt = 1.0f;
     450       44734 :     hStereoDft->hangover_cnt0 = 0;
     451       44734 :     hStereoDft->hangover_cnt1 = 0;
     452       44734 :     hStereoDft->dmx_res_all_prev = EPSILON;
     453       44734 :     hStereoDft->last_res_cod_mode_modify_flag = 0;
     454       44734 :     hStereoDft->res_cod_sw_flag = 0;
     455       44734 :     hStereoDft->switch_fade_factor = 0.5f;
     456       44734 :     hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] = STEREO_DFT_RES_COD_1kHz;
     457      626276 :     for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
     458             :     {
     459      581542 :         hStereoDft->res_cod_NRG_M[i] = 0;
     460      581542 :         hStereoDft->res_cod_NRG_S[i] = 0;
     461             :     }
     462       44734 :     hStereoDft->old_snr = 0.f;
     463             : 
     464             : 
     465       44734 :     hStereoDft->reverb_flag = 0;
     466       44734 :     set_zero( hStereoDft->pre_sub_nrg_DMX, STEREO_DFT_BAND_MAX );
     467       44734 :     hStereoDft->diff_l_h_sm = 0.0f;
     468       44734 :     hStereoDft->diff_r_h_sm = 0.0f;
     469       44734 :     hStereoDft->prev_fac2 = 1.0f;
     470             : 
     471       44734 :     set_zero( hStereoDft->res_pred_gain_f, STEREO_DFT_BAND_MAX );
     472             : 
     473             :     /*misc*/
     474       44734 :     hStereoDft->no_ipd_flag = 1; /* Initialization of the no IPD variables */
     475       44734 :     hStereoDft->prev_no_ipd_flag = 1;
     476       44734 :     hStereoDft->no_ipd_cnt = 0;
     477       44734 :     hStereoDft->no_ipd_cnt1 = 0;
     478       44734 :     hStereoDft->attackPresent = 0;
     479       44734 :     hStereoDft->wasTransient = 0;
     480       44734 :     hStereoDft->gainIPD_sm = 1.f;
     481             : 
     482             : 
     483       44734 :     hStereoDft->voicing_lt = 0;
     484             : 
     485       44734 :     hStereoDft->flip_sign = 1;
     486             : 
     487       44734 :     hStereoDft->sfm = 0.f;
     488       44734 :     hStereoDft->sum_dot_prod_real = 0.f;
     489       44734 :     hStereoDft->sum_dot_prod_img = 0.f;
     490             : 
     491             :     /*Coherence*/
     492       44734 :     set_f( hStereoDft->xspec_smooth, 1.0f, STEREO_DFT_N_32k_ENC );
     493       44734 :     set_f( hStereoDft->Spd_L_smooth, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
     494       44734 :     set_f( hStereoDft->Spd_R_smooth, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
     495             : 
     496       44734 :     hStereoDft->currentNumUpdates = 0;
     497       44734 :     hStereoDft->expectedNumUpdates = FIXED_SID_RATE;
     498       44734 :     hStereoDft->resetFrames = 0;
     499       44734 :     hStereoDft->sid_gipd = 0;
     500       44734 :     hStereoDft->prev_sid_gipd = 0;
     501       44734 :     hStereoDft->prev_sid_no_ipd_flag = 1;
     502             : 
     503       44734 :     hStereoDft->coh_fade_counter = 0;
     504             : 
     505             :     /* Xtalk classifier */
     506       44734 :     hStereoDft->hItd->prev_m1 = 0;
     507       44734 :     hStereoDft->hItd->prev_m2 = 0;
     508       44734 :     hStereoDft->hItd->prev_itd1 = 0;
     509       44734 :     hStereoDft->hItd->prev_itd2 = 0;
     510             : 
     511       44734 :     hStereoDft->first_frm_flag = 1;
     512             : 
     513             : #ifdef DEBUG_MODE_DFT
     514             :     hStereoDft->verbose = 1;
     515             : #endif
     516             : 
     517       44734 :     stereo_enc_itd_init( hStereoDft->hItd );
     518             : 
     519       44734 :     return;
     520             : }
     521             : 
     522             : 
     523             : /*-------------------------------------------------------------------------
     524             :  * stereo_enc_itd_init()
     525             :  *
     526             :  * initialize ITD struct
     527             :  *------------------------------------------------------------------------*/
     528             : 
     529       46605 : void stereo_enc_itd_init(
     530             :     ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle               */
     531             : )
     532             : {
     533       46605 :     hItd->prev_itd = 0;
     534       46605 :     set_zero( hItd->itd, STEREO_DFT_ENC_DFT_NB );
     535       46605 :     set_zero( hItd->deltaItd, STEREO_DFT_ENC_DFT_NB );
     536       46605 :     set_s( hItd->td_itd, 0, STEREO_DFT_ENC_DFT_NB );
     537       46605 :     set_s( hItd->td_itd_32k, 0, STEREO_DFT_ENC_DFT_NB );
     538       46605 :     set_s( hItd->itd_index, 0, STEREO_DFT_ENC_DFT_NB );
     539       46605 :     set_zero( hItd->xcorr_smooth, STEREO_DFT_N_32k_ENC );
     540       46605 :     hItd->lp_phat_peak = 0.f;
     541       46605 :     hItd->itd_hangover = 0;
     542       46605 :     hItd->itd_cnt = 0;
     543       46605 :     hItd->prev_sum_nrg_L_lb = 0.f;
     544       46605 :     set_zero( hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX );
     545       46605 :     set_f( hItd->E_band_n, (float) ITD_VAD_E_BAND_N_INIT, STEREO_DFT_ITD_VAD_BAND_NUM );
     546       46605 :     hItd->vad_frm_cnt = 0;
     547       46605 :     hItd->pre_vad = 0;
     548       46605 :     hItd->itd_nonzero_cnt = 0;
     549       46605 :     set_zero( hItd->acorr_L, STEREO_DFT_BAND_MAX );
     550       46605 :     set_zero( hItd->acorr_R, STEREO_DFT_BAND_MAX );
     551       46605 :     hItd->cohSNR = 15.f;
     552       46605 :     hItd->itd_thres = 0.f;
     553       46605 :     hItd->valid_itd_cnt = 0;
     554             : 
     555       46605 :     hItd->detected_itd_flag = 0;
     556       46605 :     hItd->itd_tracking = 0;
     557       46605 :     hItd->prev_max = 0.f;
     558       46605 :     hItd->prev_index = 0;
     559       46605 :     hItd->prev_avg_max = 0.f;
     560       46605 :     hItd->currFlatness = 0.f;
     561             : 
     562             :     /* Xtalk classifier */
     563       46605 :     hItd->prev_m1 = 0;
     564       46605 :     hItd->prev_m2 = 0;
     565       46605 :     hItd->prev_itd1 = 0;
     566       46605 :     hItd->prev_itd2 = 0;
     567             : 
     568       46605 :     hItd->hybrid_itd_max = 0;
     569       46605 :     return;
     570             : }
     571             : 
     572             : 
     573             : /*--------------------------------------------------------------------------
     574             :  * stereo_dft_enc_update()
     575             :  *
     576             :  * Update DFT stereo memories for new frame
     577             :  *--------------------------------------------------------------------------*/
     578             : 
     579      912789 : void stereo_dft_enc_update(
     580             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle     */
     581             :     const int16_t max_bwidth               /* i  : maximum encoded bandwidth */
     582             : )
     583             : {
     584             :     int16_t i, k_offset;
     585             :     int16_t NFFT_inner;
     586             : 
     587             :     /* Initialization */
     588      912789 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
     589             : 
     590             :     /* Update the parameters and serial */
     591    12779046 :     for ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
     592             :     {
     593    11866257 :         hStereoDft->side_gain[i] = hStereoDft->side_gain[STEREO_DFT_BAND_MAX + i];
     594    11866257 :         hStereoDft->res_pred_gain[i] = hStereoDft->res_pred_gain[STEREO_DFT_BAND_MAX + i];
     595             :     }
     596             : 
     597     1825578 :     for ( i = 0; i < k_offset; i++ )
     598             :     {
     599      912789 :         hStereoDft->gipd[i] = hStereoDft->gipd[i + 1];
     600             :     }
     601             : 
     602             :     /*Update configurations*/
     603     1825578 :     for ( i = 0; i < k_offset; i++ )
     604             :     {
     605      912789 :         hStereoDft->band_res[i] = hStereoDft->band_res[i + 1];
     606      912789 :         hStereoDft->hItd->itd[i] = hStereoDft->hItd->itd[i + 1];
     607      912789 :         hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + 1];
     608      912789 :         hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + 1];
     609             :     }
     610             : 
     611             :     /*Set new configurations*/
     612      912789 :     hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
     613             : 
     614      912789 :     if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hStereoDft->NFFT == STEREO_DFT_N_16k_ENC )
     615             :     {
     616       35514 :         hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->ada_wb_res_cod_mode;
     617             :     }
     618             :     else
     619             :     {
     620      877275 :         hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->res_cod_mode;
     621             :     }
     622      912789 :     hStereoDft->res_pred_mode[k_offset] = hStereoDft->hConfig->res_pred_mode;
     623             : 
     624      912789 :     hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag;
     625      912789 :     hStereoDft->res_cod_sw_flag = 0;
     626             : 
     627             :     /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */
     628      912789 :     NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k;
     629             : 
     630      912789 :     hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
     631      912789 :     hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
     632             : 
     633             :     /*Compute main parameters*/
     634      912789 :     hStereoDft->gipd_band_max = dft_band_ipd[1][3];
     635      912789 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
     636      912789 :     hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) );
     637      912789 :     hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 );
     638      912789 :     hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
     639             : 
     640             : #ifdef DEBUG_MODE_DFT
     641             :     /*Compute the expected bitrate*/
     642             :     if ( hStereoDft->verbose )
     643             :     {
     644             :         int16_t tmp, nbits, N_div_param, bits_itd;
     645             :         int16_t input_frame = hStereoDft->N;
     646             :         int32_t input_Fs;
     647             :         input_Fs = input_frame * FRAMES_PER_SEC;
     648             : 
     649             :         hStereoDft->verbose = 0;
     650             : 
     651             :         /*init*/
     652             :         N_div_param = 1;
     653             : 
     654             :         nbits = 0; /*header: 0 bits*/
     655             : 
     656             :         fprintf( stderr, "Stereo DFT\n" );
     657             : 
     658             :         /*ITD*/
     659             :         tmp = 1 + STEREO_DFT_ITD_NBITS;
     660             :         nbits += 1;
     661             :         bits_itd = STEREO_DFT_ITD_NBITS;
     662             :         fprintf( stderr, "\t ITD: %.2f kbps\n", tmp * input_Fs / ( 1000.f * input_frame ) );
     663             : 
     664             :         /*SIDE_GAIN*/
     665             :         tmp = hStereoDft->nbands * 5 * N_div_param;
     666             :         nbits += tmp;
     667             :         fprintf( stderr, "\t SIDE_GAIN: %.2f kbps\n", tmp * input_Fs / ( 1000.f * input_frame ) );
     668             : 
     669             : 
     670             :         /*residual coding prediction*/
     671             :         tmp = 0;
     672             :         if ( hStereoDft->hConfig->res_pred_mode )
     673             :         {
     674             :             tmp = ( hStereoDft->nbands - hStereoDft->res_pred_band_min ) * 3 * N_div_param;
     675             :             fprintf( stderr, "\t Res pred.: %.2f kbps\n", tmp * input_Fs / ( 1000.f * input_frame ) );
     676             :         }
     677             :         nbits += max( tmp, bits_itd );
     678             : 
     679             :         /*residual coding*/
     680             :         if ( hStereoDft->hConfig->res_cod_mode )
     681             :         {
     682             :             tmp = hStereoDft->res_cod_bits;
     683             :             nbits += tmp;
     684             :             fprintf( stderr, "\t Res cod.: %.2f kbps\n", tmp * input_Fs / ( 1000.f * input_frame ) );
     685             :         }
     686             : 
     687             :         fprintf( stderr, "\t Total: %.2f kbps\n", nbits * input_Fs / ( 1000.f * input_frame ) );
     688             :     }
     689             : #endif /*DEBUGGING*/
     690             : 
     691      912789 :     return;
     692             : }
     693             : 
     694             : 
     695             : /*-------------------------------------------------------------------------
     696             :  * stereo_dft_enc_destroy()
     697             :  *
     698             :  * destroy DFT stereo handle
     699             :  *-------------------------------------------------------------------------*/
     700             : 
     701       22777 : void stereo_dft_enc_destroy(
     702             :     STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle     */
     703             : )
     704             : {
     705       22777 :     if ( ( *hStereoDft )->hConfig != NULL )
     706             :     {
     707       22777 :         free( ( *hStereoDft )->hConfig );
     708       22777 :         ( *hStereoDft )->hConfig = NULL;
     709             :     }
     710             : 
     711       22777 :     if ( ( *hStereoDft )->hItd != NULL )
     712             :     {
     713       22777 :         free( ( *hStereoDft )->hItd );
     714       22777 :         ( *hStereoDft )->hItd = NULL;
     715             :     }
     716             : 
     717       22777 :     free( *hStereoDft );
     718       22777 :     *hStereoDft = NULL;
     719             : 
     720       22777 :     return;
     721             : }
     722             : 
     723             : 
     724             : /*-------------------------------------------------------------------------
     725             :  * stereo_dft_enc_analyze()
     726             :  *
     727             :  * DFT analysis on a 20ms frame
     728             :  *-------------------------------------------------------------------------*/
     729             : 
     730     1093099 : void stereo_dft_enc_analyze(
     731             :     Encoder_State **sts,                           /* i/o: encoder state structure     */
     732             :     const int16_t n_channels,                      /* i  : number of input channels    */
     733             :     const int16_t input_frame,                     /* i  : input frame length          */
     734             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,         /* i/o: encoder stereo handle       */
     735             :     STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,       /* i/o: encoder MDCT stereo handle  */
     736             :     float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o  : DFT buffers                 */
     737             :     float *input_mem[CPE_CHANNELS]                 /* i/o: input buffer memory         */
     738             : )
     739             : {
     740             :     int16_t i, n;
     741             :     float *pDFT_L, *pDFT_R;
     742             :     int16_t N, NFFT;
     743             :     int16_t dft_zp, dft_ovl;
     744             :     const float *pWin, *pTrigo;
     745             :     int16_t offset;
     746             :     float *input[CPE_CHANNELS], *mem[CPE_CHANNELS];
     747             :     float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1];
     748             :     int16_t trigo_step;
     749             : 
     750             : 
     751     1093099 :     push_wmops( "DFT_analysis" );
     752             : 
     753             :     /*-----------------------------------------------------------------*
     754             :      * Initialization
     755             :      *-----------------------------------------------------------------*/
     756             : 
     757     3279297 :     for ( n = 0; n < n_channels; n++ )
     758             :     {
     759     2186198 :         input[n] = sts[n]->input;
     760     2186198 :         mem[n] = input_mem[n];
     761             :     }
     762             : 
     763             : #ifdef DEBUG_MODE_DFT
     764             :     {
     765             :         int16_t tmp[1024];
     766             : 
     767             :         /* stereo side info is only simulated  */
     768             :         for ( i = 0; i < input_frame; i++ )
     769             :         {
     770             :             tmp[i] = (int16_t) ( input[0][i] + 0.5f );
     771             :         }
     772             :         dbgwrite( tmp, sizeof( int16_t ), input_frame, 1, "./res/stereo_dft_ch0_input.pcm" );
     773             :         for ( i = 0; i < input_frame; i++ )
     774             :         {
     775             :             tmp[i] = (int16_t) ( input[1][i] + 0.5f );
     776             :         }
     777             :         dbgwrite( tmp, sizeof( int16_t ), input_frame, 1, "./res/stereo_dft_ch1_input.pcm" );
     778             :     }
     779             : #endif
     780             : 
     781             :     /*-----------------------------------------------------------------*
     782             :      * DFT Analysis
     783             :      *-----------------------------------------------------------------*/
     784             : 
     785     1093099 :     pDFT_L = DFT[0];
     786     1093099 :     pDFT_R = DFT[1];
     787             : 
     788     1093099 :     if ( hStereoDft != NULL )
     789             :     {
     790      912789 :         N = hStereoDft->N;
     791      912789 :         NFFT = hStereoDft->NFFT;
     792      912789 :         dft_zp = hStereoDft->dft_zp;
     793      912789 :         dft_ovl = hStereoDft->dft_ovl;
     794      912789 :         offset = -dft_ovl;
     795      912789 :         pWin = hStereoDft->win_ana;
     796      912789 :         pTrigo = hStereoDft->dft_trigo;
     797      912789 :         trigo_step = hStereoDft->dft_trigo_step;
     798             :     }
     799             :     else
     800             :     {
     801      180310 :         N = hStereoMdct->hDft_ana->N;
     802      180310 :         NFFT = hStereoMdct->hDft_ana->NFFT;
     803      180310 :         dft_zp = hStereoMdct->hDft_ana->dft_zp;
     804      180310 :         dft_ovl = hStereoMdct->hDft_ana->dft_ovl;
     805      180310 :         offset = -dft_ovl;
     806      180310 :         pWin = hStereoMdct->hDft_ana->win_ana;
     807      180310 :         pTrigo = hStereoMdct->hDft_ana->dft_trigo;
     808      180310 :         trigo_step = hStereoMdct->hDft_ana->dft_trigo_step;
     809             :     }
     810             : 
     811   397746379 :     for ( i = 0; i < NFFT / 4; i++ )
     812             :     {
     813   396653280 :         trigo_enc[i] = pTrigo[i * trigo_step];
     814   396653280 :         trigo_enc[NFFT / 2 - i] = pTrigo[i * trigo_step];
     815             :     }
     816     1093099 :     trigo_enc[NFFT / 4] = pTrigo[NFFT / 4 * trigo_step];
     817             : 
     818             :     /*Forwards FFT:  L and R*/
     819             :     /*zero padding*/
     820   224210569 :     for ( i = 0; i < dft_zp; i++ )
     821             :     {
     822   223117470 :         pDFT_L[i] = 0.f;
     823   223117470 :         pDFT_L[NFFT - 1 - i] = 0.f;
     824             : 
     825   223117470 :         pDFT_R[i] = 0.f;
     826   223117470 :         pDFT_R[NFFT - 1 - i] = 0.f;
     827             :     }
     828             : 
     829             :     /*overlapping parts*/
     830   348164719 :     for ( i = 0; i < dft_ovl; i++ )
     831             :     {
     832   347071620 :         pDFT_L[dft_zp + i] = mem[0][i] * pWin[i];
     833   347071620 :         pDFT_L[dft_zp + N + dft_ovl - 1 - i] = input[0][offset + N + dft_ovl - 1 - i] * pWin[i];
     834             : 
     835   347071620 :         pDFT_R[dft_zp + i] = mem[1][i] * pWin[i];
     836   347071620 :         pDFT_R[dft_zp + N + dft_ovl - 1 - i] = input[1][offset + N + dft_ovl - 1 - i] * pWin[i];
     837             :     }
     838             : 
     839             :     /*middle part*/
     840   447328039 :     for ( i = 0; i < N - dft_ovl; i++ )
     841             :     {
     842   446234940 :         pDFT_L[dft_zp + dft_ovl + i] = input[0][offset + dft_ovl + i];
     843             : 
     844   446234940 :         pDFT_R[dft_zp + dft_ovl + i] = input[1][offset + dft_ovl + i];
     845             :     }
     846             : 
     847     1093099 :     rfft( pDFT_L, trigo_enc, NFFT, -1 );
     848     1093099 :     rfft( pDFT_R, trigo_enc, NFFT, -1 );
     849             : 
     850             :     /* update pointers to overlap memory */
     851     3279297 :     for ( n = 0; n < n_channels; n++ )
     852             :     {
     853     2186198 :         mem[n] = &input[n][N - dft_ovl];
     854             :     }
     855             : 
     856             : #ifdef DEBUG_MODE_DFT
     857             :     if ( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hConfig->itd_mode && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] )
     858             : #else
     859     1093099 :     if ( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] )
     860             : #endif
     861             :     {
     862      246129 :         for ( n = 0; n < n_channels; n++ )
     863             :         {
     864      164086 :             mvr2r( hStereoDft->input_mem_itd[n], input_mem[n], dft_ovl );
     865             :         }
     866             :     }
     867             :     else
     868             :     {
     869     3033168 :         for ( n = 0; n < n_channels; n++ )
     870             :         {
     871     2022112 :             mvr2r( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl );
     872             :         }
     873             :     }
     874             : 
     875     1093099 :     pop_wmops();
     876     1093099 :     return;
     877             : }
     878             : 
     879             : 
     880             : /*-------------------------------------------------------------------------
     881             :  * stereo_dft_enc_synthesize()
     882             :  *
     883             :  * Inverse DFT on a 20ms frame
     884             :  *-------------------------------------------------------------------------*/
     885             : 
     886     3317410 : float stereo_dft_enc_synthesize(
     887             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle       */
     888             :     float *output,                         /* o  : output synthesis            */
     889             :     const int16_t chan,                    /* i  : channel number              */
     890             :     const int32_t input_Fs,                /* i  : input sampling rate         */
     891             :     const int32_t output_sampling_rate,    /* i  : output sampling rate        */
     892             :     const int16_t L_frame                  /* i  : frame length at internal Fs */
     893             : )
     894             : {
     895             :     int16_t i, j, sign;
     896             :     float *pDFT_in;
     897             :     int16_t offset, NFFT, N, ovl, zp;
     898             :     float fac;
     899             :     float *mem;
     900             :     const float *trigo, *win, *win_ana;
     901             :     float tmp[STEREO_DFT_N_MAX_ENC];
     902             :     float nrg;
     903             :     float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1];
     904             :     int16_t trigo_step;
     905             : 
     906             : 
     907             :     /*-----------------------------------------------------------------*
     908             :      * Initialization
     909             :      *-----------------------------------------------------------------*/
     910             : 
     911     3317410 :     if ( L_frame > 0 )
     912             :     {
     913      421309 :         assert( ( output_sampling_rate == 16000 ) && "High-band generation only possible at 16kHz!" );
     914             :     }
     915     3317410 :     nrg = 0.f;
     916             : 
     917     3317410 :     hStereoDft->icbweRefEner = 0;
     918     3317410 :     hStereoDft->lbEner = 0;
     919             : 
     920     3317410 :     if ( chan == 0 )
     921             :     {
     922     3045604 :         pDFT_in = hStereoDft->DFT[0];
     923             :     }
     924             :     else
     925             :     {
     926      271806 :         pDFT_in = hStereoDft->DFT[1];
     927             :     }
     928             : 
     929     3317410 :     if ( output_sampling_rate == input_Fs )
     930             :     {
     931      912789 :         assert( chan == 0 );
     932             : 
     933      912789 :         NFFT = hStereoDft->NFFT;
     934      912789 :         fac = 1.f;
     935      912789 :         N = hStereoDft->N;
     936      912789 :         ovl = hStereoDft->dft_ovl;
     937      912789 :         zp = hStereoDft->dft_zp;
     938      912789 :         trigo = hStereoDft->dft_trigo;
     939      912789 :         trigo_step = hStereoDft->dft_trigo_step;
     940      912789 :         if ( L_frame > 0 )
     941             :         {
     942           0 :             mem = hStereoDft->output_mem_dmx_16k_shb;
     943             :         }
     944             :         else
     945             :         {
     946      912789 :             mem = hStereoDft->output_mem_dmx;
     947             :         }
     948      912789 :         win = hStereoDft->win;
     949      912789 :         win_ana = hStereoDft->win_ana;
     950             : 
     951      912789 :         push_wmops( "DFT_synth_fs" );
     952             :     }
     953     2404621 :     else if ( output_sampling_rate == INT_FS_12k8 )
     954             :     {
     955      912789 :         assert( chan == 0 );
     956             : 
     957      912789 :         NFFT = STEREO_DFT_N_12k8_ENC;
     958      912789 :         N = STEREO_DFT_HOP_12k8_ENC;
     959      912789 :         zp = STEREO_DFT_ZP_12k8_ENC;
     960      912789 :         fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
     961      912789 :         ovl = STEREO_DFT_OVL_12k8;
     962      912789 :         trigo = hStereoDft->dft_trigo_12k8;
     963      912789 :         trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP;
     964      912789 :         mem = hStereoDft->output_mem_dmx_12k8;
     965      912789 :         win = hStereoDft->win_12k8;
     966      912789 :         win_ana = hStereoDft->win_ana_12k8;
     967             : 
     968      912789 :         push_wmops( "DFT_synth_12k8" );
     969             :     }
     970     1491832 :     else if ( output_sampling_rate == 16000 )
     971             :     {
     972     1183810 :         assert( chan == 0 );
     973             : 
     974     1183810 :         NFFT = STEREO_DFT_N_16k_ENC;
     975     1183810 :         N = STEREO_DFT_HOP_16k_ENC;
     976     1183810 :         zp = STEREO_DFT_ZP_16k_ENC;
     977     1183810 :         fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
     978     1183810 :         ovl = STEREO_DFT_OVL_16k;
     979     1183810 :         trigo = hStereoDft->dft_trigo_16k;
     980     1183810 :         trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
     981     1183810 :         if ( L_frame > 0 )
     982             :         {
     983      421309 :             mem = hStereoDft->output_mem_dmx_16k_shb;
     984             : 
     985      421309 :             push_wmops( "DFT_synth_16k_shb" );
     986             :         }
     987             :         else
     988             :         {
     989      762501 :             mem = hStereoDft->output_mem_dmx_16k;
     990             : 
     991      762501 :             push_wmops( "DFT_synth_16k" );
     992             :         }
     993     1183810 :         win = hStereoDft->win_16k;
     994     1183810 :         win_ana = hStereoDft->win_ana_16k;
     995             :     }
     996      308022 :     else if ( output_sampling_rate == 32000 )
     997             :     {
     998       36216 :         assert( chan == 0 );
     999             : 
    1000       36216 :         NFFT = STEREO_DFT_N_32k_ENC;
    1001       36216 :         N = STEREO_DFT_HOP_32k_ENC;
    1002       36216 :         zp = STEREO_DFT_ZP_32k_ENC;
    1003       36216 :         fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1004       36216 :         ovl = STEREO_DFT_OVL_32k;
    1005       36216 :         trigo = hStereoDft->dft_trigo_32k;
    1006       36216 :         trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
    1007       36216 :         mem = hStereoDft->output_mem_dmx_32k;
    1008       36216 :         win = hStereoDft->win_32k;
    1009       36216 :         win_ana = hStereoDft->win_ana_32k;
    1010             : 
    1011       36216 :         push_wmops( "DFT_synth_32k" );
    1012             :     }
    1013      271806 :     else if ( output_sampling_rate == 8000 )
    1014             :     {
    1015      271806 :         assert( chan == 1 );
    1016             : 
    1017      271806 :         NFFT = STEREO_DFT_N_8k_ENC;
    1018      271806 :         N = STEREO_DFT_HOP_8k_ENC;
    1019      271806 :         zp = STEREO_DFT_ZP_8k_ENC;
    1020      271806 :         fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
    1021      271806 :         ovl = STEREO_DFT_OVL_8k;
    1022      271806 :         trigo = hStereoDft->dft_trigo_8k;
    1023      271806 :         trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP;
    1024      271806 :         mem = hStereoDft->output_mem_res_8k;
    1025      271806 :         win = hStereoDft->win_8k;
    1026      271806 :         win_ana = hStereoDft->win_ana_8k;
    1027             : 
    1028      271806 :         push_wmops( "DFT_synth_8k" );
    1029             :     }
    1030             :     else
    1031             :     {
    1032           0 :         assert( 0 && "DFT stereo: sampling rate not supported!" );
    1033             :         NFFT = -1;       /* to avoid compilation warning */
    1034             :         fac = -1;        /* to avoid compilation warning */
    1035             :         N = -1;          /* to avoid compilation warning */
    1036             :         zp = -1;         /* to avoid compilation warning */
    1037             :         win = NULL;      /* to avoid compilation warning */
    1038             :         trigo = NULL;    /* to avoid compilation warning */
    1039             :         trigo_step = -1; /* to avoid compilation warning */
    1040             :         ovl = -1;        /* to avoid compilation warning */
    1041             :         mem = NULL;      /* to avoid compilation warning */
    1042             :         win_ana = NULL;  /* to avoid compilation warning */
    1043             :     }
    1044             : 
    1045     3317410 :     offset = 0;
    1046             : 
    1047   682422882 :     for ( i = 0; i < NFFT / 4; i++ )
    1048             :     {
    1049   679105472 :         trigo_enc[i] = trigo[i * trigo_step];
    1050   679105472 :         trigo_enc[NFFT / 2 - i] = trigo[i * trigo_step];
    1051             :     }
    1052     3317410 :     trigo_enc[NFFT / 4] = trigo[NFFT / 4 * trigo_step];
    1053             : 
    1054             :     /*-----------------------------------------------------------------*
    1055             :      * Synthesizing & resampling
    1056             :      *-----------------------------------------------------------------*/
    1057             : 
    1058     3317410 :     offset = -ovl;
    1059             : 
    1060     3317410 :     if ( L_frame == L_FRAME || L_frame == L_FRAME16k )
    1061             :     {
    1062   135240189 :         for ( i = (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i < (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
    1063             :         {
    1064   134818880 :             hStereoDft->icbweRefEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
    1065             :         }
    1066   135240189 :         for ( i = 0; i < (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
    1067             :         {
    1068   134818880 :             hStereoDft->lbEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
    1069             :         }
    1070      421309 :         hStereoDft->icbweRefEner *= fac;
    1071      421309 :         hStereoDft->lbEner *= fac;
    1072             :     }
    1073             : 
    1074             :     /*Flip?*/
    1075     3317410 :     if ( L_frame == L_FRAME )
    1076             :     {
    1077             :         /* 6 to 14 kHz SHB target signal*/
    1078      229265 :         j = 2;
    1079      229265 :         set_zero( tmp, STEREO_DFT_N_MAX_ENC );
    1080      229265 :         sign = hStereoDft->flip_sign;
    1081             : 
    1082    73823330 :         for ( i = (int16_t) ( 350 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i >= (int16_t) 150 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
    1083             :         {
    1084             :             /* alternate sign between frames for even starting index */
    1085    73594065 :             tmp[j++] = sign * pDFT_in[2 * i] * fac;
    1086    73594065 :             tmp[j++] = -sign * pDFT_in[2 * i + 1] * fac;
    1087             :         }
    1088      229265 :         hStereoDft->flip_sign = -sign;
    1089             : 
    1090    37140930 :         for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
    1091             :         {
    1092    36911665 :             nrg += tmp[2 * i] * tmp[2 * i];
    1093    36911665 :             nrg += tmp[2 * i + 1] * tmp[2 * i + 1];
    1094             :         }
    1095             :     }
    1096     3088145 :     else if ( L_frame == L_FRAME16k )
    1097             :     {
    1098             :         /* 7.5 - 15.5 kHz SHB target signal*/
    1099      192044 :         j = 2;
    1100      192044 :         set_zero( tmp, STEREO_DFT_N_MAX_ENC );
    1101    61646124 :         for ( i = (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ) - 1; i >= (int16_t) 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
    1102             :         {
    1103    61454080 :             tmp[j++] = pDFT_in[2 * i] * fac;
    1104    61454080 :             tmp[j++] = -1.f * pDFT_in[2 * i + 1] * fac;
    1105             :         }
    1106             : 
    1107    31111128 :         for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
    1108             :         {
    1109    30919084 :             nrg += tmp[2 * i] * tmp[2 * i];
    1110    30919084 :             nrg += tmp[2 * i + 1] * tmp[2 * i + 1];
    1111             :         }
    1112             :     }
    1113     2896101 :     else if ( fac != 1.f )
    1114             :     {
    1115             :         /*Copy and scale*/
    1116     1983312 :         tmp[0] = pDFT_in[0] * fac;
    1117     1983312 :         tmp[1] = 0.f;
    1118  1086699696 :         for ( i = 2; i < NFFT; i++ )
    1119             :         {
    1120  1084716384 :             tmp[i] = pDFT_in[i] * fac;
    1121             :         }
    1122             : 
    1123     1983312 :         if ( fac < 1.f )
    1124             :         {
    1125     1983312 :             tmp[1] = 0.f; /*Nyquist is set to 0*/
    1126     1983312 :             tmp[0] = 0.f; /*DC is set to 0*/
    1127             :         }
    1128             :     }
    1129             :     else
    1130             :     {
    1131  1359013909 :         for ( i = 0; i < NFFT; i++ )
    1132             :         {
    1133  1358101120 :             tmp[i] = pDFT_in[i];
    1134             :         }
    1135             :     }
    1136             : 
    1137             :     /*Reconstruct */
    1138             :     /*IFFT*/
    1139     3317410 :     rfft( tmp, trigo_enc, NFFT, +1 );
    1140             : 
    1141   597534698 :     for ( i = 0; i < ovl; i++ )
    1142             :     {
    1143   594217288 :         output[offset + i] = mem[i] + tmp[zp + i] * win[i];
    1144   594217288 :         mem[i] = tmp[zp + N + i] * win[ovl - 1 - i];
    1145             :     }
    1146             : 
    1147             :     /*Middle->Copy*/
    1148   767311066 :     for ( i = 0; i < N - ovl; i++ )
    1149             :     {
    1150   763993656 :         output[offset + ovl + i] = tmp[zp + ovl + i];
    1151             :     }
    1152             : 
    1153             :     /*-----------------------------------------------------------------*
    1154             :      * Lookahead: redress signal
    1155             :      *-----------------------------------------------------------------*/
    1156             : 
    1157   597534698 :     for ( i = 0; i < ovl; i++ )
    1158             :     {
    1159   594217288 :         float ifft_deviation = tmp[zp + N + ovl];
    1160   594217288 :         output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation;
    1161             :     }
    1162             : 
    1163             : #ifdef DEBUG_MODE_DFT
    1164             :     {
    1165             :         int16_t tmp_dbg[L_FRAME48k];
    1166             : #ifdef DEBUG_STEREO_DFT_NOCORE
    1167             :         static float mem_win[2][STEREO_DFT_OVL_MAX] = { { 0 }, { 0 } };
    1168             : #endif
    1169             :         char file_name[50] = { 0 };
    1170             :         int16_t input_frame = N;
    1171             :         int16_t b = 0;
    1172             :         offset = -ovl;
    1173             :         b = L_frame;
    1174             : 
    1175             : #ifdef DEBUG_STEREO_DFT_NOCORE
    1176             :         /*Simulate the un-windowing process which breaks partly TDAC of MDCT*/
    1177             :         if ( ( ( chan == 1 ) || ( output_sampling_rate == input_Fs ) ) && ( L_frame <= 0 ) )
    1178             :         {
    1179             :             float tmp_f[L_FRAME48k + STEREO_DFT_OVL_MAX];
    1180             :             float MDCT[L_FRAME48k];
    1181             : 
    1182             :             /*window signal*/
    1183             :             for ( i = 0; i < ovl; i++ )
    1184             :             {
    1185             :                 tmp_f[i] = output[offset + i] * sqrt( win_ana[i] * win[i] );
    1186             :                 tmp_f[input_frame + i] = output[offset + input_frame + i] * sqrt( win_ana[ovl - 1 - i] * win[ovl - 1 - i] );
    1187             :             }
    1188             :             /*Middle->Copy*/
    1189             :             for ( ; i < input_frame; i++ )
    1190             :             {
    1191             :                 tmp_f[i] = output[offset + i];
    1192             :             }
    1193             : 
    1194             :             /*MDCT -IMDCT (inject Time domain aliasing)*/
    1195             :             TCX_MDCT( tmp_f, MDCT, ovl, input_frame - ovl, ovl, IVAS_CPE_DFT );
    1196             :             TCX_MDCT_Inverse( MDCT, tmp_f, ovl, input_frame - ovl, ovl, IVAS_CPE_DFT );
    1197             : 
    1198             :             /*OLA*/
    1199             :             /*overlapping parts*/
    1200             :             for ( i = 0; i < ovl; i++ )
    1201             :             {
    1202             :                 tmp_f[i] = mem_win[chan][i] + tmp_f[i] * sqrt( win_ana[i] * win[i] );
    1203             :                 mem_win[chan][i] = tmp_f[input_frame + i] * sqrt( win_ana[ovl - 1 - i] * win[ovl - 1 - i] );
    1204             :             }
    1205             :             for ( i = 0; i < input_frame; i++ )
    1206             :             {
    1207             :                 tmp_dbg[i] = (int16_t) ( tmp_f[i] + 0.5f );
    1208             :             }
    1209             :         }
    1210             :         else
    1211             : #endif
    1212             :         {
    1213             :             for ( i = 0; i < input_frame; i++ )
    1214             :             {
    1215             :                 tmp_dbg[i] = (int16_t) ( output[offset + i] + 0.5f );
    1216             :             }
    1217             :         }
    1218             : 
    1219             :         sprintf( file_name, "./res/stereo_dft_enc_M_S_%d_c%d_b%d.pcm", output_sampling_rate, chan, b );
    1220             :         dbgwrite( tmp_dbg, sizeof( int16_t ), input_frame, 1, file_name );
    1221             :     }
    1222             : #endif
    1223             : 
    1224     3317410 :     pop_wmops();
    1225     3317410 :     return ( nrg );
    1226             : }
    1227             : 
    1228             : 
    1229             : /*-------------------------------------------------------------------------
    1230             :  * stereo_dft_enc_process()
    1231             :  *
    1232             :  * DFT-based stereo main processing function:
    1233             :  * 1) compute/encode stereo parameters
    1234             :  * 2) Mid/Side computation
    1235             :  *-------------------------------------------------------------------------*/
    1236             : 
    1237      912789 : void stereo_dft_enc_process(
    1238             :     CPE_ENC_HANDLE hCPE,            /* i/o: CPE encoder structure       */
    1239             :     const int16_t vad_flag_dtx[],   /* i  : VAD dtx flags               */
    1240             :     const int16_t vad_hover_flag[], /* i  : VAD hangover flags          */
    1241             :     const int16_t input_frame       /* i  : input frame length          */
    1242             : )
    1243             : {
    1244             :     int16_t i, j, b;
    1245             :     float *pDFT_L, *pDFT_R;
    1246             :     float *pDFT_DMX;
    1247             :     float *pDFT_RES;
    1248             :     int16_t k_offset;
    1249             :     float *pgIpd;
    1250             :     float *pSideGain;
    1251             :     float c, alpha, g;
    1252             :     float wL, wR, wS;
    1253             :     float tmp;
    1254             :     float s, c1, s1;
    1255             :     float fac_att;
    1256             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
    1257             :     float DFT_DMX[STEREO_DFT_N_MAX_ENC];
    1258             :     float DFT_RES[STEREO_DFT_N_8k_ENC];
    1259             :     int32_t input_Fs;
    1260             :     float bin_nrgL[STEREO_DFT_N_MAX_ENC];
    1261             :     float bin_nrgR[STEREO_DFT_N_MAX_ENC];
    1262             :     float *pNrgL, *pNrgR;
    1263             :     float res_nrg_all_curr, dmx_nrg_all_curr;
    1264             :     float res_dmx_ratio, frame_nrg_ratio;
    1265             :     float dot_prod_nrg_ratio[STEREO_DFT_BAND_MAX]; /* contains only dot product for higher bands */
    1266             :     float sum_nrg_L2, sum_nrg_R2, dot_prod_real2;
    1267             :     float sum_nrg_Mid, sum_abs;
    1268             : 
    1269             :     /*------------------------------------------------------------------*
    1270             :      * Initialization
    1271             :      *-----------------------------------------------------------------*/
    1272             : 
    1273      912789 :     input_Fs = input_frame * FRAMES_PER_SEC;
    1274             : 
    1275      912789 :     hStereoDft = hCPE->hStereoDft;
    1276             : 
    1277      912789 :     wL = 0; /* avoid compilation warning */
    1278      912789 :     wR = 0; /* avoid compilation warning */
    1279             : 
    1280             :     /* Initialization */
    1281      912789 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
    1282             : 
    1283      912789 :     hStereoDft->gipd_band_max = dft_band_ipd[1][3];
    1284      912789 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]];
    1285      912789 :     hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * input_frame / (float) ( hStereoDft->NFFT ) );
    1286      912789 :     hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 );
    1287             : 
    1288      912789 :     hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
    1289             : 
    1290             : #ifdef DEBUG_MODE_DFT
    1291             :     dbgwrite( &( hStereoDft->nbands ), sizeof( int16_t ), 1, 1, "./res/stereo_dft_nbands.dat" );
    1292             : #endif
    1293             : 
    1294      912789 :     hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[0];
    1295      912789 :     hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[1];
    1296             : 
    1297             :     /*------------------------------------------------------------------*
    1298             :      * Compute stereo parameters
    1299             :      *-----------------------------------------------------------------*/
    1300             : 
    1301             :     /*ITD in Frequency domain*/
    1302      912789 :     fac_att = 1.0f;
    1303             : 
    1304      912789 :     pDFT_L = hStereoDft->DFT[0];
    1305      912789 :     pDFT_R = hStereoDft->DFT[1];
    1306             : 
    1307             : #ifdef DEBUG_MODE_DFT
    1308             :     if ( hStereoDft->hConfig->itd_mode )
    1309             : #endif
    1310             :     {
    1311      912789 :         stereo_dft_enc_compute_itd( hCPE, pDFT_L, pDFT_R, k_offset, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL, bin_nrgR );
    1312      912789 :         if ( hCPE->element_mode == IVAS_CPE_MDCT )
    1313             :         {
    1314           0 :             return;
    1315             :         }
    1316             : 
    1317      912789 :         if ( hStereoDft->hItd->deltaItd[k_offset] != 0 && hStereoDft->hConfig->dmx_active )
    1318             :         {
    1319             :             /* Note: this variable is used as an in-between step when passing the angle to the trig functions.
    1320             :              *       this keeps the compilter from applying optimizations at higher optimizaton levels which can break bit-exactness */
    1321             :             volatile float alpha_tmp;
    1322             : 
    1323             :             /*time shift channels*/
    1324      197825 :             alpha = -2.0f * EVS_PI * hStereoDft->hItd->deltaItd[k_offset] / hStereoDft->NFFT;
    1325      197825 :             c = 1.f; /*cos(0)*/
    1326      197825 :             s = 0.f; /*sin(0)*/
    1327             : 
    1328      197825 :             alpha_tmp = alpha;
    1329      197825 :             c1 = cosf( alpha_tmp );
    1330      197825 :             s1 = sinf( alpha_tmp );
    1331             : 
    1332      197825 :             if ( alpha >= 0 )
    1333             :             {
    1334    74235200 :                 for ( i = 1; i < hStereoDft->NFFT / 2; i++ )
    1335             :                 {
    1336    74134350 :                     tmp = s * c1 + c * s1;
    1337    74134350 :                     c = c * c1 - s * s1;
    1338    74134350 :                     s = tmp;
    1339             : 
    1340             :                     /*time shift of L*/
    1341    74134350 :                     tmp = pDFT_L[2 * i] * c - pDFT_L[2 * i + 1] * s;
    1342    74134350 :                     pDFT_L[2 * i + 1] = pDFT_L[2 * i] * s + pDFT_L[2 * i + 1] * c;
    1343    74134350 :                     pDFT_L[2 * i] = tmp;
    1344             :                 }
    1345             :             }
    1346             :             else
    1347             :             {
    1348    67595200 :                 for ( i = 1; i < hStereoDft->NFFT / 2; i++ )
    1349             :                 {
    1350    67498225 :                     tmp = s * c1 + c * s1;
    1351    67498225 :                     c = c * c1 - s * s1;
    1352    67498225 :                     s = tmp;
    1353             : 
    1354             :                     /*time shift of R*/
    1355    67498225 :                     tmp = pDFT_R[2 * i] * c + pDFT_R[2 * i + 1] * s;
    1356    67498225 :                     pDFT_R[2 * i + 1] = -pDFT_R[2 * i] * s + pDFT_R[2 * i + 1] * c;
    1357    67498225 :                     pDFT_R[2 * i] = tmp;
    1358             :                 }
    1359             :             }
    1360             : 
    1361      197825 :             if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f )
    1362             :             {
    1363       23630 :                 fac_att = min( 1.0f, max( 0.2f, 2.6f - 0.02f * fabsf( hStereoDft->hItd->deltaItd[1] ) * 32000.f / input_Fs ) );
    1364             :             }
    1365             :         }
    1366             : 
    1367             :         /* compute remaining binwise energies for FB mode (ITD function only computes energies up to 16 kHz) */
    1368   143870549 :         for ( i = STEREO_DFT_N_32k_ENC / 2; i < hStereoDft->NFFT / 2; i++ )
    1369             :         {
    1370   142957760 :             bin_nrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    1371   142957760 :             bin_nrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    1372             :         }
    1373             :     }
    1374             : #ifdef DEBUG_MODE_DFT
    1375             :     else
    1376             :     {
    1377             :         /* no ITD computation, get binwise energies here */
    1378             : 
    1379             :         for ( i = 0; i < hStereoDft->NFFT / 2; i++ )
    1380             :         {
    1381             :             bin_nrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    1382             :             bin_nrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    1383             :         }
    1384             :     }
    1385             : #endif
    1386             : 
    1387             :     /* DFT stereo parameters */
    1388      912789 :     stereo_dft_enc_compute_prm( hStereoDft, pDFT_L, pDFT_R, k_offset, 1, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->vad_flag, bin_nrgL, bin_nrgR, dot_prod_nrg_ratio );
    1389             : 
    1390      912789 :     if ( vad_flag_dtx[0] == 0 )
    1391             :     {
    1392       43803 :         if ( hCPE->hStereoCng->cng_counter == 0 && !hCPE->hStereoCng->first_SID_after_TD )
    1393             :         {
    1394         882 :             hStereoDft->sid_gipd = hStereoDft->prev_sid_gipd;
    1395         882 :             hStereoDft->no_ipd_flag = hStereoDft->prev_sid_no_ipd_flag;
    1396             :         }
    1397             : 
    1398       43803 :         if ( hCPE->hStereoCng->cng_counter > ITD_SID_PREV_FRAMES )
    1399             :         {
    1400       38276 :             hStereoDft->prev_sid_gipd = hStereoDft->sid_gipd;
    1401       38276 :             hStereoDft->prev_sid_no_ipd_flag = hStereoDft->no_ipd_flag;
    1402             :         }
    1403             :     }
    1404             : 
    1405             :     /*----------------------------------------------------------------*
    1406             :      * UNCLR classifier (detection of uncorrelated L and R channels)
    1407             :      *----------------------------------------------------------------*/
    1408             : 
    1409      912789 :     unclr_classifier_dft( hCPE );
    1410             : 
    1411             :     /*------------------------------------------------------------------*
    1412             :      * Channel mapping: computation of DMX and RES
    1413             :      *-----------------------------------------------------------------*/
    1414             : #ifdef DEBUG_MODE_DFT
    1415             :     {
    1416             :         int16_t tmp_dbg = (int16_t) ( 100 * fac_att );
    1417             :         dbgwrite( &tmp_dbg, sizeof( int16_t ), 1, 1, "./res/stereo_dft_enc_facAtt.pcm" );
    1418             :     }
    1419             : #endif
    1420             : 
    1421      912789 :     res_nrg_all_curr = EPSILON;
    1422      912789 :     dmx_nrg_all_curr = EPSILON;
    1423             : 
    1424      912789 :     pDFT_DMX = DFT_DMX;
    1425      912789 :     pDFT_RES = DFT_RES;
    1426      912789 :     pNrgL = bin_nrgL;
    1427      912789 :     pNrgR = bin_nrgR;
    1428             : 
    1429      912789 :     set_zero( pDFT_DMX, STEREO_DFT_N_MAX_ENC );
    1430      912789 :     set_zero( pDFT_RES, STEREO_DFT_N_8k_ENC );
    1431             : 
    1432      912789 :     pgIpd = hStereoDft->gipd + k_offset;
    1433      912789 :     pSideGain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX;
    1434             : 
    1435      912789 :     if ( hStereoDft->hConfig->dmx_active )
    1436             :     {
    1437             :         /*Active DMX*/
    1438      912789 :         alpha = 0; /* to avoid compilation warning */
    1439      912789 :         g = 1.f;
    1440             : 
    1441             :         /*Apply active DMX*/
    1442      912789 :         pDFT_DMX[0] = 0.f;
    1443      912789 :         pDFT_RES[0] = 0.f;
    1444    11777566 :         for ( b = 0; b < hStereoDft->nbands_dmx; b++ )
    1445             :         {
    1446    10864777 :             g = pSideGain[b];
    1447             : 
    1448    10864777 :             if ( pgIpd[0] != 0.f )
    1449             :             {
    1450             :                 volatile float pgIpd_tmp;
    1451             : 
    1452     2422411 :                 pgIpd_tmp = pgIpd[0];
    1453     2422411 :                 c = cosf( pgIpd_tmp );
    1454     2422411 :                 s = sinf( pgIpd_tmp );
    1455   125969993 :                 for ( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
    1456             :                 {
    1457             :                     /*rotate L*/
    1458   123547582 :                     tmp = pDFT_L[2 * i] * c + pDFT_L[2 * i + 1] * s;
    1459   123547582 :                     pDFT_L[2 * i + 1] = pDFT_L[2 * i + 1] * c - pDFT_L[2 * i] * s;
    1460   123547582 :                     pDFT_L[2 * i] = tmp;
    1461             :                 }
    1462             :             }
    1463             : 
    1464    10864777 :             if ( b < hStereoDft->res_cod_band_max && vad_flag_dtx[0] )
    1465             :             {
    1466             : #ifdef DEBUGGING
    1467             :                 assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" );
    1468             : #endif
    1469             : #ifdef DEBUG_MODE_DFT
    1470             :                 dbgwrite( &g, sizeof( float ), 1, 1, "./res/stereo_dft_enc_g.pcm" );
    1471             :                 dbgwrite( &alpha, sizeof( float ), 1, 1, "./res/stereo_dft_enc_alpha.pcm" );
    1472             : #endif
    1473             : 
    1474             :                 /*Get the previous frame energy*/
    1475     1314115 :                 if ( hStereoDft->hConfig->ada_wb_res_cod_mode )
    1476             :                 {
    1477             :                     /*Calculate the energy of RES and DMX*/
    1478             :                     /* 90% of old frame ... */
    1479     1314115 :                     dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.9f;
    1480     1314115 :                     res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.9f;
    1481             :                 }
    1482     1314115 :                 hStereoDft->res_cod_NRG_M[b] = EPSILON;
    1483     1314115 :                 hStereoDft->res_cod_NRG_S[b] = EPSILON;
    1484             : 
    1485    12089858 :                 for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1486             :                 {
    1487    10775743 :                     pDFT_DMX[2 * i] = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * 0.5f;
    1488    10775743 :                     pDFT_DMX[2 * i + 1] = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * 0.5f;
    1489             : 
    1490    10775743 :                     pDFT_RES[2 * i] = ( pDFT_L[2 * i] - pDFT_R[2 * i] ) * 0.5f;
    1491    10775743 :                     pDFT_RES[2 * i + 1] = ( pDFT_L[2 * i + 1] - pDFT_R[2 * i + 1] ) * 0.5f;
    1492             : 
    1493             :                     /*Prediction of RES with DMX*/
    1494    10775743 :                     pDFT_RES[2 * i] = pDFT_RES[2 * i] - g * pDFT_DMX[2 * i];
    1495    10775743 :                     pDFT_RES[2 * i + 1] = pDFT_RES[2 * i + 1] - g * pDFT_DMX[2 * i + 1];
    1496             : 
    1497    10775743 :                     pDFT_RES[2 * i] *= fac_att;
    1498    10775743 :                     pDFT_RES[2 * i + 1] *= fac_att;
    1499             : 
    1500             :                     /*Energy of the DMX and RES*/
    1501    10775743 :                     hStereoDft->res_cod_NRG_M[b] += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
    1502    10775743 :                     hStereoDft->res_cod_NRG_S[b] += pDFT_RES[2 * i] * pDFT_RES[2 * i] + pDFT_RES[2 * i + 1] * pDFT_RES[2 * i + 1];
    1503             :                 }
    1504             : 
    1505     1314115 :                 if ( hStereoDft->hConfig->ada_wb_res_cod_mode )
    1506             :                 {
    1507             :                     /*Calculate the energy of RES and DMX*/
    1508             :                     /* ... + 10% of current frame. */
    1509     1314115 :                     dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.1f;
    1510     1314115 :                     res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.1f;
    1511             :                 }
    1512             :             }
    1513             :             else
    1514             :             {
    1515             :                 int16_t upper_border;
    1516             :                 int16_t triple_bin;
    1517             :                 float frac_dot_prod; /* fraction of dot product according to energy ratio of current bins and whole band */
    1518             :                 float Sr, Si;
    1519             :                 float comb_nrgL, comb_nrgR;
    1520             : 
    1521     9550662 :                 upper_border = min( STEREO_DFT_DMX_CROSSOVER, hStereoDft->band_limits_dmx[b + 1] );
    1522             : 
    1523     9550662 :                 triple_bin = 0;
    1524     9550662 :                 if ( upper_border > hStereoDft->band_limits_dmx[b] && ( upper_border - hStereoDft->band_limits_dmx[b] ) % 2 )
    1525             :                 {
    1526             :                     /* if odd number of bins in band, combine last 3 bins */
    1527     2862687 :                     triple_bin = 1;
    1528     2862687 :                     upper_border -= 3;
    1529             :                 }
    1530             : 
    1531    95711605 :                 for ( i = hStereoDft->band_limits_dmx[b]; i < upper_border; i += 2 )
    1532             :                 {
    1533    86160943 :                     comb_nrgL = pNrgL[i] + pNrgL[i + 1];
    1534    86160943 :                     comb_nrgR = pNrgR[i] + pNrgR[i + 1];
    1535    86160943 :                     Sr = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * ( pDFT_L[2 * i] + pDFT_R[2 * i] ) + ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] ) * ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] );
    1536    86160943 :                     Si = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) + ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] ) * ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] );
    1537             : 
    1538    86160943 :                     sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
    1539    86160943 :                     frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
    1540    86160943 :                     wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
    1541             : 
    1542    86160943 :                     wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
    1543             : 
    1544             :                     /*DMX Mapping*/
    1545    86160943 :                     pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
    1546    86160943 :                     pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
    1547    86160943 :                     pDFT_DMX[2 * i + 2] = ( wL * pDFT_L[2 * i + 2] + wR * pDFT_R[2 * i + 2] ) * INV_SQRT_2;
    1548    86160943 :                     pDFT_DMX[2 * i + 3] = ( wL * pDFT_L[2 * i + 3] + wR * pDFT_R[2 * i + 3] ) * INV_SQRT_2;
    1549             :                 }
    1550             : 
    1551     9550662 :                 if ( triple_bin )
    1552             :                 {
    1553     2862687 :                     comb_nrgL = comb_nrgR = 0.f;
    1554     2862687 :                     Sr = Si = 0.f;
    1555    11450748 :                     for ( j = i; j < i + 3; j++ )
    1556             :                     {
    1557     8588061 :                         comb_nrgL += pNrgL[j];
    1558     8588061 :                         comb_nrgR += pNrgR[j];
    1559     8588061 :                         Sr += ( pDFT_L[2 * j] + pDFT_R[2 * j] ) * ( pDFT_L[2 * j] + pDFT_R[2 * j] );
    1560     8588061 :                         Si += ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] ) * ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] );
    1561             :                     }
    1562             : 
    1563     2862687 :                     sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
    1564     2862687 :                     frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
    1565     2862687 :                     wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
    1566     2862687 :                     wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
    1567             : 
    1568    11450748 :                     for ( j = i; j < i + 3; j++ )
    1569             :                     {
    1570     8588061 :                         pDFT_DMX[2 * j] = ( wL * pDFT_L[2 * j] + wR * pDFT_R[2 * j] ) * INV_SQRT_2;
    1571     8588061 :                         pDFT_DMX[2 * j + 1] = ( wL * pDFT_L[2 * j + 1] + wR * pDFT_R[2 * j + 1] ) * INV_SQRT_2;
    1572             :                     }
    1573     2862687 :                     i += 3;
    1574             :                 }
    1575             : 
    1576     9550662 :                 if ( i < hStereoDft->band_limits_dmx[b + 1] )
    1577             :                 {
    1578     2649676 :                     sum_nrg_L2 = EPSILON;
    1579     2649676 :                     sum_nrg_R2 = EPSILON;
    1580     2649676 :                     dot_prod_real2 = EPSILON;
    1581   419736317 :                     for ( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
    1582             :                     {
    1583   417086641 :                         sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
    1584   417086641 :                         sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
    1585   417086641 :                         dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
    1586             :                     }
    1587             : 
    1588     2649676 :                     sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
    1589     2649676 :                     sum_abs = sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) + EPSILON;
    1590     2649676 :                     wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs;
    1591     2649676 :                     wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs );
    1592             :                 }
    1593             : 
    1594   426637303 :                 for ( ; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
    1595             :                 {
    1596             :                     /*DMX Mapping*/
    1597   417086641 :                     pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
    1598   417086641 :                     pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
    1599             :                 }
    1600             :             }
    1601             :         }
    1602             : 
    1603    70278229 :         for ( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->NFFT / 2; i++ )
    1604             :         {
    1605    69365440 :             pDFT_DMX[2 * i] = 0.f;
    1606    69365440 :             pDFT_DMX[2 * i + 1] = 0.f;
    1607             :         }
    1608             : 
    1609             :         /*Nyquist Freq.*/
    1610      912789 :         if ( hStereoDft->band_limits_dmx[b] >= hStereoDft->NFFT / 2 )
    1611             :         {
    1612      709908 :             pDFT_DMX[1] = ( pDFT_L[1] + pDFT_R[1] ) * 0.5f;
    1613             :         }
    1614             :         else
    1615             :         {
    1616      202881 :             pDFT_DMX[1] = 0.f;
    1617             :         }
    1618             : 
    1619             :         /* DC component */
    1620      912789 :         pDFT_DMX[0] = ( pDFT_L[0] + pDFT_R[0] ) * 0.5f;
    1621             :     }
    1622             :     else
    1623             :     {
    1624             : #ifndef DEBUG_STEREO_DFT_NOSTEREO
    1625             :         /*passive DMX*/
    1626           0 :         assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" );
    1627           0 :         for ( i = 0; i < hStereoDft->band_limits[hStereoDft->res_cod_band_max]; i++ )
    1628             :         {
    1629           0 :             pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
    1630           0 :             pDFT_RES[i] = ( pDFT_L[i] - pDFT_R[i] ) * 0.5f;
    1631             :         }
    1632           0 :         for ( ; i < hStereoDft->NFFT; i++ )
    1633             :         {
    1634           0 :             pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
    1635             :         }
    1636             : #else
    1637             :         /*Copy Left channel to DMX and reset residual coding*/
    1638             :         mvr2r( pDFT_L, DFT_DMX, hStereoDft->NFFT );
    1639             :         set_zero( pDFT_RES, hStereoDft->NFFT );
    1640             : 
    1641             :         /*for( b=0; b<hStereoDft->nbands; b++ )
    1642             :         {
    1643             :             if( hStereoDft->res_pred_mode[k+k_offset] && b>= hStereoDft->res_pred_band_min )
    1644             :             {
    1645             :                 if( (k % hStereoDft->prm_res_enc[k+k_offset]) == (hStereoDft->prm_res_enc[k+k_offset]-1) )
    1646             :                 {
    1647             :                     stereo_dft_quantize_res_pred_gain( pPredGain+b, pPredGain+b, 1, hStereoDft->Ind+(k_offset+k)*STEREO_DFT_PRM_MAX, hStereoDft->nInd+k+k_offset );
    1648             :                 }
    1649             :             }
    1650             :         }*/
    1651             : #endif
    1652             :     }
    1653             : 
    1654             :     /*------------------------------------------------------------------*
    1655             :      * Recalculate RES and DMX
    1656             :      *-----------------------------------------------------------------*/
    1657             : 
    1658      912789 :     if ( hStereoDft->NFFT == STEREO_DFT_N_16k_ENC && hStereoDft->hConfig->ada_wb_res_cod_mode )
    1659             :     {
    1660       35514 :         stereo_dft_enc_get_res_cod_mode_flag( hStereoDft, res_nrg_all_curr, dmx_nrg_all_curr, &res_dmx_ratio, &frame_nrg_ratio );
    1661             : 
    1662       35514 :         if ( hStereoDft->res_cod_sw_flag )
    1663             :         {
    1664             :             int16_t res_cod_band_max;
    1665             : 
    1666         288 :             res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->hConfig->ada_wb_res_cod_mode];
    1667             : 
    1668             :             /* Recalculate RES and DMX */
    1669        1728 :             for ( b = 0; b < res_cod_band_max; b++ )
    1670             :             {
    1671        1440 :                 sum_nrg_L2 = EPSILON;
    1672        1440 :                 sum_nrg_R2 = EPSILON;
    1673        1440 :                 dot_prod_real2 = EPSILON;
    1674       13248 :                 for ( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
    1675             :                 {
    1676       11808 :                     sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
    1677       11808 :                     sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
    1678       11808 :                     dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
    1679             :                 }
    1680             : 
    1681        1440 :                 sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
    1682        1440 :                 wL = 0.5f * max( sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) - sqrtf( sum_nrg_Mid ), 0 ) * inv_sqrt( sum_nrg_L2 + EPSILON );
    1683        1440 :                 wS = 1;
    1684             : 
    1685        1440 :                 if ( hStereoDft->res_cod_sw_flag )
    1686             :                 {
    1687        1440 :                     wL *= ( 1 - hStereoDft->switch_fade_factor );
    1688        1440 :                     wS = hStereoDft->switch_fade_factor;
    1689             :                 }
    1690             : 
    1691       13248 :                 for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1692             :                 {
    1693             :                     /*DMX Recalculation*/
    1694       11808 :                     DFT_DMX[2 * i] += wL * pDFT_L[2 * i];
    1695       11808 :                     DFT_DMX[2 * i + 1] += wL * pDFT_L[2 * i + 1];
    1696             : 
    1697             :                     /*RES Recalculation*/
    1698       11808 :                     DFT_RES[2 * i] *= wS;
    1699       11808 :                     DFT_RES[2 * i + 1] *= wS;
    1700             :                 }
    1701             :             }
    1702             :         }
    1703             :     }
    1704             : 
    1705      912789 :     if ( input_Fs >= 32000 )
    1706             :     {
    1707      762501 :         stereo_dft_enc_calculate_nrg_for_icbwe( hStereoDft, DFT_DMX, input_Fs );
    1708             :     }
    1709             : 
    1710      912789 :     mvr2r( DFT_DMX, hStereoDft->DFT[0], STEREO_DFT_N_MAX_ENC );
    1711      912789 :     mvr2r( DFT_RES, hStereoDft->DFT[1], STEREO_DFT_N_8k_ENC );
    1712      912789 :     set_zero( hStereoDft->DFT[1] + STEREO_DFT_N_8k_ENC, STEREO_DFT_N_MAX_ENC - STEREO_DFT_N_8k_ENC );
    1713             : 
    1714      912789 :     return;
    1715             : }
    1716             : 
    1717             : 
    1718             : /*-------------------------------------------------------------------------
    1719             :  * stereo_dft_enc_get_res_cod_mode_flag()
    1720             :  *
    1721             :  * Get the residual signal coding flag
    1722             :  *-------------------------------------------------------------------------*/
    1723             : 
    1724       35514 : static void stereo_dft_enc_get_res_cod_mode_flag(
    1725             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    1726             :     const float res_nrg_all_curr,
    1727             :     const float dmx_nrg_all_curr,
    1728             :     float *res_dmx_ratio,
    1729             :     float *frame_nrg_ratio )
    1730             : {
    1731             :     int16_t b, k_offset;
    1732             :     float dmx_res_all, g;
    1733             :     int16_t fast_update_flag;
    1734             :     int16_t prev_res_cod_mode_flag, res_cod_mode_flag;
    1735             : 
    1736       35514 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
    1737             : 
    1738             :     /*Calculate energy ratio between residual signal and downmix signal */
    1739       35514 :     *res_dmx_ratio = 0;
    1740             : 
    1741      213084 :     for ( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    1742             :     {
    1743      177570 :         g = fabsf( hStereoDft->side_gain[(k_offset) *STEREO_DFT_BAND_MAX + b] );
    1744      177570 :         *res_dmx_ratio = max( hStereoDft->res_cod_NRG_S[b] / ( hStereoDft->res_cod_NRG_S[b] + ( 1 - g ) * ( 1 - g ) * hStereoDft->res_cod_NRG_M[b] + 1 ), *res_dmx_ratio );
    1745             :     }
    1746       35514 :     *res_dmx_ratio = check_bounds( *res_dmx_ratio, 0, 1 ); /*should always be satisfied*/
    1747             : 
    1748             :     /*Calculate the total energy of RES and DMX*/
    1749       35514 :     dmx_res_all = res_nrg_all_curr + dmx_nrg_all_curr;
    1750             : 
    1751             :     /*Calculate the energy ratio of the inter-frame */
    1752       35514 :     *frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev;
    1753       35514 :     *frame_nrg_ratio = min( 5.0f, max( 0.2f, *frame_nrg_ratio ) );
    1754             : 
    1755             :     /* Get fast update flag */
    1756       35514 :     fast_update_flag = 0;
    1757       35514 :     if ( ( *frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f ) || ( *frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f ) )
    1758             :     {
    1759         803 :         fast_update_flag = 1;
    1760             :     }
    1761             : 
    1762             :     /* Calculate long term energy ratio between residual signal and downmix signal */
    1763       35514 :     if ( fast_update_flag )
    1764             :     {
    1765         803 :         hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f;
    1766             :     }
    1767             :     else
    1768             :     {
    1769       34711 :         hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f;
    1770             :     }
    1771             : 
    1772             :     /*Get the  residual signal coding initial flag */
    1773       35514 :     if ( hStereoDft->res_dmx_ratio_lt > 0.01f )
    1774             :     {
    1775       33152 :         res_cod_mode_flag = 1;
    1776             :     }
    1777             :     else
    1778             :     {
    1779        2362 :         res_cod_mode_flag = 0;
    1780             :     }
    1781             : 
    1782             :     /* Get the residual signal coding flag */
    1783       35514 :     if ( hStereoDft->first_frm_flag )
    1784             :     {
    1785          33 :         prev_res_cod_mode_flag = res_cod_mode_flag;
    1786          33 :         hStereoDft->first_frm_flag = 0;
    1787             :     }
    1788             :     else
    1789             :     {
    1790       35481 :         prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1];
    1791             :     }
    1792       35514 :     if ( res_cod_mode_flag != prev_res_cod_mode_flag )
    1793             :     {
    1794        1628 :         if ( prev_res_cod_mode_flag == 1 )
    1795             :         {
    1796          74 :             if ( hStereoDft->hangover_cnt0 < 5 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 )
    1797             :             {
    1798          50 :                 res_cod_mode_flag = prev_res_cod_mode_flag;
    1799          50 :                 hStereoDft->hangover_cnt0++;
    1800             :             }
    1801             :             else
    1802             :             {
    1803             :                 /* reset hangover */
    1804          24 :                 hStereoDft->hangover_cnt0 = 0;
    1805             :             }
    1806             :         }
    1807             :         else
    1808             :         {
    1809        1554 :             if ( *frame_nrg_ratio > 2.5f || *frame_nrg_ratio < 0.21f )
    1810             :             {
    1811             :                 /* reset hangover */
    1812          51 :                 hStereoDft->hangover_cnt1 = 0;
    1813             :             }
    1814             :             else
    1815             :             {
    1816        1503 :                 if ( hStereoDft->hangover_cnt1 < 5 )
    1817             :                 {
    1818        1275 :                     res_cod_mode_flag = prev_res_cod_mode_flag;
    1819        1275 :                     hStereoDft->hangover_cnt1++;
    1820             :                 }
    1821             :                 else
    1822             :                 {
    1823             :                     /* reset hangover */
    1824         228 :                     hStereoDft->hangover_cnt1 = 0;
    1825             :                 }
    1826             :             }
    1827             :         }
    1828             :     }
    1829             : 
    1830             :     /* handle switching frames */
    1831       35514 :     if ( res_cod_mode_flag != prev_res_cod_mode_flag && hStereoDft->last_res_cod_mode_modify_flag == 0 )
    1832             :     {
    1833         288 :         hStereoDft->res_cod_sw_flag = 1;
    1834             : 
    1835             :         /* Update switch_fade_factor */
    1836         288 :         if ( *frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f )
    1837             :         {
    1838           2 :             hStereoDft->switch_fade_factor = 0.75f;
    1839             :         }
    1840         286 :         else if ( *frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f )
    1841             :         {
    1842           3 :             hStereoDft->switch_fade_factor = 0.25f;
    1843             :         }
    1844             :         else
    1845             :         {
    1846         283 :             hStereoDft->switch_fade_factor = 0.5f;
    1847             :         }
    1848             : 
    1849         288 :         if ( res_cod_mode_flag == 0 )
    1850             :         {
    1851          12 :             res_cod_mode_flag = 1;
    1852             :         }
    1853             :     }
    1854             : 
    1855             :     /*update previous frame's total energy of RES and DMX */
    1856       35514 :     hStereoDft->dmx_res_all_prev = dmx_res_all;
    1857             : 
    1858             :     /* update residual coding mode */
    1859       35514 :     hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] = res_cod_mode_flag;
    1860       35514 :     if ( !hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
    1861             :     {
    1862        3575 :         hStereoDft->res_cod_band_max = 0;
    1863        3575 :         hStereoDft->res_cod_line_max = 0;
    1864             :     }
    1865             : 
    1866             :     /*Update residual signal memory when switching from not coding residual signal to coding it*/
    1867       35514 :     if ( prev_res_cod_mode_flag == 0 && res_cod_mode_flag == 1 )
    1868             :     {
    1869         279 :         set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k );
    1870             :     }
    1871             : 
    1872             : #ifdef DEBUG_MODE_DFT
    1873             :     /* look at res_nrg_all value */
    1874             :     {
    1875             :         static FILE *ResNrgAll_FILE = NULL;
    1876             : 
    1877             :         if ( ResNrgAll_FILE == NULL )
    1878             :             ResNrgAll_FILE = fopen( "./res/stereo_dft_res_nrg.txt", "w" );
    1879             :         fprintf( ResNrgAll_FILE, "%f\t\t%d\n", hStereoDft->res_dmx_ratio_lt, hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] );
    1880             :         dbgwrite( &hStereoDft->res_cod_mode[STEREO_DFT_OFFSET], sizeof( int16_t ), 1, 320, "./res/stereo_dft_res_cod_mode_flag.pcm" );
    1881             :     }
    1882             : #endif
    1883       35514 :     return;
    1884             : }
    1885             : 
    1886             : 
    1887             : /*-------------------------------------------------------------------------
    1888             :  * stereo_dft_enc_res()
    1889             :  *
    1890             :  * Code the residual signal
    1891             :  *-------------------------------------------------------------------------*/
    1892             : 
    1893      910327 : void stereo_dft_enc_res(
    1894             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle       */
    1895             :     const float *input_8k,                 /* i  : input buffer sampled at 8kHz*/
    1896             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: bitstream handle            */
    1897             :     int16_t *nb_bits,                      /* o  : number of bits written      */
    1898             :     const int16_t max_bits )
    1899             : {
    1900             :     int16_t i, b;
    1901             :     RangeUniEncState range_uni_enc_state;
    1902             :     ECSQ_instance ecsq_inst;
    1903             :     float MDCT_RES[L_FRAME8k];
    1904             :     float win[L_FRAME8k + STEREO_DFT_OVL_8k];
    1905             :     int16_t global_gain_index;
    1906             :     int16_t total_bit_count;
    1907             :     float max_snr;
    1908             :     float panning_gain, panning_gain_min;
    1909             :     float res_cod_gain[10];
    1910             :     float in_phase_ratio;
    1911             : #ifdef DEBUG_MODE_DFT
    1912             :     float MDCT_RES_dec[L_FRAME8k] = { 0 };
    1913             : #endif
    1914      910327 :     assert( hStereoDft->res_cod_line_max <= L_FRAME8k );
    1915             : 
    1916      910327 :     if ( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
    1917             :     {
    1918             :         /* Windowing */
    1919             :         /* overlapping parts */
    1920             :         /*input_8k-=STEREO_DFT_OVL_8k;*/
    1921    18520350 :         for ( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1922             :         {
    1923    18259500 :             win[i] = input_8k[i] * hStereoDft->win_mdct_8k[i];
    1924    18259500 :             win[L_FRAME8k + i] = input_8k[L_FRAME8k + i] * hStereoDft->win_mdct_8k[STEREO_DFT_OVL_8k - 1 - i];
    1925             :         }
    1926             :         /* middle part */
    1927    23737350 :         for ( ; i < L_FRAME8k; i++ )
    1928             :         {
    1929    23476500 :             win[i] = input_8k[i];
    1930             :         }
    1931             : 
    1932             :         /* MDCT analysis */
    1933      260850 :         TCX_MDCT( win, MDCT_RES, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    1934             : 
    1935             :         /*Compute the DMX to RES for each band*/
    1936      260850 :         max_snr = 0.f; /*minimum gain for residual coding -> no coding*/
    1937     1565100 :         for ( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    1938             :         {
    1939             :             /*Get side gain information and it is we*/
    1940     1304250 :             panning_gain = hStereoDft->side_gain[STEREO_DFT_OFFSET * STEREO_DFT_BAND_MAX + b];
    1941     1304250 :             panning_gain_min = 1.f - fabsf( panning_gain );
    1942             : 
    1943     1304250 :             in_phase_ratio = ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] ) / ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] + hStereoDft->res_cod_NRG_S[b] + 1 );
    1944     1304250 :             in_phase_ratio = check_bounds( in_phase_ratio, 0, 1 );
    1945     1304250 :             res_cod_gain[b] = in_phase_ratio * STEREO_DFT_RES_COD_SNR_MIN + ( 1 - in_phase_ratio ) * STEREO_DFT_RES_COD_SNR_MAX;
    1946             : 
    1947             :             /*get the maximum through bands*/
    1948     1304250 :             if ( res_cod_gain[b] > max_snr )
    1949             :             {
    1950      694711 :                 max_snr = res_cod_gain[b];
    1951             :             }
    1952             :         }
    1953             : 
    1954             :         /*Smooth max_snr because of several perturbations in computation*/
    1955             : #ifdef DEBUG_MODE_DFT
    1956             :         dbgwrite( &max_snr, sizeof( float ), 1, 1, "./res/stereo_dft_res_cod_target_snr0.dat" );
    1957             : #endif
    1958      260850 :         hStereoDft->old_snr = 0.2f * max_snr + 0.8f * hStereoDft->old_snr;
    1959      260850 :         max_snr = hStereoDft->old_snr;
    1960             : 
    1961      260850 :         if ( max_snr < STEREO_DFT_RES_COD_SNR_MIN )
    1962             :         {
    1963        6710 :             max_snr = STEREO_DFT_RES_COD_SNR_MIN;
    1964             :         }
    1965             : #ifdef DEBUG_MODE_DFT
    1966             :         dbgwrite( &max_snr, sizeof( float ), 1, 1, "./res/stereo_dft_res_cod_target_snr.dat" );
    1967             : #endif
    1968             : 
    1969      260850 :         push_wmops( "residual_encode" );
    1970             :         /* residual encoding */
    1971      260850 :         ECSQ_init_instance( &ecsq_inst, 0 /*dummy index*/, &range_uni_enc_state );
    1972      260850 :         rc_uni_enc_init( &range_uni_enc_state );
    1973             : 
    1974      260850 :         ecsq_inst.bit_count_estimate = 0;
    1975      260850 :         ecsq_inst.config_index = 2 * hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] - 1;
    1976             : 
    1977             :         /* 7 bits (STEREO_DFT_RES_GLOBAL_GAIN_BITS) for global_gain_index, 2 bits for closing of the arithmetic coder, 8 safety bits to account for the size estimation accuracy */
    1978             : #ifndef DEBUG_MODE_DFT
    1979      260850 :         ECSQ_encode_target_SNR( &ecsq_inst, MDCT_RES, hStereoDft->res_cod_line_max, max_snr, max_bits - ( *nb_bits ) - STEREO_DFT_RES_GLOBAL_GAIN_BITS - 2 - 8, NULL, &global_gain_index );
    1980             : #else
    1981             :         total_bit_count = (int16_t) ECSQ_encode_target_SNR( &ecsq_inst, MDCT_RES, hStereoDft->res_cod_line_max, max_snr, max_bits - ( *nb_bits ) - STEREO_DFT_RES_GLOBAL_GAIN_BITS - 2 - 8, MDCT_RES_dec, &global_gain_index );
    1982             : #endif
    1983      260850 :         if ( global_gain_index != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
    1984             :         {
    1985      240473 :             total_bit_count = rc_uni_enc_finish( &range_uni_enc_state );
    1986             : 
    1987      240473 :             if ( total_bit_count <= max_bits - *nb_bits - STEREO_DFT_RES_GLOBAL_GAIN_BITS )
    1988             :             {
    1989             :                 int16_t idx;
    1990             :                 uint8_t *byte_buffer;
    1991             : 
    1992             :                 /* Global gain */
    1993      240466 :                 push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    1994      240466 :                 ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS;
    1995             : #ifdef DEBUG_MODE_DFT
    1996             :                 fprintf( pF, "Gain: %d ", global_gain_index );
    1997             : #endif
    1998             : 
    1999             :                 /* Push arithmetic coded bits */
    2000      240466 :                 byte_buffer = range_uni_enc_state.byte_buffer;
    2001     4120796 :                 for ( idx = 0; idx < ( total_bit_count >> 3 ); ++idx )
    2002             :                 {
    2003     3880330 :                     push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx], 8 );
    2004             :                 }
    2005      240466 :                 if ( ( total_bit_count & 7 ) != 0 )
    2006             :                 {
    2007             :                     /* move the last 1 to 7 bits from the MSB position of the last byte to the LSB postion */
    2008      210571 :                     push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx] >> ( 8 - ( total_bit_count & 7 ) ), total_bit_count & 7 );
    2009             :                 }
    2010      240466 :                 ( *nb_bits ) += total_bit_count;
    2011             : #ifdef DEBUG_MODE_DFT
    2012             :                 fprintf( pF, "%d (max: %d)\n", STEREO_DFT_RES_GLOBAL_GAIN_BITS + total_bit_count, max_bits );
    2013             : #endif
    2014             :             }
    2015             :             else
    2016             :             {
    2017             :                 /* Global gain -> 127*/
    2018           7 :                 global_gain_index = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO;
    2019           7 :                 push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2020           7 :                 ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS;
    2021             : #ifdef DEBUG_MODE_DFT
    2022             :                 fprintf( pF, "Gain: %d ", global_gain_index );
    2023             :                 fprintf( pF, "%d (max: %d)\n", STEREO_DFT_RES_GLOBAL_GAIN_BITS, max_bits );
    2024             : #endif
    2025             :             }
    2026             :         }
    2027             :         else
    2028             :         {
    2029             :             /* Global gain -> 127*/
    2030       20377 :             push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
    2031       20377 :             ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS;
    2032             : #ifdef DEBUG_MODE_DFT
    2033             :             fprintf( pF, "Gain: %d ", global_gain_index );
    2034             :             fprintf( pF, "%d (max: %d)\n", STEREO_DFT_RES_GLOBAL_GAIN_BITS, max_bits );
    2035             : #endif
    2036             :         }
    2037             : #ifdef DEBUG_MODE_DFT
    2038             :         {
    2039             :             static FILE *resCodingSNR = NULL;
    2040             :             if ( resCodingSNR == NULL )
    2041             :                 resCodingSNR = fopen( "./res/resCodingSNR.txt", "w" );
    2042             :             fprintf( resCodingSNR, "%d\t%d\t%f\n", STEREO_DFT_RES_GLOBAL_GAIN_BITS + total_bit_count, max_bits, max_snr );
    2043             :         }
    2044             : #endif
    2045             : 
    2046      260850 :         pop_wmops();
    2047             : #ifdef DEBUG_MODE_DFT
    2048             :         {
    2049             :             int16_t tmp[1024];
    2050             :             static float mem_win[STEREO_DFT_OVL_8k];
    2051             :             float global_gain;
    2052             :             int16_t input_frame = L_FRAME8k;
    2053             :             float res_cod_error, res_cod_nrg, res_cod_snr;
    2054             : 
    2055             :             for ( i = 0; i < input_frame; i++ )
    2056             :             {
    2057             :                 tmp[i] = (int16_t) ( input_8k[i] + 0.5f );
    2058             :             }
    2059             :             dbgwrite( &tmp, sizeof( int16_t ), input_frame, 1, "./res/stereo_dft_enc_res_original.pcm" );
    2060             : 
    2061             :             if ( global_gain_index != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
    2062             :             {
    2063             :                 global_gain = ECSQ_dequantize_gain( global_gain_index );
    2064             :             }
    2065             :             else
    2066             :             {
    2067             :                 global_gain = 0.f;
    2068             :             }
    2069             :             dbgwrite( &global_gain, sizeof( float ), 1, 1, "./res/stereo_dft_res_cod_gain.dat" );
    2070             : 
    2071             :             tmp[0] = total_bit_count;
    2072             :             dbgwrite( &tmp, sizeof( int16_t ), 1, 1, "./res/stereo_dft_res_cod_bits.dat" );
    2073             : 
    2074             :             dbgwrite( &( hStereoDft->res_cod_line_max ), sizeof( int16_t ), 1, 1, "./res/stereo_dft_res_cod_line.dat" );
    2075             :             dbgwrite( &( hStereoDft->res_cod_band_max ), sizeof( int16_t ), 1, 1, "./res/stereo_dft_res_cod_band_max.dat" );
    2076             :             dbgwrite( &( hStereoDft->res_cod_NRG_M ), sizeof( float ), hStereoDft->nbands, 1, "./res/stereo_dft_dmx_nrg.dat" );
    2077             :             dbgwrite( &( hStereoDft->res_cod_NRG_S ), sizeof( float ), hStereoDft->nbands, 1, "./res/stereo_dft_res_nrg.dat" );
    2078             : 
    2079             :             /*Compute coding SNR*/
    2080             :             res_cod_nrg = EPSILON;
    2081             :             res_cod_error = EPSILON;
    2082             :             for ( i = 0; i < hStereoDft->res_cod_line_max; i++ )
    2083             :             {
    2084             :                 res_cod_nrg += MDCT_RES[i] * MDCT_RES[i];
    2085             :                 res_cod_error += ( MDCT_RES[i] - MDCT_RES_dec[i] ) * ( MDCT_RES[i] - MDCT_RES_dec[i] );
    2086             :             }
    2087             : 
    2088             :             res_cod_snr = 10.f * log10f( res_cod_nrg / res_cod_error );
    2089             :             dbgwrite( &( res_cod_snr ), sizeof( float ), 1, 1, "./res/stereo_dft_res_cod_snr.dat" );
    2090             : 
    2091             :             /*IMDCT*/
    2092             :             TCX_MDCT_Inverse( MDCT_RES_dec, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    2093             : 
    2094             :             /*OLA*/
    2095             :             /*overlapping parts*/
    2096             :             for ( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    2097             :             {
    2098             :                 win[i] = mem_win[i] + win[i] * hStereoDft->win_mdct_8k[i];
    2099             :                 mem_win[i] = win[input_frame + i] * hStereoDft->win_mdct_8k[STEREO_DFT_OVL_8k - 1 - i];
    2100             :             }
    2101             :             for ( i = 0; i < input_frame; i++ )
    2102             :             {
    2103             :                 tmp[i] = (int16_t) ( win[i] + 0.5f );
    2104             :             }
    2105             :             dbgwrite( tmp, sizeof( int16_t ), input_frame, 1, "./res/stereo_dft_enc_res_decoded.pcm" );
    2106             :         }
    2107             : #endif
    2108             :     }
    2109             : 
    2110             : #ifdef DEBUG_MODE_DFT
    2111             :     {
    2112             :         int16_t input_frame = L_FRAME8k;
    2113             :         static FILE *bits_consumed = NULL;
    2114             :         if ( bits_consumed == NULL )
    2115             :             bits_consumed = fopen( "./res/stereo_dft_bits_consumed.txt", "w" );
    2116             : 
    2117             :         fprintf( bits_consumed, " %d \n", *nb_bits );
    2118             :         dbgwrite( nb_bits, sizeof( int16_t ), 1, input_frame, "./res/stereo_dft_bits_consumed.dat" );
    2119             :     }
    2120             : #endif
    2121             : 
    2122      910327 :     return;
    2123             : }
    2124             : 
    2125             : 
    2126             : /*-------------------------------------------------------------------------
    2127             :  * stereo_dft_enc_write_BS()
    2128             :  *
    2129             :  * Write DFT stereo bitstream
    2130             :  *-------------------------------------------------------------------------*/
    2131             : 
    2132      726769 : void stereo_dft_enc_write_BS(
    2133             :     CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure   */
    2134             :     int16_t *nb_bits     /* o  : number of bits written  */
    2135             : )
    2136             : {
    2137             :     int16_t b, k_offset, itd, nb, nbands, sp_aud_decision0;
    2138             :     int16_t NFFT_inner, nbands_full;
    2139             :     int16_t no_GR_ord;
    2140             :     int16_t encoded_ind_GR[STEREO_DFT_BAND_MAX];
    2141             :     int16_t encoded_ind_pred_GR[STEREO_DFT_BAND_MAX];
    2142             :     int16_t sid_gIpd_index, sid_itd;
    2143             :     float cohBand[STEREO_DFT_BAND_MAX / 2];
    2144             :     BSTR_ENC_HANDLE hBstr;
    2145             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
    2146             :     int32_t core_brate;
    2147             : #ifdef DEBUG_MODE_DFT
    2148             :     static FILE *ITD_values = NULL, *side_gain_values = NULL, *RPG_values = NULL;
    2149             :     static FILE *cum_freq_enc = NULL;
    2150             : 
    2151             :     if ( pF == NULL )
    2152             :         pF = fopen( "./res/stereo_dft_enc_ind.txt", "w" );
    2153             :     if ( ITD_values == NULL )
    2154             :         ITD_values = fopen( "./res/itd_indicies_enc.txt", "w" );
    2155             :     if ( side_gain_values == NULL )
    2156             :         side_gain_values = fopen( "./res/side_gain_indicies_enc.txt", "w" );
    2157             :     if ( RPG_values == NULL )
    2158             :         RPG_values = fopen( "./res/rpg_indicies_enc.txt", "w" );
    2159             :     if ( cum_freq_enc == NULL )
    2160             :         cum_freq_enc = fopen( "./res/cum_freq_enc.txt", "w" );
    2161             : #endif
    2162             : 
    2163             :     /*------------------------------------------------------------------*
    2164             :      * Initialization
    2165             :      *-----------------------------------------------------------------*/
    2166             : 
    2167      726769 :     hStereoDft = hCPE->hStereoDft;
    2168      726769 :     hBstr = hCPE->hMetaData;
    2169      726769 :     core_brate = hCPE->hCoreCoder[0]->core_brate;
    2170             : 
    2171      726769 :     sp_aud_decision0 = 0;
    2172      726769 :     if ( hCPE->last_element_mode == IVAS_CPE_DFT )
    2173             :     {
    2174      717794 :         sp_aud_decision0 = hCPE->hCoreCoder[0]->sp_aud_decision0;
    2175             :     }
    2176             : 
    2177      726769 :     *nb_bits = 0;
    2178      726769 :     k_offset = STEREO_DFT_OFFSET;
    2179             : 
    2180      726769 :     nbands_full = hStereoDft->nbands;
    2181             : 
    2182      726769 :     if ( core_brate == FRAME_NO_DATA || core_brate == SID_2k40 )
    2183             :     {
    2184       40511 :         NFFT_inner = min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k );
    2185       40511 :         hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
    2186       40511 :         hStereoDft->res_pred_mode[k_offset] = 0;
    2187       40511 :         hStereoDft->res_cod_mode[k_offset] = 0;
    2188             :     }
    2189             :     else
    2190             :     {
    2191      686258 :         NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k;
    2192             :     }
    2193             : 
    2194             :     /* set number of bands according to bandwidth after BWD */
    2195      726769 :     hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC );
    2196             : 
    2197      726769 :     if ( core_brate == FRAME_NO_DATA )
    2198             :     {
    2199             :         /* No data frame */
    2200       34447 :         ( *nb_bits ) = 0;
    2201       34447 :         return;
    2202             :     }
    2203             : 
    2204             :     /* attack present */
    2205             :     /* attackPresent not sent in inactive frames, receiver assumes = 0  */
    2206      692322 :     if ( core_brate != SID_2k40 )
    2207             :     {
    2208      686258 :         push_indice( hBstr, IND_STEREO_DFT_ATTACK_PRESENT, hStereoDft->attackPresent, 1 );
    2209      686258 :         ( *nb_bits )++;
    2210             :     }
    2211             : 
    2212             :     /* Writing coding residual coding mode into bitstream */
    2213      692322 :     if ( hStereoDft->hConfig->ada_wb_res_cod_mode && hCPE->hCoreCoder[0]->bwidth == WB )
    2214             :     {
    2215       51380 :         push_indice( hBstr, IND_STEREO_DFT_RES_COD, hStereoDft->res_cod_mode[k_offset], 1 );
    2216       51380 :         ( *nb_bits )++;
    2217       51380 :         hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
    2218       51380 :         hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
    2219             : #ifdef DEBUG_MODE_DFT
    2220             :         fprintf( pF, "res_cod_mode: %d\n", hStereoDft->res_cod_mode[k_offset] );
    2221             : #endif
    2222             :     }
    2223             : 
    2224             : #ifdef DEBUG_MODE_DFT
    2225             :     fprintf( pF, "stereo Data: %d %d %d %d %d\n", hStereoDft->band_res[k_offset], 1, hStereoDft->res_pred_mode[k_offset], hStereoDft->res_cod_mode[k_offset], hStereoDft->res_cod_band_max );
    2226             :     fprintf( pF, "stereo Bands: %d\n", hStereoDft->nbands );
    2227             : 
    2228             :     dbgwrite( &( hStereoDft->nbands ), sizeof( int16_t ), 1, 1, "./res/stereo_dft_encBS_nbands.dat" );
    2229             :     dbgwrite( &( hCPE->hCoreCoder[0]->bwidth ), sizeof( int16_t ), 1, 1, "./res/stereo_dft_encBS_bwidth.dat" );
    2230             : 
    2231             : #endif
    2232             : 
    2233      692322 :     if ( nbands_full < hStereoDft->nbands )
    2234             :     {
    2235           0 :         hStereoDft->reverb_flag = 0;
    2236             :     }
    2237             : 
    2238             :     /* Side gains */
    2239      692322 :     hStereoDft->side_gain_flag_1 = 0; /* EC coding by default */
    2240      692322 :     side_gain_mode_decision( hStereoDft, encoded_ind_GR, sp_aud_decision0, hCPE->hCoreCoder[0]->last_core_brate );
    2241             : 
    2242             :     /* residual pred. gains */
    2243      692322 :     hStereoDft->res_pred_flag_1 = 0; /* EC coding by default */
    2244             : 
    2245      692322 :     res_pred_gain_mode_decision( hStereoDft, encoded_ind_pred_GR, k_offset, hCPE->hCoreCoder[0]->last_core_brate );
    2246             : 
    2247             :     /*------------------------------------------------------------------*
    2248             :      * write ITD indices
    2249             :      *-----------------------------------------------------------------*/
    2250             : 
    2251      692322 :     if ( core_brate != SID_2k40 )
    2252             :     {
    2253      686258 :         push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, ( hStereoDft->hItd->itd[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS );
    2254      686258 :         ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/
    2255             :     }
    2256             : 
    2257             : #ifdef DEBUG_MODE_DFT
    2258             :     fprintf( pF, "ITD: %d ", hStereoDft->hConfig->itd_mode && ( hStereoDft->hItd->itd[k_offset] != 0 ) );
    2259             : #endif
    2260      692322 :     if ( core_brate != SID_2k40 )
    2261             :     {
    2262      686258 :         if ( hStereoDft->hItd->itd[k_offset] )
    2263             :         {
    2264      201973 :             itd = hStereoDft->hItd->itd_index[k_offset];
    2265      201973 :             if ( itd > 255 )
    2266             :             {
    2267       88508 :                 itd -= 256;
    2268             : 
    2269       88508 :                 if ( itd < 20 )
    2270             :                 {
    2271       52278 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
    2272       52278 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 );  /* negative */
    2273       52278 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
    2274       52278 :                     ( *nb_bits ) += dft_len_itd[itd] + 2;
    2275             :                 }
    2276             :                 else
    2277             :                 {
    2278       36230 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 0, 1 ); /* don't use Huffman */
    2279       36230 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 );  /* negative */
    2280       36230 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS - 1 );
    2281       36230 :                     ( *nb_bits ) += STEREO_DFT_ITD_NBITS + 1;
    2282             :                 }
    2283             :             }
    2284             :             else
    2285             :             {
    2286      113465 :                 if ( itd < 20 )
    2287             :                 {
    2288       77600 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
    2289       77600 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 );  /* positive */
    2290       77600 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
    2291       77600 :                     ( *nb_bits ) += dft_len_itd[itd] + 2;
    2292             :                 }
    2293             :                 else
    2294             :                 {
    2295             :                     /* don't use Huffman and positive*/
    2296       35865 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS + 1 );
    2297       35865 :                     ( *nb_bits ) += STEREO_DFT_ITD_NBITS + 1;
    2298             :                 }
    2299             :             }
    2300             : #ifdef DEBUG_MODE_DFT
    2301             :             fprintf( pF, "ITD: %d ", hStereoDft->hItd->itd_index[k_offset] );
    2302             :             fprintf( ITD_values, "%d  %d ", frame, hStereoDft->hItd->itd_index[k_offset] );
    2303             : #endif
    2304             :         }
    2305             :     }
    2306             : 
    2307             : #ifdef DEBUG_MODE_DFT_BITS
    2308             :     fprintf( ITD_bits, "%d ", *nb_bits );
    2309             : #endif
    2310             : 
    2311             :     /*------------------------------------------------------------------*
    2312             :      * write Side gain indices
    2313             :      *-----------------------------------------------------------------*/
    2314             : 
    2315             :     /* Side Gain flag 1 */
    2316      692322 :     nb = 0;
    2317      692322 :     if ( hStereoDft->side_gain_flag_1 > 0 )
    2318             :     {
    2319      212961 :         push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, 2 );
    2320      212961 :         nb += 2;
    2321             :     }
    2322             :     else
    2323             :     {
    2324      479361 :         push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, STEREO_DFT_FLAG_BITS );
    2325      479361 :         nb += STEREO_DFT_FLAG_BITS;
    2326             :     }
    2327             : 
    2328      692322 :     no_GR_ord = 3;
    2329             : 
    2330             : #ifdef DEBUG_MODE_DFT
    2331             :     for ( b = 0; b < hStereoDft->nbands; b++ )
    2332             :     {
    2333             :         fprintf( pF, "Side gain: %d ", hStereoDft->side_gain_index_EC[b] );
    2334             :         fprintf( side_gain_values, " %d ", hStereoDft->side_gain_index_EC[b] );
    2335             :     }
    2336             : #endif
    2337      692322 :     if ( hStereoDft->side_gain_flag_1 == 0 )
    2338             :     {
    2339      479361 :         nb += write_bitstream_adapt_GR( hBstr, IND_STEREO_DFT_SIDEGAINS, encoded_ind_GR, hStereoDft->nbands, hStereoDft->side_gain_flag_2, no_GR_ord );
    2340             :     }
    2341             :     else
    2342             :     {
    2343      212961 :         if ( hStereoDft->side_gain_flag_1 == 2 )
    2344             :         {
    2345      208298 :             nb += write_bitstream_GR( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_ECDiff, hStereoDft->nbands, hStereoDft->side_gain_flag_2 - no_GR_ord );
    2346             :         }
    2347             :         else
    2348             :         {
    2349       39533 :             for ( b = 0; b < hStereoDft->nbands; b++ )
    2350             :             {
    2351             :                 /*ILD*/
    2352       34870 :                 push_indice( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_EC[b], STEREO_DFT_SIDEGAIN_NBITS );
    2353       34870 :                 nb += STEREO_DFT_SIDEGAIN_NBITS;
    2354             :             }
    2355             :         }
    2356             :     }
    2357             : 
    2358             :     /* nb bits are used for side gain*/
    2359      692322 :     ( *nb_bits ) += nb;
    2360             : #ifdef DEBUG_MODE_DFT_BITS
    2361             :     fprintf( SG_bits, "%d ", nb );
    2362             : #endif
    2363      692322 :     nb = 0;
    2364             : 
    2365      692322 :     if ( core_brate == SID_2k40 )
    2366             :     {
    2367        6064 :         stereo_dft_enc_sid_calc_coh( hStereoDft, hCPE->hStereoCng->prev_cohBand, &hCPE->hStereoCng->td_active, &hCPE->hStereoCng->first_SID, cohBand );
    2368             : 
    2369        6064 :         if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) )
    2370             :         {
    2371        6064 :             if ( hStereoDft->hItd->itd[k_offset] != 0 )
    2372             :             {
    2373             :                 /* Re-quantize ITD with lower resolution for Stereo CNG */
    2374         653 :                 itd = hStereoDft->hItd->itd_index[k_offset];
    2375         653 :                 if ( itd > 255 )
    2376             :                 {
    2377         167 :                     itd -= 256;
    2378             :                 }
    2379         653 :                 itd = itd >> STEREO_DFT_SID_ITD_FAC;
    2380             : 
    2381         653 :                 sid_itd = itd && 1;
    2382             :             }
    2383             :             else
    2384             :             {
    2385        5411 :                 sid_itd = 0;
    2386             :             }
    2387             : 
    2388        6064 :             push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, sid_itd, STEREO_DFT_ITD_MODE_NBITS );
    2389        6064 :             ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/
    2390             : 
    2391        6064 :             if ( sid_itd )
    2392             :             {
    2393         364 :                 itd = hStereoDft->hItd->itd_index[k_offset];
    2394         364 :                 if ( itd > 255 )
    2395             :                 {
    2396          60 :                     itd -= 256;
    2397          60 :                     itd = itd >> STEREO_DFT_SID_ITD_FAC;
    2398             : 
    2399          60 :                     if ( itd > ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) )
    2400             :                     {
    2401          22 :                         itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
    2402             :                     }
    2403             : 
    2404          60 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */
    2405          60 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
    2406          60 :                     ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1;
    2407             :                 }
    2408             :                 else
    2409             :                 {
    2410         304 :                     itd = itd >> STEREO_DFT_SID_ITD_FAC;
    2411             : 
    2412         304 :                     if ( itd > ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) )
    2413             :                     {
    2414          75 :                         itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
    2415             :                     }
    2416             : 
    2417         304 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* Positive */
    2418         304 :                     push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
    2419         304 :                     ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1;
    2420             :                 }
    2421             : 
    2422             : #ifdef DEBUG_MODE_DFT
    2423             :                 fprintf( pF, "ITD: %d ", hStereoDft->hItd->itd_index[k_offset] );
    2424             :                 fprintf( ITD_values, "%d  %d ", frame, hStereoDft->hItd->itd_index[k_offset] );
    2425             : #endif
    2426             :             }
    2427             :         }
    2428             :     }
    2429             : 
    2430             :     /*------------------------------------------------------------------*
    2431             :      * write IPD indices
    2432             :      *-----------------------------------------------------------------*/
    2433             : 
    2434      692322 :     if ( core_brate != SID_2k40 )
    2435             :     {
    2436      686258 :         push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
    2437      686258 :         nb += STEREO_DFT_FLAG_BITS; /*IPD mode flag: 1bit*/
    2438             : 
    2439      686258 :         if ( hStereoDft->no_ipd_flag == 0 )
    2440             :         {
    2441       23545 :             push_indice( hBstr, IND_STEREO_DFT_GIPD, hStereoDft->gipd_index, STEREO_DFT_GIPD_NBITS );
    2442       23545 :             nb += STEREO_DFT_GIPD_NBITS;
    2443             :         }
    2444             :     }
    2445        6064 :     else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) )
    2446             :     {
    2447        6064 :         push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
    2448        6064 :         nb += STEREO_DFT_FLAG_BITS; /*IPD mode flag: 1bit*/
    2449             : 
    2450        6064 :         if ( hStereoDft->no_ipd_flag == 0 )
    2451             :         {
    2452         850 :             stereo_dft_quantize_ipd( &hStereoDft->sid_gipd, &hStereoDft->sid_gipd, &sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
    2453         850 :             push_indice( hBstr, IND_STEREO_DFT_GIPD, sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
    2454         850 :             nb += STEREO_DFT_SID_GIPD_NBITS;
    2455             :         }
    2456             :     }
    2457             : 
    2458             : 
    2459             : #ifdef DEBUG_MODE_DFT_BITS
    2460             :     fprintf( IPD_bits, "%d ", nb );
    2461             : #endif
    2462      692322 :     ( *nb_bits ) += nb;
    2463             : 
    2464             :     /*----------------------------------------------------------------*
    2465             :      * Residual prediction
    2466             :      *----------------------------------------------------------------*/
    2467             : 
    2468      692322 :     nb = 0; /* bits for residual pred gains */
    2469      692322 :     if ( hStereoDft->res_pred_mode[k_offset] )
    2470             :     {
    2471      686258 :         if ( hStereoDft->attackPresent == 0 )
    2472             :         {
    2473      665983 :             nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
    2474      665983 :             b = hStereoDft->res_pred_band_min;
    2475             : 
    2476             :             /*Adaptive SF*/
    2477      665983 :             if ( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
    2478             :             {
    2479             :                 /*read flag*/
    2480      410078 :                 push_indice( hBstr, IND_STEREO_DFT_REVERB_MODE, hStereoDft->reverb_flag, STEREO_DFT_REVERB_MODE_NBITS );
    2481      410078 :                 nb += STEREO_DFT_REVERB_MODE_NBITS;
    2482             : #ifdef DEBUG_MODE_DFT
    2483             :                 fprintf( RPG_values, " reverb_flag %d ", hStereoDft->reverb_flag );
    2484             : #endif
    2485      410078 :                 if ( hStereoDft->reverb_flag )
    2486             :                 {
    2487      153362 :                     nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST;
    2488             :                 }
    2489             :             }
    2490             : 
    2491             :             /* Res Pred Gain flag 0 */
    2492      665983 :             if ( hStereoDft->res_pred_flag_1 > 0 )
    2493             :             {
    2494      479352 :                 push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, 2 );
    2495      479352 :                 nb += 2; /*pred gain mode flag: 2 bits*/
    2496             :             }
    2497             :             else
    2498             :             {
    2499      186631 :                 push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, STEREO_DFT_FLAG_BITS );
    2500      186631 :                 nb += STEREO_DFT_FLAG_BITS; /*pred gain mode flag: 1bit*/
    2501             :             }
    2502             : 
    2503      665983 :             no_GR_ord = 2;
    2504      665983 :             if ( hStereoDft->res_pred_flag_1 == 0 )
    2505             :             {
    2506             : #ifdef DEBUG_MODE_DFT
    2507             :                 fprintf( RPG_values, "flag: 0" );
    2508             : #endif
    2509      186631 :                 if ( encoded_ind_pred_GR[0] == dft_maps_rpg[8 * NO_SYMB_GR_PRED_G] )
    2510             :                 {
    2511       92893 :                     nb += write_GR1( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, 1 );
    2512             :                 }
    2513             :                 else
    2514             :                 {
    2515       93738 :                     nb += write_bitstream_adapt_GR( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2, 2 );
    2516             :                 }
    2517             :             }
    2518             :             else
    2519             :             {
    2520      479352 :                 if ( hStereoDft->res_pred_flag_1 == 2 )
    2521             :                 {
    2522             : #ifdef DEBUG_MODE_DFT
    2523             :                     fprintf( RPG_values, "flag: 2" );
    2524             : #endif
    2525      434215 :                     nb += write_bitstream_GR( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2 - no_GR_ord );
    2526             :                 }
    2527             :                 else
    2528             :                 {
    2529             : #ifdef DEBUG_MODE_DFT
    2530             :                     fprintf( RPG_values, "flag: 1" );
    2531             : #endif
    2532      352751 :                     for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    2533             :                     {
    2534      307614 :                         push_indice( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, hStereoDft->res_pred_index_EC[b], STEREO_DFT_RES_GAINS_BITS );
    2535      307614 :                         nb += STEREO_DFT_RES_GAINS_BITS;
    2536             :                     }
    2537             :                 }
    2538             :             }
    2539             : 
    2540             : #ifdef DEBUG_MODE_DFT
    2541             :             for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    2542             :             {
    2543             :                 fprintf( pF, "Res pred values: %d ", hStereoDft->res_pred_index_EC[b] );
    2544             :                 if ( hStereoDft->res_pred_flag_1 == 2 )
    2545             :                 {
    2546             :                     fprintf( RPG_values, " %d(%d) ", hStereoDft->res_pred_index_EC[b], hStereoDft->res_pred_index_EC[b] + ( ( hStereoDft->res_pred_index_ECDiff[b] % 2 ) ? -( hStereoDft->res_pred_index_ECDiff[b] + 1 ) / 2 : ( hStereoDft->res_pred_index_ECDiff[b] ) / 2 ) );
    2547             :                 }
    2548             :                 else
    2549             :                 {
    2550             :                     fprintf( RPG_values, " %d ", hStereoDft->res_pred_index_EC[b] );
    2551             :                 }
    2552             :             }
    2553             : #endif
    2554             :         }
    2555             :         else
    2556             :         {
    2557       20275 :             set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min );
    2558             :         }
    2559             :     }
    2560             :     else
    2561             :     {
    2562        6064 :         set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min );
    2563             :     }
    2564             : 
    2565      692322 :     ( *nb_bits ) += nb;
    2566             : 
    2567      692322 :     if ( core_brate == SID_2k40 )
    2568             :     {
    2569        6064 :         stereo_dft_enc_sid_coh( hBstr, hCPE->hStereoCng->mem_cohBand, hStereoDft->nbands, nb_bits, cohBand );
    2570             :     }
    2571             : 
    2572             : #ifdef DEBUG_MODE_DFT
    2573             :     /*fprintf(pF, "Total bits: %d", (*nb_bits));*/
    2574             :     fprintf( pF, "\n" );
    2575             :     fprintf( ITD_values, "\n" );
    2576             :     fprintf( side_gain_values, "\n" );
    2577             :     fprintf( RPG_values, "\n" );
    2578             : #endif
    2579             : 
    2580      692322 :     return;
    2581             : }
    2582             : 
    2583             : 
    2584             : /*-------------------------------------------------------------------------
    2585             :  * stereo_dft_enc_compute_prm()
    2586             :  *
    2587             :  * Compute stereo parameters: IPD and SIDE_GAIN
    2588             :  * SIDE_GAIN: Interchannel Level Difference
    2589             :  * IPD: Interchannel Phase Difference: angle(L)-angle(R) = acos(<L,R>/(|L|.|R|)) or atan2(Img(L.R*)/Re(L.R*))
    2590             :  *------------------------------------------------------------------------*/
    2591             : 
    2592      912789 : static void stereo_dft_enc_compute_prm(
    2593             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    2594             :     float *DFT_L,
    2595             :     float *DFT_R,
    2596             :     int16_t k_offset,
    2597             :     int16_t flag_quant,
    2598             :     const int16_t sp_aud_decision0,
    2599             :     const int16_t vad_flag,
    2600             :     float *bin_nrgL,
    2601             :     float *bin_nrgR,
    2602             :     float *dot_prod_nrg_ratio )
    2603             : {
    2604             :     int16_t b, i;
    2605             :     int16_t b2;
    2606             :     float *pDFT_L, *pDFT_R;
    2607             :     float sum_nrg_L, sum_nrg_R;
    2608             :     float dot_prod_real, dot_prod_img;
    2609             :     float sum_nrg_L2, sum_nrg_R2;
    2610             :     float dot_prod_real2, dot_prod_img2;
    2611             :     float *pPredGain;
    2612             :     float *pSideGain;
    2613             :     float sum_energy_L, sum_energy_R;
    2614             :     float g, c;
    2615             :     float abs_L_R;
    2616             :     float abs_L_R2;
    2617             :     float gain_IPD;
    2618             :     float sub_nrg_DMX[STEREO_DFT_BAND_MAX];
    2619             :     float sub_nrg_DMX2;
    2620             :     float sub_nrg_L[STEREO_DFT_BAND_MAX];
    2621             :     float sub_nrg_R[STEREO_DFT_BAND_MAX];
    2622             :     float diff_ipd;
    2623             :     float *pNrgL, *pNrgR;
    2624             :     float reg;
    2625             :     float *pgIpd, sum_dot_prod_real, sum_dot_prod_img;
    2626             :     float sum_past_nrgL, sum_past_nrgL2;
    2627             :     float sum_past_nrgR, sum_past_nrgR2;
    2628             :     float sum_past_dpr, sum_past_dpr2;
    2629             :     float sum_past_dpi, sum_past_dpi2;
    2630             :     float sum_past_dot_prod_abs, sum_past_dot_prod_abs2;
    2631             :     float sum_past_nrg_dmx;
    2632             :     int16_t pos;
    2633             :     float pIpd[STEREO_DFT_BAND_MAX];
    2634             :     float ipd_smooth[STEREO_DFT_BAND_MAX];
    2635             :     float ipd_mean_change;
    2636             : 
    2637             :     /*------------------------------------------------------------------*
    2638             :      * Initialization
    2639             :      *-----------------------------------------------------------------*/
    2640             : 
    2641      912789 :     sum_past_dot_prod_abs2 = 0.0f;
    2642      912789 :     pos = hStereoDft->nrg_past_pos;
    2643             : 
    2644      912789 :     set_f( sub_nrg_DMX, 0, STEREO_DFT_BAND_MAX );
    2645      912789 :     set_f( sub_nrg_L, 0, STEREO_DFT_BAND_MAX );
    2646      912789 :     set_f( sub_nrg_R, 0, STEREO_DFT_BAND_MAX );
    2647             : 
    2648      912789 :     pSideGain = hStereoDft->side_gain + k_offset * STEREO_DFT_BAND_MAX;
    2649      912789 :     pgIpd = hStereoDft->gipd + k_offset;
    2650      912789 :     pPredGain = hStereoDft->res_pred_gain + k_offset * STEREO_DFT_BAND_MAX;
    2651      912789 :     gain_IPD = EPSILON;
    2652      912789 :     sum_energy_L = EPSILON; /* Set the accumulations for the no IPD Calculation */
    2653      912789 :     sum_energy_R = EPSILON;
    2654      912789 :     sum_dot_prod_real = EPSILON;
    2655      912789 :     sum_dot_prod_img = EPSILON;
    2656      912789 :     sub_nrg_DMX2 = 0.f;
    2657             : #ifdef DEBUG_MODE_DFT
    2658             :     sum_nrg_L = EPSILON;
    2659             :     sum_nrg_R = EPSILON;
    2660             : #endif
    2661             : 
    2662             :     /*------------------------------------------------------------------*
    2663             :      * Band-wise processing
    2664             :      *-----------------------------------------------------------------*/
    2665             : 
    2666      912789 :     b2 = 0;
    2667     9328424 :     for ( b = 0; b < hStereoDft->nbands; b++ )
    2668             :     {
    2669     8415635 :         pPredGain[b] = 1.f;
    2670     8415635 :         sum_nrg_L = EPSILON;
    2671     8415635 :         sum_nrg_R = EPSILON;
    2672     8415635 :         dot_prod_real = EPSILON;
    2673     8415635 :         dot_prod_img = EPSILON;
    2674     8415635 :         sum_past_nrgL = 0;
    2675     8415635 :         sum_past_nrgR = 0;
    2676     8415635 :         sum_past_dpr = 0;
    2677     8415635 :         sum_past_dpi = 0;
    2678             : 
    2679    19280412 :         while ( hStereoDft->band_limits_dmx[b2] < hStereoDft->band_limits[b + 1] )
    2680             :         {
    2681    10864777 :             pDFT_L = DFT_L;
    2682    10864777 :             pDFT_R = DFT_R;
    2683    10864777 :             pNrgL = bin_nrgL;
    2684    10864777 :             pNrgR = bin_nrgR;
    2685             : 
    2686    10864777 :             sum_nrg_L2 = EPSILON;
    2687    10864777 :             sum_nrg_R2 = EPSILON;
    2688    10864777 :             dot_prod_real2 = EPSILON;
    2689    10864777 :             dot_prod_img2 = EPSILON;
    2690             : 
    2691   619637108 :             for ( i = hStereoDft->band_limits_dmx[b2]; i < hStereoDft->band_limits_dmx[b2 + 1]; i++ )
    2692             :             {
    2693   608772331 :                 sum_nrg_L2 += pNrgL[i];
    2694   608772331 :                 sum_nrg_R2 += pNrgR[i];
    2695             : 
    2696             :                 /* compute dot product*/
    2697   608772331 :                 dot_prod_real2 += pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1];
    2698   608772331 :                 dot_prod_img2 += pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1];
    2699             :             }
    2700    10864777 :             abs_L_R2 = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 );
    2701    10864777 :             sub_nrg_DMX2 = sum_nrg_L2 + sum_nrg_R2 + 2 * abs_L_R2;
    2702             : 
    2703    10864777 :             if ( b2 < hStereoDft->gipd_band_max )
    2704             :             {
    2705     7302312 :                 hStereoDft->dot_prod_real_smooth[b2] = 0.5f * hStereoDft->dot_prod_real_smooth[b2] + 0.5f * dot_prod_real2;
    2706     7302312 :                 hStereoDft->dot_prod_img_smooth[b2] = 0.5f * hStereoDft->dot_prod_img_smooth[b2] + 0.5f * dot_prod_img2;
    2707     7302312 :                 pIpd[b2] = (float) atan2f( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] );
    2708             : 
    2709     7302312 :                 ipd_smooth[b2] = stereo_dft_calc_mean_bipd( &pIpd[b2], hStereoDft->ipd_buf[b2] );
    2710             : 
    2711     7302312 :                 gain_IPD += ( sum_nrg_L2 + sum_nrg_R2 + 2 * dot_prod_real2 ) / sub_nrg_DMX2 / hStereoDft->gipd_band_max;
    2712             :             }
    2713             : 
    2714    10864777 :             sum_past_nrgL2 = EPSILON;
    2715    10864777 :             sum_past_nrgR2 = EPSILON;
    2716    10864777 :             sum_past_dpr2 = EPSILON;
    2717    10864777 :             sum_past_dpi2 = EPSILON;
    2718    10864777 :             if ( ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH && b2 < STEREO_DFT_NRG_PAST_MAX_BAND ) ||
    2719     6452734 :                  ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW && b2 < 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) )
    2720             :             {
    2721     7792539 :                 hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2;
    2722     7792539 :                 hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2;
    2723     7792539 :                 hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2;
    2724     7792539 :                 hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2;
    2725             : 
    2726    31170156 :                 for ( i = 0; i < STEREO_DFT_NRG_PAST_LEN; i++ )
    2727             :                 {
    2728    23377617 :                     sum_past_nrgL2 += hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    2729    23377617 :                     sum_past_nrgR2 += hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    2730    23377617 :                     sum_past_dpr2 += hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    2731    23377617 :                     sum_past_dpi2 += hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + i];
    2732             :                 }
    2733             : 
    2734     7792539 :                 if ( hStereoDft->attackPresent )
    2735             :                 {
    2736             :                     /* omit transient frames from past part of parameter estimation in following frames */
    2737      265171 :                     int16_t prev_pos = ( pos + STEREO_DFT_NRG_PAST_LEN - 1 ) % STEREO_DFT_NRG_PAST_LEN;
    2738      265171 :                     hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    2739      265171 :                     hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    2740      265171 :                     hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    2741      265171 :                     hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
    2742             :                 }
    2743             : 
    2744     7792539 :                 sum_past_dot_prod_abs2 = sqrtf( sum_past_dpr2 * sum_past_dpr2 + sum_past_dpi2 * sum_past_dpi2 );
    2745     7792539 :                 dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON );
    2746             :             }
    2747             :             else
    2748             :             {
    2749     3072238 :                 sum_past_nrgL2 += sum_nrg_L2;
    2750     3072238 :                 sum_past_nrgR2 += sum_nrg_R2;
    2751     3072238 :                 dot_prod_nrg_ratio[b2] = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 );
    2752     3072238 :                 if ( b2 == 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) /* hStereoDft->band_res[k_offset] == 2 */
    2753             :                 {
    2754      422562 :                     dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON );
    2755             :                 }
    2756             :             }
    2757    10864777 :             sum_nrg_L += sum_nrg_L2;
    2758    10864777 :             sum_nrg_R += sum_nrg_R2;
    2759    10864777 :             dot_prod_real += dot_prod_real2;
    2760    10864777 :             dot_prod_img += dot_prod_img2;
    2761             : 
    2762    10864777 :             sum_past_nrgL += sum_past_nrgL2;
    2763    10864777 :             sum_past_nrgR += sum_past_nrgR2;
    2764    10864777 :             sum_past_dpr += sum_past_dpr2;
    2765    10864777 :             sum_past_dpi += sum_past_dpi2;
    2766             : 
    2767    10864777 :             b2++;
    2768             :         }
    2769     8415635 :         sum_energy_L += sum_nrg_L; /* Energies of the individual Band for Left and Right */
    2770     8415635 :         sum_energy_R += sum_nrg_R;
    2771     8415635 :         sum_dot_prod_real += dot_prod_real;
    2772     8415635 :         sum_dot_prod_img += dot_prod_img;
    2773             : 
    2774             :         /* compute side and residual gains over two frames */
    2775     8415635 :         abs_L_R = sqrtf( dot_prod_real * dot_prod_real + dot_prod_img * dot_prod_img );
    2776             : 
    2777     8415635 :         if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW && b < 4 )
    2778             :         {
    2779     1690248 :             sum_past_dot_prod_abs = sqrtf( sum_past_dpr * sum_past_dpr + sum_past_dpi * sum_past_dpi );
    2780             :         }
    2781     6725387 :         else if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH && b < 9 )
    2782             :         {
    2783     4412043 :             sum_past_dot_prod_abs = sum_past_dot_prod_abs2;
    2784             :         }
    2785             :         else
    2786             :         {
    2787     2313344 :             sum_past_dot_prod_abs = abs_L_R;
    2788             :         }
    2789             : 
    2790     8415635 :         c = sqrtf( sum_past_nrgL / sum_past_nrgR );
    2791     8415635 :         sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs;
    2792     8415635 :         sub_nrg_DMX[b] = sum_nrg_L + sum_nrg_R + 2 * abs_L_R;
    2793             : 
    2794     8415635 :         sub_nrg_L[b] = sum_nrg_L;
    2795     8415635 :         sub_nrg_R[b] = sum_nrg_R;
    2796             : 
    2797     8415635 :         if ( ( hStereoDft->res_pred_mode[k_offset] && b >= hStereoDft->res_pred_band_min ) || ( b < hStereoDft->res_cod_band_max ) )
    2798             :         {
    2799     7483023 :             g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx );
    2800     7483023 :             pSideGain[b] = g;
    2801             :         }
    2802             :         else
    2803             :         {
    2804      932612 :             g = 0.0f; /* to avoid compilation warning */
    2805      932612 :             pSideGain[b] = ( c - 1 ) / ( c + 1 );
    2806             :         }
    2807             : 
    2808     8415635 :         if ( hStereoDft->res_pred_mode[k_offset] && b >= hStereoDft->res_pred_band_min && !( hStereoDft->attackPresent ) )
    2809             :         {
    2810             :             /*(1-g)^2*L*L' + (1+g)^2*R*R' - 2(1-g^2)*abs(L*R')*/
    2811     5905385 :             pPredGain[b] = max( 0, ( ( 1 - g ) * sum_past_nrgL + ( 1 + g ) * sum_past_nrgR - 2 * sum_past_dot_prod_abs ) );
    2812             : 
    2813             :             /*Normalized with energy of DMX*/
    2814             : 
    2815             :             /*Regularized gain computation by adding a coherent low energy contribution->avoid singularity for very low energy signals */
    2816             : 
    2817     5905385 :             reg = ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) * sqrtf( STEREO_DFT_N_32k_ENC );
    2818     5905385 :             reg *= reg;
    2819             : 
    2820     5905385 :             pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) );
    2821             : 
    2822     5905385 :             if ( hStereoDft->hItd->deltaItd[k_offset] != 0 )
    2823             :             {
    2824             :                 float gain_offset, conversion_factor;
    2825             :                 int16_t dItd32;
    2826             : 
    2827             :                 /* factor for converting deltaItd to 32kHz */
    2828     1245715 :                 conversion_factor = 1.f;
    2829     1245715 :                 if ( hStereoDft->NFFT == STEREO_DFT_N_16k_ENC )
    2830             :                 {
    2831      235580 :                     conversion_factor = 2.f;
    2832             :                 }
    2833     1010135 :                 else if ( hStereoDft->NFFT == STEREO_DFT_N_MAX_ENC )
    2834             :                 {
    2835      495350 :                     conversion_factor = 2.f / 3;
    2836             :                 }
    2837     1245715 :                 dItd32 = (int16_t) floorf( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f );
    2838             : 
    2839     1245715 :                 gain_offset = stereo_dft_gain_offset( c, dItd32 );
    2840     1245715 :                 pPredGain[b] = max( 0, pPredGain[b] - gain_offset );
    2841             :             }
    2842             : 
    2843             :             /*Limiter for active speech*/
    2844     5905385 :             if ( sp_aud_decision0 == 0 && vad_flag )
    2845             :             {
    2846             :                 /*Avoid jump of residual prediction gain when ITD is changing*/
    2847     2999400 :                 if ( hStereoDft->hItd->deltaItd[k_offset] != hStereoDft->hItd->deltaItd[0] )
    2848             :                 {
    2849      149876 :                     pPredGain[b] = min( hStereoDft->res_pred_gain_f[b], pPredGain[b] );
    2850             :                 }
    2851             : 
    2852             :                 /*Limiter*/
    2853     2999400 :                 hStereoDft->res_pred_gain_f[b] = 0.9f * hStereoDft->res_pred_gain_f[b] + 0.1f * pPredGain[b];
    2854     2999400 :                 pPredGain[b] = min( 1.1f * hStereoDft->res_pred_gain_f[b], pPredGain[b] );
    2855             :             }
    2856             :             else
    2857             :             {
    2858     2905985 :                 hStereoDft->res_pred_gain_f[b] = pPredGain[b];
    2859             :             }
    2860             :         }
    2861             :         else
    2862             :         {
    2863     2510250 :             pPredGain[b] = 0.f;
    2864             :         }
    2865             : 
    2866             : 
    2867     8415635 :         if ( b2 == hStereoDft->gipd_band_max )
    2868             :         {
    2869      912789 :             ipd_mean_change = stereo_dft_calc_mean_ipd_change( pIpd, ipd_smooth, hStereoDft->gipd_band_max );
    2870      912789 :             hStereoDft->sum_dot_prod_real = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_real + hStereoDft->sfm * sum_dot_prod_real;
    2871      912789 :             hStereoDft->sum_dot_prod_img = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_img + hStereoDft->sfm * sum_dot_prod_img;
    2872             : 
    2873      912789 :             pgIpd[0] = (float) atan2f( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real );
    2874             : 
    2875      912789 :             stereo_dft_gipd_stabilization( &pgIpd[0], hStereoDft->prev_gipd, ipd_mean_change );
    2876      912789 :             hStereoDft->prev_gipd = pgIpd[0];
    2877             :         }
    2878             :     }
    2879             : 
    2880      912789 :     hStereoDft->nrg_past_pos = ( pos + 1 ) % STEREO_DFT_NRG_PAST_LEN;
    2881             : 
    2882             : #ifdef FIX_1461_CNG_BW_SWITCHING
    2883             :     /* Replicate last band for remaining bands in case the bandwidth is higher after SID/NODATA is considered */
    2884     4363411 :     for ( i = hStereoDft->nbands; i < STEREO_DFT_BAND_MAX; i++ )
    2885             :     {
    2886     3450622 :         pPredGain[i] = pPredGain[i - 1];
    2887     3450622 :         pSideGain[i] = pSideGain[i - 1];
    2888             :     }
    2889             : #endif
    2890             : 
    2891             : #ifdef DEBUG_MODE_DFT
    2892             :     {
    2893             :         float tmp_f;
    2894             :         dbgwrite( pPredGain, sizeof( float ), hStereoDft->nbands, 1, "./res/stereo_dft_gainPred.pcm" );
    2895             :         dbgwrite( pSideGain, sizeof( float ), hStereoDft->nbands, 1, "./res/stereo_dft_gainSide.pcm" );
    2896             : 
    2897             :         for ( i = 0; i < hStereoDft->nbands; i++ )
    2898             :         {
    2899             :             float regularization;
    2900             : 
    2901             :             regularization = ( hStereoDft->band_limits[i + 1] - hStereoDft->band_limits[i] ) * sqrtf( hStereoDft->NFFT );
    2902             :             tmp_f = sub_nrg_DMX[i] / ( regularization * regularization );
    2903             :             dbgwrite( &tmp_f, sizeof( float ), 1, 1, "./res/stereo_dft_nrgDMX.pcm" );
    2904             : 
    2905             :             g = sqrtf( sum_nrg_L / sum_nrg_R );
    2906             :             tmp_f = ( g - 1 ) / ( g + 1 );
    2907             :             dbgwrite( &tmp_f, sizeof( float ), 1, 1, "./res/stereo_dft_gainILD.pcm" );
    2908             :         }
    2909             :     }
    2910             : #endif
    2911             : 
    2912             :     /*------------------------------------------------------------------*
    2913             :      * Compute IPDs
    2914             :      *-----------------------------------------------------------------*/
    2915             : 
    2916             : #ifdef DEBUG_MODE_DFT
    2917             :     stereo_dft_enc_get_nipd_flag( hStereoDft, pgIpd, sp_aud_decision0, gain_IPD );
    2918             : #else
    2919      912789 :     stereo_dft_enc_get_nipd_flag( hStereoDft, sp_aud_decision0, gain_IPD );
    2920             : #endif
    2921             : 
    2922             : #ifdef DEBUG_MODE_DFT
    2923             :     hStereoDft->no_ipd_flag = ( hStereoDft->hConfig->gipd_mode == 0 ) ? 1 : hStereoDft->no_ipd_flag;
    2924             : #endif
    2925             : 
    2926      912789 :     if ( flag_quant )
    2927             :     {
    2928      912789 :         if ( hStereoDft->no_ipd_flag == 0 )
    2929             :         {
    2930       30375 :             hStereoDft->sid_gipd = *pgIpd;
    2931       30375 :             stereo_dft_quantize_ipd( pgIpd, pgIpd, &( hStereoDft->gipd_index ), STEREO_DFT_GIPD_NBITS );
    2932             :         }
    2933             :         else
    2934             :         {
    2935      882414 :             pgIpd[0] = 0;
    2936             :         }
    2937             :     }
    2938      912789 :     diff_ipd = pgIpd[0] - pgIpd[-1];
    2939             : 
    2940      912789 :     if ( diff_ipd < -EVS_PI )
    2941             :     {
    2942       63438 :         pgIpd[0] += PI2;
    2943             :     }
    2944      849351 :     else if ( diff_ipd > EVS_PI )
    2945             :     {
    2946       65650 :         pgIpd[0] -= PI2;
    2947             :     }
    2948             : 
    2949      912789 :     if ( !hStereoDft->attackPresent )
    2950             :     {
    2951      881430 :         if ( hStereoDft->wasTransient )
    2952             :         {
    2953       29529 :             pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-1];
    2954             :         }
    2955             :         else
    2956             :         {
    2957      851901 :             pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-1];
    2958             :         }
    2959             :     }
    2960             : 
    2961      912789 :     c = sqrtf( sum_energy_L / sum_energy_R );
    2962      912789 :     g = fabsf( ( c - 1 ) / ( c + 1 ) );
    2963      912789 :     if ( g > 0.8f )
    2964             :     {
    2965       44309 :         g = max( 0.f, -10.f * g + 9.0f );
    2966      438704 :         for ( b = 0; b < hStereoDft->nbands; b++ )
    2967             :         {
    2968      394395 :             pPredGain[b] *= g;
    2969             :         }
    2970             :     }
    2971             : 
    2972      912789 :     if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW )
    2973             :     {
    2974      422562 :         hStereoDft->reverb_flag = 1;
    2975             :     }
    2976             :     else
    2977             :     {
    2978      490227 :         stereo_dft_enc_get_reverb_flag( hStereoDft, pPredGain, sub_nrg_DMX, sub_nrg_L, sub_nrg_R, k_offset, bin_nrgL, bin_nrgR );
    2979             :     }
    2980             : 
    2981             : 
    2982             :     /*------------------------------------------------------------------*
    2983             :      * Compute Side gains
    2984             :      *-----------------------------------------------------------------*/
    2985             : 
    2986     9328424 :     for ( b = 0; b < hStereoDft->nbands; b++ )
    2987             :     {
    2988     8415635 :         hStereoDft->sidSideGain[b] = *( pSideGain + b );
    2989             : 
    2990             :         /* Quantization */
    2991     8415635 :         if ( flag_quant )
    2992             :         {
    2993     8415635 :             stereo_dft_quantize_res_gains( pSideGain + b, pPredGain + b, pSideGain + b, pPredGain + b, hStereoDft->side_gain_index_EC + b, hStereoDft->res_pred_index_EC + b );
    2994             :         }
    2995             : 
    2996             : 
    2997     8415635 :         if ( !hStereoDft->attackPresent )
    2998             :         {
    2999     8140431 :             if ( b < hStereoDft->res_cod_band_max )
    3000             :             {
    3001     1340970 :                 pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - STEREO_DFT_BAND_MAX];
    3002             :             }
    3003             :         }
    3004             :     }
    3005             : 
    3006             :     /*------------------------------------------------------------------*
    3007             :      * simulate prediction of parameters at the decoder
    3008             :      *-----------------------------------------------------------------*/
    3009             : 
    3010      912789 :     if ( hStereoDft->reverb_flag )
    3011             :     {
    3012             :         int16_t ipred, bpred0, bpred1, max_dev, sum_abs_dev;
    3013             : 
    3014      605487 :         ipred = 0;
    3015      605487 :         max_dev = 0;
    3016      605487 :         sum_abs_dev = 0;
    3017             : 
    3018             :         /* parameters for bred0 <= b < bpred1 are estimated from parameters of
    3019             :         the remaining bands with ptrans0 <= b < btrans1. */
    3020      605487 :         bpred1 = ( hStereoDft->nbands > 10 ) ? STEREO_DFT_RES_PRED_BAND_MAX - 2 : hStereoDft->nbands;
    3021      605487 :         if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_LOW )
    3022             :         {
    3023      422562 :             bpred1 = min( bpred1, 6 );
    3024             :         }
    3025      605487 :         bpred0 = bpred1 - STEREO_DFT_RES_PRED_BAND_MIN_CONST;
    3026             : 
    3027             :         /* get estimate (currently the maximal index) */
    3028     3067418 :         for ( b = hStereoDft->res_pred_band_min; b < bpred0; b++ )
    3029             :         {
    3030     2461931 :             ipred = max( ipred, hStereoDft->res_pred_index_EC[b] );
    3031             :         }
    3032             : 
    3033             :         /* check prediction error */
    3034     2421948 :         for ( b = bpred0; b < bpred1; b++ )
    3035             :         {
    3036     1816461 :             max_dev = (int16_t) max( max_dev, abs( ipred - hStereoDft->res_pred_index_EC[b] ) );
    3037     1816461 :             sum_abs_dev += (int16_t) abs( ipred - hStereoDft->res_pred_index_EC[b] );
    3038             :         }
    3039             : 
    3040      605487 :         hStereoDft->reverb_flag = ( max_dev <= 1 && sum_abs_dev <= 2 );
    3041             : 
    3042      605487 :         if ( hStereoDft->reverb_flag && hStereoDft->nbands > 10 ) /*SWB and FB*/
    3043             :         {
    3044      243078 :             for ( b = STEREO_DFT_RES_PRED_BAND_MAX - 1; b >= STEREO_DFT_RES_PRED_BAND_MAX - 2; b-- )
    3045             :             {
    3046      162052 :                 hStereoDft->res_pred_index_EC[b - STEREO_DFT_RES_PRED_BAND_MIN_CONST] = hStereoDft->res_pred_index_EC[b];
    3047             :             }
    3048             :         }
    3049             : #ifdef DEBUG_MODE_DFT
    3050             :         if ( hStereoDft->reverb_flag )
    3051             :         {
    3052             :             dbgwrite( &ipred, sizeof( ipred ), 1, 1, "./res/stereo_dft_enc_ipred" );
    3053             :         }
    3054             : #endif
    3055             :     }
    3056             : #ifdef DEBUG_MODE_DFT
    3057             :     dbgwrite( &( hStereoDft->reverb_flag ), sizeof( int16_t ), 1, 640, "./res/stereo_dft_reverb_flag2.pcm" );
    3058             : #endif
    3059             : 
    3060      912789 :     assert( hStereoDft->nbands <= 13 ); /* always use band_limits_erb4 and not band_limits_erb2 */
    3061             : 
    3062      912789 :     return;
    3063             : }
    3064             : 
    3065             : 
    3066             : /*---------------------------------------------------------------------*
    3067             :  * side_gain_mode_decision()
    3068             :  *
    3069             :  *
    3070             :  *---------------------------------------------------------------------*/
    3071             : 
    3072      692322 : static void side_gain_mode_decision(
    3073             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
    3074             :     int16_t encoded_ind_GR[],
    3075             :     const int16_t sp_aud_decision0, /* i  : Speech/audio decision 0     */
    3076             :     const int32_t last_core_brate   /* i  : Last core bitrate           */
    3077             : )
    3078             : {
    3079             :     int16_t try_diff, nb_diff, no_GR_ord, n_bits, i;
    3080             : 
    3081      692322 :     try_diff = sp_aud_decision0;
    3082      692322 :     if ( try_diff )
    3083             :     {
    3084      256801 :         if ( hStereoDft->side_gain_counter == STEREO_DFT_FEC_THRESHOLD )
    3085             :         {
    3086        9011 :             try_diff = 0;
    3087        9011 :             hStereoDft->side_gain_counter = 0;
    3088             :         }
    3089             :     }
    3090             :     else
    3091             :     {
    3092      435521 :         hStereoDft->side_gain_counter = 0;
    3093             :     }
    3094             : 
    3095             :     /* If last frame SID/NO_DATA do not use differential coding */
    3096      692322 :     if ( last_core_brate <= SID_2k40 )
    3097             :     {
    3098        6036 :         try_diff = 0;
    3099             :     }
    3100      692322 :     no_GR_ord = 3;
    3101     1384644 :     hStereoDft->side_gain_flag_2 = adapt_GR_ief( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious,
    3102      692322 :                                                  hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff,
    3103      692322 :                                                  hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp, try_diff );
    3104             : 
    3105             : 
    3106     7566545 :     for ( i = 0; i < hStereoDft->nbands; i++ )
    3107             :     {
    3108     6874223 :         hStereoDft->side_gain_index_ECprevious[i] = hStereoDft->side_gain_index_EC[i];
    3109             :     }
    3110             : 
    3111      692322 :     if ( n_bits > ( hStereoDft->nbands * STEREO_DFT_SIDE_GAIN_NBITS - 1 ) )
    3112             :     {
    3113             :         /* use fixed rate */
    3114        4663 :         hStereoDft->side_gain_flag_1 = 3;
    3115        4663 :         hStereoDft->side_gain_counter = 0;
    3116             :     }
    3117             :     else
    3118             :     {
    3119      687659 :         if ( hStereoDft->side_gain_flag_2 >= no_GR_ord )
    3120             :         {
    3121      208298 :             hStereoDft->side_gain_flag_1 = 2;
    3122      208298 :             hStereoDft->side_gain_counter += 1;
    3123             :         }
    3124             :         else
    3125             :         {
    3126      479361 :             hStereoDft->side_gain_flag_1 = 0;
    3127      479361 :             hStereoDft->side_gain_counter = 0;
    3128             :         }
    3129             :     }
    3130             : 
    3131      692322 :     return;
    3132             : }
    3133             : 
    3134             : 
    3135             : /*---------------------------------------------------------------------*
    3136             :  * res_pred_gain_mode_decision()
    3137             :  *
    3138             :  *
    3139             :  *---------------------------------------------------------------------*/
    3140             : 
    3141      692322 : static void res_pred_gain_mode_decision(
    3142             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i  : DFT stereo encoder handle   */
    3143             :     int16_t encoded_ind_pred_GR[],
    3144             :     const int16_t k_offset,       /* i  : Parameter offset            */
    3145             :     const int32_t last_core_brate /* i  : Last core bitrate           */
    3146             : )
    3147             : {
    3148             :     int16_t nb_diff, try_diff, no_GR_ord, i, n_bits;
    3149             :     int16_t nbands;
    3150             : 
    3151             :     /* Residual Prediction Gain */
    3152      692322 :     if ( hStereoDft->res_pred_mode[k_offset] )
    3153             :     {
    3154      686258 :         if ( hStereoDft->attackPresent == 0 )
    3155             :         {
    3156      665983 :             nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
    3157             : 
    3158      665983 :             if ( hStereoDft->reverb_flag )
    3159             :             {
    3160      153362 :                 nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST;
    3161             :             }
    3162             : 
    3163      665983 :             try_diff = 1;
    3164      665983 :             if ( hStereoDft->res_pred_counter == STEREO_DFT_FEC_THRESHOLD )
    3165             :             {
    3166       31324 :                 try_diff = 0;
    3167       31324 :                 hStereoDft->res_pred_counter = 0;
    3168             :             }
    3169             : 
    3170             :             /* If last frame SID/NO_DATA do not use differential coding */
    3171      665983 :             if ( last_core_brate <= SID_2k40 )
    3172             :             {
    3173        1425 :                 try_diff = 0;
    3174             :             }
    3175             : 
    3176      665983 :             no_GR_ord = 2;
    3177             : 
    3178      665983 :             hStereoDft->res_pred_flag_2 = adapt_GR_rpg1_ief( &hStereoDft->res_pred_index_EC[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECprevious[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, NO_SYMB_GR_PRED_G, &n_bits, encoded_ind_pred_GR, dft_maps_rpg, &nb_diff, no_GR_ord, try_diff );
    3179             : 
    3180     6670822 :             for ( i = 0; i < nbands; i++ )
    3181             :             {
    3182     6004839 :                 hStereoDft->res_pred_index_ECprevious[i] = hStereoDft->res_pred_index_EC[i];
    3183             :             }
    3184             : 
    3185     1294354 :             for ( ; i < hStereoDft->nbands; i++ )
    3186             :             {
    3187      628371 :                 hStereoDft->res_pred_index_ECprevious[i] = 0;
    3188             :             }
    3189             : 
    3190      665983 :             if ( n_bits > ( nbands - hStereoDft->res_pred_band_min ) * STEREO_DFT_RES_GAINS_BITS - 1 )
    3191             :             {
    3192       45137 :                 hStereoDft->res_pred_flag_1 = 3;
    3193       45137 :                 hStereoDft->res_pred_counter = 0;
    3194             :             }
    3195             :             else
    3196             :             {
    3197      620846 :                 if ( hStereoDft->res_pred_flag_2 > 1 )
    3198             :                 {
    3199             :                     /* differential coding */
    3200      434215 :                     hStereoDft->res_pred_flag_1 = 2;
    3201      434215 :                     hStereoDft->res_pred_counter += 1;
    3202             :                 }
    3203             :                 else
    3204             :                 {
    3205      186631 :                     hStereoDft->res_pred_counter = 0;
    3206      186631 :                     hStereoDft->res_pred_flag_1 = 0;
    3207             :                 }
    3208             :             }
    3209             :         }
    3210             :         else
    3211             :         {
    3212       20275 :             set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
    3213             :         }
    3214             :     }
    3215             :     else
    3216             :     {
    3217        6064 :         set_s( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
    3218             :     }
    3219             : 
    3220      692322 :     return;
    3221             : }
    3222             : 
    3223             : 
    3224             : /*-------------------------------------------------------------------------
    3225             :  * stereo_dft_calc_mean_bipd()
    3226             :  *
    3227             :  * Calculate mean of previous bandwise IPD values
    3228             :  *------------------------------------------------------------------------*/
    3229             : 
    3230     7302312 : static float stereo_dft_calc_mean_bipd(
    3231             :     float *pIpd,                          /* i  : current bandwise IPD   */
    3232             :     float ipd_buf[STEREO_DFT_IPD_BUF_LEN] /* i/o: previous bandwise IPDs */
    3233             : )
    3234             : {
    3235             :     int16_t i;
    3236             :     float ipd_smooth;
    3237             :     float diff_to_last;
    3238             : 
    3239     7302312 :     assert( *pIpd <= EVS_PI && *pIpd >= -EVS_PI );
    3240             : 
    3241     7302312 :     ipd_smooth = 0.f;
    3242    43813872 :     for ( i = 0; i < STEREO_DFT_IPD_BUF_LEN; i++ )
    3243             :     {
    3244    36511560 :         if ( i == 0 )
    3245             :         {
    3246     7302312 :             diff_to_last = ipd_buf[0];
    3247             :         }
    3248             :         else
    3249             :         {
    3250    29209248 :             diff_to_last = fabsf( ipd_buf[i] - ipd_smooth );
    3251             :         }
    3252    36511560 :         if ( diff_to_last > EVS_PI )
    3253             :         {
    3254      475769 :             if ( ipd_buf[i] > 0 )
    3255             :             {
    3256      272017 :                 ipd_buf[i] -= 2 * EVS_PI;
    3257             :             }
    3258             :             else
    3259             :             {
    3260      203752 :                 ipd_buf[i] += 2 * EVS_PI;
    3261             :             }
    3262             :         }
    3263    36511560 :         ipd_smooth = ( i / (float) ( i + 1 ) ) * ipd_smooth + ( 1 / (float) ( i + 1 ) ) * ipd_buf[i];
    3264    36511560 :         if ( ipd_smooth < -EVS_PI )
    3265             :         {
    3266      167502 :             ipd_smooth += 2 * EVS_PI;
    3267             :         }
    3268    36344058 :         else if ( ipd_smooth > EVS_PI )
    3269             :         {
    3270       98841 :             ipd_smooth -= 2 * EVS_PI;
    3271             :         }
    3272             :     }
    3273             : 
    3274    36511560 :     for ( i = 0; i < STEREO_DFT_IPD_BUF_LEN - 1; i++ )
    3275             :     {
    3276    29209248 :         ipd_buf[i] = ipd_buf[i + 1];
    3277             :     }
    3278     7302312 :     ipd_buf[STEREO_DFT_IPD_BUF_LEN - 1] = *pIpd;
    3279             : 
    3280             : #ifdef DEBUG_MODE_DFT
    3281             :     dbgwrite( pIpd, sizeof( float ), 1, 1, "res/stereo_dft_bipd.pcm" );
    3282             :     dbgwrite( &ipd_smooth, sizeof( float ), 1, 1, "res/stereo_dft_bipd_smooth.pcm" );
    3283             : #endif
    3284             : 
    3285     7302312 :     return ipd_smooth;
    3286             : }
    3287             : 
    3288             : 
    3289             : /*-------------------------------------------------------------------------
    3290             :  * stereo_dft_calc_mean_ipd_change()
    3291             :  *
    3292             :  * Calculate mean IPD change over all bands
    3293             :  *------------------------------------------------------------------------*/
    3294             : 
    3295      912789 : static float stereo_dft_calc_mean_ipd_change(
    3296             :     float *pIpd,          /* i  : bandwise IPDs                   */
    3297             :     float *ipd_smooth,    /* i  : mean of previous bandwise IPDs  */
    3298             :     int16_t gipd_band_max /* i  : number of IPD bands             */
    3299             : )
    3300             : {
    3301             :     int16_t b;
    3302             :     float ipd_mean_change;
    3303             :     float ipd_change[STEREO_DFT_BAND_MAX];
    3304             : 
    3305      912789 :     ipd_mean_change = 0.f;
    3306     8215101 :     for ( b = 0; b < gipd_band_max; b++ )
    3307             :     {
    3308     7302312 :         ipd_change[b] = fabsf( pIpd[b] - ipd_smooth[b] );
    3309     7302312 :         if ( ipd_change[b] > EVS_PI )
    3310             :         {
    3311      194659 :             ipd_change[b] = 2 * EVS_PI - ipd_change[b];
    3312             :         }
    3313     7302312 :         ipd_mean_change += ipd_change[b];
    3314             :     }
    3315      912789 :     ipd_mean_change /= gipd_band_max;
    3316             : 
    3317             : #ifdef DEBUG_MODE_DFT
    3318             :     dbgwrite( ipd_change, sizeof( float ), gipd_band_max, 1, "res/stereo_dft_ipd_change.pcm" );
    3319             :     dbgwrite( &ipd_mean_change, sizeof( float ), 1, 1, "res/stereo_dft_ipd_mean_change.pcm" );
    3320             : #endif
    3321             : 
    3322      912789 :     return ipd_mean_change;
    3323             : }
    3324             : 
    3325             : 
    3326             : /*-------------------------------------------------------------------------
    3327             :  * stereo_dft_gipd_stabilization()
    3328             :  *
    3329             :  * stabilize global IPD based on stability of bandwise IPDs
    3330             :  *------------------------------------------------------------------------*/
    3331             : 
    3332      912789 : static void stereo_dft_gipd_stabilization(
    3333             :     float *pgIpd,         /* i/o: global IPD to be stabilized     */
    3334             :     float prev_gipd,      /* i  : previous global IPD             */
    3335             :     float ipd_mean_change /* i  : mean of previous bandwise IPDs  */
    3336             : )
    3337             : {
    3338             :     float diff_gipd;
    3339             : 
    3340      912789 :     if ( ipd_mean_change < 0.3f )
    3341             :     {
    3342      530962 :         *pgIpd = prev_gipd;
    3343             :     }
    3344             :     else
    3345             :     {
    3346      381827 :         diff_gipd = fabsf( *pgIpd - prev_gipd );
    3347      381827 :         if ( diff_gipd > EVS_PI )
    3348             :         {
    3349       10882 :             diff_gipd = 2 * EVS_PI - diff_gipd;
    3350             :         }
    3351      381827 :         if ( diff_gipd > ipd_mean_change )
    3352             :         {
    3353       48462 :             if ( *pgIpd > prev_gipd )
    3354             :             {
    3355       24059 :                 if ( *pgIpd - prev_gipd < EVS_PI )
    3356             :                 {
    3357       20492 :                     *pgIpd = prev_gipd + ipd_mean_change;
    3358             :                 }
    3359             :                 else
    3360             :                 {
    3361        3567 :                     *pgIpd = prev_gipd - ipd_mean_change;
    3362        3567 :                     if ( *pgIpd < -EVS_PI )
    3363             :                     {
    3364        1771 :                         *pgIpd += 2 * EVS_PI;
    3365             :                     }
    3366             :                 }
    3367             :             }
    3368             :             else
    3369             :             {
    3370       24403 :                 if ( prev_gipd - *pgIpd < EVS_PI )
    3371             :                 {
    3372       19866 :                     *pgIpd = prev_gipd - ipd_mean_change;
    3373             :                 }
    3374             :                 else
    3375             :                 {
    3376        4537 :                     *pgIpd = prev_gipd + ipd_mean_change;
    3377        4537 :                     if ( *pgIpd > EVS_PI )
    3378             :                     {
    3379        2352 :                         *pgIpd -= 2 * EVS_PI;
    3380             :                     }
    3381             :                 }
    3382             :             }
    3383             :         }
    3384             :     }
    3385      912789 :     return;
    3386             : }
    3387             : 
    3388             : 
    3389             : /*-------------------------------------------------------------------------
    3390             :  * stereo_dft_enc_get_nipd_flag()
    3391             :  *
    3392             :  *
    3393             :  *------------------------------------------------------------------------*/
    3394             : 
    3395      912789 : static void stereo_dft_enc_get_nipd_flag(
    3396             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    3397             : #ifdef DEBUG_MODE_DFT
    3398             :     float *pgIpd,
    3399             : #endif
    3400             :     const int16_t sp_aud_decision0,
    3401             :     const float gainIPD )
    3402             : {
    3403      912789 :     hStereoDft->gainIPD_sm = 0.5f * hStereoDft->gainIPD_sm + 0.5f * gainIPD; /* to decide on use of no IPD */
    3404             : 
    3405      912789 :     hStereoDft->no_ipd_flag = 0; /* Set flag initially to zero - subband IPD */
    3406             : 
    3407      912789 :     if ( hStereoDft->gainIPD_sm >= 0.75f || ( hStereoDft->prev_no_ipd_flag && ( sp_aud_decision0 || hStereoDft->voicing_lt > 0.98f ) ) )
    3408             :     {
    3409      869685 :         hStereoDft->no_ipd_flag = 1; /* Set the flag */
    3410             :     }
    3411             : 
    3412             : #ifdef DEBUG_MODE_DFT
    3413             :     {
    3414             :         int16_t tmp;
    3415             :         dbgwrite( &( hStereoDft->no_ipd_flag ), sizeof( int16_t ), 1, 640, "./res/stereo_dft_nipd_first.pcm" );
    3416             :         tmp = (int16_t) ( hStereoDft->gainIPD_sm * 100.f );
    3417             :         dbgwrite( &tmp, sizeof( int16_t ), 1, 640, "./res/stereo_dft_gipd_gain_IPD.pcm" );
    3418             :         dbgwrite( pgIpd, sizeof( float ), 1, 1, "./res/stereo_dft_gipd_IPD.pcm" );
    3419             :     }
    3420             : #endif
    3421             : 
    3422             :     /* hangover between the group IPD and subband IPD */
    3423      912789 :     if ( hStereoDft->prev_no_ipd_flag != hStereoDft->no_ipd_flag && hStereoDft->no_ipd_cnt < 5 )
    3424             :     {
    3425       40277 :         hStereoDft->no_ipd_flag = hStereoDft->prev_no_ipd_flag;
    3426       40277 :         hStereoDft->no_ipd_cnt++;
    3427             :     }
    3428             :     else
    3429             :     {
    3430      872512 :         hStereoDft->no_ipd_cnt = 0;
    3431             :     }
    3432             : 
    3433      912789 :     hStereoDft->prev_no_ipd_flag = hStereoDft->no_ipd_flag; /* Save the no IPD flag for the next frame */
    3434             : 
    3435             : #ifdef DEBUG_MODE_DFT
    3436             :     /*fprintf(pF2, "%d\n",hStereoDft->no_ipd_flag);*/
    3437             :     dbgwrite( &( hStereoDft->no_ipd_flag ), sizeof( int16_t ), 1, 640, "./res/stereo_dft_nipd_final.pcm" );
    3438             : #endif
    3439             : 
    3440      912789 :     return;
    3441             : }
    3442             : 
    3443             : 
    3444             : /*---------------------------------------------------------------
    3445             :  * stereo_dft_enc_get_reverb_flag()
    3446             :  *
    3447             :  *
    3448             :  * ---------------------------------------------------------------*/
    3449             : 
    3450      490227 : static void stereo_dft_enc_get_reverb_flag(
    3451             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
    3452             :     float *pPredGain,
    3453             :     float *sub_nrg_DMX,
    3454             :     const float *sub_nrg_L,
    3455             :     const float *sub_nrg_R,
    3456             :     const int16_t k_offset,
    3457             :     const float *bin_nrgL,
    3458             :     const float *bin_nrgR )
    3459             : {
    3460             :     int16_t i, b, b1, index_min, nbands;
    3461             :     float nrg_DMX_min;
    3462             :     float norm_r, norm_l, norm_dmx;
    3463             :     float diff_l_l, diff_r_l, diff_l_h, diff_r_h;
    3464             :     float ener_l, ener_r, ener_dmx;
    3465             :     float nrg_DMX_max_avrg, nrg_DMX_min_avrg;
    3466             :     float fac;
    3467             : 
    3468      490227 :     hStereoDft->reverb_flag = 0;
    3469      490227 :     if ( hStereoDft->res_pred_mode[k_offset] && hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
    3470             :     {
    3471      214846 :         diff_r_l = EPSILON;
    3472      214846 :         diff_l_l = EPSILON;
    3473      214846 :         diff_r_h = EPSILON;
    3474      214846 :         diff_l_h = EPSILON;
    3475             : 
    3476     1718768 :         for ( b = 0; b <= min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */
    3477             :         {
    3478     1503922 :             norm_dmx = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_DMX[b] );
    3479     1503922 :             norm_l = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_L[b] );
    3480     1503922 :             norm_r = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_R[b] );
    3481             : 
    3482    20625216 :             for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
    3483             :             {
    3484    19121294 :                 ener_l = bin_nrgL[i];
    3485    19121294 :                 ener_r = bin_nrgR[i];
    3486    19121294 :                 ener_dmx = ( ener_l + ener_r + 2 * sqrtf( ener_l * ener_r ) ) * norm_dmx; /*approximation of nrg of DMX per line*/
    3487    19121294 :                 ener_l *= norm_l;
    3488    19121294 :                 ener_r *= norm_r;
    3489             : 
    3490    19121294 :                 diff_l_l += fabsf( ener_l - ener_dmx );
    3491    19121294 :                 diff_r_l += fabsf( ener_r - ener_dmx );
    3492             :             }
    3493             :         }
    3494      214846 :         if ( hStereoDft->nbands <= 10 )
    3495             :         {
    3496      145316 :             for ( ; b < min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */
    3497             :             {
    3498      108987 :                 norm_dmx = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_DMX[b] );
    3499      108987 :                 norm_l = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_L[b] );
    3500      108987 :                 norm_r = ( ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) / sub_nrg_R[b] );
    3501             : 
    3502     8464657 :                 for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
    3503             :                 {
    3504     8355670 :                     ener_l = bin_nrgL[i];
    3505     8355670 :                     ener_r = bin_nrgR[i];
    3506     8355670 :                     ener_dmx = ( ener_l + ener_r + 2 * sqrtf( ener_l * ener_r ) ) * norm_dmx; /*approximation of nrg of DMX per line*/
    3507     8355670 :                     ener_l *= norm_l;
    3508     8355670 :                     ener_r *= norm_r;
    3509             : 
    3510     8355670 :                     diff_l_h += fabsf( ener_l - ener_dmx );
    3511     8355670 :                     diff_r_h += fabsf( ener_r - ener_dmx );
    3512             :                 }
    3513             :             }
    3514             :         }
    3515             : 
    3516     2764463 :         for ( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */
    3517             :         {
    3518     2549617 :             sub_nrg_DMX[b] /= ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] );
    3519     2549617 :             sub_nrg_DMX[b] = 0.6f * hStereoDft->pre_sub_nrg_DMX[b] + 0.4f * sub_nrg_DMX[b];
    3520     2549617 :             hStereoDft->pre_sub_nrg_DMX[b] = sub_nrg_DMX[b];
    3521             :         }
    3522             : 
    3523             :         /* adaptively select the subbands to predict based on the energy */
    3524      214846 :         nbands = ( hStereoDft->nbands > 10 ) ? ( hStereoDft->nbands - 2 ) : hStereoDft->nbands;
    3525      214846 :         nrg_DMX_min_avrg = 0.0f;
    3526      429692 :         for ( b = 2; b < STEREO_DFT_RES_PRED_BAND_MIN_RED; b++ )
    3527             :         {
    3528      214846 :             nrg_DMX_min = sub_nrg_DMX[b];
    3529      214846 :             index_min = b;
    3530             : 
    3531     1977737 :             for ( b1 = 2; b1 < nbands; b1++ )
    3532             :             {
    3533     1762891 :                 if ( nrg_DMX_min > sub_nrg_DMX[b1] )
    3534             :                 {
    3535     1179374 :                     nrg_DMX_min = sub_nrg_DMX[b1];
    3536     1179374 :                     index_min = b1;
    3537             :                 }
    3538             :             }
    3539             : 
    3540      214846 :             nrg_DMX_min_avrg += nrg_DMX_min;
    3541      214846 :             sub_nrg_DMX[index_min] = FLT_MAX;
    3542             :         }
    3543             : 
    3544      214846 :         nrg_DMX_max_avrg = 0.0f;
    3545     1977737 :         for ( b = 2, b1 = STEREO_DFT_RES_PRED_BAND_MIN_RED; b < nbands; b++ )
    3546             :         {
    3547     1762891 :             if ( sub_nrg_DMX[b] != FLT_MAX )
    3548             :             {
    3549     1548045 :                 nrg_DMX_max_avrg += sub_nrg_DMX[b];
    3550             :             }
    3551             :         }
    3552             : 
    3553      214846 :         if ( hStereoDft->nbands <= 10 ) /*WB*/
    3554             :         {
    3555       36329 :             if ( hStereoDft->res_pred_mode[0] == STEREO_DFT_RESPRED_OFF || hStereoDft->hConfig->res_cod_mode != STEREO_DFT_RES_COD_OFF )
    3556             :             {
    3557        2940 :                 hStereoDft->diff_l_h_sm = diff_l_h;
    3558        2940 :                 hStereoDft->diff_r_h_sm = diff_r_h;
    3559             :             }
    3560             :             else
    3561             :             {
    3562       33389 :                 hStereoDft->diff_l_h_sm = 0.9f * hStereoDft->diff_l_h_sm + 0.1f * diff_l_h;
    3563       33389 :                 hStereoDft->diff_r_h_sm = 0.9f * hStereoDft->diff_r_h_sm + 0.1f * diff_r_h;
    3564             :             }
    3565             : 
    3566       36329 :             if ( hStereoDft->diff_l_h_sm > 120.0f || hStereoDft->diff_r_h_sm > 120.0f )
    3567             :             {
    3568       21811 :                 hStereoDft->reverb_flag = 1;
    3569             :             }
    3570             :         }
    3571             :         else /*SWB/FB*/
    3572             :         {
    3573      178517 :             if ( 3 * nrg_DMX_max_avrg > 64 * 5 * nrg_DMX_min_avrg )
    3574             :             {
    3575      161114 :                 hStereoDft->reverb_flag = 1;
    3576             :             }
    3577             :         }
    3578             : 
    3579             :         /*Stereo Filling gain damping*/
    3580      214846 :         fac = ( ( diff_l_l > diff_r_l ) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l );
    3581      214846 :         fac = fac > 0.25f ? 1.0f : 4.f * fac;
    3582      214846 :         fac = 0.98f * hStereoDft->prev_fac2 + 0.02f * fac;
    3583      214846 :         hStereoDft->prev_fac2 = fac;
    3584             : 
    3585     2764463 :         for ( b = 0; b < hStereoDft->nbands; b++ )
    3586             :         {
    3587     2549617 :             if ( b < 5 )
    3588             :             {
    3589     1074230 :                 pPredGain[b] *= max( 0.5f, fac );
    3590             :             }
    3591             :             else
    3592             :             {
    3593     1475387 :                 pPredGain[b] *= min( 1.0f, max( 0.75f, 0.5f + fac ) );
    3594             :             }
    3595             :         }
    3596             :     }
    3597             : 
    3598             : #ifdef DEBUG_MODE_DFT
    3599             :     dbgwrite( &( hStereoDft->reverb_flag ), sizeof( int16_t ), 1, 640, "./res/stereo_dft_reverb_flag.pcm" );
    3600             : #endif
    3601             : 
    3602      490227 :     return;
    3603             : }
    3604             : 
    3605             : /*---------------------------------------------------------------
    3606             :  * stereo_dft_gain_offset()
    3607             :  *
    3608             :  * c = gain between L and R, itd = itd in samples @ 32kHz
    3609             :  * ---------------------------------------------------------------*/
    3610             : 
    3611     1245715 : static float stereo_dft_gain_offset(
    3612             :     const float c,
    3613             :     const int16_t itd )
    3614             : {
    3615             :     float wnt, go, alpha;
    3616             :     int16_t tau, k0;
    3617             : 
    3618     1245715 :     tau = (int16_t) min( abs( itd ), 160 );
    3619             :     /* Wn_table contains every 8th sample of the window's cross-correlation
    3620             :      * function @ 32kHz from which the values are interpolated:  */
    3621     1245715 :     k0 = tau >> 3;
    3622     1245715 :     alpha = ( tau & 7 ) / 8.f;
    3623     1245715 :     wnt = ( 1 - alpha ) * Wn_table[k0] + alpha * Wn_table[k0 + 1];
    3624             : 
    3625     1245715 :     go = sqrtf( 8 * c * c / ( ( 1 + c ) * ( 1 + c ) ) * ( 1 - wnt ) / ( 1 + c * c + 2 * c * wnt ) );
    3626             : 
    3627     1245715 :     return go;
    3628             : }
    3629             : 
    3630             : /*---------------------------------------------------------------
    3631             :  * stereo_dft_enc_calculate_nrg_for_icbwe()
    3632             :  *
    3633             :  * calculate energy of downmix and left and right channel in the
    3634             :  * SHB region for later use in ICBWE
    3635             :  * ---------------------------------------------------------------*/
    3636             : 
    3637      762501 : static void stereo_dft_enc_calculate_nrg_for_icbwe(
    3638             :     STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle   */
    3639             :     const float *DMX,                      /* i  : DFT Stereo downmix          */
    3640             :     const int32_t input_Fs                 /* i  : input sampling rate         */
    3641             : )
    3642             : {
    3643             :     float *pDFT_L, *pDFT_R, bandResDft;
    3644             :     int16_t i, shbBins[3];
    3645             : 
    3646      762501 :     bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT;
    3647      762501 :     shbBins[0] = (int16_t) ( 6400 / bandResDft );
    3648      762501 :     shbBins[1] = (int16_t) ( 10400 / bandResDft );
    3649      762501 :     shbBins[2] = (int16_t) ( 14400 / bandResDft );
    3650      762501 :     assert( shbBins[1] <= hStereoDft->NFFT / 2 );
    3651             : 
    3652      762501 :     set_f( hStereoDft->nrg_L, EPSILON, 2 );
    3653      762501 :     set_f( hStereoDft->nrg_R, EPSILON, 2 );
    3654      762501 :     set_f( hStereoDft->nrg_DMX, EPSILON, 2 );
    3655             : 
    3656      762501 :     pDFT_L = hStereoDft->DFT[0];
    3657      762501 :     pDFT_R = hStereoDft->DFT[1];
    3658             : 
    3659   122762661 :     for ( i = shbBins[0]; i < shbBins[1]; i++ )
    3660             :     {
    3661   122000160 :         hStereoDft->nrg_L[0] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    3662   122000160 :         hStereoDft->nrg_R[0] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    3663   122000160 :         hStereoDft->nrg_DMX[0] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
    3664             :     }
    3665   122762661 :     for ( ; i < shbBins[2]; i++ )
    3666             :     {
    3667   122000160 :         hStereoDft->nrg_L[1] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
    3668   122000160 :         hStereoDft->nrg_R[1] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
    3669   122000160 :         hStereoDft->nrg_DMX[1] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
    3670             :     }
    3671             : 
    3672      762501 :     return;
    3673             : }

Generated by: LCOV version 1.14