LCOV - code coverage report
Current view: top level - lib_enc - ivas_stereo_dmx_evs.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 7a280f5ab01088e7a52ffe8a940e96df49c0ceac Lines: 811 869 93.3 %
Date: 2025-12-12 05:20:29 Functions: 14 14 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 <stdint.h>
      34             : #include <math.h>
      35             : #include "options.h"
      36             : #include "cnst.h"
      37             : #include "ivas_cnst.h"
      38             : #include "rom_com.h"
      39             : #include "prot.h"
      40             : #include "ivas_prot.h"
      41             : #include "ivas_rom_com.h"
      42             : #include "ivas_rom_enc.h"
      43             : #ifdef DEBUGGING
      44             : #include "debug.h"
      45             : #endif
      46             : #include "wmc_auto.h"
      47             : 
      48             : 
      49             : /*-----------------------------------------------------------------------*
      50             :  * Local constants
      51             :  *-----------------------------------------------------------------------*/
      52             : 
      53             : #define STEREO_DMX_EVS_FIND_POC_PEAK_TAU  4
      54             : #define STEREO_DMX_EVS_FIND_POC_PEAK_TAU2 8
      55             : 
      56             : #define STEREO_DMX_EVS_POC_GAMMA             0.75f
      57             : #define STEREO_DMX_EVS_POC_SMOOTH            1.25f
      58             : #define STEREO_DMX_EVS_POC_FORGETTING        0.78f
      59             : #define STEREO_DMX_EVS_TARGET_POC_FORGETTING 0.79f
      60             : #define STEREO_DMX_EVS_POC_W_FORGETTING      0.875f
      61             : #define STEREO_DMX_EVS_SHIFT_LIMIT           STEREO_DFT_ZP_NS_ENC
      62             : 
      63             : #define STEREO_DMX_EVS_DMX_EGY_FORGETTING 0.25f
      64             : #define STEREO_DMX_EVS_CORR_FORGETTING    0.78f
      65             : 
      66             : #define Q_BAND 0.25f
      67             : 
      68             : 
      69             : #define STEREO_DMX_EVS_ISD_FORGETTING     0.95f
      70             : #define STEREO_DMX_EVS_ISD_THRES_H        1.69f
      71             : #define STEREO_DMX_EVS_ISD_THRES_L        0.9f
      72             : #define STEREO_DMX_EVS_ISD_DIST_THRES_IPD 0.5f
      73             : 
      74             : #define STEREO_DMX_EVS_ISD_DIST_HYST_L 0.36f
      75             : #define STEREO_DMX_EVS_ISD_DIST_HYST_H 0.43f
      76             : 
      77             : #define STEREO_DMX_EVS_ICCR_FORGETTING 0.7f
      78             : #define STEREO_DMX_EVS_ICCR_HYST_L     0.75f
      79             : #define STEREO_DMX_EVS_ICCR_HYST_H     0.85f
      80             : 
      81             : #define STEREO_DMX_EVS_ICCRES_FORGETTING 0.92f
      82             : #define STEREO_DMX_EVS_LVLU_FORGETTING   0.5f
      83             : #define STEREO_DMX_EVS_LVLD_FORGETTING   0.92f
      84             : #define STEREO_DMX_EVS_ICLD_THRESH       3.f
      85             : #define STEREO_DMX_EVS_ICCRES_THRESH     0.4f
      86             : #define STEREO_DMX_EVS_DICLD_THRESH      1.49623566f
      87             : 
      88             : #define STEREO_DMX_EVS_SWTCH_HYS_THRES 1
      89             : #define STEREO_DMX_EVS_LR_EGY          15.0f
      90             : #define STEREO_DMX_EVS_ILDS_EGY        10000.0f
      91             : #define STEREO_DMX_EVS_ILD_PRC         0.1f
      92             : 
      93             : #define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55
      94             : #define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19
      95             : #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29
      96             : 
      97             : #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1
      98             : #define STEREO_DMX_EVS_IFF_AMIN            0.857696f
      99             : #define STEREO_DMX_EVS_IFF_AMAX            0.944061f
     100             : #define STEREO_DMX_EVS_IFF_FREQ            3000.0f
     101             : #define STEREO_DMX_EVS_PHA_WND_C           1.8f
     102             : 
     103             : #define STEREO_DMX_EVS_NB_SBFRM      5
     104             : #define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f
     105             : #define STEREO_DMX_EVS_CRST_FCTR_16  80.0f
     106             : #define STEREO_DMX_EVS_CRST_FCTR_32  40.0f
     107             : #define STEREO_DMX_EVS_CRST_FCTR_48  35.0f
     108             : 
     109             : #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f
     110             : 
     111             : #define STEREO_DMX_EVS_FAD_R              3
     112             : #define STEREO_DMX_EVS_SGC_EGY_FORGETTING 0.9f
     113             : #define STEREO_DMX_EVS_SGC_GR_S           1.00461543f
     114             : #define STEREO_DMX_EVS_SGC_GL             0.9885f
     115             : #define STEREO_DMX_EVS_SGC_GH             1.0116f
     116             : #define STEREO_DMX_EVS_SGC_LEGY_THRES_16  2.5E8
     117             : #define STEREO_DMX_EVS_SGC_LEGY_THRES_32  3.E8
     118             : #define STEREO_DMX_EVS_SGC_LEGY_THRES_48  5.E8
     119             : #define STEREO_DMX_EVS_SGC_GMAX           1.4142f
     120             : #define STEREO_DMX_EVS_SGC_GMIN           0.7071f
     121             : 
     122             : #define STEREO_DMX_EVS_IPD_ILD_THRES 3.16f // 5dB
     123             : #define STEREO_DMX_EVS_IPD_SF_THRES  0.05f
     124             : 
     125             : /*-----------------------------------------------------------------------*
     126             :  * Local function prototypes
     127             :  *-----------------------------------------------------------------------*/
     128             : 
     129             : static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci, const float *rfft_coef, const float *wnd, const int16_t input_frame );
     130             : static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame );
     131             : static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame );
     132             : static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] );
     133             : static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] );
     134             : static float find_poc_peak( STEREO_DMX_EVS_POC_HANDLE hPOC, float itd[], const int16_t input_frame, const float ratio );
     135             : static float spectral_flatness( const float sig[], const int16_t sig_length );
     136             : static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy, STEREO_DMX_EVS_PHA_HANDLE hPHA );
     137             : static void calc_energy( const float src1[], const float src2[], float energy[], float *lvl, const int16_t input_frame, const float ratio );
     138             : 
     139             : /*-------------------------------------------------------------------*
     140             :  * estimate_itd_wnd_fft()
     141             :  *
     142             :  * Transforms input signal from time domain into frequency domain.
     143             :  * The input signal is windowed before being transformed.
     144             :  *-------------------------------------------------------------------*/
     145             : 
     146       17700 : void estimate_itd_wnd_fft(
     147             :     const float *input,       /* i  : input signal                     */
     148             :     float *specr,             /* o  : real-part spectra                */
     149             :     float *speci,             /* o  : imaginary-part spectra           */
     150             :     const float *rfft_coef,   /* i  : rfft coef                        */
     151             :     const float *wnd,         /* i  : window coef                      */
     152             :     const int16_t input_frame /* i  : input frame length per channel   */
     153             : )
     154             : {
     155             :     int16_t n0, i;
     156             :     float rfft_buf[L_FRAME48k];
     157             :     int16_t step, bias;
     158             : 
     159       17700 :     n0 = input_frame >> 1;
     160       17700 :     if ( input_frame == L_FRAME16k )
     161             :     {
     162        6000 :         step = 3;
     163        6000 :         bias = 1;
     164             :     }
     165             :     else
     166             :     {
     167       11700 :         step = 1;
     168       11700 :         bias = 0;
     169             :     }
     170             : 
     171    11345700 :     for ( i = 0; i < input_frame; i++ )
     172             :     {
     173             :         /* window */
     174    11328000 :         rfft_buf[i] = input[i] * wnd[i * step + bias];
     175             :     }
     176             : 
     177       17700 :     rfft( rfft_buf, rfft_coef, input_frame, -1 );
     178             : 
     179     5664000 :     for ( i = 1; i < n0; i++ )
     180             :     {
     181     5646300 :         specr[i] = rfft_buf[i * 2];
     182     5646300 :         speci[i] = rfft_buf[i * 2 + 1];
     183             :     }
     184             : 
     185       17700 :     specr[0] = rfft_buf[0];
     186       17700 :     specr[n0] = rfft_buf[1];
     187       17700 :     speci[0] = 0.f;
     188       17700 :     speci[n0] = 0.f;
     189             : 
     190       17700 :     return;
     191             : }
     192             : 
     193             : 
     194             : /*-------------------------------------------------------------------*
     195             :  * calc_poc()
     196             :  *
     197             :  * calculate phase only correlation
     198             :  *-------------------------------------------------------------------*/
     199             : 
     200        8850 : static void calc_poc(
     201             :     STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */
     202             :     STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure     */
     203             :     const float wnd[],              /* i  : window coef                      */
     204             :     const float rfft_coef[],        /* i  : RFFT coef                        */
     205             :     const float specLr[],           /* i  : Lch real-part spectra            */
     206             :     const float specLi[],           /* i  : Lch imaginary-part input signal  */
     207             :     const float specRr[],           /* i  : Rch real-part spectra            */
     208             :     const float specRi[],           /* i  : Rch imaginary-part input signal  */
     209             :     const int16_t input_frame       /* i  : input frame length per channel   */
     210             : )
     211             : {
     212             :     int16_t i, n1, n2;
     213             :     int16_t n0, *itdLR;
     214             :     const float *s;
     215             :     float *P;
     216             :     float tmp1, tmp2, Lr, Li, Rr, Ri, gamma, igamma, iN;
     217             : 
     218             :     float specPOr[L_FRAME48k / 2 + 1], specPOi[L_FRAME48k / 2]; /*real and imaginary values for searching phase angle*/
     219             :     float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k];
     220             :     float rfft_buf[L_FRAME48k];
     221             :     int16_t step, bias;
     222             :     int16_t mult_angle;
     223             :     int16_t j;
     224             :     int16_t end;
     225             : 
     226             :     int16_t cos_step, cos_max;
     227             :     float eps_cos, eps_sin, EPS;
     228             : 
     229             :     int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase;
     230             :     float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate;
     231             :     float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr;
     232             :     float *Pr, *Pi, *ipd_ff, *p_curr_taps;
     233             :     float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX];
     234             : 
     235             :     /* Initialization */
     236        8850 :     iN = 1.0f / (float) input_frame;
     237        8850 :     s = hPOC->sin;
     238        8850 :     P = hPOC->P;
     239        8850 :     n0 = input_frame / 2;
     240        8850 :     itdLR = hPOC->itdLR;
     241             : 
     242        8850 :     Pr = hPHA->Pr;
     243        8850 :     Pi = hPHA->Pi;
     244        8850 :     nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE;
     245        8850 :     input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE;
     246             : 
     247        8850 :     igamma = STEREO_DMX_EVS_POC_GAMMA * iN;
     248        8850 :     gamma = 1.0f - igamma;
     249             : 
     250        8850 :     step = 1;
     251        8850 :     bias = 0;
     252        8850 :     cos_step = 2;
     253        8850 :     cos_max = n0;
     254        8850 :     mult_angle = 3;
     255             : 
     256        8850 :     if ( input_frame == L_FRAME16k )
     257             :     {
     258        3000 :         step = 3;
     259        3000 :         bias = 1;
     260        3000 :         cos_step = 4;
     261        3000 :         cos_max = input_frame;
     262        3000 :         mult_angle = 2; /*****/
     263             :     }
     264        8850 :     if ( input_frame == L_FRAME32k )
     265             :     {
     266        2850 :         mult_angle = 2;
     267             :     }
     268             : 
     269        8850 :     end = min( n0, 320 );
     270        8850 :     specPOr[0] = sign( specLr[0] * specRr[0] ) * wnd[bias];
     271        8850 :     specPOi[0] = 0.0f;
     272        8850 :     EPS = hPOC->eps;
     273        8850 :     if ( input_frame == L_FRAME48k )
     274             :     {
     275      720000 :         for ( i = 1; i < n0 / 2; i++ )
     276             :         {
     277      717000 :             eps_cos = s[cos_max - i * cos_step /*cos_max - i_for*/] * EPS;
     278      717000 :             eps_sin = s[i * cos_step /*i_for*/] * EPS;
     279      717000 :             Lr = specLr[i] + specRr[i] * eps_cos + specRi[i] * eps_sin;
     280      717000 :             Li = specLi[i] - specRr[i] * eps_sin + specRi[i] * eps_cos;
     281      717000 :             Rr = specRr[i] + specLr[i] * eps_cos + specLi[i] * eps_sin;
     282      717000 :             Ri = specRi[i] - specLr[i] * eps_sin + specLi[i] * eps_cos;
     283             : 
     284      717000 :             specPOr[i] = ( Lr * Rr + Li * Ri );
     285      717000 :             specPOi[i] = ( Lr * Ri - Li * Rr );
     286      717000 :             j = n0 - i;
     287      717000 :             if ( j < 320 )
     288             :             {
     289      237000 :                 Lr = specLr[j] - specRr[j] * eps_cos + specRi[j] * eps_sin;
     290      237000 :                 Li = specLi[j] - specRr[j] * eps_sin - specRi[j] * eps_cos;
     291      237000 :                 Rr = specRr[j] - specLr[j] * eps_cos + specLi[j] * eps_sin;
     292      237000 :                 Ri = specRi[j] - specLr[j] * eps_sin - specLi[j] * eps_cos;
     293             : 
     294      237000 :                 specPOr[j] = ( Lr * Rr + Li * Ri );
     295      237000 :                 specPOi[j] = ( Lr * Ri - Li * Rr );
     296             :             }
     297             :         }
     298             :     }
     299             :     else /* 16kHz and 32 kHz*/
     300             :     {
     301      696000 :         for ( i = 1; i < n0 / 2; i++ )
     302             :         {
     303      690150 :             eps_cos = s[cos_max - i * cos_step /*cos_max - i_for*/] * EPS;
     304      690150 :             eps_sin = s[i * cos_step /*i_for*/] * EPS;
     305             : 
     306      690150 :             Lr = specLr[i] + specRr[i] * eps_cos + specRi[i] * eps_sin;
     307      690150 :             Li = specLi[i] - specRr[i] * eps_sin + specRi[i] * eps_cos;
     308      690150 :             Rr = specRr[i] + specLr[i] * eps_cos + specLi[i] * eps_sin;
     309      690150 :             Ri = specRi[i] - specLr[i] * eps_sin + specLi[i] * eps_cos;
     310      690150 :             specPOr[i] = ( Lr * Rr + Li * Ri );
     311      690150 :             specPOi[i] = ( Lr * Ri - Li * Rr );
     312             : 
     313      690150 :             j = n0 - i;
     314      690150 :             Lr = specLr[j] - specRr[j] * eps_cos + specRi[j] * eps_sin;
     315      690150 :             Li = specLi[j] - specRr[j] * eps_sin - specRi[j] * eps_cos;
     316      690150 :             Rr = specRr[j] - specLr[j] * eps_cos + specLi[j] * eps_sin;
     317      690150 :             Ri = specRi[j] - specLr[j] * eps_sin - specLi[j] * eps_cos;
     318      690150 :             specPOr[j] = ( Lr * Rr + Li * Ri );
     319      690150 :             specPOi[j] = ( Lr * Ri - Li * Rr );
     320             :         }
     321             :     }
     322             :     {
     323             :         /* i=n0/2*/
     324        8850 :         Lr = specLr[i] + specRi[i] * EPS;
     325        8850 :         Li = specLi[i] - specRr[i] * EPS;
     326        8850 :         Rr = specRr[i] + specLi[i] * EPS;
     327        8850 :         Ri = specRi[i] - specLr[i] * EPS;
     328        8850 :         specPOr[i] = ( Lr * Rr + Li * Ri );
     329        8850 :         specPOi[i] = ( Lr * Ri - Li * Rr );
     330             :     }
     331             :     /* complex spectrum (specPOr[i], specPOi[i]) are placed on an unit circle without using  srqt()*/
     332       88500 :     for ( i = 1; i < 10; i++ ) /*search from 4 angles */
     333             :     {
     334       79650 :         tmp1 = wnd[i * step + bias] * gamma;
     335             : 
     336       79650 :         specPOr[i] = sign( specPOr[i] ) * 0.866f * tmp1; /* low angles are more frequent for low frequency */
     337       79650 :         specPOi[i] = sign( specPOi[i] ) * 0.5f * tmp1;
     338       79650 :         gamma -= igamma;
     339             :     }
     340       97350 :     for ( ; i < n0 >> 4; i++ ) /*search from 4 angles */
     341             :     {
     342       88500 :         tmp1 = wnd[i * step + bias] * gamma * 0.7071f;
     343             : 
     344       88500 :         specPOr[i] = sign( specPOr[i] ) * tmp1;
     345       88500 :         specPOi[i] = sign( specPOi[i] ) * tmp1; /* low accuracy is adequate for low frequency */
     346       88500 :         gamma -= igamma;
     347             :     }
     348             : 
     349      185850 :     for ( ; i < n0 >> 3; i++ ) /* binary search from 8 angles */
     350             :     {
     351      177000 :         tmp1 = wnd[i * step + bias] * gamma;
     352             : 
     353      177000 :         if ( ( specPOr[i] - specPOi[i] ) * ( specPOr[i] + specPOi[i] ) > 0 )
     354             :         {
     355       94302 :             specPOr[i] = sign( specPOr[i] ) * tmp1 * /*0.923880f*/ s[120 * mult_angle]; /*  cos(PI/8)*/
     356       94302 :             specPOi[i] = sign( specPOi[i] ) * tmp1 * /*0.382683f*/ s[40 * mult_angle];
     357             :         }
     358             :         else
     359             :         {
     360       82698 :             specPOr[i] = sign( specPOr[i] ) * tmp1 * /*0.382683f*/ s[40 * mult_angle]; /*  cos(PI*3/8)*/
     361       82698 :             specPOi[i] = sign( specPOi[i] ) * tmp1 * /*0.923880f*/ s[120 * mult_angle];
     362             :         }
     363      177000 :         gamma -= igamma;
     364             :     }
     365     2006850 :     for ( ; i < end; i++ ) /* binary search from 16 angles */
     366             :     {
     367     1998000 :         tmp1 = wnd[i * step + bias] * gamma;
     368     1998000 :         if ( ( specPOr[i] - specPOi[i] ) * ( specPOr[i] + specPOi[i] ) > 0 )
     369             :         {
     370     1047342 :             if ( ( specPOr[i] * 0.414213f - specPOi[i] ) * ( specPOr[i] * 0.414213f + specPOi[i] ) > 0 ) /*tan(PI/8)*/
     371             :             {
     372      563128 :                 specPOr[i] = sign( specPOr[i] ) * tmp1 /*0.980785f */ * s[140 * mult_angle]; /* cos(PI/16)*/
     373      563128 :                 specPOi[i] = sign( specPOi[i] ) * tmp1 /*0.195090f */ * s[20 * mult_angle];
     374             :             }
     375             :             else
     376             :             {
     377      484214 :                 specPOr[i] = sign( specPOr[i] ) * tmp1 /* 0.831470f */ * s[100 * mult_angle]; /*cos(PI*3/16)*/
     378      484214 :                 specPOi[i] = sign( specPOi[i] ) * tmp1 /* 0.555570f*/ * s[60 * mult_angle];
     379             :             }
     380             :         }
     381             :         else
     382             :         {
     383      950658 :             if ( ( specPOr[i] - specPOi[i] * 0.414213f ) * ( specPOr[i] + specPOi[i] * 0.414213f ) > 0 ) /*tan(PI/8)*/
     384             :             {
     385      476523 :                 specPOr[i] = sign( specPOr[i] ) * tmp1 /** 0.555570f*/ * s[60 * mult_angle]; /*cos(PI*5/16)*/
     386      476523 :                 specPOi[i] = sign( specPOi[i] ) * tmp1 /** 0.831470f*/ * s[100 * mult_angle];
     387             :             }
     388             :             else
     389             :             {
     390      474135 :                 specPOr[i] = sign( specPOr[i] ) * tmp1 /** 0.195090f*/ * s[20 * mult_angle]; /*cos(PI*7/16)*/
     391      474135 :                 specPOi[i] = sign( specPOi[i] ) * tmp1 /** 0.980785f*/ * s[140 * mult_angle];
     392             :             }
     393             :         }
     394     1998000 :         gamma -= igamma;
     395             :     }
     396             : 
     397        8850 :     if ( i < n0 )
     398             :     {
     399        3000 :         gamma -= igamma * ( n0 - 320 );
     400             :     }
     401      488850 :     for ( ; i < n0; i++ ) /*neglect higher frequency bins when 48 kHz samplng*/
     402             :     {
     403      480000 :         specPOr[i] = 0.f;
     404      480000 :         specPOi[i] = 0.f;
     405             :     }
     406        8850 :     specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma;
     407             : 
     408        8850 :     freq_8k = L_FRAME16k / 2;
     409        8850 :     freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) );
     410             : 
     411             :     /* Memorize the filters N-1 */
     412       26550 :     for ( n = 0; n < CPE_CHANNELS; n++ )
     413             :     {
     414       17700 :         if ( hPHA->p_curr_taps[n] )
     415             :         {
     416       17349 :             hPHA->p_prev_taps[n] = hPHA->prev_taps[n];
     417       17349 :             mvr2r( hPHA->p_curr_taps[n], hPHA->p_prev_taps[n], hPHA->pha_len );
     418             :         }
     419             :         else
     420             :         {
     421         351 :             hPHA->p_prev_taps[n] = NULL;
     422             :         }
     423             :     }
     424             : 
     425             :     /* ISD */
     426        8850 :     isd_cnt_l = 0;
     427        8850 :     isd_cnt_h = 0;
     428     1424850 :     for ( i = 1; i <= freq_8k; i++ )
     429             :     {
     430     1416000 :         Nr = ( specLr[i] - specRr[i] );
     431     1416000 :         Ni = ( specLi[i] - specRi[i] );
     432     1416000 :         Dr = ( specLr[i] + specRr[i] );
     433     1416000 :         Di = ( specLi[i] + specRi[i] );
     434     1416000 :         if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) )
     435             :         {
     436      460932 :             isd_cnt_h++;
     437             :         }
     438     1416000 :         if ( ( Nr * Nr + Ni * Ni ) < STEREO_DMX_EVS_ISD_THRES_L * ( Dr * Dr + Di * Di ) )
     439             :         {
     440      743891 :             isd_cnt_l++;
     441             :         }
     442             :     }
     443             : 
     444        8850 :     isd_rate = (float) isd_cnt_h / (float) freq_8k;
     445        8850 :     hPHA->isd_rate_s = STEREO_DMX_EVS_ISD_FORGETTING * hPHA->isd_rate_s + ( 1.0f - STEREO_DMX_EVS_ISD_FORGETTING ) * isd_rate;
     446             : 
     447        8850 :     if ( hPHA->isd_rate_s > STEREO_DMX_EVS_ISD_DIST_HYST_H )
     448             :     {
     449           0 :         if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD )
     450             :         {
     451           0 :             if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD )
     452             :             {
     453           0 :                 hPHA->pha_hys_cnt += 1;
     454             :             }
     455             :             else
     456             :             {
     457           0 :                 hPHA->pha_hys_cnt = 0;
     458             :             }
     459             : 
     460           0 :             if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES )
     461             :             {
     462           0 :                 hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD;
     463             :             }
     464             :         }
     465             : 
     466           0 :         hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD;
     467             :     }
     468        8850 :     else if ( hPHA->isd_rate_s < STEREO_DMX_EVS_ISD_DIST_HYST_L )
     469             :     {
     470        7752 :         if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2 )
     471             :         {
     472         234 :             if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2 )
     473             :             {
     474         117 :                 hPHA->pha_hys_cnt += 1;
     475             :             }
     476             :             else
     477             :             {
     478         117 :                 hPHA->pha_hys_cnt = 0;
     479             :             }
     480             : 
     481         234 :             if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES )
     482             :             {
     483         117 :                 hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2;
     484             :             }
     485             :         }
     486        7752 :         hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2;
     487             :     }
     488             : 
     489        8850 :     ipd_ff = hPHA->ipd_ff;
     490             : 
     491        8850 :     Nr = 0;
     492        8850 :     Ni = 0;
     493        8850 :     eneL = 0;
     494        8850 :     eneR = 0;
     495        8850 :     step = n0 >> 3;
     496        8850 :     tmp1 = 0.0f;
     497        8850 :     tmp2 = 0.0f;
     498     1416000 :     for ( n = 1, i = 1; n < nsbd; n++ )
     499             :     {
     500     1407150 :         tPr = 0.0f;
     501     1407150 :         tPi = 0.0f;
     502     1407150 :         tEr[n] = 0.0f;
     503     1407150 :         tEl[n] = 0.0f;
     504             : 
     505     4221450 :         for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ )
     506             :         {
     507             :             /* Energy */
     508     2814300 :             tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i];
     509     2814300 :             tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i];
     510             : 
     511             :             /* IPD */
     512     2814300 :             IPDr = specLr[i] * specRr[i] + specLi[i] * specRi[i];
     513     2814300 :             IPDi = specLi[i] * specRr[i] - specLr[i] * specRi[i];
     514     2814300 :             tPr += IPDr;
     515     2814300 :             tPi += IPDi;
     516             : 
     517             :             /* ICCr */
     518     2814300 :             Pn = inv_sqrtf( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON );
     519     2814300 :             IPDr *= Pn;
     520     2814300 :             IPDi *= Pn;
     521             : 
     522     2814300 :             tIPDr = ( specRr[i] * IPDr - specRi[i] * IPDi );
     523     2814300 :             tIPDi = ( specRr[i] * IPDi + specRi[i] * IPDr );
     524             : 
     525     2814300 :             Nr += ( specLr[i] * tIPDr + specLi[i] * tIPDi );
     526     2814300 :             Ni += ( specLi[i] * tIPDr - specLr[i] * tIPDi );
     527             : 
     528     2814300 :             eneL += ( specLr[i] * specLr[i] + specLi[i] * specLi[i] );
     529     2814300 :             eneR += ( specRr[i] * specRr[i] + specRi[i] * specRi[i] );
     530             : 
     531     2814300 :             if ( i == step - 1 )
     532             :             {
     533        8850 :                 tmp1 = eneL;
     534        8850 :                 tmp2 = eneR;
     535             :             }
     536             :         }
     537     1407150 :         Pn = inv_sqrtf( ( tPr * tPr + tPi * tPi ) + EPSILON );
     538             : 
     539     1407150 :         tPr *= Pn;
     540     1407150 :         tPi *= Pn;
     541             : 
     542     1407150 :         Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr;
     543     1407150 :         Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi;
     544     1407150 :         Pn = inv_sqrtf( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON );
     545     1407150 :         Pr[n] *= Pn;
     546     1407150 :         Pi[n] *= Pn;
     547             : 
     548     1407150 :         Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n];
     549     1407150 :         Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n];
     550             :     }
     551             : 
     552             :     /* Computes Spectral flatness on one channel */
     553        8850 :     if ( spectral_flatness( &tEl[1], nsbd - 1 ) < hPHA->pha_ipd_sf_Threshold )
     554             :     {
     555        7269 :         hPHA->pha_ipd_chanswitch_allowed = 0;
     556             :     }
     557             :     else
     558             :     {
     559        1581 :         hPHA->pha_ipd_chanswitch_allowed = 1;
     560             :     }
     561             : 
     562        8850 :     ICCr = sqrtf( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) );
     563        8850 :     hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr;
     564             : 
     565        8850 :     eneL -= tmp1;
     566        8850 :     eneR -= tmp2;
     567             : 
     568        8850 :     IPDr = cosf( hPHA->phitd * step );
     569        8850 :     IPDi = sinf( hPHA->phitd * step );
     570        8850 :     tmp1 = cosf( hPHA->phitd );
     571        8850 :     tmp2 = sinf( hPHA->phitd );
     572             : 
     573     2478000 :     for ( Nr = 0, Ni = 0, i = step; i < ( n0 - 1 ); i++ )
     574             :     {
     575     2469150 :         tIPDr = ( specRr[i] * IPDr + specRi[i] * IPDi );
     576     2469150 :         tIPDi = ( specRr[i] * IPDi - specRi[i] * IPDr );
     577     2469150 :         Nr += ( specLr[i] * tIPDr - specLi[i] * tIPDi );
     578     2469150 :         Ni += ( specLi[i] * tIPDr + specLr[i] * tIPDi );
     579     2469150 :         tIPDr = IPDr;
     580     2469150 :         IPDr = tIPDr * tmp1 - IPDi * tmp2;
     581     2469150 :         IPDi = tIPDr * tmp2 + IPDi * tmp1;
     582             :     }
     583             : 
     584        8850 :     if ( ICCr == 0.f )
     585             :     {
     586           0 :         ICCr = 1;
     587             :     }
     588        8850 :     ICCr = 0.5f * ( ICCr + ( sqrtf( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ) ) );
     589        8850 :     hPHA->iccres_s = STEREO_DMX_EVS_ICCRES_FORGETTING * hPHA->iccres_s + ( 1.0f - STEREO_DMX_EVS_ICCRES_FORGETTING ) * ICCr;
     590             : 
     591        8850 :     if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD )
     592             :     {
     593         117 :         hPHA->force_poc = FALSE;
     594         117 :         hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD;
     595             :     }
     596             :     else
     597             :     {
     598        8733 :         if ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_L ) || ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_H ) && ( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD2 ) && !hPHA->force_poc ) )
     599             :         {
     600        1323 :             hPHA->force_poc = FALSE;
     601        1323 :             hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD2;
     602             :         }
     603             :         else
     604             :         {
     605        7410 :             hPHA->force_poc = TRUE;
     606             :         }
     607             :     }
     608             : 
     609        8850 :     if ( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD )
     610             :     {
     611         117 :         rfft_pha_buf[0] = 1.;
     612         117 :         rfft_pha_buf[1] = 1.;
     613             : 
     614         117 :         ild_cnt = 0;
     615       15520 :         for ( i = 1; i < nsbd; i++ )
     616             :         {
     617       15403 :             rfft_pha_buf[i * 2] = Pr[i];
     618       15403 :             rfft_pha_buf[i * 2 + 1] = Pi[i];
     619       15403 :             if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) )
     620             :             {
     621         687 :                 ild_cnt++;
     622         687 :                 tEr[i] = 1;
     623             :             }
     624             :             else
     625             :             {
     626       14716 :                 tEr[i] = -1;
     627             :             }
     628             :         }
     629         117 :         if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC )
     630             :         {
     631           0 :             for ( i = 1; i < nsbd; i++ )
     632             :             {
     633           0 :                 if ( tEr[i] > 0 )
     634             :                 {
     635           0 :                     rfft_pha_buf[i * 2] = 1.;
     636           0 :                     rfft_pha_buf[i * 2 + 1] = 0.;
     637             :                 }
     638             :             }
     639             :         }
     640             : 
     641         117 :         rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 );
     642             : 
     643             :         /* Choose best channel to phase align */
     644             :         /* Channel selection based on ILD     */
     645         117 :         if ( hPHA->trns_aux_energy[0] > hPHA->trns_aux_energy[1] * hPHA->pha_ipd_ild_thresh )
     646             :         {
     647           0 :             pha_ipd_ild_chan2rephase = 1;
     648             :         }
     649         117 :         else if ( hPHA->trns_aux_energy[1] > hPHA->trns_aux_energy[0] * hPHA->pha_ipd_ild_thresh )
     650             :         {
     651           0 :             pha_ipd_ild_chan2rephase = 0;
     652             :         }
     653             :         else
     654             :         {
     655         117 :             pha_ipd_ild_chan2rephase = -1;
     656             :         }
     657             : 
     658             :         /* Channel selection based on spikyness of R2L/L2R impulse responses */
     659         117 :         tmp1 = spectral_flatness( rfft_pha_buf, hPHA->pha_len );
     660         117 :         rfft_pha_buf[input_frame_pha - hPHA->pha_len] = rfft_pha_buf[0];
     661         117 :         tmp2 = spectral_flatness( &rfft_pha_buf[input_frame_pha - hPHA->pha_len], hPHA->pha_len );
     662             : 
     663             :         /* Combined ILD/SF channel selection with tempo */
     664         117 :         if ( ( ( tmp1 > tmp2 ) && ( pha_ipd_ild_chan2rephase == -1 ) ) || ( pha_ipd_ild_chan2rephase == 0 ) ) /* L => R */
     665             :         {
     666           0 :             if ( hPHA->pha_ipd_previouschan2rephase == 0 )
     667             :             {
     668           0 :                 hPHA->pha_ipd_chan_cnt++;
     669           0 :                 if ( hPHA->pha_ipd_chan_cnt >= hPHA->pha_ipd_chan_thresh )
     670             :                 {
     671             :                     /* Avoid channel switch in case of too harmonic signals */
     672           0 :                     if ( hPHA->pha_ipd_chanswitch_allowed )
     673             :                     {
     674           0 :                         if ( hPHA->pha_ipd_chan2rephase != 0 )
     675             :                         {
     676           0 :                             hPHA->pha_ipd_chanswitch = 1;
     677             :                         }
     678             :                         else
     679             :                         {
     680           0 :                             hPHA->pha_ipd_chanswitch = 0;
     681             :                         }
     682           0 :                         hPHA->pha_ipd_chan2rephase = 0;
     683             :                     }
     684             :                 }
     685             :             }
     686             :             else
     687             :             {
     688           0 :                 hPHA->pha_ipd_previouschan2rephase = 0;
     689           0 :                 hPHA->pha_ipd_chan_cnt = 1;
     690           0 :                 hPHA->pha_ipd_chanswitch = 0;
     691             :             }
     692             :         }
     693             :         else /* R => L */
     694             :         {
     695         117 :             if ( hPHA->pha_ipd_previouschan2rephase == 1 )
     696             :             {
     697         117 :                 hPHA->pha_ipd_chan_cnt++;
     698         117 :                 if ( hPHA->pha_ipd_chan_cnt >= hPHA->pha_ipd_chan_thresh )
     699             :                 {
     700             :                     /* Avoid channel switch in case of too harmonic signals */
     701           0 :                     if ( hPHA->pha_ipd_chanswitch_allowed )
     702             :                     {
     703           0 :                         if ( hPHA->pha_ipd_chan2rephase != 1 )
     704             :                         {
     705           0 :                             hPHA->pha_ipd_chanswitch = 1;
     706             :                         }
     707             :                         else
     708             :                         {
     709           0 :                             hPHA->pha_ipd_chanswitch = 0;
     710             :                         }
     711           0 :                         hPHA->pha_ipd_chan2rephase = 1;
     712             :                     }
     713           0 :                     hPHA->pha_ipd_chan_cnt = hPHA->pha_ipd_chan_thresh;
     714             :                 }
     715             :             }
     716             :             else
     717             :             {
     718           0 :                 hPHA->pha_ipd_previouschan2rephase = 1;
     719           0 :                 hPHA->pha_ipd_chan_cnt = 1;
     720           0 :                 hPHA->pha_ipd_chanswitch = 0;
     721             :             }
     722             :         }
     723             : 
     724         117 :         if ( !hPHA->pha_ipd_chanswitch )
     725             :         {
     726         117 :             if ( hPHA->pha_ipd_chan2rephase == 0 )
     727             :             {
     728           0 :                 hPHA->p_curr_taps[1] = NULL;
     729           0 :                 hPHA->p_curr_taps[0] = hPHA->curr_taps[0];
     730           0 :                 p_curr_taps = hPHA->p_curr_taps[0];
     731           0 :                 p_curr_taps[0] = rfft_pha_buf[0];
     732           0 :                 for ( i = 1, j = input_frame_pha - 1; i < hPHA->pha_len; i++, j-- )
     733             :                 {
     734           0 :                     p_curr_taps[i] = rfft_pha_buf[j];
     735             :                 }
     736             :             }
     737             :             else
     738             :             {
     739         117 :                 hPHA->p_curr_taps[0] = NULL;
     740         117 :                 hPHA->p_curr_taps[1] = hPHA->curr_taps[1];
     741         117 :                 mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len );
     742             :             }
     743             :         }
     744             :     }
     745             : 
     746        8850 :     if ( hPHA->pha_ipd_chanswitch )
     747             :     {
     748           0 :         for ( n = 0; n < CPE_CHANNELS; n++ )
     749             :         {
     750           0 :             hPHA->p_curr_taps[n] = NULL;
     751             :         }
     752             :     }
     753        8850 :     else if ( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD2 )
     754             :     {
     755             :         /* IPDn */
     756             : 
     757        8733 :         set_f( &( Pr[freq_ipd_max] ), 1.0f, ( nsbd - freq_ipd_max ) );
     758        8733 :         set_f( &( Pi[freq_ipd_max] ), 0.0f, ( nsbd - freq_ipd_max ) );
     759             : 
     760       26199 :         for ( n = 0; n < CPE_CHANNELS; n++ )
     761             :         {
     762       17466 :             hPHA->p_curr_taps[n] = hPHA->curr_taps[n];
     763             :         }
     764             : 
     765        8733 :         rfft_pha_buf[0] = 1.;
     766        8733 :         rfft_pha_buf[1] = 1.;
     767             : 
     768        8733 :         ild_cnt = 0;
     769        8733 :         isd_rate = (float) isd_cnt_l / freq_8k;
     770     1400480 :         for ( i = 1; i < nsbd; i++ )
     771             :         {
     772     1391747 :             rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + Pr[i] ) / 2.0f );
     773     1391747 :             rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] );
     774     1391747 :             if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD )
     775             :             {
     776      728270 :                 rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] );
     777      728270 :                 rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f );
     778             :             }
     779     1391747 :             if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) )
     780             :             {
     781       87417 :                 ild_cnt++;
     782       87417 :                 tEr[i] = 1;
     783             :             }
     784             :             else
     785             :             {
     786     1304330 :                 tEr[i] = -1;
     787             :             }
     788             :         }
     789        8733 :         if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC )
     790             :         {
     791      155680 :             for ( i = 1; i < nsbd; i++ )
     792             :             {
     793      154940 :                 if ( tEr[i] > 0 )
     794             :                 {
     795       43422 :                     rfft_pha_buf[i * 2] = 1.;
     796       43422 :                     rfft_pha_buf[i * 2 + 1] = 0.;
     797             :                 }
     798             :             }
     799             :         }
     800             : 
     801        8733 :         rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 );
     802        8733 :         mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len );
     803             : 
     804             :         /* PHA L2R */
     805        8733 :         p_curr_taps = hPHA->p_curr_taps[0];
     806        8733 :         p_curr_taps[0] = rfft_pha_buf[0];
     807      348624 :         for ( i = 1; i < hPHA->pha_len; i++ )
     808             :         {
     809      339891 :             p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i];
     810             :         }
     811             :     }
     812             : 
     813       26550 :     for ( n = 0; n < CPE_CHANNELS; n++ )
     814             :     {
     815       17700 :         if ( hPHA->p_curr_taps[n] )
     816             :         {
     817      719007 :             for ( i = 0; i < hPHA->pha_len; i++ )
     818             :             {
     819      701424 :                 hPHA->p_curr_taps[n][i] *= hPHA->win[i];
     820             :             }
     821             : 
     822       17583 :             energy = 0.;
     823      719007 :             for ( i = 0; i < hPHA->pha_len; i++ )
     824             :             {
     825      701424 :                 energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i];
     826             :             }
     827       17583 :             energy = inv_sqrtf( energy + EPSILON );
     828      719007 :             for ( i = 0; i < hPHA->pha_len; i++ )
     829             :             {
     830      701424 :                 hPHA->p_curr_taps[n][i] *= energy;
     831             :             }
     832             :         }
     833             :     }
     834             : 
     835             : 
     836        8850 :     rfft_buf[0] = specPOr[0];
     837        8850 :     rfft_buf[1] = specPOr[n0];
     838     2832000 :     for ( i = 1; i < n0; i++ )
     839             :     {
     840     2823150 :         rfft_buf[i * 2] = specPOr[i];
     841     2823150 :         rfft_buf[i * 2 + 1] = specPOi[i];
     842             :     }
     843             : 
     844        8850 :     rfft( rfft_buf, rfft_coef, input_frame, +1 );
     845             : 
     846        8850 :     tmp1 = rfft_buf[0];
     847        8850 :     tmpPOC1[n0] = tmp1 * tmp1;
     848             : 
     849     1601850 :     for ( i = 1; i < hPOC->shift_limit + 1; i++ )
     850             :     {
     851     1593000 :         n1 = n0 + i;
     852     1593000 :         n2 = n0 - i;
     853             : 
     854     1593000 :         tmp1 = rfft_buf[i];
     855     1593000 :         tmpPOC1[n1] = tmp1 * tmp1;
     856             : 
     857     1593000 :         tmp1 = rfft_buf[input_frame - i];
     858     1593000 :         tmpPOC1[n2] = tmp1 * tmp1;
     859             :     }
     860             : 
     861        8850 :     tmp1 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n0] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n0 - 1] + tmpPOC1[n0 + 1] );
     862        8850 :     tmpPOC2[n0] = max( tmp1, 0.0f );
     863             : 
     864     1593000 :     for ( i = 1; i < hPOC->shift_limit; i++ )
     865             :     {
     866     1584150 :         n1 = n0 + i;
     867     1584150 :         n2 = n0 - i;
     868     1584150 :         tmp1 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n1] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n1 - 1] + tmpPOC1[n1 + 1] );
     869     1584150 :         tmp2 = STEREO_DMX_EVS_POC_SMOOTH * tmpPOC1[n2] + 0.5f * ( 1.0f - STEREO_DMX_EVS_POC_SMOOTH ) * ( tmpPOC1[n2 - 1] + tmpPOC1[n2 + 1] );
     870     1584150 :         tmpPOC2[n1] = max( tmp1, 0.0f );
     871     1584150 :         tmpPOC2[n2] = max( tmp2, 0.0f );
     872             :     }
     873             : 
     874        8850 :     P[n0] = P[n0] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n0] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING );
     875             : 
     876     1593000 :     for ( i = 1; i < hPOC->shift_limit; i++ )
     877             :     {
     878     1584150 :         n1 = n0 + i;
     879     1584150 :         n2 = n0 - i;
     880             : 
     881     1584150 :         if ( i == -itdLR[1] )
     882             :         {
     883        1486 :             P[n1] = P[n1] * STEREO_DMX_EVS_TARGET_POC_FORGETTING + tmpPOC2[n1] * ( 1.0f - STEREO_DMX_EVS_TARGET_POC_FORGETTING );
     884             :         }
     885             :         else
     886             :         {
     887     1582664 :             P[n1] = P[n1] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n1] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING );
     888             :         }
     889             : 
     890     1584150 :         if ( i == itdLR[0] )
     891             :         {
     892        3333 :             P[n2] = P[n2] * STEREO_DMX_EVS_TARGET_POC_FORGETTING + tmpPOC2[n2] * ( 1.0f - STEREO_DMX_EVS_TARGET_POC_FORGETTING );
     893             :         }
     894             :         else
     895             :         {
     896     1580817 :             P[n2] = P[n2] * STEREO_DMX_EVS_POC_FORGETTING + tmpPOC2[n2] * ( 1.0f - STEREO_DMX_EVS_POC_FORGETTING );
     897             :         }
     898             :     }
     899             : 
     900        8850 :     return;
     901             : }
     902             : 
     903             : 
     904             : /*-------------------------------------------------------------------*
     905             :  * find_poc_peak()
     906             :  *
     907             :  * find peak phase only correlation
     908             :  *-------------------------------------------------------------------*/
     909             : 
     910        8850 : static float find_poc_peak(
     911             :     STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */
     912             :     float itd[],                    /* o  : estimated itd                    */
     913             :     const int16_t input_frame,      /* i  : input frame length per channel   */
     914             :     const float ratio               /* i  : adapting ratio                   */
     915             : )
     916             : {
     917             :     int16_t itd_cand[CPE_CHANNELS], i, n, cnt[CPE_CHANNELS], Lh, peak_range, *on, *itdLR, prev_off[CPE_CHANNELS];
     918             :     float Q[CPE_CHANNELS], aQ[CPE_CHANNELS], cQ[CPE_CHANNELS], width, eps, cconfidence, *peak_width, *peakQ;
     919             :     float *P, tmpf;
     920             :     float eps2;
     921             : 
     922             :     /* Initialization */
     923        8850 :     Lh = input_frame / 2;
     924        8850 :     on = hPOC->ispeak;
     925        8850 :     itdLR = hPOC->itdLR;
     926        8850 :     width = 0.38f;
     927        8850 :     eps = 1.0f / (float) input_frame;
     928        8850 :     peak_width = hPOC->peak_width;
     929        8850 :     peakQ = hPOC->peakQ;
     930        8850 :     Q[0] = hPOC->P[Lh];
     931        8850 :     Q[1] = 0.0f;
     932        8850 :     itd_cand[0] = itd_cand[1] = 0;
     933        8850 :     P = hPOC->P;
     934             : 
     935     1593000 :     for ( i = 1; i < hPOC->shift_limit; i++ ) /*find peaks of POC P[] with positive and negative ITD */
     936             :     {
     937     1584150 :         if ( P[Lh - i] > Q[0] )
     938             :         {
     939       30908 :             Q[0] = P[Lh - i];
     940       30908 :             itd_cand[0] = i;
     941             :         }
     942     1584150 :         if ( P[Lh + i] > Q[1] )
     943             :         {
     944       34790 :             Q[1] = P[Lh + i];
     945       34790 :             itd_cand[1] = -i;
     946             :         }
     947             :     }
     948             : 
     949       26550 :     for ( n = 0; n < CPE_CHANNELS; n++ )
     950             :     {
     951       17700 :         prev_off[n] = !on[n];
     952             : 
     953       17700 :         aQ[n] = Q[n] * width;
     954       17700 :         cnt[n] = 0;
     955       17700 :         cQ[n] = P[Lh - itd_cand[n]];
     956             : 
     957       17700 :         peak_range = (int16_t) ( abs( itd_cand[n] ) + hPOC->shift_limit / STEREO_DMX_EVS_FIND_POC_PEAK_TAU ) / STEREO_DMX_EVS_FIND_POC_PEAK_TAU2;
     958             : 
     959      167547 :         for ( i = 1; i <= peak_range; i++ )
     960             :         {
     961      149847 :             cnt[n] += ( P[Lh - itd_cand[n] + i] > aQ[n] ) + ( P[Lh - itd_cand[n] - i] > aQ[n] );
     962      149847 :             cQ[n] += P[Lh - itd_cand[n] + i] + P[Lh - itd_cand[n] - i];
     963             :         }
     964             : 
     965       17700 :         peak_width[n] = peak_width[n] * ratio + (float) cnt[n] * ( 1.0f - ratio );
     966       17700 :         eps2 = eps * peak_width[n] * 0.25f;
     967       17700 :         Q[n] = ( 1.0f - ( cQ[n] / ( peak_range * 2 + 1 ) + eps2 ) / ( Q[n] + eps2 ) );
     968       17700 :         Q[n] = max( Q[n], 0.0f );
     969             : 
     970       17700 :         if ( on[n] ) /*if channel n was active (likely to be preceding) in the previous frame*/
     971             :         {
     972        5482 :             tmpf = ( 0.3f - 0.2f * (float) abs( itd_cand[n] ) / (float) hPOC->shift_limit ) * peakQ[n];
     973        5482 :             if ( Q[n] < tmpf )
     974             :             {
     975          22 :                 itdLR[n] = 0;
     976          22 :                 on[n] = 0;
     977          22 :                 peakQ[n] = 0.0f;
     978          22 :                 Q[n] = 0.0f;
     979             :             }
     980        5460 :             else if ( Q[n] > 1.25f * peakQ[n] )
     981             :             {
     982         159 :                 itdLR[n] = itd_cand[n];
     983             :             }
     984             : 
     985        5482 :             peakQ[n] = max( peakQ[n], Q[n] );
     986             :         }
     987             :         else /*if channel n was not active (not likely to be preceding) in the previous frame*/
     988             :         {
     989       12218 :             tmpf = ( 0.75f - 0.2f * (float) abs( itd_cand[n] ) / (float) hPOC->shift_limit );
     990             : 
     991       12218 :             if ( Q[n] < tmpf )
     992             :             {
     993       12059 :                 itdLR[n] = 0;
     994       12059 :                 Q[n] = 0.0f;
     995             :             }
     996             :             else
     997             :             {
     998         159 :                 itdLR[n] = itd_cand[n];
     999         159 :                 on[n] = 1;
    1000             :             }
    1001             :         }
    1002             :     }
    1003             : 
    1004        8850 :     if ( ( on[0] && prev_off[0] ) && ( on[1] && prev_off[1] ) ) /*if both channels have newly detected as active (possibility of preceding), select channel by peakness Q[] of POC */
    1005             :     {
    1006           0 :         *itd = ( Q[0] > Q[1] ) ? (float) itdLR[0] : (float) itdLR[1];
    1007             :     }
    1008        8850 :     else if ( ( on[0] && prev_off[0] ) && ( Q[0] > ( Q[1] - 0.1 ) ) ) /* if channel 0 becomes active, select channel 0*/
    1009             :     {
    1010         110 :         *itd = (float) itdLR[0];
    1011             :     }
    1012        8740 :     else if ( ( on[1] && prev_off[1] ) && ( Q[1] > ( Q[0] - 0.1 ) ) ) /*if channel 1 becomes active, selsect channel 1*/
    1013             :     {
    1014          45 :         *itd = (float) itdLR[1];
    1015             :     }
    1016        8695 :     else if ( Q[0] > ( Q[1] + Q_BAND ) ) /* if no status change, use Q[]*/
    1017             :     {
    1018        3126 :         *itd = (float) itdLR[0];
    1019             :     }
    1020        5569 :     else if ( Q[1] > ( Q[0] + Q_BAND ) ) /* if no status change, use Q[]*/
    1021             :     {
    1022         565 :         *itd = (float) itdLR[1];
    1023             :     }
    1024        5004 :     else if ( *itd == 0.0 ) /*if no channels are likely to be preceding, follow the status of the previous frame*/
    1025             :     {
    1026        4408 :         *itd = 0;
    1027             :     }
    1028             :     else /*follow the status of the previous frame*/
    1029             :     {
    1030         596 :         *itd = ( *itd > 0 ) ? (float) itdLR[0] : (float) itdLR[1];
    1031             :     }
    1032             : 
    1033        8850 :     cconfidence = sqrtf( fabsf( Q[0] - Q[1] ) ); /*higher value indicates higher confidence for one preceding channel*/
    1034             : 
    1035        8850 :     return hPOC->confidence = hPOC->confidence * STEREO_DMX_EVS_CORR_FORGETTING + cconfidence * ( 1.0f - STEREO_DMX_EVS_CORR_FORGETTING );
    1036             : }
    1037             : 
    1038             : 
    1039             : /*-------------------------------------------------------------------*
    1040             :  * estimate_itd()
    1041             :  *
    1042             :  * estimate itd
    1043             :  *-------------------------------------------------------------------*/
    1044             : 
    1045        8850 : static ivas_error estimate_itd(
    1046             :     float *corr,                    /* o  : correlation                      */
    1047             :     STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */
    1048             :     STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o: correlation filter structure     */
    1049             :     const float srcL[],             /* i  : Lch input signal                 */
    1050             :     const float srcR[],             /* i  : Rch input signal                 */
    1051             :     float itd[],                    /* o  : estimated itd                    */
    1052             :     const int16_t input_frame       /* i  : input frame length per channel   */
    1053             : )
    1054             : {
    1055             :     float specLr[L_FRAME48k / 2 + 1], specLi[L_FRAME48k / 2 + 1], specRr[L_FRAME48k / 2 + 1], specRi[L_FRAME48k / 2 + 1];
    1056             :     float rfft_coef[L_FRAME48k];
    1057             :     const float *p_w;
    1058             :     int16_t n, n0, n1;
    1059             :     int16_t rfft_coef_step;
    1060             :     ivas_error error;
    1061             : 
    1062        8850 :     error = IVAS_ERR_OK;
    1063             : 
    1064        8850 :     n0 = input_frame >> 1;
    1065        8850 :     n1 = input_frame >> 2;
    1066             : 
    1067        8850 :     if ( input_frame == L_FRAME16k )
    1068             :     {
    1069        3000 :         p_w = dft_trigo_32k;
    1070        3000 :         rfft_coef_step = 4;
    1071             :     }
    1072        5850 :     else if ( input_frame == L_FRAME32k )
    1073             :     {
    1074        2850 :         p_w = dft_trigo_32k;
    1075        2850 :         rfft_coef_step = 2;
    1076             :     }
    1077        3000 :     else if ( input_frame == L_FRAME48k )
    1078             :     {
    1079        3000 :         p_w = dft_trigo_48k;
    1080        3000 :         rfft_coef_step = 2;
    1081             :     }
    1082             :     else
    1083             :     {
    1084           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "failed estimate_itd()\n" );
    1085             :     }
    1086             : 
    1087     1424850 :     for ( n = 0; n < n1; n++ )
    1088             :     {
    1089     1416000 :         rfft_coef[n] = p_w[n * rfft_coef_step];
    1090     1416000 :         rfft_coef[n0 - n] = p_w[n * rfft_coef_step];
    1091             :     }
    1092        8850 :     rfft_coef[n1] = p_w[n1 * rfft_coef_step];
    1093             : 
    1094        8850 :     estimate_itd_wnd_fft( srcL, specLr, specLi, rfft_coef, hPOC->wnd, input_frame );
    1095        8850 :     estimate_itd_wnd_fft( srcR, specRr, specRi, rfft_coef, hPOC->wnd, input_frame );
    1096             : 
    1097        8850 :     calc_poc( hPOC, hPHA, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame );
    1098        8850 :     *corr = find_poc_peak( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING );
    1099             : 
    1100        8850 :     return error;
    1101             : }
    1102             : 
    1103             : 
    1104             : /*-------------------------------------------------------------------*
    1105             :  * weighted_ave()
    1106             :  *
    1107             :  * create weighted downmix signal
    1108             :  *-------------------------------------------------------------------*/
    1109             : 
    1110        8850 : static void weighted_ave(
    1111             :     const float src1[],        /* i  : Lch input signal               */
    1112             :     const float src2[],        /* i  : Rch input signal               */
    1113             :     float dst[],               /* o  : output signal                  */
    1114             :     const float gain,          /* i  : adapting gain                  */
    1115             :     const float old_gain,      /* i  : adapting prev gain             */
    1116             :     const int16_t input_frame, /* i  : input frame length per channel */
    1117             :     const float wnd[]          /* i  : window coef                    */
    1118             : )
    1119             : {
    1120             : 
    1121             : 
    1122             :     int16_t i, len, len2;
    1123        8850 :     float gain_tmp = 0.f, gain_sub;
    1124             : 
    1125        8850 :     len = input_frame >> 1;
    1126        8850 :     len2 = input_frame >> 2;
    1127        8850 :     gain_sub = gain - old_gain;
    1128             : 
    1129     1424850 :     for ( i = 0; i < len2; i++ )
    1130             :     {
    1131     1416000 :         gain_tmp = old_gain + gain_sub * wnd[i];
    1132     1416000 :         dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp );
    1133             :     }
    1134     1424850 :     for ( ; i < len; i++ )
    1135             :     {
    1136     1416000 :         gain_tmp = old_gain + gain_sub * ( 1.0f - wnd[len - i - 1] );
    1137     1416000 :         dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp );
    1138             :     }
    1139     2840850 :     for ( ; i < input_frame; i++ )
    1140             :     {
    1141     2832000 :         dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp );
    1142             :     }
    1143             : 
    1144             : 
    1145        8850 :     return;
    1146             : }
    1147             : 
    1148             : /*-------------------------------------------------------------------*
    1149             :  * spectral_flatness()
    1150             :  *
    1151             :  * computes spectral flatness SF
    1152             :  * SF(x) = exp(mean_i(ln(x_i))) / mean_i(x_i)
    1153             :  *-------------------------------------------------------------------*/
    1154             : 
    1155        9084 : static float spectral_flatness(
    1156             :     const float sig[],      /* i  : input signal               */
    1157             :     const int16_t sigLength /* i  : input signal length        */
    1158             : )
    1159             : {
    1160        9084 :     float geoMean = 0.0f;
    1161        9084 :     float ariMean = 0.0f;
    1162        9084 :     float eps = 1e-10f;
    1163             :     int16_t i;
    1164             : 
    1165             :     /* Initialization */
    1166     1424586 :     for ( i = 0; i < sigLength; i++ )
    1167             :     {
    1168     1415502 :         ariMean += fabsf( sig[i] ) + eps;
    1169     1415502 :         geoMean += logf( fabsf( sig[i] ) + eps );
    1170             :     }
    1171        9084 :     ariMean /= sigLength;
    1172        9084 :     geoMean /= sigLength;
    1173        9084 :     geoMean = expf( geoMean );
    1174             : 
    1175        9084 :     return geoMean / ariMean;
    1176             : }
    1177             : 
    1178             : 
    1179             : /*-------------------------------------------------------------------*
    1180             :  * calc_energy()
    1181             :  *
    1182             :  * calculate energy
    1183             :  *-------------------------------------------------------------------*/
    1184       26550 : static void calc_energy(
    1185             :     const float src1[],        /* i  : Lch input signal               */
    1186             :     const float src2[],        /* i  : Rch input signal               */
    1187             :     float energy[],            /* o  : calculated energy              */
    1188             :     float *lvl,                /* o  : calculated rms level           */
    1189             :     const int16_t input_frame, /* i  : input frame length per channel */
    1190             :     const float ratio          /* i  : adapting ratio                 */
    1191             : )
    1192             : {
    1193             :     float E, wnd, wnd_diff, lvli, lvlff;
    1194             :     int16_t i, adaptlen;
    1195             : 
    1196             :     /* Initialization */
    1197       26550 :     E = 0.0f;
    1198       26550 :     adaptlen = input_frame >> 4;
    1199       26550 :     wnd = 0.5f / (float) adaptlen;
    1200       26550 :     wnd_diff = 1.0f / (float) adaptlen;
    1201             : 
    1202     1088550 :     for ( i = 0; i < adaptlen; i++ )
    1203             :     {
    1204     1062000 :         E += ( src1[i] * wnd ) * ( src2[i] * wnd );
    1205             : 
    1206     1062000 :         wnd += wnd_diff;
    1207             :     }
    1208    14894550 :     for ( ; i < input_frame - adaptlen; i++ )
    1209             :     {
    1210    14868000 :         E += src1[i] * src2[i];
    1211             :     }
    1212     1088550 :     for ( ; i < input_frame; i++ )
    1213             :     {
    1214     1062000 :         wnd -= wnd_diff;
    1215             : 
    1216     1062000 :         E += ( src1[i] * wnd ) * ( src2[i] * wnd );
    1217             :     }
    1218             : 
    1219       26550 :     *energy = *energy * ratio + ( E / (float) input_frame ) * ( 1.0f - ratio );
    1220             : 
    1221       26550 :     if ( lvl != NULL )
    1222             :     {
    1223       17700 :         lvli = log10f( E + EPSILON );
    1224       17700 :         lvlff = ( lvli > *lvl ) ? STEREO_DMX_EVS_LVLU_FORGETTING : STEREO_DMX_EVS_LVLD_FORGETTING;
    1225       17700 :         *lvl = lvlff * *lvl + ( 1.0f - lvlff ) * lvli;
    1226             :     }
    1227             : 
    1228       26550 :     return;
    1229             : }
    1230             : 
    1231             : 
    1232             : /*-------------------------------------------------------------------*
    1233             :  * calc_energy_sgc()
    1234             :  *
    1235             :  * calculate energy for switch gain control
    1236             :  *-------------------------------------------------------------------*/
    1237       35400 : static void calc_energy_sgc(
    1238             :     const float src[],         /* i  : input signal       */
    1239             :     float *energy,             /* o  : calculated energy  */
    1240             :     const int16_t input_frame, /* i  : input frame length */
    1241             :     const float ratio          /* i  : adapting ratio     */
    1242             : )
    1243             : {
    1244       35400 :     *energy = ratio * *energy + ( 1.0f - ratio ) * sum2_f( src, input_frame );
    1245       35400 :     return;
    1246             : }
    1247             : 
    1248             : 
    1249             : /*-------------------------------------------------------------------*
    1250             :  * adapt_gain()
    1251             :  *
    1252             :  * adapt gain to the signal
    1253             :  *-------------------------------------------------------------------*/
    1254             : 
    1255       17700 : static void adapt_gain(
    1256             :     const float src[],         /* i  : input signal                   */
    1257             :     float dst[],               /* o  : output signal                  */
    1258             :     const float gain,          /* i  : adapting gain                  */
    1259             :     const float old_gain,      /* i  : adapting prev gain             */
    1260             :     const int16_t input_frame, /* i  : input frame length per channel */
    1261             :     const float wnd[]          /* i  : window coef                    */
    1262             : )
    1263             : {
    1264             :     int16_t i, len, len2;
    1265             :     float gain_tmp, gain_sub;
    1266             : 
    1267       17700 :     len = input_frame >> 1;
    1268       17700 :     len2 = input_frame >> 2;
    1269       17700 :     gain_sub = gain - old_gain;
    1270             : 
    1271     2849700 :     for ( i = 0; i < len2; i++ )
    1272             :     {
    1273     2832000 :         gain_tmp = old_gain + gain_sub * wnd[i];
    1274     2832000 :         dst[i] = src[i] * gain_tmp;
    1275             :     }
    1276     2849700 :     for ( ; i < len; i++ )
    1277             :     {
    1278     2832000 :         gain_tmp = old_gain + gain_sub * ( 1.0f - wnd[len - i - 1] );
    1279     2832000 :         dst[i] = src[i] * gain_tmp;
    1280             :     }
    1281             : 
    1282     5681700 :     for ( ; i < input_frame; i++ )
    1283             :     {
    1284     5664000 :         dst[i] = src[i] * gain;
    1285             :     }
    1286             : 
    1287       17700 :     return;
    1288             : }
    1289             : 
    1290             : 
    1291             : /*-------------------------------------------------------------------*
    1292             :  * create_M_signal()
    1293             :  *
    1294             :  * create downmix signal
    1295             :  *-------------------------------------------------------------------*/
    1296        8850 : static void create_M_signal(
    1297             :     const float srcL[],            /* i  : Lch input signal               */
    1298             :     const float srcR[],            /* i  : Rch input signal               */
    1299             :     float dmx[],                   /* o  : output signal                  */
    1300             :     const float w_curr,            /* i  : adapting weight                */
    1301             :     const int16_t input_frame,     /* i  : input frame length per channel */
    1302             :     const float wnd[],             /* i  : window coef                    */
    1303             :     float *w_prev,                 /* i/o: adapting prev weight           */
    1304             :     float *dmx_energy,             /* i/o: downmix signal energy          */
    1305             :     float *src_energy,             /* i/o: input signal energy            */
    1306             :     STEREO_DMX_EVS_PHA_HANDLE hPHA /* i/o: correlation filter structure   */
    1307             : )
    1308             : {
    1309             :     float weighted[L_FRAME48k], eps, amp_mod[CPE_CHANNELS], Lbias;
    1310             : 
    1311             :     /* Initialization */
    1312        8850 :     eps = 1024.0f;
    1313        8850 :     Lbias = ( w_prev[2] == 0 ) ? 4.0f : 0.25f;
    1314             : 
    1315        8850 :     weighted_ave( srcL, srcR, dmx, w_curr, w_prev[0], input_frame, wnd );
    1316             : 
    1317        8850 :     calc_energy( srcL, srcL, src_energy, hPHA->lvlin, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING );
    1318        8850 :     calc_energy( srcR, srcR, src_energy + 1, hPHA->lvlin + 1, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING );
    1319        8850 :     calc_energy( dmx, dmx, dmx_energy, NULL, input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING );
    1320             : 
    1321        8850 :     if ( src_energy[0] * Lbias > src_energy[1] )
    1322             :     {
    1323        5651 :         amp_mod[0] = 1.0f - sqrtf( ( dmx_energy[0] + eps ) / ( src_energy[0] + eps ) );
    1324        5651 :         amp_mod[0] = max( amp_mod[0], 0.0f );
    1325        5651 :         amp_mod[1] = 0.0f;
    1326             :     }
    1327             :     else
    1328             :     {
    1329        3199 :         amp_mod[1] = 1.0f - sqrtf( ( dmx_energy[0] + eps ) / ( src_energy[1] + eps ) );
    1330        3199 :         amp_mod[1] = max( amp_mod[1], 0.0f );
    1331        3199 :         amp_mod[0] = 0.0f;
    1332             :     }
    1333             : 
    1334        8850 :     adapt_gain( srcL, weighted, amp_mod[0], w_prev[1], input_frame, wnd );
    1335        8850 :     v_add( dmx, weighted, dmx, input_frame );
    1336        8850 :     adapt_gain( srcR, weighted, amp_mod[1], w_prev[2], input_frame, wnd );
    1337        8850 :     v_add( dmx, weighted, dmx, input_frame );
    1338             : 
    1339        8850 :     w_prev[0] = w_curr;
    1340        8850 :     w_prev[1] = amp_mod[0];
    1341        8850 :     w_prev[2] = amp_mod[1];
    1342             : 
    1343        8850 :     return;
    1344             : }
    1345             : 
    1346             : 
    1347             : /*-------------------------------------------------------------------*
    1348             :  * apply_gain_sgc()
    1349             :  *
    1350             :  * Apply gain for switching
    1351             :  *-------------------------------------------------------------------*/
    1352             : 
    1353       17700 : static void apply_gain_sgc(
    1354             :     float data[],             /* i/o  : input signal */
    1355             :     float *gain,              /* i  : gain */
    1356             :     float ratio,              /* i  : ratio */
    1357             :     const int16_t input_frame /* i  : input frame length */
    1358             : )
    1359             : {
    1360             :     int16_t n;
    1361             :     float lr;
    1362             : 
    1363       17700 :     if ( *gain > STEREO_DMX_EVS_SGC_GH )
    1364             :     {
    1365         170 :         lr = 1.0f / ratio;
    1366             :     }
    1367       17530 :     else if ( *gain < STEREO_DMX_EVS_SGC_GL )
    1368             :     {
    1369         348 :         lr = ratio;
    1370             :     }
    1371             :     else
    1372             :     {
    1373       17182 :         return;
    1374             :     }
    1375             : 
    1376      456838 :     for ( n = 0; n < input_frame; n++ )
    1377             :     {
    1378      456320 :         data[n] *= *gain;
    1379             :     }
    1380             : 
    1381         518 :     *gain *= lr;
    1382             : }
    1383             : 
    1384             : 
    1385             : /*-------------------------------------------------------------------*
    1386             :  * stereo_dmx_evs_enc()
    1387             :  *
    1388             :  * Stereo downmix for EVS encoder routine
    1389             :  *-------------------------------------------------------------------*/
    1390             : 
    1391        8850 : void stereo_dmx_evs_enc(
    1392             :     STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle   */
    1393             :     const int32_t input_Fs,                  /* i  : input sampling rate                     */
    1394             :     int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal                            */
    1395             :     const int16_t n_samples,                 /* i  : number of input samples                 */
    1396             :     const bool is_binaural                   /* i  : indication that input is binaural audio */
    1397             : )
    1398             : {
    1399             :     float dmx_weight, corr;
    1400             :     int16_t k, m, n, pha_len, fad_len, input_subframe, input_frame, n_fad_r, n_fad_g, m_fad_g, n_fad_cnt, sbfad_len;
    1401             :     float data_f[CPE_CHANNELS][L_FRAME48k];
    1402             :     float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX];
    1403             :     float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], subframe_energy[STEREO_DMX_EVS_NB_SBFRM];
    1404             :     float *p_data_mem, *p_prev_taps, *p_curr_taps, *p_data, *p_sub_frame;
    1405             :     float ftmp, *fad_g, *p_dmx_data, *p_dmx_data_fo;
    1406             :     bool is_transient;
    1407             : 
    1408             :     STEREO_DMX_EVS_PRC prev_prc, req_prc;
    1409             :     STEREO_DMX_EVS_PHA_HANDLE hPHA;
    1410             : 
    1411             :     if ( is_binaural )
    1412             :     {
    1413             :         /* use of is_binaural flag is to be considered */
    1414             :     }
    1415             : 
    1416        8850 :     input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
    1417        8850 :     hPHA = hStereoDmxEVS->hPHA;
    1418             : 
    1419     5672850 :     for ( n = 0; n < input_frame; n++ )
    1420             :     {
    1421     5664000 :         data_f[0][n] = (float) data[2 * n];
    1422     5664000 :         data_f[1][n] = (float) data[2 * n + 1];
    1423             :     }
    1424        8850 :     if ( n_samples < input_frame )
    1425             :     {
    1426           0 :         set_f( data_f[0] + n_samples, 0.0f, input_frame - n_samples );
    1427           0 :         set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples );
    1428             :     }
    1429             : 
    1430        8850 :     input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM;
    1431        8850 :     is_transient = false;
    1432       26550 :     for ( k = 0; k < CPE_CHANNELS; k++ )
    1433             :     {
    1434      106200 :         for ( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ )
    1435             :         {
    1436       88500 :             p_sub_frame = &( data_f[k][m * input_subframe] );
    1437       88500 :             subframe_energy[m] = sum2_f( p_sub_frame, input_subframe );
    1438       88500 :             if ( subframe_energy[m] > hPHA->crst_fctr * ( hPHA->trns_aux_energy[k] + EPSILON ) )
    1439             :             {
    1440         323 :                 is_transient = true;
    1441             :             }
    1442             : 
    1443       88500 :             hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m];
    1444             :         }
    1445             : 
    1446       88500 :         for ( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ )
    1447             :         {
    1448       70800 :             if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST )
    1449             :             {
    1450          34 :                 is_transient = true;
    1451             :             }
    1452             :         }
    1453             :     }
    1454             : 
    1455        8850 :     estimate_itd( &corr, hStereoDmxEVS->hPOC, hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame );
    1456             : 
    1457             :     /* poc */
    1458             : 
    1459        8850 :     if ( hStereoDmxEVS->itd )
    1460             :     {
    1461        3956 :         dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f;
    1462             :     }
    1463             :     else
    1464             :     {
    1465        4894 :         dmx_weight = 0.5f;
    1466             :     }
    1467             : 
    1468        8850 :     hPHA->phitd = hStereoDmxEVS->itd * PI2 / input_frame;
    1469             : 
    1470        8850 :     create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd,
    1471        8850 :                      hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy, hPHA );
    1472             : 
    1473             :     /* pha */
    1474             : 
    1475        8850 :     pha_len = hPHA->pha_len;
    1476        8850 :     fad_len = hPHA->fad_len;
    1477        8850 :     fad_g = hPHA->fad_g;
    1478             : 
    1479        8850 :     set_zero( dmx_pha_data, n_samples );
    1480        8850 :     set_zero( mem_prev, fad_len );
    1481             : 
    1482       26550 :     for ( k = 0; k < CPE_CHANNELS; k++ )
    1483             :     {
    1484       17700 :         p_data = data_f[k];
    1485       17700 :         mvr2r( hPHA->data_mem[k], data_mem, pha_len );
    1486       17700 :         mvr2r( &( p_data[n_samples - pha_len] ), hPHA->data_mem[k], pha_len );
    1487       17700 :         p_data_mem = &( data_mem[pha_len] );
    1488       17700 :         mvr2r( p_data, p_data_mem, n_samples );
    1489             : 
    1490       17700 :         p_prev_taps = hPHA->p_prev_taps[k];
    1491       17700 :         if ( p_prev_taps )
    1492             :         {
    1493     5588229 :             for ( n = 0; n < fad_len; n++ )
    1494             :             {
    1495   250624320 :                 for ( ftmp = 0, m = 0; m < pha_len; m++ )
    1496             :                 {
    1497   245053440 :                     ftmp += p_data_mem[n - m] * p_prev_taps[m];
    1498             :                 }
    1499     5570880 :                 mem_prev[n] += ftmp * INV_SQRT_2;
    1500             :             }
    1501             :         }
    1502             :         else
    1503             :         {
    1504       93471 :             for ( n = 0; n < fad_len; n++ )
    1505             :             {
    1506       93120 :                 mem_prev[n] += p_data[n] * INV_SQRT_2;
    1507             :             }
    1508             :         }
    1509             : 
    1510       17700 :         p_curr_taps = hPHA->p_curr_taps[k];
    1511       17700 :         if ( p_curr_taps )
    1512             :         {
    1513    11283503 :             for ( n = 0; n < n_samples; n++ )
    1514             :             {
    1515   506410880 :                 for ( ftmp = 0, m = 0; m < pha_len; m++ )
    1516             :                 {
    1517   495144960 :                     ftmp += p_data_mem[n - m] * p_curr_taps[m];
    1518             :                 }
    1519    11265920 :                 dmx_pha_data[n] += ftmp * INV_SQRT_2;
    1520             :             }
    1521             :         }
    1522             :         else
    1523             :         {
    1524       62197 :             for ( n = 0; n < n_samples; n++ )
    1525             :             {
    1526       62080 :                 dmx_pha_data[n] += p_data[n] * INV_SQRT_2;
    1527             :             }
    1528             :         }
    1529             :     }
    1530             : 
    1531     2840850 :     for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- )
    1532             :     {
    1533     2832000 :         dmx_pha_data[n] *= fad_g[n];
    1534     2832000 :         dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m];
    1535             :     }
    1536             : 
    1537             :     /* prc switch */
    1538             : 
    1539        8850 :     prev_prc = hPHA->curr_prc;
    1540        8850 :     if ( abs( (int16_t) hStereoDmxEVS->itd ) > hPHA->prc_thres )
    1541             :     {
    1542         725 :         req_prc = STEREO_DMX_EVS_PRC_POC;
    1543         725 :         if ( ( fabs( hPHA->lvlin[0] - hPHA->lvlin[1] ) < STEREO_DMX_EVS_ICLD_THRESH ) && ( hPHA->iccres_s < STEREO_DMX_EVS_ICCRES_THRESH ) && ( ( ( dmx_weight + hStereoDmxEVS->dmx_weight[1] ) > STEREO_DMX_EVS_DICLD_THRESH * ( 1 - dmx_weight + hStereoDmxEVS->dmx_weight[2] ) ) || ( ( 1 - dmx_weight + hStereoDmxEVS->dmx_weight[2] ) > STEREO_DMX_EVS_DICLD_THRESH * ( dmx_weight + hStereoDmxEVS->dmx_weight[1] ) ) ) )
    1544             :         {
    1545           0 :             req_prc = STEREO_DMX_EVS_PRC_PHA;
    1546             :         }
    1547             :     }
    1548             :     else
    1549             :     {
    1550        8125 :         req_prc = STEREO_DMX_EVS_PRC_PHA;
    1551             :     }
    1552             : 
    1553             :     // Set mode with hysteresis
    1554        8850 :     if ( hPHA->curr_prc != req_prc )
    1555             :     {
    1556        7081 :         if ( hPHA->prev_prc == req_prc )
    1557             :         {
    1558        6948 :             hPHA->prc_hys_cnt += 1;
    1559             :         }
    1560             :         else
    1561             :         {
    1562         133 :             hPHA->prc_hys_cnt = 0;
    1563             :         }
    1564             : 
    1565        7081 :         if ( hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES )
    1566             :         {
    1567        6948 :             hPHA->curr_prc = req_prc;
    1568             :         }
    1569             :     }
    1570        8850 :     hPHA->prev_prc = req_prc;
    1571             : 
    1572        8850 :     if ( is_transient || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( hPHA->force_poc ) )
    1573             :     {
    1574        7530 :         hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC;
    1575        7530 :         hPHA->prc_hys_cnt = 0;
    1576             :     }
    1577             : 
    1578        8850 :     calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1579        8850 :     calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1580             : 
    1581        8850 :     if ( ( prev_prc != hPHA->curr_prc ) && !is_transient && !( ( hPHA->dmx_pha_ener < hPHA->low_egy_thres_sgc ) && ( hPHA->dmx_poc_ener < hPHA->low_egy_thres_sgc ) ) )
    1582             :     {
    1583          18 :         if ( hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC )
    1584             :         {
    1585          10 :             apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1586          10 :             calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1587             : 
    1588          10 :             hPHA->dmx_poc_gain_sgc = sqrtf( hPHA->dmx_pha_ener_sgc / ( hPHA->dmx_poc_ener + EPSILON ) );
    1589          10 :             hPHA->dmx_poc_gain_sgc = min( hPHA->dmx_poc_gain_sgc, STEREO_DMX_EVS_SGC_GMAX );
    1590          10 :             hPHA->dmx_poc_gain_sgc = max( hPHA->dmx_poc_gain_sgc, STEREO_DMX_EVS_SGC_GMIN );
    1591             : 
    1592          10 :             apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1593          10 :             calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1594             :         }
    1595             :         else
    1596             :         {
    1597           8 :             apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1598           8 :             calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1599             : 
    1600           8 :             hPHA->dmx_pha_gain_sgc = sqrtf( hPHA->dmx_poc_ener_sgc / ( hPHA->dmx_pha_ener + EPSILON ) );
    1601           8 :             hPHA->dmx_pha_gain_sgc = min( hPHA->dmx_pha_gain_sgc, STEREO_DMX_EVS_SGC_GMAX );
    1602           8 :             hPHA->dmx_pha_gain_sgc = max( hPHA->dmx_pha_gain_sgc, STEREO_DMX_EVS_SGC_GMIN );
    1603             : 
    1604           8 :             apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1605           8 :             calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1606             :         }
    1607             :     }
    1608             :     else
    1609             :     {
    1610        8832 :         apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1611        8832 :         calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1612             : 
    1613        8832 :         apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc ), STEREO_DMX_EVS_SGC_GR_S, n_samples );
    1614        8832 :         calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING );
    1615             :     }
    1616             : 
    1617        8850 :     if ( hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC )
    1618             :     {
    1619        7786 :         p_dmx_data = dmx_poc_data;
    1620        7786 :         p_dmx_data_fo = dmx_pha_data;
    1621             :     }
    1622             :     else
    1623             :     {
    1624        1064 :         p_dmx_data = dmx_pha_data;
    1625        1064 :         p_dmx_data_fo = dmx_poc_data;
    1626             :     }
    1627             : 
    1628        8850 :     n_fad_r = is_transient ? 1 : STEREO_DMX_EVS_FAD_R;
    1629             : 
    1630        8850 :     if ( prev_prc != hPHA->curr_prc )
    1631             :     {
    1632         278 :         if ( hPHA->n_fad_g == input_frame )
    1633             :         {
    1634         275 :             hPHA->n_fad_g = 0;
    1635         275 :             hPHA->n_fad_cnt = 0;
    1636             :         }
    1637             :         else
    1638             :         {
    1639           3 :             hPHA->n_fad_g = input_frame - hPHA->n_fad_g - 1;
    1640           3 :             hPHA->n_fad_cnt = 0;
    1641             :         }
    1642             :     }
    1643        8572 :     else if ( is_transient )
    1644             :     {
    1645         199 :         hPHA->n_fad_cnt = 0;
    1646             :     }
    1647             : 
    1648        8850 :     fad_len = min( n_samples, ( ( input_frame * n_fad_r ) - ( hPHA->n_fad_g * n_fad_r + hPHA->n_fad_cnt ) ) );
    1649             : 
    1650        8850 :     if ( fad_len != 0 )
    1651             :     {
    1652         825 :         fad_g = hPHA->fad_g_prc;
    1653         825 :         n_fad_g = hPHA->n_fad_g;
    1654         825 :         n_fad_cnt = hPHA->n_fad_cnt;
    1655         825 :         m_fad_g = input_frame - n_fad_g - 1;
    1656             : 
    1657         825 :         if ( n_fad_r == 1 )
    1658             :         {
    1659           3 :             n_fad_cnt = 0;
    1660        2563 :             for ( n = 0; n < fad_len; n++ )
    1661             :             {
    1662        2560 :                 p_dmx_data[n] *= fad_g[n_fad_g++];
    1663        2560 :                 p_dmx_data[n] += fad_g[m_fad_g--] * p_dmx_data_fo[n];
    1664             :             }
    1665             :         }
    1666             :         else
    1667             :         {
    1668         822 :             n = 0;
    1669         822 :             sbfad_len = 0;
    1670         822 :             if ( n_fad_cnt != 0 )
    1671             :             {
    1672         409 :                 sbfad_len = min( fad_len, n_fad_r - n_fad_cnt );
    1673        1023 :                 for ( ; n < sbfad_len; n++ )
    1674             :                 {
    1675         614 :                     p_dmx_data[n] *= fad_g[n_fad_g];
    1676         614 :                     p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
    1677             :                 }
    1678         409 :                 n_fad_cnt = 0;
    1679         409 :                 n_fad_g++;
    1680         409 :                 m_fad_g--;
    1681             :             }
    1682             : 
    1683         822 :             sbfad_len = (int16_t) ( ( fad_len - sbfad_len ) / n_fad_r );
    1684      158708 :             for ( k = 0; k < sbfad_len; k++ )
    1685             :             {
    1686      631544 :                 for ( m = 0; m < n_fad_r; m++ )
    1687             :                 {
    1688      473658 :                     p_dmx_data[n] *= fad_g[n_fad_g];
    1689      473658 :                     p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
    1690      473658 :                     n++;
    1691             :                 }
    1692      157886 :                 n_fad_g++;
    1693      157886 :                 m_fad_g--;
    1694             :             }
    1695             : 
    1696        1437 :             for ( ; n < fad_len; n++ )
    1697             :             {
    1698         615 :                 p_dmx_data[n] *= fad_g[n_fad_g];
    1699         615 :                 p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
    1700         615 :                 if ( ++n_fad_cnt >= n_fad_r )
    1701             :                 {
    1702           0 :                     n_fad_cnt = 0;
    1703           0 :                     n_fad_g++;
    1704           0 :                     m_fad_g--;
    1705             :                 }
    1706             :             }
    1707             :         }
    1708             : 
    1709         825 :         hPHA->n_fad_g = n_fad_g;
    1710         825 :         hPHA->n_fad_cnt = n_fad_cnt;
    1711             :     }
    1712             : 
    1713        8850 :     mvr2s( p_dmx_data, data, n_samples );
    1714             : 
    1715        8850 :     return;
    1716             : }
    1717             : 
    1718             : 
    1719             : /*-------------------------------------------------------------------*
    1720             :  * stereo_dmx_evs_init_encoder()
    1721             :  *
    1722             :  * open and initialize stereo downmix for EVS encoder
    1723             :  *-------------------------------------------------------------------*/
    1724             : 
    1725         117 : ivas_error stereo_dmx_evs_init_encoder(
    1726             :     STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS_out, /* o  : Stereo downmix for EVS encoder handle   */
    1727             :     const int32_t input_Fs                        /* i  : input sampling rate                     */
    1728             : )
    1729             : {
    1730             :     STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS;
    1731             :     int16_t n, input_frame;
    1732             : 
    1733             :     int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha;
    1734             :     float *win, *fad_g, fad_r, tmp_r, a_step, *ipd_ff;
    1735             :     const float *p_ipd_w;
    1736             : 
    1737         117 :     input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
    1738             : 
    1739         117 :     hStereoDmxEVS = NULL;
    1740         117 :     if ( ( hStereoDmxEVS = (STEREO_DMX_EVS_ENC_HANDLE) malloc( sizeof( STEREO_DMX_EVS_ENC_DATA ) ) ) == NULL )
    1741             :     {
    1742           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_ENC_DATA\n" ) );
    1743             :     }
    1744             : 
    1745         117 :     hStereoDmxEVS->itd = 0.0f;
    1746         117 :     hStereoDmxEVS->pre_dmx_energy[0] = 0.0f;
    1747         351 :     for ( n = 0; n < CPE_CHANNELS; n++ )
    1748             :     {
    1749         234 :         hStereoDmxEVS->aux_dmx_energy[n] = 0.0f;
    1750             :     }
    1751             : 
    1752         117 :     hStereoDmxEVS->dmx_weight[0] = 0.5f;
    1753         117 :     hStereoDmxEVS->dmx_weight[1] = 0.0f;
    1754         117 :     hStereoDmxEVS->dmx_weight[2] = 0.0f;
    1755             : 
    1756         117 :     if ( input_frame == L_FRAME16k )
    1757             :     {
    1758          60 :         hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_16k;
    1759             :     }
    1760          57 :     else if ( input_frame == L_FRAME32k )
    1761             :     {
    1762          37 :         hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_32k;
    1763             :     }
    1764          20 :     else if ( input_frame == L_FRAME48k )
    1765             :     {
    1766          20 :         hStereoDmxEVS->s_wnd = Stereo_dmx_s_wnd_coef_48k;
    1767             :     }
    1768             :     else
    1769             :     {
    1770           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" );
    1771             :     }
    1772             : 
    1773         117 :     hStereoDmxEVS->hPOC = NULL;
    1774         117 :     if ( ( hStereoDmxEVS->hPOC = (STEREO_DMX_EVS_POC_HANDLE) malloc( sizeof( STEREO_DMX_EVS_POC_DATA ) ) ) == NULL )
    1775             :     {
    1776           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_POC_DATA\n" ) );
    1777             :     }
    1778             : 
    1779         117 :     hStereoDmxEVS->hPOC->shift_limit = NS2SA( input_Fs, STEREO_DMX_EVS_SHIFT_LIMIT );
    1780             : 
    1781         351 :     for ( n = 0; n < CPE_CHANNELS; n++ )
    1782             :     {
    1783         234 :         hStereoDmxEVS->hPOC->peakQ[n] = 0.0f;
    1784         234 :         hStereoDmxEVS->hPOC->peak_width[n] = (float) hStereoDmxEVS->hPOC->shift_limit / 2;
    1785         234 :         hStereoDmxEVS->hPOC->ispeak[n] = 0;
    1786         234 :         hStereoDmxEVS->hPOC->itdLR[n] = 0;
    1787             :     }
    1788         117 :     set_f( hStereoDmxEVS->hPOC->P, 0.0f, L_FRAME48k );
    1789             : 
    1790         117 :     if ( input_frame == L_FRAME16k )
    1791             :     {
    1792          60 :         hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_48k;
    1793             :     }
    1794          57 :     else if ( input_frame == L_FRAME32k )
    1795             :     {
    1796          37 :         hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_32k;
    1797             :     }
    1798          20 :     else if ( input_frame == L_FRAME48k )
    1799             :     {
    1800          20 :         hStereoDmxEVS->hPOC->wnd = Stereo_dmx_wnd_coef_48k;
    1801             :     }
    1802             :     else
    1803             :     {
    1804           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" );
    1805             :     }
    1806         117 :     hStereoDmxEVS->hPOC->eps = 2.0f * EVS_PI / ( (float) input_frame );
    1807             : 
    1808         117 :     if ( input_frame == L_FRAME16k )
    1809             :     {
    1810          60 :         hStereoDmxEVS->hPOC->sin = dft_trigo_32k;
    1811             :     }
    1812          57 :     else if ( input_frame == L_FRAME32k )
    1813             :     {
    1814          37 :         hStereoDmxEVS->hPOC->sin = dft_trigo_32k;
    1815             :     }
    1816          20 :     else if ( input_frame == L_FRAME48k )
    1817             :     {
    1818          20 :         hStereoDmxEVS->hPOC->sin = dft_trigo_48k;
    1819             :     }
    1820             :     else
    1821             :     {
    1822           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" );
    1823             :     }
    1824             : 
    1825         117 :     hStereoDmxEVS->hPOC->confidence = 0.0f;
    1826             : 
    1827         117 :     hStereoDmxEVS->hPHA = NULL;
    1828         117 :     if ( ( hStereoDmxEVS->hPHA = (STEREO_DMX_EVS_PHA_HANDLE) malloc( sizeof( STEREO_DMX_EVS_PHA_DATA ) ) ) == NULL )
    1829             :     {
    1830           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_CORFILT_DATA\n" ) );
    1831             :     }
    1832             : 
    1833         351 :     for ( n = 0; n < CPE_CHANNELS; n++ )
    1834             :     {
    1835         234 :         hStereoDmxEVS->hPHA->p_curr_taps[n] = NULL;
    1836         234 :         hStereoDmxEVS->hPHA->p_prev_taps[n] = NULL;
    1837             : 
    1838         234 :         set_zero( hStereoDmxEVS->hPHA->data_mem[n], STEREO_DMX_EVS_PHA_LEN_MAX );
    1839         234 :         set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX );
    1840             :     }
    1841             : 
    1842         117 :     if ( input_Fs == 16000 )
    1843             :     {
    1844          60 :         len = STEREO_DMX_EVS_PHA_LEN_16;
    1845          60 :         hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16;
    1846          60 :         hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_16;
    1847          60 :         hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_16;
    1848          60 :         hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16;
    1849             :     }
    1850          57 :     else if ( input_Fs == 32000 )
    1851             :     {
    1852          37 :         len = STEREO_DMX_EVS_PHA_LEN_32;
    1853          37 :         hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32;
    1854          37 :         hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32;
    1855          37 :         hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32;
    1856          37 :         hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32;
    1857             :     }
    1858          20 :     else if ( input_Fs == 48000 )
    1859             :     {
    1860          20 :         len = STEREO_DMX_EVS_PHA_LEN_48;
    1861          20 :         hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48;
    1862          20 :         hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48;
    1863          20 :         hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48;
    1864          20 :         hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48;
    1865             :     }
    1866             :     else
    1867             :     {
    1868           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" );
    1869             :     }
    1870             : 
    1871         117 :     hStereoDmxEVS->hPHA->pha_len = len / 2;
    1872         117 :     hStereoDmxEVS->hPHA->isd_rate_s = 0.0f;
    1873         117 :     hStereoDmxEVS->hPHA->iccr_s = 0.0f;
    1874         117 :     hStereoDmxEVS->hPHA->iccres_s = 0.0f;
    1875         117 :     hStereoDmxEVS->hPHA->phitd = 0.0f;
    1876         351 :     for ( n = 0; n < CPE_CHANNELS; n++ )
    1877             :     {
    1878         234 :         hStereoDmxEVS->hPHA->lvlin[n] = 0.0f;
    1879             :     }
    1880             : 
    1881         117 :     pha_len = hStereoDmxEVS->hPHA->pha_len;
    1882         117 :     fad_len = hStereoDmxEVS->hPHA->fad_len;
    1883             : 
    1884         117 :     trans_len = (int16_t) ( (float) pha_len / 20.0f );
    1885         117 :     set_f( hStereoDmxEVS->hPHA->win, STEREO_DMX_EVS_PHA_WND_C, pha_len - trans_len );
    1886         117 :     hStereoDmxEVS->hPHA->win[0] = 1.0f;
    1887         117 :     tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 );
    1888         117 :     win = &( hStereoDmxEVS->hPHA->win[pha_len - trans_len] );
    1889         291 :     for ( n = 0; n < trans_len; n++ )
    1890             :     {
    1891         174 :         win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * STEREO_DMX_EVS_PHA_WND_C;
    1892             :     }
    1893             : 
    1894         117 :     fad_g = hStereoDmxEVS->hPHA->fad_g;
    1895         117 :     fad_r = 1.0f / (float) ( fad_len + 1 );
    1896         117 :     fad_len2 = fad_len / 2;
    1897       15637 :     for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- )
    1898             :     {
    1899       15520 :         fad_g[n] = (float) ( n + 1 ) * fad_r;
    1900       15520 :         fad_g[m] = 1.0f - fad_g[n];
    1901             :     }
    1902             : 
    1903         117 :     hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD;
    1904         117 :     hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD;
    1905         117 :     hStereoDmxEVS->hPHA->pha_hys_cnt = 0;
    1906             : 
    1907             : 
    1908         117 :     hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0;
    1909         117 :     hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10;
    1910         117 :     hStereoDmxEVS->hPHA->pha_ipd_ild_thresh = STEREO_DMX_EVS_IPD_ILD_THRES;
    1911         117 :     hStereoDmxEVS->hPHA->pha_ipd_chan2rephase = 1;
    1912         117 :     hStereoDmxEVS->hPHA->pha_ipd_previouschan2rephase = 1;
    1913         117 :     hStereoDmxEVS->hPHA->pha_ipd_chanswitch = 0;
    1914         117 :     hStereoDmxEVS->hPHA->pha_ipd_chanswitch_allowed = 0;
    1915         117 :     hStereoDmxEVS->hPHA->pha_ipd_sf_Threshold = STEREO_DMX_EVS_IPD_SF_THRES;
    1916             : 
    1917         117 :     hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD;
    1918         117 :     hStereoDmxEVS->hPHA->force_poc = FALSE;
    1919             : 
    1920             :     /* Compute the forgetting factor */
    1921         117 :     itrh = (int16_t) ( ( STEREO_DMX_EVS_IFF_FREQ * input_frame ) / ( input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE ) );
    1922         117 :     n0 = L_FRAME16k / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE );
    1923         117 :     a_step = ( STEREO_DMX_EVS_IFF_AMIN - STEREO_DMX_EVS_IFF_AMAX ) / ( n0 + 1 - itrh );
    1924         117 :     ipd_ff = hStereoDmxEVS->hPHA->ipd_ff;
    1925        3627 :     for ( n = 0; n < itrh; n++ )
    1926             :     {
    1927        3510 :         ipd_ff[n] = STEREO_DMX_EVS_IFF_AMAX;
    1928             :     }
    1929        6084 :     for ( ; n < ( n0 + 1 ); n++ ) /* 8kHz */
    1930             :     {
    1931        5967 :         ipd_ff[n] = STEREO_DMX_EVS_IFF_AMAX + ( n - itrh ) * a_step;
    1932             :     }
    1933       18720 :     for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ )
    1934             :     {
    1935       18603 :         ipd_ff[n] = STEREO_DMX_EVS_IFF_AMIN;
    1936             :     }
    1937         117 :     set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX );
    1938         117 :     set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX );
    1939             : 
    1940         117 :     n0 = input_frame / ( 4 * STEREO_DMX_EVS_SUBBAND_SIZE );
    1941         117 :     input_frame_pha = input_frame / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE );
    1942             : 
    1943         117 :     if ( input_frame == L_FRAME16k )
    1944             :     {
    1945          60 :         p_ipd_w = dft_trigo_32k;
    1946          60 :         rfft_ipd_coef_step = 4;
    1947             :     }
    1948          57 :     else if ( input_frame == L_FRAME32k )
    1949             :     {
    1950          37 :         p_ipd_w = dft_trigo_32k;
    1951          37 :         rfft_ipd_coef_step = 2;
    1952             :     }
    1953          20 :     else if ( input_frame == L_FRAME48k )
    1954             :     {
    1955          20 :         p_ipd_w = dft_trigo_48k;
    1956          20 :         rfft_ipd_coef_step = 2;
    1957             :     }
    1958             :     else
    1959             :     {
    1960           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" );
    1961             :     }
    1962             : 
    1963         117 :     win = hStereoDmxEVS->hPHA->rfft_ipd_coef;
    1964         117 :     len = rfft_ipd_coef_step * STEREO_DMX_EVS_SUBBAND_SIZE;
    1965        7877 :     for ( n = 0; n < n0; n++ )
    1966             :     {
    1967        7760 :         win[n] = p_ipd_w[n * len];
    1968        7760 :         win[input_frame_pha - n] = p_ipd_w[n * len];
    1969             :     }
    1970         117 :     win[n0] = p_ipd_w[n0 * len];
    1971             : 
    1972         117 :     hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC;
    1973         117 :     hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC;
    1974         117 :     hStereoDmxEVS->hPHA->prc_hys_cnt = 0;
    1975             : 
    1976         117 :     fad_len = input_frame;
    1977             : 
    1978         117 :     fad_g = hStereoDmxEVS->hPHA->fad_g_prc;
    1979         117 :     fad_r = 1.0f / (float) ( fad_len + 1 );
    1980         117 :     fad_len2 = fad_len / 2;
    1981       31157 :     for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- )
    1982             :     {
    1983       31040 :         fad_g[n] = (float) ( n + 1 ) * fad_r;
    1984       31040 :         fad_g[m] = 1.0f - fad_g[n];
    1985             :     }
    1986             : 
    1987         351 :     for ( n = 0; n < CPE_CHANNELS; n++ )
    1988             :     {
    1989         234 :         hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f;
    1990             :     }
    1991             : 
    1992             : 
    1993         117 :     hStereoDmxEVS->hPHA->n_fad_g = input_frame;
    1994         117 :     hStereoDmxEVS->hPHA->n_fad_cnt = 0;
    1995             : 
    1996         117 :     hStereoDmxEVS->hPHA->dmx_pha_ener_sgc = 0.0f;
    1997         117 :     hStereoDmxEVS->hPHA->dmx_poc_ener_sgc = 0.0f;
    1998         117 :     hStereoDmxEVS->hPHA->dmx_pha_gain_sgc = 1.0f;
    1999         117 :     hStereoDmxEVS->hPHA->dmx_poc_gain_sgc = 1.0f;
    2000             : 
    2001         117 :     hStereoDmxEVS->hPHA->dmx_pha_ener = 0.0f;
    2002         117 :     hStereoDmxEVS->hPHA->dmx_poc_ener = 0.0f;
    2003             : 
    2004             : 
    2005         117 :     *hStereoDmxEVS_out = hStereoDmxEVS;
    2006             : 
    2007         117 :     return IVAS_ERR_OK;
    2008             : }
    2009             : 
    2010             : 
    2011             : /*-------------------------------------------------------------------*
    2012             :  * stereo_dmx_evs_close_encoder()
    2013             :  *
    2014             :  * close stereo downmix for EVS encoder
    2015             :  *-------------------------------------------------------------------*/
    2016             : 
    2017        5803 : void stereo_dmx_evs_close_encoder(
    2018             :     STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle    */
    2019             : )
    2020             : {
    2021        5803 :     if ( hStereoDmxEVS == NULL || *hStereoDmxEVS == NULL )
    2022             :     {
    2023        5686 :         return;
    2024             :     }
    2025             : 
    2026         117 :     if ( ( *hStereoDmxEVS )->hPOC != NULL )
    2027             :     {
    2028         117 :         free( ( *hStereoDmxEVS )->hPOC );
    2029         117 :         ( *hStereoDmxEVS )->hPOC = NULL;
    2030             :     }
    2031             : 
    2032         117 :     if ( ( *hStereoDmxEVS )->hPHA != NULL )
    2033             :     {
    2034         117 :         free( ( *hStereoDmxEVS )->hPHA );
    2035         117 :         ( *hStereoDmxEVS )->hPHA = NULL;
    2036             :     }
    2037             : 
    2038         117 :     free( ( *hStereoDmxEVS ) );
    2039         117 :     ( *hStereoDmxEVS ) = NULL;
    2040             : 
    2041         117 :     return;
    2042             : }

Generated by: LCOV version 1.14