LCOV - code coverage report
Current view: top level - lib_enc - igf_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ b9bfbe380d1c207f5198ba67a82398b3d313550e Lines: 1969 2089 94.3 %
Date: 2025-11-16 02:22:47 Functions: 39 40 97.5 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdio.h>
       6             : #include <stdlib.h>
       7             : #include <assert.h>
       8             : #include "options.h"
       9             : #include "cnst.h"
      10             : #include "stl.h"
      11             : #include "prot_fx.h"
      12             : #include "prot_fx_enc.h" /* Function prototypes                    */
      13             : #include "stat_enc.h"
      14             : #include "basop_util.h"
      15             : 
      16             : 
      17             : /*-------------------------------------------------------------------*
      18             :  * IGF_write_bit_fx()
      19             :  *
      20             :  * write single bit to stream
      21             :  *-------------------------------------------------------------------*/
      22             : 
      23     9036783 : static void IGF_write_bit_fx(
      24             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
      25             :     Word16 *bitCount,      /* i/o: bit counter              */
      26             :     const Word16 value     /* i  : value                    */
      27             : )
      28             : {
      29     9036783 :     IF( hBstr )
      30             :     {
      31     4574511 :         push_next_indice( hBstr, value, 1 );
      32             :     }
      33             : 
      34     9036783 :     ( *bitCount ) = add( ( *bitCount ), 1 );
      35     9036783 :     move16();
      36             : 
      37     9036783 :     return;
      38             : }
      39             : 
      40             : /*-------------------------------------------------------------------*
      41             :  * IGF_write_bits()
      42             :  *
      43             :  * write bits to stream
      44             :  *-------------------------------------------------------------------*/
      45             : 
      46     7625907 : static void IGF_write_bits(
      47             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
      48             :     Word16 *bitCount,      /* i/o: bit counter              */
      49             :     const Word16 value,    /* i/o: value                    */
      50             :     Word16 bits            /* i  : number of bits           */
      51             : )
      52             : {
      53    15251814 :     WHILE( bits-- )
      54             :     {
      55     7625907 :         IF( s_and( value, shl( 1, bits ) ) == 0 )
      56             :         {
      57     2452929 :             IGF_write_bit_fx( hBstr, bitCount, 0 );
      58             :         }
      59             :         ELSE
      60             :         {
      61     5172978 :             IGF_write_bit_fx( hBstr, bitCount, 1 );
      62             :         }
      63             :     }
      64             : 
      65     7625907 :     return;
      66             : }
      67             : 
      68             : 
      69             : /**********************************************************************/ /*
      70             :    envelope estimation
      71             :    **************************************************************************/
      72        1311 : static void IGF_CalculateEnvelope(
      73             :     const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder                     */
      74             :     Word32 *pMDCTSpectrum,                   /**< in: Q31 | MDCT spectrum                                      */
      75             :     Word16 MDCTSpectrum_e,                   /**< in:     | exponent of MDCT spectrum                          */
      76             :     Word32 *pPowerSpectrum,                  /**< in: Q31 | MDCT^2 + MDST^2 spectrum, or estimate              */
      77             :     Word16 PowerSpectrum_e,                  /**< in:     | exponent of MDCT^2 + MDST^2 spectrum, or estimate  */
      78             :     const Word16 igfGridIdx                  /**< in: Q0  | IGF grid index                                     */
      79             : 
      80             : )
      81             : {
      82             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
      83             :     H_IGF_GRID hGrid;
      84             :     Word16 *swb_offset;
      85             :     Word16 sfb;   /* this is the actual scalefactor band */
      86             :     Word16 width; /* this is width in subbands of the actual scalefactor band */
      87             :     Word16 tile_idx;
      88             :     Word16 strt_cpy;
      89             :     Word16 gain; /* the gain which has to be applied to the source tile to get the destination energy */
      90             :     Word16 gain_exp;
      91             :     Word16 tb;
      92             :     Word16 zeroNrg; /* Q0 | flag indicating if the signal contains almost no energy */
      93             :     Word32 sfbEnergyR[IGF_MAX_SFB];
      94             :     Word16 sfbEnergyR_exp[IGF_MAX_SFB];
      95             :     Word32 sfbEnergyC[IGF_MAX_SFB]; /* the energy of the destination region of the tile */
      96             :     Word16 sfbEnergyC_exp[IGF_MAX_SFB];
      97             :     Word32 sfbEnergyTileR[IGF_MAX_SFB];
      98             :     Word16 sfbEnergyTileR_exp[IGF_MAX_SFB];
      99             :     Word32 sfbEnergyTileC[IGF_MAX_SFB]; /* the energy of the destination region of the tile */
     100             :     Word16 sfbEnergyTileC_exp[IGF_MAX_SFB];
     101             :     Word32 LFMDCTSpectrum[N_MAX];
     102             :     Word16 LFMDCTSpectrum_exp;
     103             :     Word32 LFPowerSpectrum[N_MAX];
     104             :     Word16 tmp;
     105             :     Word16 tmp_exp;
     106             :     Word32 L_tmp;
     107             :     Word16 shift;
     108             : 
     109             :     /* initialize variables */
     110        1311 :     Copy32( pMDCTSpectrum + IGF_START_MN, hInstance->spec_be_igf, hInstance->infoStopLine - IGF_START_MN );
     111        1311 :     hPrivateData = &hInstance->igfData;
     112        1311 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     113        1311 :     swb_offset = hGrid->swb_offset;
     114        1311 :     move16();
     115        1311 :     hInstance->spec_be_igf_e = MDCTSpectrum_e;
     116        1311 :     move16();
     117        1311 :     zeroNrg = 0;
     118        1311 :     move16();
     119             : 
     120             : 
     121        1311 :     IF( pPowerSpectrum != NULL )
     122             :     {
     123        4645 :         FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     124             :         {
     125        3342 :             strt_cpy = hGrid->sbWrap[tile_idx];
     126        3342 :             move16();
     127       12632 :             FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     128             :             {
     129      474128 :                 FOR( tb = swb_offset[sfb]; tb < swb_offset[sfb + 1]; tb++ )
     130             :                 {
     131      464838 :                     LFMDCTSpectrum[tb] = pMDCTSpectrum[strt_cpy];
     132      464838 :                     move32();
     133      464838 :                     LFPowerSpectrum[tb] = pPowerSpectrum[strt_cpy];
     134      464838 :                     move32();
     135      464838 :                     strt_cpy = add( strt_cpy, 1 );
     136             :                 }
     137             :             }
     138             :         }
     139        1303 :         IGFCommonFuncsCalcSfbEnergyPowerSpec( hGrid->startSfb,
     140        1303 :                                               hGrid->stopSfb,
     141        1303 :                                               hGrid->swb_offset,
     142             :                                               pPowerSpectrum,
     143             :                                               &PowerSpectrum_e,
     144             :                                               sfbEnergyC,
     145             :                                               sfbEnergyC_exp );
     146        1303 :         IGFCommonFuncsCalcSfbEnergyPowerSpec( hGrid->startSfb,
     147        1303 :                                               hGrid->stopSfb,
     148        1303 :                                               hGrid->swb_offset,
     149             :                                               LFPowerSpectrum,
     150             :                                               &PowerSpectrum_e,
     151             :                                               sfbEnergyTileC,
     152             :                                               sfbEnergyTileC_exp );
     153        1303 :         IGFCommonFuncsMDCTSquareSpec( hGrid->startLine,
     154        1303 :                                       hGrid->stopLine,
     155             :                                       LFMDCTSpectrum,
     156             :                                       MDCTSpectrum_e,
     157             :                                       LFMDCTSpectrum,
     158             :                                       &LFMDCTSpectrum_exp,
     159             :                                       0 );
     160        1303 :         IGFCommonFuncsCalcSfbEnergyPowerSpec( hGrid->startSfb,
     161        1303 :                                               hGrid->stopSfb,
     162        1303 :                                               hGrid->swb_offset,
     163             :                                               LFMDCTSpectrum,
     164             :                                               &LFMDCTSpectrum_exp,
     165             :                                               sfbEnergyTileR,
     166             :                                               sfbEnergyTileR_exp );
     167             :     }
     168             :     ELSE
     169             :     {
     170           8 :         IGFCommonFuncsMDCTSquareSpec( hGrid->startLine,
     171           8 :                                       hGrid->stopLine,
     172             :                                       pMDCTSpectrum,
     173             :                                       MDCTSpectrum_e,
     174             :                                       LFMDCTSpectrum,
     175             :                                       &LFMDCTSpectrum_exp,
     176             :                                       0 );
     177           8 :         IGFCommonFuncsCalcSfbEnergyPowerSpec( hGrid->startSfb,
     178           8 :                                               hGrid->stopSfb,
     179           8 :                                               hGrid->swb_offset,
     180             :                                               LFMDCTSpectrum,
     181             :                                               &LFMDCTSpectrum_exp,
     182             :                                               sfbEnergyR,
     183             :                                               sfbEnergyR_exp );
     184             :     }
     185             : 
     186        4677 :     FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
     187             :     {
     188             : 
     189       12720 :         FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
     190             :         {
     191             : 
     192             : 
     193        9354 :             width = sub( swb_offset[sfb + 1], swb_offset[sfb] );
     194        9354 :             L_tmp = 0;
     195        9354 :             move16();
     196        9354 :             gain_exp = 0;
     197        9354 :             move16();
     198             : 
     199        9354 :             IF( pPowerSpectrum )
     200             :             {
     201        9290 :                 IF( sfbEnergyTileR[sfb] == 0 )
     202             :                 {
     203           0 :                     sfbEnergyTileR[sfb] = 0x00010000;
     204           0 :                     move32();
     205           0 :                     sfbEnergyTileR_exp[sfb] = 0;
     206           0 :                     move16();
     207           0 :                     zeroNrg = 1;
     208           0 :                     move16();
     209             :                 }
     210        9290 :                 IF( sfbEnergyTileC[sfb] == 0 )
     211             :                 {
     212           0 :                     sfbEnergyTileC[sfb] = 0x00010000;
     213           0 :                     move32();
     214           0 :                     sfbEnergyTileC_exp[sfb] = 0;
     215           0 :                     move16();
     216           0 :                     zeroNrg = 1;
     217           0 :                     move16();
     218             :                 }
     219        9290 :                 IF( sfbEnergyC[sfb] == 0 )
     220             :                 {
     221           0 :                     sfbEnergyC[sfb] = 0x00010000;
     222           0 :                     move32();
     223           0 :                     sfbEnergyC_exp[sfb] = 0;
     224           0 :                     move16();
     225           0 :                     zeroNrg = 1;
     226           0 :                     move16();
     227             :                 }
     228             : 
     229        9290 :                 BASOP_Util_Divide_MantExp( round_fx_sat( sfbEnergyTileR[sfb] ), sfbEnergyTileR_exp[sfb], width, 15, &gain, &gain_exp );
     230        9290 :                 BASOP_Util_Divide_MantExp( round_fx_sat( sfbEnergyC[sfb] ), sfbEnergyC_exp[sfb], round_fx_sat( sfbEnergyTileC[sfb] ), sfbEnergyTileC_exp[sfb], &tmp, &tmp_exp );
     231        9290 :                 L_tmp = L_mult( gain, tmp );
     232        9290 :                 gain_exp = add( gain_exp, tmp_exp );
     233             :             }
     234             :             ELSE
     235             :             {
     236          64 :                 IF( sfbEnergyR[sfb] == 0 )
     237             :                 {
     238           0 :                     sfbEnergyR[sfb] = 0x00010000;
     239           0 :                     move32();
     240           0 :                     sfbEnergyR_exp[sfb] = 0;
     241           0 :                     move16();
     242           0 :                     zeroNrg = 1;
     243           0 :                     move16();
     244             :                 }
     245          64 :                 BASOP_Util_Divide_MantExp( round_fx_sat( sfbEnergyR[sfb] ),
     246          64 :                                            sfbEnergyR_exp[sfb],
     247             :                                            width,
     248             :                                            15,
     249             :                                            &gain,
     250             :                                            &gain_exp );
     251          64 :                 L_tmp = L_deposit_h( gain );
     252             :             }
     253             : 
     254             :             /* gain = 0.5f + (float)((2.885390081777927f * log(gain) + 16.f)); */
     255        9354 :             L_tmp = BASOP_Util_Log2( L_tmp );
     256        9354 :             L_tmp = L_add( L_tmp, L_deposit_h( shl( gain_exp, 15 - 6 ) ) );
     257        9354 :             shift = norm_l( L_tmp );
     258        9354 :             gain = round_fx_sat( L_shl( L_tmp, shift ) );
     259        9354 :             gain_exp = sub( 7, shift );
     260        9354 :             gain_exp = BASOP_Util_Add_MantExp( gain, gain_exp, 32767 /*16 Q11*/, 4, &gain );
     261        9354 :             gain_exp = BASOP_Util_Add_MantExp( gain, gain_exp, 0x4000, 0, &gain );
     262        9354 :             gain = shr( gain, s_min( sub( 15, gain_exp ), 15 ) );
     263             : 
     264        9354 :             if ( gain > 91 )
     265             :             {
     266           0 :                 gain = s_min( gain, 91 ); /* 13+15+63, see arithocde encode residual */
     267             :             }
     268        9354 :             if ( gain < 0 )
     269             :             {
     270           0 :                 gain = s_max( gain, 0 );
     271             :             }
     272             : 
     273             :             /* set gain to zero if the signal contains too less energy */
     274        9354 :             if ( zeroNrg != 0 )
     275             :             {
     276           0 :                 gain = 0;
     277           0 :                 move16();
     278             :             }
     279             : 
     280        9354 :             hPrivateData->igfScfQuantized[sfb] = gain;
     281        9354 :             move16();
     282             :         }
     283             :     }
     284             : 
     285        1311 :     return;
     286             : }
     287             : 
     288             : 
     289             : /**********************************************************************/ /*
     290             : writes IGF SCF values
     291             : **************************************************************************/
     292             : 
     293             : /**< out: Q0 | number of bits writen */
     294        2622 : static void IGF_WriteEnvelope(
     295             :     const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder                                               */
     296             :     BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
     297             :     Word16 *pBitOffset,                      /**< in:     | ptr to bitOffset counter                                                     */
     298             :     const Word16 igfGridIdx,                 /**< in: Q0  | igf grid index see declaration of IGF_GRID_IDX for details                   */
     299             :     const Word16 isIndepFlag,                /**< in: Q0  | if 1 frame is independent, 0 = frame is coded with data from previous frame  */
     300             :     Word16 *igfAllZero                       /**< in: Q0  | returns 1 if all IGF scfs are zero, else 0                                   */
     301             : )
     302             : {
     303             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     304             :     H_IGF_GRID hGrid;
     305             :     Word16 sfb;
     306             : 
     307        2622 :     *igfAllZero = 1;
     308        2622 :     move16();
     309        2622 :     hPrivateData = &hInstance->igfData;
     310        2622 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     311             : 
     312        2622 :     FOR( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ )
     313             :     {
     314        2622 :         IF( hPrivateData->igfScfQuantized[sfb] != 0 )
     315             :         {
     316        2622 :             *igfAllZero = 0;
     317        2622 :             move16();
     318        2622 :             BREAK;
     319             :         }
     320             :     }
     321             : 
     322        2622 :     IF( *igfAllZero != 0 )
     323             :     {
     324           0 :         IGF_write_bit_fx( hBstr, pBitOffset, 1 );
     325           0 :         if ( NULL == hBstr )
     326             :         {
     327           0 :             IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     328             :         }
     329           0 :         IGFSCFEncoderReset_fx( &hPrivateData->hIGFSCFArithEnc );
     330           0 :         if ( NULL == hBstr )
     331             :         {
     332           0 :             IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     333             :         }
     334             :     }
     335             :     ELSE
     336             :     {
     337        2622 :         IGF_write_bit_fx( hBstr, pBitOffset, 0 );
     338        2622 :         if ( NULL == hBstr )
     339             :         {
     340        1311 :             IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     341             :         }
     342             : 
     343        2622 :         *pBitOffset = IGFSCFEncoderEncode_fx( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag );
     344        2622 :         move16();
     345             : 
     346        2622 :         if ( NULL == hBstr )
     347             :         {
     348        1311 :             IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
     349             :         }
     350             :     }
     351        2622 : }
     352             : 
     353             : /**********************************************************************/ /*
     354             : identifies significant spectral content
     355             : **************************************************************************/
     356        1311 : void IGF_ErodeSpectrum( Word16 *highPassEner_exp,                        /**< out:    | exponent of highPassEner       */
     357             :                         const IGF_ENC_INSTANCE_HANDLE hInstance,         /**< in:     | instance handle of IGF Encoder */
     358             :                         Word32 *pSpectrum,                               /**< in/out: | MDCT spectrum                  */
     359             :                         Word32 *pPowerSpectrum,                          /**< in/out: | power spectrum                 */
     360             :                         Word16 pPowerSpectrum_exp,                       /**< in:     | exponent of power spectrum     */
     361             :                         const Word16 igfGridIdx                          /**< in: Q0  | IGF grid index                 */
     362             : )
     363             : {
     364             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     365             :     H_IGF_GRID hGrid;
     366             :     Word16 i;
     367             :     Word16 igfBgn;
     368             :     Word16 igfEnd;
     369             :     Word32 highPassEner; /* Q31 */
     370             :     Word32 lastLine;
     371             :     Word32 nextLine;
     372             :     Word32 highPassEner_Ovfl;
     373             :     Word16 s;
     374             :     Word16 tmploop;
     375             :     Word16 *swb_offset;
     376             :     Word16 sfb;
     377             :     Word16 startSfb;
     378             :     Word16 stopSfb;
     379             :     Word16 line;
     380             :     Word16 flag;
     381             :     Word16 *igfScaleF;
     382             :     Word16 tmp;
     383             :     Word32 L_tmp;
     384             : 
     385        1311 :     hPrivateData = &hInstance->igfData;
     386        1311 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     387        1311 :     igfBgn = hGrid->startLine;
     388        1311 :     move16();
     389        1311 :     igfEnd = hGrid->stopLine;
     390        1311 :     move16();
     391        1311 :     swb_offset = hGrid->swb_offset;
     392        1311 :     move16();
     393        1311 :     startSfb = hGrid->startSfb;
     394        1311 :     move16();
     395        1311 :     stopSfb = hGrid->stopSfb;
     396        1311 :     move16();
     397        1311 :     igfScaleF = hPrivateData->igfScfQuantized;
     398        1311 :     move16();
     399        1311 :     *highPassEner_exp = 0;
     400        1311 :     move16();
     401        1311 :     highPassEner = 0;
     402        1311 :     move32();
     403             : 
     404        1311 :     IF( NULL == pPowerSpectrum )
     405             :     {
     406           0 :         FOR( i = igfBgn; i < hGrid->infoGranuleLen; i++ )
     407             :         {
     408           0 :             pSpectrum[i] = L_deposit_l( 0 );
     409             :         }
     410           0 :         return;
     411             :     }
     412             : 
     413        1311 :     IF( igfBgn > 0 )
     414             :     {
     415        1311 :         Word64 W_highPassEner = 0;
     416        1311 :         move64();
     417      341535 :         FOR( i = 0; i < igfBgn; i++ )
     418             :         {
     419      340224 :             W_highPassEner = W_add( W_highPassEner, W_deposit32_l( Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) ) /*Q20, pPowerSpectrum_exp*/ );
     420             :         }
     421             : 
     422        1311 :         highPassEner = w_norm_llQ31( W_highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/
     423        1311 :         *highPassEner_exp = add( *highPassEner_exp, pPowerSpectrum_exp );
     424        1311 :         move16();
     425        1311 :         test();
     426        1311 :         test();
     427        2622 :         if ( NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_9600 ) &&
     428        2622 :              NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_RF_SWB_13200 ) &&
     429        1311 :              NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_13200 ) )
     430             :         {
     431         744 :             igfBgn = shl( igfBgn, 1 );
     432             :         }
     433        1311 :         highPassEner = L_deposit_l( BASOP_Util_Divide3216_Scale( highPassEner /*Q20, highPassEner_exp*/, igfBgn /*Q0*/, &s ) ); /*Q15, highPassEner_exp+11-16+s*/
     434        1311 :         *highPassEner_exp = add( add( *highPassEner_exp, s ), 12 - 16 + ( 31 - 15 ) );                                          /*Q15->Q31,highPassEner_exp*/
     435        1311 :         lastLine = pSpectrum[i - 1];
     436        1311 :         move32();
     437        1311 :         nextLine = 0;
     438        1311 :         move32();
     439             : 
     440             :         /* May overflow - just for threshold comparison                                                   */
     441             :         /* negate because the negated may be 1 larger in abs,                                             */
     442             :         /* so whenever compared to the negation of a maximum possible pPowerspectrum, it is still larger  */
     443        1311 :         highPassEner_Ovfl = L_shl_sat( L_negate( highPassEner ), sub( *highPassEner_exp, pPowerSpectrum_exp ) );
     444        1311 :         L_tmp = L_add_sat( pPowerSpectrum[i - 1], highPassEner_Ovfl );
     445             : 
     446        1311 :         if ( L_tmp >= 0 )
     447             :         {
     448           0 :             nextLine = pSpectrum[i];
     449           0 :             move32();
     450             :         }
     451        1311 :         tmploop = sub( igfEnd, 1 );
     452      467910 :         FOR( /*i*/; i < tmploop; i++ )
     453             :         {
     454             :             /* May overflow - just for threshold comparison */
     455             :             BASOP_SATURATE_WARNING_OFF_EVS
     456      466599 :             L_tmp = L_add_sat( pPowerSpectrum[i], highPassEner_Ovfl );
     457             :             BASOP_SATURATE_WARNING_ON_EVS;
     458             : 
     459      466599 :             IF( L_tmp < 0 )
     460             :             {
     461      466538 :                 lastLine = pSpectrum[i];
     462      466538 :                 move32();
     463      466538 :                 pSpectrum[i] = nextLine;
     464      466538 :                 move32();
     465      466538 :                 nextLine = 0;
     466      466538 :                 move32();
     467             :             }
     468             :             ELSE
     469             :             {
     470          61 :                 pSpectrum[i - 1] = lastLine;
     471          61 :                 move32();
     472          61 :                 lastLine = pSpectrum[i];
     473          61 :                 move32();
     474          61 :                 nextLine = pSpectrum[i + 1];
     475          61 :                 move32();
     476             :             }
     477             :         }
     478             : 
     479             :         /* May overflow - just for threshold comparison */
     480             :         BASOP_SATURATE_WARNING_OFF_EVS
     481        1311 :         L_tmp = L_add_sat( pPowerSpectrum[i], highPassEner_Ovfl );
     482             :         BASOP_SATURATE_WARNING_ON_EVS
     483        1311 :         if ( L_tmp < 0 )
     484             :         {
     485        1311 :             pSpectrum[i] = L_deposit_l( 0 );
     486        1311 :             move32();
     487             :         }
     488             :     }
     489             : 
     490             :     /* delete spectrum above igfEnd: */
     491       43737 :     FOR( i = igfEnd; i < hGrid->infoGranuleLen; i++ )
     492             :     {
     493       42426 :         pSpectrum[i] = L_deposit_l( 0 );
     494       42426 :         move32();
     495       42426 :         pPowerSpectrum[i] = L_deposit_l( 0 );
     496       42426 :         move32();
     497             :     }
     498             : 
     499       10665 :     FOR( sfb = startSfb; sfb < stopSfb; sfb++ )
     500             :     {
     501        9354 :         flag = 0;
     502        9354 :         move16();
     503      477264 :         FOR( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ )
     504             :         {
     505      467910 :             if ( pSpectrum[line] != 0 )
     506             :             {
     507         119 :                 flag = 1;
     508         119 :                 move16();
     509             :             }
     510             :         }
     511        9354 :         tmp = igfScaleF[sfb];
     512        9354 :         move16();
     513        9354 :         if ( flag )
     514             :         {
     515          13 :             tmp = sub( igfScaleF[sfb], 1 );
     516             :         }
     517        9354 :         if ( igfScaleF[sfb] )
     518             :         {
     519        9354 :             igfScaleF[sfb] = tmp;
     520        9354 :             move16();
     521             :         }
     522             :     }
     523             : }
     524             : 
     525      718458 : void IGF_ErodeSpectrum_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder */
     526             :                                 Word32 *pSpectrum,                       /**< in/out: | MDCT spectrum                  Qx*/
     527             :                                 Word32 *pPowerSpectrum,                  /**< in/out: | power spectrum                 */
     528             :                                 Word16 pPowerSpectrum_exp,               /**< in:     | exponent of power spectrum     */
     529             :                                 const Word16 igfGridIdx,                 /**< in: Q0  | IGF grid index                 */
     530             :                                 const Word16 mct_on )
     531             : {
     532             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
     533             :     H_IGF_GRID hGrid;
     534             :     Word16 i;
     535             :     Word16 igfBgn;
     536             :     Word16 igfEnd;
     537             :     Word32 highPassEner; /* Q31 */
     538             :     Word32 lastLine;
     539             :     Word32 nextLine;
     540             :     Word16 *swb_offset;
     541             :     Word16 sfb;
     542             :     Word16 startSfb;
     543             :     Word16 stopSfb;
     544             :     Word16 line;
     545             :     Word16 *igfScaleF;
     546             :     Word16 tmp;
     547             :     Word16 factor;
     548             :     Word16 exp1, exp2;
     549             :     Word16 num, den;
     550             :     Word32 temp;
     551             : 
     552      718458 :     hPrivateData = &hInstance->igfData;
     553      718458 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
     554      718458 :     igfBgn = hGrid->startLine;
     555      718458 :     move16();
     556      718458 :     igfEnd = hGrid->stopLine;
     557      718458 :     move16();
     558      718458 :     swb_offset = hGrid->swb_offset;
     559      718458 :     move16();
     560      718458 :     startSfb = hGrid->startSfb;
     561      718458 :     move16();
     562      718458 :     stopSfb = hGrid->stopSfb;
     563      718458 :     move16();
     564      718458 :     igfScaleF = hPrivateData->igfScfQuantized;
     565      718458 :     move16();
     566             : 
     567      718458 :     IF( NULL == pPowerSpectrum )
     568             :     {
     569     5917582 :         FOR( i = igfBgn; i < hGrid->infoGranuleLen; i++ )
     570             :         {
     571     5888920 :             pSpectrum[i] = 0;
     572     5888920 :             move32();
     573             :         }
     574       28662 :         return;
     575             :     }
     576             : 
     577      689796 :     IF( igfBgn > 0 )
     578             :     {
     579      689796 :         Word64 sum = 0;
     580      689796 :         move64();
     581   309508138 :         FOR( i = 0; i < igfBgn; i++ )
     582             :         {
     583   308818342 :             sum = W_mac_32_16( sum, pPowerSpectrum[i], i ); // Q: 31-pPowerSpectrum_exp+1
     584             :         }
     585      689796 :         exp1 = W_norm( sum );
     586      689796 :         sum = W_shl( sum, sub( exp1, 1 ) );                // Q: 31-pPowerSpectrum_exp+1+exp1-1
     587      689796 :         num = extract_h( W_extract_h( sum ) );             // Q: 31-pPowerSpectrum_exp+exp1-48 = -pPowerSpectrum_exp+exp1-17
     588      689796 :         exp1 = add( 32, sub( pPowerSpectrum_exp, exp1 ) ); // exp: 32+pPowerSpectrum_exp-exp1
     589             : 
     590      689796 :         IF( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_9600 ) ||
     591             :             EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_RF_SWB_13200 ) ||
     592             :             EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_13200 ) ||
     593             :             EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_16400_CPE ) )
     594             :         {
     595       30157 :             factor = ONE_IN_Q14; // Q14
     596       30157 :             move16();
     597             :         }
     598      659639 :         ELSE IF( mct_on && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) ) )
     599             :         {
     600        4142 :             factor = 11469; // 0.7f in Q14
     601        4142 :             move16();
     602             :         }
     603             :         ELSE
     604             :         {
     605      655497 :             factor = 32767; // 2.f in Q14
     606      655497 :             move16();
     607             :         }
     608             : 
     609      689796 :         temp = L_mult( igfBgn, factor ); // exp: 16
     610      689796 :         exp2 = norm_l( temp );
     611      689796 :         den = extract_h( L_shl( temp, exp2 ) ); // exp: 16-exp2
     612      689796 :         exp2 = sub( 16, exp2 );
     613             : 
     614      689796 :         highPassEner = L_deposit_h( div_s( num, den ) ); // exp: exp1-exp2
     615             : 
     616             :         /* highPassEner is used only for comparison, saturation doesn't effect the outcome */
     617      689796 :         highPassEner = L_shl_sat( highPassEner, sub( sub( exp1, exp2 ), pPowerSpectrum_exp ) ); // exp: pPowerSpectrum_exp
     618             : 
     619      689796 :         lastLine = pSpectrum[i - 1]; // Qx
     620      689796 :         move32();
     621      689796 :         nextLine = pSpectrum[i]; // Qx
     622      689796 :         move32();
     623             : 
     624      689796 :         if ( LT_32( pPowerSpectrum[i - 1], highPassEner ) )
     625             :         {
     626      679751 :             nextLine = 0;
     627      679751 :             move32();
     628             :         }
     629             : 
     630   211605288 :         FOR( /*i*/; i < igfEnd - 1; i++ )
     631             :         {
     632             :             /* May overflow - just for threshold comparison */
     633   210915492 :             IF( LT_32( pPowerSpectrum[i], highPassEner ) )
     634             :             {
     635   206468029 :                 lastLine = pSpectrum[i]; // Qx
     636   206468029 :                 move32();
     637   206468029 :                 pSpectrum[i] = nextLine; // Qx
     638   206468029 :                 move32();
     639   206468029 :                 nextLine = 0;
     640   206468029 :                 move32();
     641             :             }
     642             :             ELSE
     643             :             {
     644     4447463 :                 pSpectrum[i - 1] = lastLine; // Qx
     645     4447463 :                 move32();
     646     4447463 :                 lastLine = pSpectrum[i]; // Qx
     647     4447463 :                 move32();
     648     4447463 :                 nextLine = pSpectrum[i + 1]; // Qx
     649     4447463 :                 move32();
     650             :             }
     651             :         }
     652             : 
     653             :         /* May overflow - just for threshold comparison */
     654      689796 :         if ( LT_32( pPowerSpectrum[i], highPassEner ) )
     655             :         {
     656      679730 :             pSpectrum[i] = 0;
     657      679730 :             move32();
     658             :         }
     659             :     }
     660             : 
     661             :     /* delete spectrum above igfEnd: */
     662    85609046 :     FOR( i = igfEnd; i < hGrid->infoGranuleLen; i++ )
     663             :     {
     664    84919250 :         pSpectrum[i] = 0;
     665    84919250 :         pPowerSpectrum[i] = 0;
     666    84919250 :         move32();
     667    84919250 :         move32();
     668             :     }
     669             : 
     670             :     // Below check is present at the beginning of the function and is not required here
     671             :     /* IF( NULL != pPowerSpectrum ) */
     672             :     {
     673     4434369 :         FOR( sfb = startSfb; sfb < stopSfb; sfb++ )
     674             :         {
     675     3744573 :             tmp = 0;
     676     3744573 :             move16();
     677   215349861 :             FOR( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ )
     678             :             {
     679   211605288 :                 if ( pSpectrum[line] != 0 )
     680             :                 {
     681       91617 :                     tmp = add( tmp, 1 );
     682             :                 }
     683             :             }
     684             : 
     685     3744573 :             Word16 igfScaleF_cnt = igfScaleF[sfb];
     686     3744573 :             move16();
     687     3744573 :             test();
     688     3744573 :             if ( tmp && igfScaleF[sfb] )
     689             :             {
     690        3162 :                 igfScaleF_cnt = sub( igfScaleF[sfb], 1 );
     691             :             }
     692     3744573 :             igfScaleF[sfb] = igfScaleF_cnt;
     693     3744573 :             move16();
     694             :         }
     695             :     }
     696             : }
     697             : 
     698             : /**********************************************************************/ /*
     699             : crest factor calculation
     700             : **************************************************************************/
     701        2548 : Word16 IGF_getCrest(                                                     /**< out: Q15| crest factor                 */
     702             :                      Word16 *crest_exp,                                  /**< out:    | exponent of crest factor     */
     703             :                      const Word32 *powerSpectrum,                        /**< in: Q31 | power spectrum               */
     704             :                      const Word16 powerSpectrum_exp,                     /**< in:     | exponent of power spectrum   */
     705             :                      const Word16 start,                                 /**< in: Q0  | start subband index          */
     706             :                      const Word16 stop                                   /**< in: Q0  | stop subband index           */
     707             : )
     708             : {
     709             :     Word16 i;
     710             :     Word16 x;
     711             :     Word16 s;
     712             :     Word32 x_eff32;
     713             :     Word16 x_max;
     714             :     Word16 crest;
     715             :     Word16 tmp;
     716             :     Word32 tmp32;
     717             : 
     718        2548 :     x_eff32 = 0;
     719        2548 :     move32();
     720        2548 :     x_max = 0;
     721        2548 :     move16();
     722        2548 :     crest = 16384 /*.5f Q15*/;
     723        2548 :     move16();
     724        2548 :     *crest_exp = 1;
     725        2548 :     move16();
     726             : 
     727      410596 :     FOR( i = start; i < stop; i++ )
     728             :     {
     729             :         /*x      = max(0, (int)(log(powerSpectrum[i]) * INV_LOG_2));*/
     730             : 
     731             :         /*see IGF_getSFM for more comment */
     732      408048 :         x = sub( sub( powerSpectrum_exp, norm_l( powerSpectrum[i] ) ), 1 ); /*Q0*/
     733      408048 :         if ( powerSpectrum[i] == 0 )                                        /*special case: energy is zero*/
     734             :         {
     735        1221 :             x = 0;
     736        1221 :             move16();
     737             :         }
     738      408048 :         x = s_max( 0, x );
     739      408048 :         x_eff32 = L_mac0( x_eff32, x, x ); /*Q0*/
     740      408048 :         x_max = s_max( x_max, x );         /*Q0*/
     741             :     }
     742             : 
     743             :     /*x_eff /= (stop - start);*/
     744        2548 :     x_eff32 = BASOP_Util_Divide3216_Scale( x_eff32, sub( stop, start ), &s ); /*Q-1, s*/
     745        2548 :     s = add( s, 32 );                                                         /*make x_eff Q31*/
     746             : 
     747             :     /*trunkate to int*/
     748        2548 :     x_eff32 = L_shr( x_eff32, sub( 31, s ) );
     749        2548 :     x_eff32 = L_shl( x_eff32, sub( 31, s ) );
     750             : 
     751        2548 :     test();
     752        2548 :     IF( x_eff32 > 0 && x_max > 0 )
     753             :     {
     754             :         /*crest = max(1.f, (float)x_max/sqrt(x_eff));*/
     755        2178 :         tmp32 = ISqrt32( x_eff32, &s );                        /*Q31, s*/
     756        2178 :         tmp32 = Mpy_32_16_1( tmp32 /*Q31, s*/, x_max /*Q0*/ ); /*Q16, s*/
     757        2178 :         i = norm_l( tmp32 );
     758        2178 :         tmp32 = L_shl( tmp32, i ); /*Q31, s-i+15*/
     759        2178 :         crest = extract_h( tmp32 );
     760        2178 :         *crest_exp = add( sub( s, i ), 15 );
     761        2178 :         move16();
     762             :         /* limit crest factor to a lower bound of 1, may overflow */
     763             :         BASOP_SATURATE_WARNING_OFF_EVS
     764        2178 :         tmp = shl_sat( -1, sub( 15, *crest_exp ) ); /* build negative threshold */
     765        2178 :         tmp = add_sat( crest, tmp );
     766             :         BASOP_SATURATE_WARNING_ON_EVS
     767        2178 :         if ( tmp < 0 )
     768             :         {
     769           0 :             crest = 1;
     770           0 :             move16();
     771             :         }
     772        2178 :         if ( tmp < 0 )
     773             :         {
     774           0 :             *crest_exp = 15;
     775           0 :             move16();
     776             :         }
     777             :     }
     778             : 
     779        2548 :     return crest;
     780             : }
     781             : 
     782     1112597 : Word16 IGF_getCrest_ivas(                                  /**< out: Q15| crest factor                 */
     783             :                           Word16 *crest_exp,               /**< out:    | exponent of crest factor     */
     784             :                           const Word32 *powerSpectrum,     /**< in: Q31 | power spectrum               */
     785             :                           const Word16 *powerSpectrum_exp, /**< in:     | exponent of power spectrum   */
     786             :                           const Word16 start,              /**< in: Q0  | start subband index          */
     787             :                           const Word16 stop                /**< in: Q0  | stop subband index           */
     788             : )
     789             : {
     790             :     Word16 i;
     791             :     Word16 x;
     792             :     Word16 s;
     793             :     Word32 x_eff32;
     794             :     Word16 x_max;
     795             :     Word16 crest;
     796             :     Word16 tmp;
     797             :     Word32 tmp32;
     798             : 
     799     1112597 :     x_eff32 = 0;
     800     1112597 :     move32();
     801     1112597 :     x_max = 0;
     802     1112597 :     move16();
     803     1112597 :     crest = 16384 /*.5f Q15*/;
     804     1112597 :     move16();
     805     1112597 :     *crest_exp = 1;
     806     1112597 :     move16();
     807             : 
     808    59117737 :     FOR( i = start; i < stop; i++ )
     809             :     {
     810             :         /*x      = max(0, (int)(log(powerSpectrum[i]) * INV_LOG_2));*/
     811             : 
     812             :         /*see IGF_getSFM for more comment */
     813    58005140 :         x = sub( sub( powerSpectrum_exp[i], norm_l( powerSpectrum[i] ) ), 1 ); /*Q0*/
     814    58005140 :         if ( powerSpectrum[i] == 0 )                                           /*special case: energy is zero*/
     815             :         {
     816        4692 :             x = 0;
     817        4692 :             move16();
     818             :         }
     819    58005140 :         x = s_max( 0, x );
     820    58005140 :         x_eff32 = L_mac0( x_eff32, x, x ); /*Q0*/
     821    58005140 :         x_max = s_max( x_max, x );         /*Q0*/
     822             :     }
     823             : 
     824             :     /*x_eff /= (stop - start);*/
     825     1112597 :     x_eff32 = BASOP_Util_Divide3216_Scale( x_eff32, sub( stop, start ), &s ); /*Q-1, s*/
     826     1112597 :     s = add( s, 32 );                                                         /*make x_eff Q31*/
     827             : 
     828             :     /*trunkate to int*/
     829     1112597 :     x_eff32 = L_shr( x_eff32, sub( 31, s ) );
     830     1112597 :     x_eff32 = L_shl( x_eff32, sub( 31, s ) );
     831             : 
     832     1112597 :     test();
     833     1112597 :     IF( x_eff32 > 0 && x_max > 0 )
     834             :     {
     835             :         /*crest = max(1.f, (float)x_max/sqrt(x_eff));*/
     836     1045509 :         tmp32 = ISqrt32( x_eff32, &s );                        /*Q31, s*/
     837     1045509 :         tmp32 = Mpy_32_16_1( tmp32 /*Q31, s*/, x_max /*Q0*/ ); /*Q16, s*/
     838     1045509 :         i = norm_l( tmp32 );
     839     1045509 :         tmp32 = L_shl( tmp32, i ); /*Q31, s-i+15*/
     840     1045509 :         crest = extract_h( tmp32 );
     841     1045509 :         *crest_exp = add( sub( s, i ), 15 );
     842     1045509 :         move16();
     843             :         /* limit crest factor to a lower bound of 1, may overflow */
     844             :         BASOP_SATURATE_WARNING_OFF_EVS
     845     1045509 :         tmp = shl_sat( -1, sub( 15, *crest_exp ) ); /* build negative threshold */
     846     1045509 :         tmp = add_sat( crest, tmp );
     847             :         BASOP_SATURATE_WARNING_ON_EVS
     848     1045509 :         if ( tmp < 0 )
     849             :         {
     850           2 :             crest = 1;
     851           2 :             move16();
     852             :         }
     853     1045509 :         if ( tmp < 0 )
     854             :         {
     855           2 :             *crest_exp = 15;
     856           2 :             move16();
     857             :         }
     858             :     }
     859             : 
     860     1112597 :     return crest;
     861             : }
     862             : 
     863             : /*************************************************************************
     864             : calculates spectral flatness measurment
     865             : **************************************************************************/
     866        2548 : Word16 IGF_getSFM(                           /**< out: Q15| SFM value              */
     867             :                    Word16 *SFM_exp,          /**< out:    | exponent of SFM Factor */
     868             :                    const Word32 *energy,     /**< in:  Q31| energies               */
     869             :                    const Word16 *energy_exp, /**< in:     | exponent of energies   */
     870             :                    const Word16 start,       /**< in:  Q0 | start subband index    */
     871             :                    const Word16 stop         /**< in:  Q0 | stop subband index     */
     872             : )
     873             : {
     874             :     Word16 n, i, s;
     875             :     Word32 num;
     876             :     Word32 denom;
     877             :     Word16 denom_exp;
     878             :     Word16 invDenom_exp, numf_exp;
     879             :     Word16 numf;
     880             :     Word32 SFM32;
     881             :     Word16 invDenom, SFM;
     882        2548 :     move32();
     883        2548 :     move32();
     884             : 
     885        2548 :     move32();
     886        2548 :     num = 0;
     887        2548 :     move32();
     888        2548 :     denom = L_shr( 2147483 /*0,001 in Q31 - float is "1", here*/, s_min( *energy_exp, 31 ) );
     889        2548 :     denom = L_max( denom, 1 );
     890        2548 :     *SFM_exp = 0;
     891        2548 :     move16();
     892        2548 :     SFM = 32767 /*1.0f Q15*/;
     893        2548 :     move16();
     894             : 
     895        2548 :     Word64 W_denom = W_deposit32_l( denom );
     896      410596 :     FOR( i = start; i < stop; i++ )
     897             :     {
     898             :         /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/
     899             : 
     900             :         /* n       = sub(sub(31,norm_l(tmp32)),1);  */ /*<- ld    */
     901             :         /* n       = sub(n,31);                     */ /*<- -Qx   */
     902             :         /* n       = add(n,*energy_exp);            */ /*<- +xExp */
     903             : 
     904      408048 :         n = sub( sub( *energy_exp, norm_l( energy[i] ) ), 1 ); /*<-- short form*/
     905             : 
     906      408048 :         if ( energy[i] == 0 ) /*special case: energy is zero*/
     907             :         {
     908        1221 :             n = 0;
     909        1221 :             move16();
     910             :         }
     911             : 
     912      408048 :         n = s_max( 0, n );
     913      408048 :         num = L_add( num, L_deposit_l( n ) ); /*Q0*/
     914             : 
     915      408048 :         W_denom = W_add( W_deposit32_l( energy[i] ), W_denom );
     916             :     }
     917             : 
     918        2548 :     denom = w_norm_llQ31( W_denom, &denom_exp ); /*Q31*/
     919        2548 :     denom_exp = add( denom_exp, *energy_exp );
     920             : 
     921             :     /* calculate SFM only if signal is present */
     922        2548 :     IF( denom != 0 )
     923             :     {
     924             :         /*numf   = (float)num / (float)(stop - start);*/
     925        2548 :         numf = BASOP_Util_Divide3216_Scale( num,                /*Q0*/
     926        2548 :                                             sub( stop, start ), /*Q0*/
     927             :                                             &s );               /*Q-1 s*/
     928        2548 :         numf_exp = add( s, 16 );                                /*-> numf Q15 numf_exp*/
     929             :         /*denom /= (float)(stop - start);*/
     930             :         /*return ((float)pow(2.0, numf + 0.5f) / denom);*/
     931             : 
     932             :         /*SFM= ((float)pow(2.0, numf + 0.5f) * invDenom);*/
     933        2548 :         invDenom = BASOP_Util_Divide3232_uu_1616_Scale( L_deposit_l( sub( stop, start ) ) /*Q0*/,
     934             :                                                         denom /*Q31, denom_exp*/,
     935             :                                                         &s ); /*Q-16, s-denom_exp*/
     936        2548 :         invDenom_exp = add( sub( s, denom_exp ), 31 );        /*invDenom: Q15, invDenom_exp*/
     937             : 
     938             :         /*add .5f to numf*/
     939        2548 :         SFM32 = L_add( L_shl( L_deposit_l( numf ), numf_exp ) /*16Q15*/, 16384l /*.5f Q15*/ ); /*16Q15*/
     940        2548 :         s = norm_l( SFM32 );
     941        2548 :         SFM32 = L_shl( SFM32, s );
     942        2548 :         s = sub( 16, s ); /*SFM32(numf) is Q31 now*/
     943             : 
     944             :         /*do the pow2 and the mult*/
     945        2548 :         SFM32 = BASOP_util_Pow2( SFM32, s, &s );
     946        2548 :         SFM32 = Mpy_32_16_1( SFM32, invDenom );
     947        2548 :         *SFM_exp = add( s, invDenom_exp );
     948             : 
     949             :         /*Transform to Q15*/
     950        2548 :         s = norm_l( SFM32 );
     951        2548 :         SFM = round_fx_sat( L_shl_sat( SFM32, s ) );
     952        2548 :         *SFM_exp = sub( *SFM_exp, s );
     953        2548 :         move16();
     954             :         /**SFM_exp = s_min(*SFM_exp, 0);*/
     955        2548 :         IF( *SFM_exp > 0 )
     956             :         {
     957         363 :             *SFM_exp = 0;
     958         363 :             move16();
     959         363 :             SFM = 32767 /*1.0f Q15*/;
     960         363 :             move16();
     961             :         }
     962             :     }
     963             : 
     964        2548 :     return SFM /*Q15*/;
     965             : }
     966             : 
     967             : /*************************************************************************
     968             : calculates spectral flatness measurment
     969             : **************************************************************************/
     970     1112597 : Word16 IGF_getSFM_ivas_fx(                           /**< out: Q15| SFM value              */
     971             :                            Word16 *SFM_exp,          /**< out:    | exponent of SFM Factor */
     972             :                            const Word32 *energy,     /**< in:  Q31| energies               */
     973             :                            const Word16 *energy_exp, /**< in:     | exponent of energies   */
     974             :                            const Word16 start,       /**< in:  Q0 | start subband index    */
     975             :                            const Word16 stop         /**< in:  Q0 | stop subband index     */
     976             : )
     977             : {
     978             :     Word16 n, i, s;
     979             :     Word32 num;
     980             :     Word32 denom;
     981             :     Word16 denom_exp;
     982             :     Word16 invDenom_exp, numf_exp;
     983             :     Word16 numf;
     984             :     Word32 SFM32;
     985             :     Word16 invDenom, SFM;
     986             : 
     987     1112597 :     num = 0;
     988     1112597 :     move32();
     989     1112597 :     denom = 65536; // 1.f in Q16
     990     1112597 :     denom_exp = 15;
     991     1112597 :     *SFM_exp = 0;
     992     1112597 :     move16();
     993     1112597 :     SFM = 32767 /*1.0f Q15*/;
     994     1112597 :     move16();
     995             : 
     996    59117737 :     FOR( i = start; i < stop; i++ )
     997             :     {
     998             :         /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/
     999             : 
    1000             :         /* n       = sub(sub(31,norm_l(tmp32)),1);  */ /*<- ld    */
    1001             :         /* n       = sub(n,31);                     */ /*<- -Qx   */
    1002             :         /* n       = add(n,*energy_exp);            */ /*<- +xExp */
    1003             : 
    1004    58005140 :         n = sub( sub( energy_exp[i], norm_l( energy[i] ) ), 1 ); /*<-- short form*/
    1005             : 
    1006    58005140 :         if ( energy[i] == 0 ) /*special case: energy is zero*/
    1007             :         {
    1008        4692 :             n = 0;
    1009        4692 :             move16();
    1010             :         }
    1011             : 
    1012    58005140 :         n = s_max( 0, n );
    1013    58005140 :         num = L_add( num, L_deposit_l( n ) ); /*Q0*/
    1014             : 
    1015    58005140 :         denom = BASOP_Util_Add_Mant32Exp( energy[i], energy_exp[i], denom, denom_exp, &denom_exp );
    1016             :     }
    1017             : 
    1018             :     /* calculate SFM only if signal is present */
    1019     1112597 :     IF( denom != 0 )
    1020             :     {
    1021             :         /*numf   = (float)num / (float)(stop - start);*/
    1022     1112597 :         numf = BASOP_Util_Divide3216_Scale( num,                /*Q0*/
    1023     1112597 :                                             sub( stop, start ), /*Q0*/
    1024             :                                             &s );               /*Q-1 s*/
    1025     1112597 :         numf_exp = add( s, 16 );                                /*-> numf Q15 numf_exp*/
    1026             :         /*denom /= (float)(stop - start);*/
    1027             :         /*return ((float)pow(2.0, numf + 0.5f) / denom);*/
    1028             : 
    1029             :         /*SFM= ((float)pow(2.0, numf + 0.5f) * invDenom);*/
    1030     1112597 :         invDenom = BASOP_Util_Divide3232_uu_1616_Scale( L_deposit_l( sub( stop, start ) ) /*Q0*/,
    1031             :                                                         denom /*Q31, denom_exp*/,
    1032             :                                                         &s ); /*Q-16, s-denom_exp*/
    1033     1112597 :         invDenom_exp = add( sub( s, denom_exp ), 31 );        /*invDenom: Q15, invDenom_exp*/
    1034             : 
    1035             :         /*add .5f to numf*/
    1036     1112597 :         SFM32 = L_add( L_shl( L_deposit_l( numf ), numf_exp ) /*16Q15*/, 16384l /*.5f Q15*/ ); /*16Q15*/
    1037     1112597 :         s = norm_l( SFM32 );
    1038     1112597 :         SFM32 = L_shl( SFM32, s );
    1039     1112597 :         s = sub( 16, s ); /*SFM32(numf) is Q31 now*/
    1040             : 
    1041             :         /*do the pow2 and the mult*/
    1042     1112597 :         SFM32 = BASOP_util_Pow2( SFM32, s, &s );
    1043     1112597 :         SFM32 = Mpy_32_16_1( SFM32, invDenom );
    1044     1112597 :         *SFM_exp = add( s, invDenom_exp );
    1045             : 
    1046             :         /*Transform to Q15*/
    1047     1112597 :         s = norm_l( SFM32 );
    1048     1112597 :         SFM = round_fx_sat( L_shl_sat( SFM32, s ) );
    1049     1112597 :         *SFM_exp = sub( *SFM_exp, s );
    1050     1112597 :         move16();
    1051             :         /**SFM_exp = s_min(*SFM_exp, 0);*/
    1052     1112597 :         IF( *SFM_exp > 0 )
    1053             :         {
    1054       65516 :             *SFM_exp = 0;
    1055       65516 :             move16();
    1056       65516 :             SFM = 32767 /*1.0f Q15*/;
    1057       65516 :             move16();
    1058             :         }
    1059             :     }
    1060             : 
    1061     1112597 :     return SFM /*Q15*/;
    1062             : }
    1063             : 
    1064             : /**********************************************************************/ /*
    1065             : calculates the IGF whitening levels by SFM and crest
    1066             : **************************************************************************/
    1067        1311 : static void IGF_Whitening( const IGF_ENC_INSTANCE_HANDLE hInstance,      /**< in:     | instance handle of IGF Encoder               */
    1068             :                            Word32 *powerSpectrum,                        /**< in: Q31 | MDCT/MDST power spectrum                     */
    1069             :                            const Word16 powerSpectrum_exp,               /**< in:     | exponent of powerspectrum                    */
    1070             :                            const Word16 igfGridIdx,                      /**< in: Q0  | IGF grid index                               */
    1071             :                            Word16 isTransient,                           /**< in: Q0  | boolean, indicating if transient is detected */
    1072             :                            Word16 last_core_acelp                        /**< in: Q0  | indictaor if last frame was acelp coded      */
    1073             : )
    1074             : {
    1075             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1076             :     H_IGF_GRID hGrid;
    1077             :     Word16 p; /*Q0*/
    1078             :     Word16 tmp;
    1079             :     Word16 SFM;
    1080             :     Word16 crest;
    1081             :     Word16 SFM_exp;
    1082             :     Word16 crest_exp;
    1083             :     Word16 s;
    1084             :     Word32 tmp32;
    1085             :     Word32 SFM32;
    1086             : 
    1087        1311 :     hPrivateData = &hInstance->igfData;
    1088        1311 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    1089             : 
    1090        1311 :     IF( igfGridIdx != IGF_GRID_LB_NORM )
    1091             :     {
    1092         262 :         FOR( p = 0; p < hGrid->nTiles; p++ )
    1093             :         {
    1094             :             /* reset filter */
    1095         190 :             hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 );
    1096         190 :             move32();
    1097         190 :             hPrivateData->prevSFM_IIR[p] = 0;
    1098         190 :             move16();
    1099             : 
    1100             :             /* preset values: */
    1101         190 :             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1102         190 :             move16();
    1103             :         }
    1104             :     }
    1105       14421 :     FOR( p = 0; p < IGF_MAX_TILES; p++ )
    1106             :     {
    1107             :         /* update prev data: */
    1108       13110 :         hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p];
    1109       13110 :         move16();
    1110             :         /* preset values: */
    1111       13110 :         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    1112       13110 :         move16();
    1113             :     }
    1114             : 
    1115        1311 :     IF( !s_or( isTransient, hPrivateData->wasTransient ) )
    1116             :     {
    1117        1274 :         IF( powerSpectrum )
    1118             :         {
    1119        1274 :             Word16 nT = hGrid->nTiles;
    1120        1274 :             move16();
    1121        1274 :             SWITCH( hPrivateData->igfInfo.bitRateIndex )
    1122             :             {
    1123         740 :                 case IGF_BITRATE_WB_9600:
    1124             :                 case IGF_BITRATE_SWB_9600:
    1125             :                 case IGF_BITRATE_SWB_16400:
    1126             :                 case IGF_BITRATE_SWB_24400:
    1127             :                 case IGF_BITRATE_SWB_32000:
    1128             :                 case IGF_BITRATE_FB_16400:
    1129             :                 case IGF_BITRATE_FB_24400:
    1130             :                 case IGF_BITRATE_FB_32000:
    1131         740 :                     nT = sub( nT, 1 );
    1132         740 :                     BREAK;
    1133         534 :                 default:
    1134         534 :                     BREAK;
    1135             :             }
    1136        3822 :             FOR( p = 0; p < nT; p++ )
    1137             :             {
    1138             :                 /*tmp  = IGF_getSFM(powerSpectrum, hGrid->tile[p], hGrid->tile[p+1]) / IGF_getCrest(powerSpectrum, hGrid->tile[p], hGrid->tile[p+1]);*/
    1139        2548 :                 SFM = IGF_getSFM( &SFM_exp, powerSpectrum, &powerSpectrum_exp, hGrid->tile[p], hGrid->tile[p + 1] );
    1140        2548 :                 crest = IGF_getCrest( &crest_exp, powerSpectrum, powerSpectrum_exp, hGrid->tile[p], hGrid->tile[p + 1] );
    1141             : 
    1142        2548 :                 tmp = BASOP_Util_Divide1616_Scale( SFM, crest, &s ); /*   Q15 */
    1143        2548 :                 s = add( s, sub( SFM_exp, crest_exp ) );
    1144        2548 :                 tmp32 = L_shl( L_deposit_l( tmp ) /*16Q15, s*/, add( s, 1 ) ); /* 15Q16 */
    1145             : 
    1146        2548 :                 test();
    1147        2548 :                 IF( last_core_acelp || hPrivateData->wasTransient )
    1148             :                 {
    1149         144 :                     hPrivateData->prevSFM_FIR[p] = tmp32; /* 15Q16 */
    1150         144 :                     move32();
    1151         144 :                     hPrivateData->prevSFM_IIR[p] = shr( tmp, 2 ); /*  2Q13 */
    1152         144 :                     move16();
    1153             :                 }
    1154             : 
    1155             :                 /*SFM  = tmp + hPrivateData->prevSFM_FIR[p] + 0.5f * hPrivateData->prevSFM_IIR[p];*/
    1156        2548 :                 SFM32 = L_add( tmp32, hPrivateData->prevSFM_FIR[p] );
    1157        2548 :                 SFM32 = L_mac0( SFM32, hPrivateData->prevSFM_IIR[p] /*Q13*/, 4 /*.5f Q3*/ ); /*15Q16*/
    1158             : 
    1159             :                 BASOP_SATURATE_WARNING_OFF_EVS
    1160             :                 /*SFM  = min(2.7f, SFM);*/
    1161             :                 /*Overflow possible in shift, intended*/
    1162        2548 :                 tmp = add_sat( crest, tmp );
    1163        2548 :                 SFM = s_min( 22118 /*2.7f Q13*/, extract_h( L_shr_sat( SFM32, 16 - 29 ) /*->Q29*/ ) /*->Q13*/ );
    1164             :                 BASOP_SATURATE_WARNING_ON_EVS
    1165             : 
    1166        2548 :                 hPrivateData->prevSFM_FIR[p] = tmp32; /*15Q16*/
    1167        2548 :                 move32();
    1168        2548 :                 hPrivateData->prevSFM_IIR[p] = SFM;
    1169        2548 :                 move16();
    1170             : 
    1171        2548 :                 IF( GT_16( SFM, hGrid->whiteningThreshold[1][p] ) )
    1172             :                 {
    1173        1222 :                     hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    1174        1222 :                     move16();
    1175             :                 }
    1176        1326 :                 ELSE IF( GT_16( SFM, hGrid->whiteningThreshold[0][p] ) )
    1177             :                 {
    1178         895 :                     hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1179         895 :                     move16();
    1180             :                 }
    1181             :             }
    1182        1274 :             SWITCH( hPrivateData->igfInfo.bitRateIndex )
    1183             :             {
    1184         740 :                 case IGF_BITRATE_WB_9600:
    1185             :                 case IGF_BITRATE_RF_WB_13200:
    1186             :                 case IGF_BITRATE_RF_SWB_13200:
    1187             :                 case IGF_BITRATE_SWB_9600:
    1188             :                 case IGF_BITRATE_SWB_16400:
    1189             :                 case IGF_BITRATE_SWB_24400:
    1190             :                 case IGF_BITRATE_SWB_32000:
    1191             :                 case IGF_BITRATE_FB_16400:
    1192             :                 case IGF_BITRATE_FB_24400:
    1193             :                 case IGF_BITRATE_FB_32000:
    1194         740 :                     move16();
    1195         740 :                     hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2];
    1196         740 :                     BREAK;
    1197         534 :                 default:
    1198         534 :                     BREAK;
    1199             :             }
    1200             :         }
    1201             :         ELSE
    1202             :         {
    1203           0 :             FOR( p = 0; p < hGrid->nTiles; p++ )
    1204             :             {
    1205           0 :                 hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    1206           0 :                 move16();
    1207             :             }
    1208             :         }
    1209             :     }
    1210             :     ELSE
    1211             :     {
    1212             :         /* reset filter */
    1213         407 :         FOR( p = 0; p < IGF_MAX_TILES; p++ )
    1214             :         {
    1215         370 :             hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 );
    1216         370 :             move32();
    1217         370 :             hPrivateData->prevSFM_IIR[p] = 0;
    1218         370 :             move16();
    1219             :         }
    1220             :     }
    1221        1311 :     hPrivateData->wasTransient = isTransient;
    1222        1311 :     move16();
    1223             : 
    1224        1311 :     return;
    1225             : }
    1226             : 
    1227             : 
    1228             : /**********************************************************************/ /*
    1229             : write whitening levels into bitstream
    1230             : **************************************************************************/
    1231             : 
    1232             : /**< out: Q0 | number of bits written     */
    1233        4202 : static void IGF_WriteWhiteningTile_fx(
    1234             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle       */
    1235             :     Word16 *pBitOffset,    /**< in:     | ptr to bitOffset counter   */
    1236             :     Word16 whiteningLevel  /**< in: Q0  | whitening levels to write  */
    1237             : )
    1238             : {
    1239        4202 :     IF( EQ_32( whiteningLevel, IGF_WHITENING_MID ) )
    1240             :     {
    1241        1466 :         IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1242             :     }
    1243             :     ELSE
    1244             :     {
    1245        2736 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1246        2736 :         IF( EQ_32( whiteningLevel, IGF_WHITENING_OFF ) )
    1247             :         {
    1248         776 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1249             :         }
    1250             :         ELSE
    1251             :         {
    1252        1960 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1253             :         }
    1254             :     }
    1255             : 
    1256        4202 :     return;
    1257             : }
    1258             : 
    1259             : /**********************************************************************/          /*
    1260             :          writes the whitening levels
    1261             :          **************************************************************************/
    1262        2622 : static void IGF_WriteWhiteningLevels_fx(                                          /**< out: Q0 | total number of bits written                                                 */
    1263             :                                          const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF encoder                                               */
    1264             :                                          BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
    1265             :                                          Word16 *pBitOffset,                      /**< in:     | ptr to bitOffset counter                                                     */
    1266             :                                          const Word16 igfGridIdx,                 /**< in: Q0  | igf grid index see declaration of IGF_GRID_IDX for details                   */
    1267             :                                          const Word16 isIndepFlag                 /**< in: Q0  | if 1 frame is independent, 0 = frame is coded with data from previous frame  */
    1268             : )
    1269             : {
    1270             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1271             :     H_IGF_GRID hGrid;
    1272             :     Word16 p;
    1273             :     Word16 nTiles;
    1274             :     Word16 isSame;
    1275             :     Word32 tmp32;
    1276             : 
    1277             : 
    1278        2622 :     isSame = 1;
    1279        2622 :     move16();
    1280        2622 :     hPrivateData = &hInstance->igfData;
    1281        2622 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    1282        2622 :     nTiles = hGrid->nTiles;
    1283        2622 :     move16();
    1284             : 
    1285        2622 :     IF( isIndepFlag )
    1286             :     {
    1287        2622 :         isSame = 0;
    1288        2622 :         move16();
    1289             :     }
    1290             :     ELSE
    1291             :     {
    1292           0 :         p = 0;
    1293           0 :         move16();
    1294           0 :         tmp32 = 0;
    1295           0 :         move32();
    1296           0 :         test();
    1297           0 :         WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) )
    1298             :         {
    1299           0 :             test();
    1300           0 :             tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] );
    1301           0 :             if ( tmp32 != 0 )
    1302             :             {
    1303           0 :                 isSame = 0;
    1304           0 :                 move16();
    1305             :             }
    1306           0 :             p++;
    1307             :         }
    1308             :     }
    1309        2622 :     IF( isSame )
    1310             :     {
    1311           0 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1312             :     }
    1313             :     ELSE
    1314             :     {
    1315        2622 :         IF( !isIndepFlag )
    1316             :         {
    1317           0 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1318             :         }
    1319        2622 :         IGF_WriteWhiteningTile_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] );
    1320        2622 :         p = 1;
    1321        2622 :         move16();
    1322        2622 :         tmp32 = 0;
    1323        2622 :         move32();
    1324        2622 :         if ( LT_16( p, nTiles ) )
    1325             :         {
    1326        2622 :             isSame = 1;
    1327        2622 :             move16();
    1328             :         }
    1329        2622 :         test();
    1330        6116 :         WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) )
    1331             :         {
    1332        3494 :             test();
    1333        3494 :             tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfCurrWhiteningLevel[p - 1] );
    1334        3494 :             if ( tmp32 != 0 )
    1335             :             {
    1336         964 :                 isSame = 0;
    1337         964 :                 move16();
    1338             :             }
    1339        3494 :             p++;
    1340             :         }
    1341             : 
    1342        2622 :         IF( !isSame )
    1343             :         {
    1344         964 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    1345        2544 :             FOR( p = 1; p < nTiles; p++ )
    1346             :             {
    1347        1580 :                 IGF_WriteWhiteningTile_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] );
    1348             :             }
    1349             :         }
    1350             :         ELSE
    1351             :         {
    1352        1658 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    1353             :         }
    1354             :     }
    1355        2622 : }
    1356             : 
    1357             : /**********************************************************************/            /*
    1358             :            write flattening trigger
    1359             :            **************************************************************************/
    1360        2622 : static void IGF_WriteFlatteningTrigger_fx(                                          /**< out:    | number of bits written         */
    1361             :                                            const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder */
    1362             :                                            BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
    1363             :                                            Word16 *pBitOffset                       /**< in:     | ptr to bitOffset counter       */
    1364             : )
    1365             : {
    1366             :     Word16 flatteningTrigger;
    1367             : 
    1368             : 
    1369        2622 :     flatteningTrigger = hInstance->flatteningTrigger;
    1370        2622 :     move16();
    1371             : 
    1372        2622 :     IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 );
    1373        2622 : }
    1374             : 
    1375             : /**********************************************************************/ /*
    1376             : updates the start/stop frequency of IGF according to igfGridIdx
    1377             : **************************************************************************/
    1378     1438227 : void IGF_UpdateInfo( const IGF_ENC_INSTANCE_HANDLE hInstance,            /**< in:     | instance handle of IGF Encoder */
    1379             :                      const Word16 igfGridIdx                             /**< in: Q0  | IGF grid index                 */
    1380             : )
    1381             : {
    1382             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1383             :     H_IGF_GRID hGrid;
    1384             : 
    1385             : 
    1386     1438227 :     hPrivateData = &hInstance->igfData;
    1387     1438227 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    1388     1438227 :     hInstance->infoStartFrequency = hGrid->startFrequency;
    1389     1438227 :     move16();
    1390     1438227 :     hInstance->infoStopFrequency = hGrid->stopFrequency;
    1391     1438227 :     move16();
    1392     1438227 :     hInstance->infoStartLine = hGrid->startLine;
    1393     1438227 :     move16();
    1394     1438227 :     hInstance->infoStopLine = hGrid->stopLine;
    1395     1438227 :     move16();
    1396             : 
    1397     1438227 :     return;
    1398             : }
    1399             : 
    1400             : /**********************************************************************/ /*
    1401             : IGF bitsream writer
    1402             : **************************************************************************/
    1403        2622 : Word16 IGFEncWriteBitstream_fx(                                          /**< out:    | number of bits written per frame                                             */
    1404             :                                 const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder                                               */
    1405             :                                 BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
    1406             :                                 Word16 *pBitOffset,                      /**< in:     | ptr to bitOffset counter                                                     */
    1407             :                                 const Word16 igfGridIdx,                 /**< in: Q0  | igf grid index see declaration of IGF_GRID_IDX for details                   */
    1408             :                                 const Word16 isIndepFlag                 /**< in: Q0  | if 1 frame is independent, 0 = frame is coded with data from previous frame  */
    1409             : )
    1410             : {
    1411             :     Word16 igfAllZero;
    1412             :     Word16 startBitCount;
    1413             : 
    1414             : 
    1415        2622 :     startBitCount = *pBitOffset;
    1416        2622 :     move16();
    1417        2622 :     hInstance->infoTotalBitsPerFrameWritten = 0;
    1418        2622 :     move16();
    1419             : 
    1420        2622 :     if ( isIndepFlag )
    1421             :     {
    1422        2622 :         hInstance->infoTotalBitsWritten = 0;
    1423        2622 :         move16();
    1424             :     }
    1425             : 
    1426        2622 :     IGF_WriteEnvelope( hInstance,     /* i: instance handle of IGF Encoder                                              */
    1427             :                        hBstr,         /* i: encoder state                                                               */
    1428             :                        pBitOffset,    /* i: ptr to bitOffset counter                                                    */
    1429             :                        igfGridIdx,    /* i: igf grid index see definition of IGF_GRID_IDX for details                   */
    1430             :                        isIndepFlag,   /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */
    1431             :                        &igfAllZero ); /* o: *igfAllZero                                                                 */
    1432             : 
    1433        2622 :     IGF_WriteWhiteningLevels_fx( hInstance,     /* i: instance handle of IGF Encoder                                              */
    1434             :                                  hBstr,         /* i: encoder state                                                               */
    1435             :                                  pBitOffset,    /* i: ptr to bitOffset counter                                                    */
    1436             :                                  igfGridIdx,    /* i: igf grid index see definition of IGF_GRID_IDX for details                   */
    1437             :                                  isIndepFlag ); /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */
    1438             : 
    1439        2622 :     IGF_WriteFlatteningTrigger_fx( hInstance,    /* i: instance handle of IGF Encoder                                              */
    1440             :                                    hBstr,        /* i: encoder state                                                               */
    1441             :                                    pBitOffset ); /* i: ptr to bitOffset counter                                                    */
    1442             : 
    1443        2622 :     hInstance->infoTotalBitsPerFrameWritten = sub( *pBitOffset, startBitCount );
    1444        2622 :     hInstance->infoTotalBitsWritten = add( hInstance->infoTotalBitsWritten, hInstance->infoTotalBitsPerFrameWritten );
    1445        2622 :     move16();
    1446        2622 :     move16();
    1447        2622 :     return hInstance->infoTotalBitsPerFrameWritten;
    1448             : }
    1449             : 
    1450             : /**********************************************************************/ /*
    1451             : sets the IGF mode according to given bitrate
    1452             : **************************************************************************/
    1453         172 : void IGFEncSetMode_fx(
    1454             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */
    1455             :     const Word32 total_brate,              /* i  : encoder total bitrate          */
    1456             :     const Word16 bwidth,                   /* i  : encoder audio bandwidth        */
    1457             :     const Word16 element_mode,             /* i  : IVAS element mode              */
    1458             :     const Word16 rf_mode                   /* i  : flag to signal the RF mode     */
    1459             : )
    1460             : {
    1461             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1462             :     Word16 i;
    1463             : 
    1464         172 :     hPrivateData = &hIGFEnc->igfData;
    1465         172 :     hPrivateData->igfBitstreamBits = 0;
    1466         172 :     move16();
    1467         172 :     set16_fx( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB );
    1468         172 :     set16_fx( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES );
    1469         172 :     set16_fx( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES );
    1470       55212 :     FOR( i = 0; i < IGF_BITBUFSIZE / 8; i++ )
    1471             :     {
    1472       55040 :         hPrivateData->igfBitstream[i] = 0;
    1473       55040 :         move16();
    1474             :     }
    1475         172 :     hPrivateData->wasTransient = 0;
    1476         172 :     move16();
    1477         172 :     set32_fx( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES );
    1478         172 :     set16_fx( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES );
    1479             : 
    1480         172 :     IF( IGFCommonFuncsIGFConfiguration( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) != 0 )
    1481             :     {
    1482         172 :         IGFSCFEncoderOpen_fx( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode );
    1483             : 
    1484         172 :         hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate;
    1485         172 :         move32();
    1486         172 :         hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency;
    1487         172 :         move16();
    1488         172 :         hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency;
    1489         172 :         move16();
    1490         172 :         hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine;
    1491         172 :         move16();
    1492         172 :         hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine;
    1493         172 :         move16();
    1494             :     }
    1495             :     ELSE
    1496             :     {
    1497             :         /* IGF configuration failed -> error! */
    1498           0 :         hIGFEnc->infoSamplingRate = 0;
    1499           0 :         move32();
    1500           0 :         hIGFEnc->infoStartFrequency = -1;
    1501           0 :         move16();
    1502           0 :         hIGFEnc->infoStopFrequency = -1;
    1503           0 :         move16();
    1504           0 :         hIGFEnc->infoStartLine = -1;
    1505           0 :         move16();
    1506           0 :         hIGFEnc->infoStopLine = -1;
    1507           0 :         move16();
    1508           0 :         fprintf( stderr, "IGFEncSetMode_fx: initialization error!\n" );
    1509             :     }
    1510             : 
    1511             :     /* reset remaining variables */
    1512         172 :     hIGFEnc->infoTotalBitsWritten = 0;
    1513         172 :     move16();
    1514         172 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    1515         172 :     move16();
    1516         172 :     hIGFEnc->flatteningTrigger = 0;
    1517         172 :     move16();
    1518         172 :     hIGFEnc->spec_be_igf_e = 0;
    1519         172 :     move16();
    1520         172 :     hIGFEnc->tns_predictionGain = 0;
    1521         172 :     move16();
    1522         172 :     set32_fx( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN );
    1523         172 :     return;
    1524             : }
    1525             : 
    1526             : /*-------------------------------------------------------------------*
    1527             :  * pack_bit()
    1528             :  *
    1529             :  * insert a bit into packed octet
    1530             :  *-------------------------------------------------------------------*/
    1531             : 
    1532      652001 : static void pack_bit_fx(
    1533             :     const Word16 bit, /* i  : bit to be packed */
    1534             :     UWord8 **pt,      /* i/o: pointer to octet array into which bit will be placed */
    1535             :     UWord8 *omask     /* i/o: output mask to indicate where in the octet the bit is to be written */
    1536             : )
    1537             : {
    1538      652001 :     if ( EQ_16( *omask, 0x80 ) )
    1539             :     {
    1540       88109 :         **pt = 0;
    1541       88109 :         move16();
    1542             :     }
    1543             : 
    1544      652001 :     if ( bit != 0 )
    1545             :     {
    1546      348480 :         **pt = (UWord8) s_or( **pt, *omask );
    1547      348480 :         move16();
    1548             :     }
    1549             : 
    1550      652001 :     *omask = (UWord8) UL_lshr( *omask, 1 );
    1551      652001 :     move16();
    1552      652001 :     IF( *omask == 0 )
    1553             :     {
    1554       75267 :         *omask = 0x80;
    1555       75267 :         move16();
    1556       75267 :         ( *pt )++;
    1557             :     }
    1558             : 
    1559      652001 :     return;
    1560             : }
    1561             : 
    1562             : /*-------------------------------------------------------------------*
    1563             :  * IGFEncConcatenateBitstream_fx()
    1564             :  *
    1565             :  * IGF bitstream concatenation for TCX10 modes
    1566             :  *-------------------------------------------------------------------*/
    1567             : 
    1568       28662 : void IGFEncConcatenateBitstream_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                  */
    1569             :                                          const Word16 bsBits,                   /* i  : number of IGF bits written to list of indices   */
    1570             :                                          BSTR_ENC_HANDLE hBstr                  /* i/o: bitstream handle                                */
    1571             : )
    1572             : {
    1573             :     Word16 i;
    1574             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1575             :     Indice *ind_list;
    1576             :     UWord8 *pFrame;      /* byte array with bit packet and byte aligned coded speech data */
    1577             :     Word16 *pFrame_size; /* number of bits in the binary encoded access unit [bits]       */
    1578             :     Word16 k, nb_bits_written;
    1579             :     Word32 imask;
    1580             :     UWord8 omask;
    1581             : 
    1582       28662 :     hPrivateData = &hIGFEnc->igfData;
    1583             : 
    1584       28662 :     ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */
    1585       28662 :     pFrame = hPrivateData->igfBitstream;
    1586       28662 :     move16();
    1587       28662 :     pFrame_size = &hPrivateData->igfBitstreamBits;
    1588       28662 :     move16();
    1589       28662 :     nb_bits_written = 0;
    1590       28662 :     move16();
    1591             : 
    1592       28662 :     omask = (UWord8) UL_lshr( 0x80, s_and( *pFrame_size, 0x7 ) );
    1593       28662 :     move16();
    1594       28662 :     pFrame += *pFrame_size >> 3;
    1595             : 
    1596             :     /* bitstream packing (conversion of individual indices into a serial stream) */
    1597      680663 :     FOR( i = 0; i < bsBits; i++ ){
    1598      652001 :         IF( ind_list[i].nb_bits > 0 ){
    1599             :             /* mask from MSB to LSB */
    1600      652001 :             imask = L_shl( 1, sub( ind_list[i].nb_bits, 1 ) );
    1601             : 
    1602             :     /* write bit by bit */
    1603     1304002 :     FOR( k = 0; k < ind_list[i].nb_bits; k++ )
    1604             :     {
    1605      652001 :         pack_bit_fx( extract_l( L_and( ind_list[i].value, imask ) ), &pFrame, &omask );
    1606      652001 :         imask = L_shr( imask, 1 );
    1607             :     }
    1608      652001 :     nb_bits_written = add( nb_bits_written, ind_list[i].nb_bits );
    1609             : 
    1610             :     /* delete the indice */
    1611      652001 :     ind_list[i].nb_bits = -1;
    1612      652001 :     move16();
    1613             : }
    1614             : }
    1615             : 
    1616       28662 : *pFrame_size = add( *pFrame_size, nb_bits_written );
    1617       28662 : move16();
    1618             : 
    1619             : /* update list of indices */
    1620       28662 : hBstr->nb_ind_tot = sub( hBstr->nb_ind_tot, bsBits );
    1621       28662 : hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written );
    1622             : 
    1623       28662 : return;
    1624             : }
    1625             : 
    1626             : 
    1627             : /**********************************************************************/ /*
    1628             :  IGF write concatenated bitsream for TCX10 modes
    1629             : **************************************************************************/
    1630             : 
    1631             : /**< out: Q0 | total number of bits written   */
    1632           0 : Word16 IGFEncWriteConcatenatedBitstream_fx(
    1633             :     const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder */
    1634             :     BSTR_ENC_HANDLE hBstr                    /* i/o: encoder bitstream handle       */
    1635             : )
    1636             : {
    1637             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1638             :     Word16 i;
    1639             :     Word16 tmp;
    1640             :     Word16 bitsLeft;
    1641             :     UWord8 *pBitstream;
    1642             : 
    1643           0 :     hPrivateData = &hInstance->igfData;
    1644           0 :     pBitstream = &hPrivateData->igfBitstream[0];
    1645             : 
    1646           0 :     tmp = shr( hPrivateData->igfBitstreamBits, 3 );
    1647           0 :     FOR( i = 0; i < tmp; i++ )
    1648             :     {
    1649           0 :         push_next_indice( hBstr, pBitstream[i], 8 );
    1650             :     }
    1651             : 
    1652           0 :     bitsLeft = s_and( hPrivateData->igfBitstreamBits, 0x7 );
    1653           0 :     IF( bitsLeft > 0 )
    1654             :     {
    1655           0 :         push_next_indice( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft );
    1656             :     }
    1657             : 
    1658           0 :     return hInstance->infoTotalBitsWritten;
    1659             : }
    1660       14331 : Word16 IGFEncWriteConcatenatedBitstream_ivas_fx(                                          /**< out: Q0 | total number of bits written   */
    1661             :                                                  const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder */
    1662             :                                                  BSTR_ENC_HANDLE hBstr                    /* i/o: encoder bitstream handle       */
    1663             : )
    1664             : {
    1665             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    1666             :     Word16 i;
    1667             :     Word16 tmp;
    1668             :     Word16 bitsLeft;
    1669             :     UWord8 *pBitstream;
    1670             : 
    1671       14331 :     hPrivateData = &hInstance->igfData;
    1672       14331 :     pBitstream = &hPrivateData->igfBitstream[0];
    1673             : 
    1674       14331 :     tmp = shr( hPrivateData->igfBitstreamBits, 3 );
    1675       89598 :     FOR( i = 0; i < tmp; i++ )
    1676             :     {
    1677       75267 :         push_next_indice( hBstr, pBitstream[i], 8 );
    1678             :     }
    1679             : 
    1680       14331 :     bitsLeft = s_and( hPrivateData->igfBitstreamBits, 0x7 );
    1681       14331 :     IF( bitsLeft > 0 )
    1682             :     {
    1683       12842 :         push_next_indice( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft );
    1684             :     }
    1685             : 
    1686       14331 :     return hInstance->infoTotalBitsWritten;
    1687             : }
    1688             : 
    1689             : /**********************************************************************/ /*
    1690             : apply the IGF encoder, main encoder interface
    1691             : **************************************************************************/
    1692        1311 : void IGFEncApplyMono_fx( const IGF_ENC_INSTANCE_HANDLE hInstance,        /**< in:     | instance handle of IGF Encoder                         */
    1693             :                          const Word16 igfGridIdx,                        /**< in: Q0  | IGF grid index                                         */
    1694             :                          Encoder_State *st,                              /**< in:     | Encoder state                                          */
    1695             :                          Word32 *pMDCTSpectrum,                          /**< in: Q31 | MDCT spectrum                                          */
    1696             :                          Word16 MDCTSpectrum_e,                          /**< in:     | exponent of MDCT spectrum                              */
    1697             :                          Word32 *pPowerSpectrum,                         /**< in: Q31 | MDCT^2 + MDST^2 spectrum, or estimate                  */
    1698             :                          Word16 PowerSpectrum_e,                         /**< in:     | exponent of pPowerSpectrum                             */
    1699             :                          Word16 isTCX20,                                 /**< in: Q0  | flag indicating if the input is TCX20 or TCX10/2xTCX5  */
    1700             :                          Word16 isTNSActive,                             /**< in: Q0  | flag indicating if the TNS is active                   */
    1701             :                          Word16 last_core_acelp                          /**< in: Q0  | indicator if last frame was acelp coded                */
    1702             : )
    1703             : {
    1704             :     Word32 *pPowerSpectrumParameter;          /* If it is NULL it informs a function that specific handling is needed */
    1705             :     Word32 *pPowerSpectrumParameterWhitening; /* If it is NULL it informs a function that specific handling is needed */
    1706             :     Word16 highPassEner_exp;                  /*exponent of highpass energy - maybe not needed*/
    1707             : 
    1708             : 
    1709        1311 :     pPowerSpectrumParameter = NULL;
    1710        1311 :     test();
    1711        1311 :     if ( ( isTNSActive == 0 ) && ( isTCX20 != 0 ) )
    1712             :     {
    1713        1303 :         pPowerSpectrumParameter = pPowerSpectrum;
    1714             :     }
    1715        1311 :     pPowerSpectrumParameterWhitening = NULL;
    1716        1311 :     if ( isTCX20 != 0 )
    1717             :     {
    1718        1311 :         pPowerSpectrumParameterWhitening = pPowerSpectrum;
    1719             :     }
    1720             : 
    1721        1311 :     IGF_UpdateInfo( hInstance,    /* i: instance handle of IGF Encoder            */
    1722             :                     igfGridIdx ); /* i: IGF grid index                            */
    1723             : 
    1724        1311 :     IGF_CalculateEnvelope( hInstance,               /* i: instance handle of IGF Encoder            */
    1725             :                            pMDCTSpectrum,           /* i: MDCT spectrum                             */
    1726             :                            MDCTSpectrum_e,          /* i: exponent of MDCT spectrum                 */
    1727             :                            pPowerSpectrumParameter, /* i: MDCT^2 + MDST^2 spectrum, or estimate     */
    1728             :                            PowerSpectrum_e,         /* i: exponent of pPowerSpectrum                */
    1729             :                            igfGridIdx               /* i: IGF grid index                            */
    1730             :     );
    1731             : 
    1732             : 
    1733        1311 :     IGF_Whitening( hInstance,                        /* i: instance handle of IGF Encoder            */
    1734             :                    pPowerSpectrumParameterWhitening, /* i: MDCT^2 + MDST^2 spectrum, or estimate     */
    1735             :                    PowerSpectrum_e,                  /* i: exponent of powerSpectrum                 */
    1736             :                    igfGridIdx,                       /* i: IGF grid index                            */
    1737        1311 :                    ( st->hTranDet->transientDetector.bIsAttackPresent == 1 ),
    1738             :                    last_core_acelp ); /* i: last frame was acelp indicator            */
    1739             : 
    1740        1311 :     pPowerSpectrumParameter = NULL;
    1741        1311 :     if ( isTCX20 != 0 )
    1742             :     {
    1743        1311 :         pPowerSpectrumParameter = pPowerSpectrum;
    1744             :     }
    1745             : 
    1746        1311 :     IGF_ErodeSpectrum(                          /* o: highpass energy                           */
    1747             :                        &highPassEner_exp,       /* o: exponent of highPassEner                  */
    1748             :                        hInstance,               /* i: instance handle of IGF Encoder            */
    1749             :                        pMDCTSpectrum,           /* i: MDCT spectrum                             */
    1750             :                        pPowerSpectrumParameter, /* i: MDCT^2 + MDST^2 spectrum, or estimate     */
    1751             :                        PowerSpectrum_e,         /* i: exponent of pPowerSpectrum                */
    1752             :                        igfGridIdx );            /* i: IGF grid index                            */
    1753        1311 : }
    1754             : 
    1755             : 
    1756       28931 : ivas_error IGF_Reconfig_fx(
    1757             :     IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder  */
    1758             :     const Word16 igf,                 /* i  : IGF on/off                      */
    1759             :     const Word16 reset,               /* i  : reset flag                      */
    1760             :     const Word32 brate,               /* i  : bitrate for configuration       */
    1761             :     const Word16 bwidth,              /* i  : signal bandwidth                */
    1762             :     const Word16 element_mode,        /* i  : IVAS element mode               */
    1763             :     const Word16 rf_mode              /* i  : flag to signal the RF mode      */
    1764             : )
    1765             : {
    1766             :     ivas_error error;
    1767             : 
    1768       28931 :     error = IVAS_ERR_OK;
    1769       28931 :     move32();
    1770             : 
    1771       28931 :     test();
    1772       28931 :     test();
    1773       28931 :     test();
    1774       28931 :     IF( igf && *hIGFEnc == NULL )
    1775             :     {
    1776        1816 :         IF( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
    1777             :         {
    1778           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
    1779             :         }
    1780        1816 :         IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    1781             :     }
    1782       27115 :     ELSE IF( igf && reset )
    1783             :     {
    1784           0 :         IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    1785             :     }
    1786       27115 :     ELSE IF( !igf && *hIGFEnc != NULL )
    1787             :     {
    1788        2454 :         free( *hIGFEnc );
    1789        2454 :         *hIGFEnc = NULL;
    1790             :     }
    1791             : 
    1792       28931 :     return error;
    1793             : }
    1794             : 
    1795             : 
    1796             : #define INV_Log2_10_Q15 9864  /*1/log2(10) in Q15*/
    1797             : #define INV_Log2_10_Q12 1233  /*1/log2(10) in Q12*/
    1798             : #define INV_Log2_e_Q15  22713 /*1/log2(e) in Q15*/
    1799             : 
    1800             : 
    1801             : /*-------------------------------------------------------------------*
    1802             :  * IGF_getCrest_new()
    1803             :  *
    1804             :  * crest factor calculation
    1805             :  *-------------------------------------------------------------------*/
    1806             : 
    1807             : /*! r: crest factor */
    1808     6593645 : static Word16 IGF_getCrest_new_fx(
    1809             :     const Word16 *logSpec, /* i  : power spectrum           */
    1810             :     const Word16 start,    /* i  : start subband index      */
    1811             :     const Word16 stop,     /* i  : stop subband index       */
    1812             :     Word16 *crest_exp      /*Stores the exponent of the result(return value)*/
    1813             : )
    1814             : {
    1815             :     Word16 i;
    1816             :     Word16 x;
    1817             :     Word32 x_eff;
    1818             :     Word16 x_max;
    1819             :     Word16 exp;
    1820             :     Word16 temp;
    1821             :     Word16 temp_e;
    1822             :     Word16 crest; /*1.0f in Q15*/
    1823     6593645 :     x_eff = 0;
    1824     6593645 :     x_max = 0;
    1825     6593645 :     exp = 0;
    1826     6593645 :     temp = 0;
    1827     6593645 :     crest = 32767; /*1.0f in Q15*/
    1828     6593645 :     move32();
    1829     6593645 :     move16();
    1830     6593645 :     move16();
    1831     6593645 :     move16();
    1832     6593645 :     move16();
    1833             : 
    1834   454375395 :     FOR( i = start; i < stop; i++ )
    1835             :     {
    1836   447781750 :         x = logSpec[i];
    1837   447781750 :         move16();
    1838   447781750 :         x_eff = L_mac0( x_eff, x, x );
    1839             : 
    1840   447781750 :         if ( GT_16( x, x_max ) )
    1841             :         {
    1842    20147405 :             x_max = x;
    1843    20147405 :             move16();
    1844             :         }
    1845             :     }
    1846             : 
    1847     6593645 :     x_eff = BASOP_Util_Divide3216_Scale( x_eff, sub( stop, start ), &temp_e );
    1848     6593645 :     temp_e = add( temp_e, 16 ); /*exp += 31 - 15 + 16(because x_eff is word32)*/
    1849     6593645 :     x_eff = L_shr( x_eff, sub( 15, temp_e ) );
    1850     6593645 :     temp_e = 15;
    1851     6593645 :     move16();
    1852     6593645 :     temp = Sqrt16( extract_l( x_eff ), &temp_e );
    1853             : 
    1854     6593645 :     test();
    1855     6593645 :     IF( x_eff > 0 && x_max > 0 )
    1856             :     {
    1857     5814184 :         temp = BASOP_Util_Divide1616_Scale( x_max, temp, &exp );
    1858     5814184 :         exp = add( exp, sub( 15, temp_e ) );
    1859     5814184 :         IF( exp < 0 )
    1860             :         {
    1861           0 :             temp = shl( temp, exp );
    1862           0 :             exp = 0;
    1863           0 :             move16();
    1864             :         }
    1865     5814184 :         crest = s_max( shl_sat( 1, sub( 15, exp ) ), temp );
    1866             :     }
    1867     6593645 :     *crest_exp = exp;
    1868     6593645 :     move16();
    1869     6593645 :     return crest;
    1870             : }
    1871             : 
    1872             : 
    1873             : /*-------------------------------------------------------------------*
    1874             :  * IGF_getSFM_new()
    1875             :  *
    1876             :  * calculates spectral flatness measurement
    1877             :  *-------------------------------------------------------------------*/
    1878             : 
    1879             : /*! r: SFM value */
    1880     6593645 : static Word16 IGF_getSFM_new_fx(
    1881             :     const Word32 *powerSpectrum, /* i  : power spectrum            */
    1882             :     const Word16 *logSpec,       /* i  : log of power spectrum     */
    1883             :     const Word16 start,          /* i  : start subband index       */
    1884             :     const Word16 stop,           /* i  : stop subband index        */
    1885             :     Word16 *e_ps                 /*Stores exp related to power spectrum*/
    1886             : )
    1887             : {
    1888             :     Word16 n;
    1889             :     Word16 i;
    1890             :     Word16 num;
    1891             :     Word32 denom;
    1892             :     Word16 numf;
    1893             :     Word32 tmp;
    1894             :     Word16 sfm;
    1895             :     Word16 sfm_e;
    1896             :     Word16 denom_e;
    1897             :     Word16 numf_e; /*stores exponent for numf*/
    1898             :     Word16 tmp_e;
    1899             : 
    1900     6593645 :     num = 0;
    1901     6593645 :     denom = ONE_IN_Q30;
    1902     6593645 :     denom_e = 1;
    1903     6593645 :     sfm = MAX16B; // Q15
    1904     6593645 :     move16();
    1905     6593645 :     move32();
    1906     6593645 :     move16();
    1907     6593645 :     move16();
    1908             : 
    1909   454375395 :     FOR( i = start; i < stop; i++ )
    1910             :     {
    1911   447781750 :         tmp = powerSpectrum[i];
    1912   447781750 :         n = logSpec[i /*-start*/];
    1913   447781750 :         move32();
    1914   447781750 :         move16();
    1915   447781750 :         num = add( num, n );
    1916   447781750 :         denom = BASOP_Util_Add_Mant32Exp( tmp, e_ps[i], denom, denom_e, &denom_e );
    1917             :     }
    1918             : 
    1919     6593645 :     numf = BASOP_Util_Divide1616_Scale( num, sub( stop, start ), &numf_e );
    1920     6593645 :     denom = BASOP_Util_Divide3216_Scale( denom, sub( stop, start ), &tmp_e );
    1921     6593645 :     denom_e = add( add( denom_e, tmp_e ), 1 ); /*denom_e+tmp_e-15 +16(because type of denom is word32)*/
    1922             : 
    1923     6593645 :     IF( denom != 0 )
    1924             :     {
    1925     6593645 :         tmp = BASOP_util_Pow2( L_add( numf, shl_sat( 1, sub( 14, numf_e ) ) ), add( 16, numf_e ), &tmp_e );
    1926     6593645 :         sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e );
    1927     6593645 :         sfm_e = add( sfm_e, sub( tmp_e, denom_e ) );
    1928     6593645 :         sfm = shl_sat( extract_l( L_min( sfm, L_shl_sat( 1, sub( 15, sfm_e ) ) ) ), sfm_e );
    1929             :     }
    1930             : 
    1931     6593645 :     return sfm;
    1932             : }
    1933             : /*-------------------------------------------------------------------*
    1934             :  * IGF_getTilt()
    1935             :  *
    1936             :  * calculates spectral tilt
    1937             :  *-------------------------------------------------------------------*/
    1938             : 
    1939             : /*! r: spectral tilt value */
    1940             : 
    1941             : /*-------------------------------------------------------------------*
    1942             :  * IGF_getTNR()
    1943             :  *
    1944             :  * calculates tonal-to-noise ratio
    1945             :  *-------------------------------------------------------------------*/
    1946             : 
    1947             : /*! r: spectral tilt value */
    1948             : /* Returns value with exponent as 9 and Q as 22*/
    1949             : 
    1950       15325 : static Word32 IGF_getTNR_ivas_fx(
    1951             :     const Word32 *powerSpectrum, /* i  : energies               */
    1952             :     const Word16 start,          /* i  : start subband index    */
    1953             :     const Word16 stop,           /* i  : stop subband index     */
    1954             :     const Word16 adap,           /* i  : SFB width adaptation   */
    1955             :     Word16 *e_ps,                /*Stores exponent for powerSpectrum*/
    1956             :     Word16 e_adap                /*Stores exponent for adap*/
    1957             : )
    1958             : {
    1959             :     Word16 i;
    1960             :     Word16 width;
    1961             :     Word32 avg;
    1962             :     Word32 tonal;
    1963             :     Word16 tonal_e; /* holds exp for tonal*/
    1964             :     Word32 noise;
    1965             :     Word16 noise_e; /* holds exp for noise*/
    1966             :     Word32 tonalToNoise;
    1967             :     Word32 rootSpec[300];
    1968             :     Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/
    1969             :     Word16 avg_e;           /* holds exp for avg*/
    1970             :     Word16 tmp_e;
    1971       15325 :     avg = 0;
    1972       15325 :     tonal = 0;
    1973       15325 :     noise = EPSILON_FX;
    1974       15325 :     tonal_e = 0;
    1975       15325 :     noise_e = 0;
    1976       15325 :     avg_e = 0;
    1977       15325 :     tmp_e = 0;
    1978       15325 :     move32();
    1979       15325 :     move32();
    1980       15325 :     move32();
    1981       15325 :     move16();
    1982       15325 :     move16();
    1983       15325 :     move16();
    1984       15325 :     move16();
    1985             : 
    1986       15325 :     set32_fx( rootSpec, 0, 300 );
    1987       15325 :     set16_fx( rootSpec_e, 0, 300 );
    1988             : 
    1989       15325 :     width = sub( stop, start );
    1990      933069 :     FOR( i = start; i < stop; i++ )
    1991             :     {
    1992      917744 :         rootSpec_e[( i - start )] = e_ps[i];
    1993      917744 :         move16();
    1994      917744 :         rootSpec[( i - start )] = Sqrt32( powerSpectrum[i], &rootSpec_e[( i - start )] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/
    1995      917744 :         move32();
    1996      917744 :         avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/
    1997             :     }
    1998       15325 :     avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/
    1999       15325 :     avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) );
    2000             : 
    2001      933069 :     FOR( i = start; i < stop; i++ )
    2002             :     {
    2003             :         Word16 normSpec_e;                                                                      /*stores resultant exponent for normSpec*/
    2004      917744 :         Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[i - start], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/
    2005      917744 :         normSpec_e = add( normSpec_e, sub( rootSpec_e[i - start], avg_e ) );
    2006      917744 :         IF( GT_32( normSpec, L_add_sat( L_shl_sat( 1, sub( 15, normSpec_e ) ), L_shl_sat( adap, sub( e_adap, normSpec_e ) ) ) ) )
    2007             :         {
    2008       74230 :             tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &tonal_e ); /*tonal += rootSpec[i - start];*/
    2009             :         }
    2010      843514 :         ELSE IF( LT_32( normSpec, L_shl_sat( 1, sub( 15, normSpec_e ) ) ) )
    2011             :         {
    2012      745027 :             noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[( i - start )], rootSpec_e[( i - start )], &noise_e ); /*noise += rootSpec[i - start];*/
    2013             :         }
    2014             :     }
    2015             : 
    2016             :     /*tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) )*/
    2017       15325 :     IF( noise == 0 ) // To handle condition if denom = 0
    2018             :     {
    2019           0 :         tonalToNoise = imult3216( L_shr( L_add( L_shl( 18 /* log10f(1e-018f) */, Q25 ), Mpy_32_16_1( L_add( BASOP_Util_Log2( tonal ), L_shl( tonal_e, Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/ ), 3 ) /*Q22*/, 20 );
    2020             :     }
    2021             :     ELSE
    2022             :     {
    2023       15325 :         Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/
    2024       15325 :         tmp_e = add( tmp_e, sub( tonal_e, noise_e ) );
    2025       15325 :         IF( GE_16( temp, 1 ) )
    2026             :         {
    2027       15324 :             tonalToNoise = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q12 ) /*25+12-15*/, 20 ); /*Q22*/
    2028             :         }
    2029             :         ELSE
    2030             :         {
    2031           1 :             tonalToNoise = -1509949440; /*-360.f Q22*/
    2032           1 :             move32();
    2033             :         }
    2034             :     }
    2035             : 
    2036       15325 :     return tonalToNoise;
    2037             : }
    2038             : 
    2039             : /*-------------------------------------------------------------------*
    2040             :  * IGF_CalculateEnvelope()
    2041             :  *
    2042             :  * envelope estimation
    2043             :  *-------------------------------------------------------------------*/
    2044             : 
    2045      588384 : static void IGF_CalculateEnvelope_ivas_fx(
    2046             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                  */
    2047             :     Word32 *pMDCTSpectrum_fx,              /* i  : MDCT spectrum                                   */
    2048             :     Word16 e_mdct,                         /* i  : exp of MDCT spectrum                  */
    2049             :     Word32 *pPowerSpectrum_fx,             /* i  : MDCT^2 + MDST^2 spectrum, or estimate           */
    2050             :     Word16 *e_ps,                          /* i  : exp of power spectrum                 */
    2051             :     const Word16 igfGridIdx,               /* i  : IGF grid index                                  */
    2052             :     const Word16 isTransient,              /* i  : flag indicating if transient is detected        */
    2053             :     const Word16 last_core_acelp,          /* i  : indicator if last frame was ACELP core          */
    2054             :     const Word16 element_mode,             /* i  : IVAS element_mode                               */
    2055             :     const Word16 att                       /* i  : attenuation                                     */
    2056             : )
    2057             : {
    2058             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    2059             :     H_IGF_GRID hGrid;
    2060             :     Word16 *swb_offset;
    2061             :     Word16 sfb;   /* this is the actual scalefactor band */
    2062             :     Word16 width; /* this is width in subbands of the actual scalefactor band */
    2063             :     Word16 tile_idx;
    2064             :     Word16 strt_cpy;
    2065             :     Word32 gain; /* the gain which has to be applied to the source tile to get the destination energy */
    2066             :     Word16 sb;
    2067             :     Word32 sfbEnergyR;
    2068             :     Word32 sfbEnergyC; /* the energy of the destination region of the tile */
    2069             :     Word32 sfbEnergyTileR;
    2070             :     Word32 sfbEnergyTileC; /* the energy of the destination region of the tile */
    2071             :     Word16 tmp, x, y;
    2072             :     Word16 mean_x_fx, mean_y_fx;
    2073             :     Word32 mean_xy_fx, mean_x2_fx;
    2074             :     Word16 tmp_tb;
    2075             :     Word16 tmp_sb;
    2076             :     Word16 sfbCnt;
    2077             :     Word16 sfm;
    2078             :     Word16 crest;
    2079             :     Word16 temp;
    2080             :     Word16 mean_x_e, mean_y_e;   /*Stores exponent for mean_x and mean_y respectively*/
    2081             :     Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/
    2082             :     Word16 sfbEnergyTileR_e;     /*Exponent for sfbEnergyTileR*/
    2083             :     Word16 sfbEnergyTileC_e;     /*Exponent for sfbEnergyTileC*/
    2084             :     Word16 sfbEnergyC_e;         /*Exponent for sfbEnergyC*/
    2085             :     Word16 sfbEnergyR_e;
    2086             :     Word16 gain_e;    /*exponent for gain*/
    2087             :     Word16 tmp_tb_e;  /*Stores exponent for tmp_tb*/
    2088             :     Word16 tmp_sb_e;  /*stores exponent for tmp_sb*/
    2089             :     Word16 crest_exp; /*Stores the exponent of the result(return value)*/
    2090             :     Word16 sfm_exp;   /*stores exponent for ouput from sfm*/
    2091             :     Word16 tmp_e;
    2092             : 
    2093      588384 :     hPrivateData = &hIGFEnc->igfData;
    2094      588384 :     hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx];
    2095      588384 :     swb_offset = hGrid->swb_offset;
    2096             : 
    2097      588384 :     IF( element_mode > EVS_MONO )
    2098             :     {
    2099      588384 :         IF( igfGridIdx != IGF_GRID_LB_NORM )
    2100             :         {
    2101      230702 :             FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ )
    2102             :             {
    2103             :                 /* reset filter */
    2104      194252 :                 hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt]
    2105      194252 :                 hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0;
    2106      194252 :                 hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt]
    2107      194252 :                 hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0;
    2108      194252 :                 hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt]
    2109      194252 :                 hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0;
    2110      194252 :                 hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt]
    2111      194252 :                 hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0;
    2112      194252 :                 hPrivateData->prevDampingFactor_IIR_fx[sfbCnt] = MIN16B; /* -1.f in Q15*/
    2113      194252 :                 hPrivateData->prevDampingFactor_IIR_e[sfbCnt] = 0;
    2114      194252 :                 hPrivateData->dampingFactorSmoothing[sfbCnt] = 2;
    2115      194252 :                 move16();
    2116      194252 :                 move16();
    2117      194252 :                 move16();
    2118      194252 :                 move16();
    2119      194252 :                 move16();
    2120      194252 :                 move16();
    2121      194252 :                 move16();
    2122      194252 :                 move16();
    2123      194252 :                 move16();
    2124      194252 :                 move16();
    2125      194252 :                 move16();
    2126             :             }
    2127             :         }
    2128             :     }
    2129             : 
    2130      588384 :     IF( pPowerSpectrum_fx )
    2131             :     {
    2132   276533457 :         FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
    2133             :         {
    2134   276020378 :             IF( LT_32( 1, pPowerSpectrum_fx[sb] ) )
    2135             :             {
    2136   268725437 :                 hPrivateData->logSpec[sb] = s_max( 0, extract_l( W_extract_l( W_shr( W_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), W_shl( e_ps[sb], Q25 ) ), Q25 ) ) ) );
    2137   268725437 :                 move16();
    2138             :             }
    2139             :             ELSE
    2140             :             {
    2141     7294941 :                 hPrivateData->logSpec[sb] = 0;
    2142     7294941 :                 move16();
    2143             :             }
    2144             :         }
    2145             :     }
    2146             : 
    2147     2723169 :     FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
    2148             :     {
    2149     2134785 :         strt_cpy = hGrid->sbWrap[tile_idx];
    2150     2134785 :         move16();
    2151             : 
    2152     5335568 :         FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
    2153             :         {
    2154     3200783 :             width = sub( swb_offset[sfb + 1], swb_offset[sfb] );
    2155     3200783 :             sfbEnergyTileR = EPSILON_FIX;
    2156     3200783 :             sfbEnergyTileC = EPSILON_FIX;
    2157     3200783 :             sfbEnergyC = EPSILON_FX;
    2158     3200783 :             sfbEnergyTileR_e = 0;
    2159     3200783 :             sfbEnergyTileC_e = 0;
    2160     3200783 :             sfbEnergyC_e = 0;
    2161     3200783 :             move16();
    2162     3200783 :             move16();
    2163     3200783 :             move16();
    2164     3200783 :             move16();
    2165     3200783 :             move16();
    2166     3200783 :             move16();
    2167             : 
    2168     3200783 :             IF( pPowerSpectrum_fx != NULL )
    2169             :             {
    2170     2847537 :                 tmp = strt_cpy;
    2171     2847537 :                 move16();
    2172   166123469 :                 FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
    2173             :                 {
    2174   163275932 :                     Word16 shift = norm_l( pPowerSpectrum_fx[sb] );
    2175   163275932 :                     sfbEnergyC = BASOP_Util_Add_Mant32Exp( sfbEnergyC, sfbEnergyC_e, L_shl( pPowerSpectrum_fx[sb], shift ), sub( e_ps[sb], shift ), &sfbEnergyC_e );
    2176             :                     // sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ), shl( e_mdct, 1 ), &sfbEnergyTileR_e );
    2177   163275932 :                     Word64 tmp64 = W_mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] );
    2178   163275932 :                     Word16 tmp64_e = W_norm( tmp64 );
    2179   163275932 :                     tmp64 = W_shl( tmp64, tmp64_e );
    2180             : 
    2181   163275932 :                     sfbEnergyTileR = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR, sfbEnergyTileR_e, W_extract_h( tmp64 ), shl( e_mdct, 1 ) - tmp64_e, &sfbEnergyTileR_e );
    2182   163275932 :                     shift = norm_l( pPowerSpectrum_fx[strt_cpy] );
    2183   163275932 :                     sfbEnergyTileC = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC, sfbEnergyTileC_e, L_shl( pPowerSpectrum_fx[strt_cpy], shift ), sub( e_ps[strt_cpy], shift ), &sfbEnergyTileC_e );
    2184             : 
    2185   163275932 :                     strt_cpy = add( strt_cpy, 1 );
    2186             :                 }
    2187             : 
    2188     2847537 :                 sfbEnergyTileR = L_deposit_h( BASOP_Util_Divide3232_Scale( sfbEnergyTileR, width, &tmp_e ) );
    2189     2847537 :                 sfbEnergyTileR_e = add( sub( sfbEnergyTileR_e, Q31 ), tmp_e );
    2190             : 
    2191     2847537 :                 IF( sfbEnergyTileR == 0 )
    2192             :                 {
    2193       74809 :                     sfbEnergyTileR = EPSILON_FX;
    2194       74809 :                     sfbEnergyTileR_e = 0;
    2195       74809 :                     move32();
    2196       74809 :                     move16();
    2197             :                 }
    2198     2847537 :                 IF( sfbEnergyC == 0 )
    2199             :                 {
    2200       74809 :                     sfbEnergyC = EPSILON_FX;
    2201       74809 :                     sfbEnergyC_e = 0;
    2202       74809 :                     move32();
    2203       74809 :                     move16();
    2204             :                 }
    2205     2847537 :                 IF( sfbEnergyTileC == 0 )
    2206             :                 {
    2207       74809 :                     sfbEnergyTileC = EPSILON_FX;
    2208       74809 :                     sfbEnergyTileC_e = 0;
    2209       74809 :                     temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e );
    2210       74809 :                     tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) );
    2211       74809 :                     move32();
    2212       74809 :                     move16();
    2213             :                 }
    2214             :                 ELSE
    2215             :                 {
    2216             :                     /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/
    2217     2772728 :                     temp = BASOP_Util_Divide3232_Scale( sfbEnergyC, sfbEnergyTileC, &tmp_e );
    2218     2772728 :                     tmp_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) );
    2219             :                 }
    2220             : 
    2221     2847537 :                 gain = Mult_32_16( sfbEnergyTileR, temp ); // gain_e
    2222     2847537 :                 gain_e = add( tmp_e, sfbEnergyTileR_e );
    2223             : 
    2224     2847537 :                 IF( element_mode > EVS_MONO )
    2225             :                 {
    2226     2847537 :                     test();
    2227     2847537 :                     IF( !isTransient )
    2228             :                     {
    2229             :                         Word16 diffSFM;
    2230     2837402 :                         Word16 shiftedSFM = 0;
    2231     2837402 :                         Word16 shiftedSFM_e = 0;
    2232     2837402 :                         move16();
    2233     2837402 :                         move16();
    2234             : 
    2235             :                         // tmp_tb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_new( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1] );
    2236     2837402 :                         sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], e_ps );
    2237     2837402 :                         sfm_exp = 0;
    2238     2837402 :                         move16();
    2239     2837402 :                         crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb], swb_offset[sfb + 1], &crest_exp );
    2240     2837402 :                         tmp_tb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_tb_e
    2241     2837402 :                         tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) );
    2242             : 
    2243             :                         // tmp_sb = IGF_getSFM_new( pPowerSpectrum, hPrivateData->logSpec, tmp, strt_cpy ) / IGF_getCrest_new( hPrivateData->logSpec, tmp, strt_cpy );
    2244     2837402 :                         sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, tmp, strt_cpy, e_ps );
    2245     2837402 :                         crest = IGF_getCrest_new_fx( hPrivateData->logSpec, tmp, strt_cpy, &crest_exp );
    2246     2837402 :                         tmp_sb = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); // tmp_sb_e
    2247     2837402 :                         tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) );
    2248             : 
    2249     2837402 :                         test();
    2250     2837402 :                         IF( last_core_acelp || hPrivateData->wasTransient )
    2251             :                         {
    2252      129599 :                             hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_FIR_TB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] : hPrivateData->prevSFB_IIR_TB_e[sfb] */
    2253      129599 :                             hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_FIR_SB_e[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] : hPrivateData->prevSFB_IIR_SB_e[sfb] */
    2254      129599 :                             hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e;
    2255      129599 :                             hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e;
    2256      129599 :                             move16();
    2257      129599 :                             move16();
    2258      129599 :                             move16();
    2259      129599 :                             move16();
    2260      129599 :                             move16();
    2261      129599 :                             move16();
    2262      129599 :                             move16();
    2263      129599 :                             move16();
    2264             :                         }
    2265             : 
    2266     2837402 :                         tmp_tb = shr( tmp_tb, 2 ); /*taking 2 guard bits so it's exponent tmp_sb_e=+2*/
    2267     2837402 :                         tmp_sb = shr( tmp_sb, 2 ); /*taking 2 guard bits so it's exponent tmp_tb_e=+2 */
    2268     2837402 :                         tmp_sb_e = add( tmp_sb_e, 2 );
    2269     2837402 :                         tmp_tb_e = add( tmp_tb_e, 2 );
    2270             : 
    2271             :                         Word16 tmp0, tmp2, tmp3, tmp4;
    2272             :                         Word16 tmp0_e, tmp2_e, tmp3_e, tmp4_e;
    2273     2837402 :                         tmp0 = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], 2 );
    2274     2837402 :                         tmp0_e = add( hPrivateData->prevSFB_FIR_TB_e[sfb], 2 );
    2275     2837402 :                         move16();
    2276     2837402 :                         tmp2 = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], 2 );
    2277     2837402 :                         tmp2_e = add( hPrivateData->prevSFB_IIR_TB_e[sfb], 2 );
    2278     2837402 :                         move16();
    2279     2837402 :                         tmp3 = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], 2 );
    2280     2837402 :                         tmp3_e = add( hPrivateData->prevSFB_FIR_SB_e[sfb], 2 );
    2281     2837402 :                         move16();
    2282     2837402 :                         tmp4 = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], 2 );
    2283     2837402 :                         tmp4_e = add( hPrivateData->prevSFB_IIR_SB_e[sfb], 2 );
    2284     2837402 :                         move16();
    2285             :                         Word16 x1, x2;
    2286             : 
    2287     2837402 :                         Word16 x1_e = BASOP_Util_Add_MantExp( tmp0, tmp0_e, tmp2, tmp2_e - 1, &x1 );
    2288     2837402 :                         Word16 x2_e = BASOP_Util_Add_MantExp( tmp3, tmp3_e, tmp4, tmp4_e - 1, &x2 );
    2289     2837402 :                         hPrivateData->sfb_tb_e[sfb] = BASOP_Util_Add_MantExp( tmp_tb, tmp_tb_e, x1, x1_e, &hPrivateData->SFM_tb_fx[sfb] ); // hPrivateData->sfb_sb_e[sfb]
    2290     2837402 :                         move16();
    2291     2837402 :                         BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &tmp );
    2292             : 
    2293     2837402 :                         IF( tmp < 0 )
    2294             :                         {
    2295      307814 :                             hPrivateData->sfb_tb_e[sfb] = 2;
    2296      307814 :                             hPrivateData->SFM_tb_fx[sfb] = 22118;
    2297      307814 :                             move16();
    2298      307814 :                             move16();
    2299             :                         }
    2300             : 
    2301     2837402 :                         hPrivateData->sfb_sb_e[sfb] = BASOP_Util_Add_MantExp( tmp_sb, tmp_sb_e, x2, x2_e, &hPrivateData->SFM_sb_fx[sfb] ); // hPrivateData->sfb_tb_e[sfb]
    2302     2837402 :                         move16();
    2303     2837402 :                         BASOP_Util_Add_MantExp( 22118, 2, negate( hPrivateData->SFM_sb_fx[sfb] ), hPrivateData->sfb_sb_e[sfb], &tmp );
    2304             : 
    2305     2837402 :                         IF( tmp < 0 )
    2306             :                         {
    2307      187787 :                             hPrivateData->sfb_sb_e[sfb] = 2;
    2308      187787 :                             hPrivateData->SFM_sb_fx[sfb] = 22118;
    2309      187787 :                             move16();
    2310      187787 :                             move16();
    2311             :                         }
    2312             : 
    2313     2837402 :                         BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb], negate( hPrivateData->SFM_tb_fx[sfb] ), hPrivateData->sfb_tb_e[sfb], &diffSFM );
    2314             : 
    2315     2837402 :                         test();
    2316     2837402 :                         IF( diffSFM > 0 && LT_32( hPrivateData->SFM_tb_fx[sfb], L_shr( 3277 /*0.1 Q15*/, hPrivateData->sfb_tb_e[sfb] ) ) ) /* check whether target SFB is more tonal than source SFB */
    2317       14071 :                         {
    2318             :                             Word16 currDampingFactor, dampingFactor;
    2319             :                             Word16 slope, threshold;
    2320             :                             Word16 alpha;
    2321             :                             Word16 slope_e, threshold_e, currDampingFactor_e, dampingFactor_e, alpha_e;
    2322             : 
    2323             :                             /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */
    2324             :                             // slope = IGF_getTilt_fx( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1], e_ps, &slope_e );
    2325             : 
    2326       14071 :                             x = 1;
    2327       14071 :                             mean_x_fx = mean_y_fx = 0;
    2328       14071 :                             Word32 mean_y_fx_tmp = 0;
    2329       14071 :                             move32();
    2330       14071 :                             mean_xy_fx = mean_x2_fx = 0;
    2331       14071 :                             mean_x_e = 15;
    2332       14071 :                             mean_xy_e = mean_y_e = mean_x2_e = 31;
    2333       14071 :                             move16();
    2334       14071 :                             move16();
    2335       14071 :                             move16();
    2336       14071 :                             move16();
    2337       14071 :                             move16();
    2338       14071 :                             move16();
    2339       14071 :                             move16();
    2340       14071 :                             move16();
    2341       14071 :                             move16();
    2342             : 
    2343      864017 :                             FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
    2344             :                             {
    2345      849946 :                                 mean_x_fx = add( mean_x_fx, x );                   /*Q0*/
    2346      849946 :                                 mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/
    2347             : 
    2348             :                                 /*y = 20.f * log10f( max( 1.f, powerSpectrum[i] ) );*/
    2349      849946 :                                 IF( LE_64( W_deposit32_l( pPowerSpectrum_fx[sb] ), W_shl( 1, ( sub( 31, e_ps[sb] ) ) ) ) )
    2350             :                                 {
    2351      100624 :                                     y = 0;
    2352      100624 :                                     move16();
    2353             :                                 }
    2354             :                                 ELSE
    2355             :                                 {
    2356      749322 :                                     y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ) ), INV_Log2_10_Q15 ), Q25 ) ) ); /*Q0*/
    2357             :                                 }
    2358      849946 :                                 mean_y_fx_tmp = L_mac0( mean_y_fx_tmp, y, 1 );     /*Q0*/
    2359      849946 :                                 mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/
    2360             : 
    2361      849946 :                                 x = add( x, 1 );
    2362             :                             }
    2363       14071 :                             mean_y_fx = BASOP_Util_Divide3216_Scale( mean_y_fx_tmp, width, &tmp_e ); /* mean_y_e*/
    2364             : 
    2365       14071 :                             mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) );
    2366       14071 :                             mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* mean_x_e*/
    2367       14071 :                             mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) );
    2368       14071 :                             mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* mean_xy_e*/
    2369       14071 :                             mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) );
    2370       14071 :                             mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* mean_x2_e*/
    2371       14071 :                             mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) );
    2372             : 
    2373             :                             /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/
    2374       14071 :                             slope = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e );
    2375       14071 :                             slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) );
    2376             : 
    2377             :                             /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping)
    2378             :                                or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/
    2379       14071 :                             threshold = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e );
    2380             : 
    2381       14071 :                             test();
    2382       14071 :                             IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), negate( threshold ), add( threshold_e, 16 ) ), -1 ) )
    2383             :                             {
    2384         307 :                                 Word16 shift = shr( width, 1 );
    2385         307 :                                 sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, e_ps );
    2386         307 :                                 crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift, &crest_exp );
    2387         307 :                                 shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e );
    2388             :                             }
    2389       13764 :                             ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope, add( slope_e, 16 ), threshold, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) )
    2390             :                             {
    2391         118 :                                 Word16 shift = shr( width, 1 );
    2392         118 :                                 shiftedSFM = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps ), IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp ), &tmp_e );
    2393         118 :                                 sfm = IGF_getSFM_new_fx( pPowerSpectrum_fx, hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, e_ps );
    2394         118 :                                 crest = IGF_getCrest_new_fx( hPrivateData->logSpec, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift, &crest_exp );
    2395         118 :                                 shiftedSFM = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e );
    2396             :                             }
    2397       14071 :                             shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) );
    2398             : 
    2399       14071 :                             IF( GT_32( shiftedSFM, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) )
    2400             :                             {
    2401         136 :                                 currDampingFactor = 32767; /*1.f Q15*/
    2402         136 :                                 currDampingFactor_e = 0;
    2403         136 :                                 move16();
    2404         136 :                                 move16();
    2405             :                             }
    2406             :                             ELSE
    2407             :                             {
    2408             :                                 // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
    2409       13935 :                                 temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e );
    2410       13935 :                                 alpha = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); // alpha_e
    2411             : 
    2412             :                                 // currDampingFactor = expf( 1.25f * alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) );
    2413       13935 :                                 temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); // tmp_e
    2414       13935 :                                 tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) );
    2415       13935 :                                 Word16 temp1 = mult( 20480 /* 1.25f in Q14 */, alpha );
    2416       13935 :                                 Word16 tmp1_e = add( 1, alpha_e );
    2417       13935 :                                 currDampingFactor = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl_sat( add( 16, tmp_e ), 25 ) ), temp1 ), add( tmp1_e, 6 ), &currDampingFactor_e ) ); // currDampingFactor_e
    2418             : 
    2419             :                                 /* calculate tonal-to-noise ratio and reduce damping for low values*/
    2420             : 
    2421             :                                 Word32 tonalToNoise;
    2422             :                                 Word16 adap;
    2423             :                                 Word16 adap_e;         /*stores exp for adap*/
    2424             :                                 Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/
    2425       13935 :                                 tonalToNoise_e = 9;
    2426       13935 :                                 move16();
    2427       13935 :                                 adap = BASOP_Util_Divide1616_Scale( width, 40, &adap_e );
    2428       13935 :                                 tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, e_ps, adap_e ); /*Q22*/
    2429             : 
    2430       13935 :                                 IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) )
    2431             :                                 {
    2432             :                                     // currDampingFactor += 0.03f * ( ( 10 + adap ) - tonalToNoise );
    2433       10089 :                                     Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); // tmp_e
    2434       10089 :                                     currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, extract_l( Mult_32_32( 983 /*0.03f Q15*/, temp2 ) ), tmp_e, &currDampingFactor );       // currDampingFactor_e
    2435             :                                 }
    2436             :                             }
    2437             : 
    2438       14071 :                             Word32 L_tmp = hPrivateData->prevDampingFactor_IIR_fx[sfb];
    2439       14071 :                             move32();
    2440       14071 :                             L_tmp = L_shl( L_tmp, hPrivateData->prevDampingFactor_IIR_e[sfb] );
    2441       14071 :                             test();
    2442       14071 :                             test();
    2443       14071 :                             IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( L_tmp, MIN16B ) )
    2444             :                             {
    2445        5039 :                                 tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor, currDampingFactor_e, 3277 /* 0.1f in Q15 */, 0 );
    2446        5039 :                                 IF( tmp >= 0 )
    2447             :                                 {
    2448        4995 :                                     hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor;
    2449        4995 :                                     hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e;
    2450        4995 :                                     move16();
    2451        4995 :                                     move16();
    2452             :                                 }
    2453             :                                 ELSE
    2454             :                                 {
    2455          44 :                                     hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */
    2456          44 :                                     hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    2457          44 :                                     move16();
    2458          44 :                                     move16();
    2459             :                                 }
    2460             :                             }
    2461       14071 :                             IF( last_core_acelp )
    2462             :                             {
    2463         878 :                                 hPrivateData->dampingFactorSmoothing[sfb] = 2;
    2464         878 :                                 move16();
    2465             :                             }
    2466             : 
    2467       14071 :                             dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor ); // dampingFactor_e
    2468       14071 :                             dampingFactor = shr( dampingFactor, 1 );
    2469             : 
    2470       14071 :                             gain = Mult_32_16( gain, shl_sat( extract_l( L_min( L_add( dampingFactor, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ );
    2471             : 
    2472       14071 :                             hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor;
    2473       14071 :                             move16();
    2474       14071 :                             hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e;
    2475       14071 :                             move16();
    2476       14071 :                             if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
    2477             :                             {
    2478        6305 :                                 hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 );
    2479        6305 :                                 move16();
    2480             :                             }
    2481             :                         }
    2482             :                         ELSE
    2483             :                         {
    2484     2823331 :                             hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; // exponent : hPrivateData->prevDampingFactor_IIR_e[sfb]
    2485     2823331 :                             hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    2486     2823331 :                             hPrivateData->dampingFactorSmoothing[sfb] = 1;
    2487     2823331 :                             move16();
    2488     2823331 :                             move16();
    2489     2823331 :                             move16();
    2490             :                         }
    2491             : 
    2492     2837402 :                         hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb; // hPrivateData->prevSFB_FIR_TB_e[sfb]
    2493     2837402 :                         hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e;
    2494     2837402 :                         hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; // hPrivateData->prevSFB_IIR_TB_e[sfb]
    2495     2837402 :                         hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb];
    2496     2837402 :                         hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb; // hPrivateData->prevSFB_FIR_SB_e[sfb]
    2497     2837402 :                         hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e;
    2498     2837402 :                         hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; // hPrivateData->prevSFB_IIR_SB_e[sfb]
    2499     2837402 :                         hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb];
    2500     2837402 :                         move16();
    2501     2837402 :                         move16();
    2502     2837402 :                         move16();
    2503     2837402 :                         move16();
    2504     2837402 :                         move16();
    2505     2837402 :                         move16();
    2506     2837402 :                         move16();
    2507     2837402 :                         move16();
    2508             :                     }
    2509             :                     ELSE
    2510             :                     {
    2511       10135 :                         hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb]
    2512       10135 :                         hPrivateData->prevSFB_FIR_TB_e[sfb] = 0;
    2513       10135 :                         hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb]
    2514       10135 :                         hPrivateData->prevSFB_IIR_TB_e[sfb] = 0;
    2515       10135 :                         hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb]
    2516       10135 :                         hPrivateData->prevSFB_FIR_SB_e[sfb] = 0;
    2517       10135 :                         hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb]
    2518       10135 :                         hPrivateData->prevSFB_IIR_SB_e[sfb] = 0;
    2519       10135 :                         hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/
    2520       10135 :                         hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    2521       10135 :                         hPrivateData->dampingFactorSmoothing[sfb] = 2;
    2522       10135 :                         move16();
    2523       10135 :                         move16();
    2524       10135 :                         move16();
    2525       10135 :                         move16();
    2526       10135 :                         move16();
    2527       10135 :                         move16();
    2528       10135 :                         move16();
    2529       10135 :                         move16();
    2530       10135 :                         move16();
    2531       10135 :                         move16();
    2532       10135 :                         move16();
    2533             :                     }
    2534             :                 }
    2535             :             }
    2536             :             ELSE
    2537             :             {
    2538      353246 :                 tmp_e = e_mdct;
    2539      353246 :                 move16();
    2540      353246 :                 sfbEnergyR = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); // sfbEnergyR_e
    2541      353246 :                 sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) );
    2542      353246 :                 gain = L_shl( sfbEnergyR, 16 ); // gain_e
    2543      353246 :                 move32();
    2544      353246 :                 gain_e = sfbEnergyR_e;
    2545             : 
    2546      353246 :                 IF( element_mode > EVS_MONO )
    2547             :                 {
    2548      353246 :                     hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_FIR_TB_e[sfb]
    2549      353246 :                     hPrivateData->prevSFB_FIR_TB_e[sfb] = 0;
    2550      353246 :                     hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb]
    2551      353246 :                     hPrivateData->prevSFB_IIR_TB_e[sfb] = 0;
    2552      353246 :                     hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_TB_e[sfb]
    2553      353246 :                     hPrivateData->prevSFB_FIR_SB_e[sfb] = 0;
    2554      353246 :                     hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; // hPrivateData->prevSFB_IIR_SB_e[sfb]
    2555      353246 :                     hPrivateData->prevSFB_IIR_SB_e[sfb] = 0;
    2556      353246 :                     hPrivateData->prevDampingFactor_IIR_fx[sfb] = MIN16B; /* hPrivateData->prevDampingFactor_IIR_e[sfb]*/
    2557      353246 :                     hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    2558      353246 :                     hPrivateData->dampingFactorSmoothing[sfb] = 2;
    2559      353246 :                     move16();
    2560      353246 :                     move16();
    2561      353246 :                     move16();
    2562      353246 :                     move16();
    2563      353246 :                     move16();
    2564      353246 :                     move16();
    2565      353246 :                     move16();
    2566      353246 :                     move16();
    2567      353246 :                     move16();
    2568      353246 :                     move16();
    2569      353246 :                     move16();
    2570             :                 }
    2571             :             }
    2572             : 
    2573     3200783 :             gain = Mult_32_16( gain, att ); // gain_e
    2574     3200783 :             gain_e = add( gain_e, 0 );
    2575             : 
    2576             :             /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/
    2577     3200783 :             gain = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/
    2578     3200783 :             test();
    2579     3200783 :             test();
    2580     3200783 :             IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) )
    2581             :             {
    2582      418581 :                 gain = L_add( gain, ONE_IN_Q21 ); /* better preservation of original HF band energy */
    2583             :             }
    2584     3200783 :             test();
    2585     3200783 :             test();
    2586     3200783 :             IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) )
    2587             :             {
    2588      569017 :                 gain = L_add( gain, ONE_IN_Q20 );
    2589             :             }
    2590     3200783 :             gain = L_min( gain, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */
    2591     3200783 :             gain = L_max( gain, 0 );
    2592     3200783 :             gain_e = 8; /* stores exponent for gain_fx*/
    2593     3200783 :             move16();
    2594     3200783 :             hPrivateData->igfScfQuantized[sfb] = extract_l( L_shr( gain, Q23 ) ); /*Q0*/
    2595     3200783 :             move16();
    2596             :         }
    2597             :     }
    2598             : 
    2599      588384 :     return;
    2600             : }
    2601             : 
    2602             : /*-------------------------------------------------------------------*
    2603             :  * IGF_CalculateStereoEnvelope_fx()
    2604             :  *
    2605             :  * envelope estimation
    2606             : 
    2607             :  *-------------------------------------------------------------------*/
    2608      130074 : static void IGF_CalculateStereoEnvelope_fx(
    2609             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder              */
    2610             :     const Word32 *pMDCTSpectrum_fx,        /* i  : MDCT spectrum                               */
    2611             :     Word16 pMDCTSpectrum_e,                /* i  : exponent for pMDCTSpectrum_fx               */
    2612             :     const Word32 *pMDCTSpectrumMsInv_fx,   /* i  : MDCT spectrum                               */
    2613             :     Word16 pMDCTSpectrumMsInv_e,           /* i  : expontent for pMDCTSpectrumMsInv_fx         */
    2614             :     const Word32 *pPowerSpectrum_fx,       /* i  : MDCT^2 + MDST^2 spectrum, or estimate       */
    2615             :     Word16 *pPowerSpectrum_e,              /* i  : exponent for pPowerSpectrum_fx              */
    2616             :     const Word32 *pPowerSpectrumMsInv_fx,  /* i  : inverse power spectrum                      */
    2617             :     Word16 *q_pPowerSpectrumMsInv,         /* i  : Q for pPowerSpectrumMsInv_fx         */
    2618             :     const Word16 igfGridIdx,               /* i  : IGF grid index                                     */
    2619             :     const Word16 coreMsMask[N_MAX],        /* i  : line wise ms Mask                                  */
    2620             :     const Word16 isTransient,              /* i  : flag indicating if transient is detected           */
    2621             :     const Word16 last_core_acelp,          /* i  : indicator if last frame was ACELP core             */
    2622             :     const Word16 mct_on )
    2623             : {
    2624             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    2625             :     H_IGF_GRID hGrid;
    2626             :     Word16 *swb_offset;
    2627             :     Word16 sfb;   /* this is the actual scalefactor band */
    2628             :     Word16 width; /* this is width in subbands of the actual scalefactor band */
    2629             :     Word16 tile_idx;
    2630             :     Word16 strt_cpy;
    2631             :     Word32 gain_fx; /* the gain which has to be applied to the source tile to get the destination energy */
    2632             :     Word16 sb;
    2633             :     Word16 sfbEnergyR_fx;
    2634             :     Word32 sfbEnergyC_fx; /* the energy of the destination region of the tile */
    2635             :     Word32 sfbEnergyTileR_fx;
    2636             :     Word32 sfbEnergyTileC_fx; /* the energy of the destination region of the tile */
    2637             :     Word16 tmp, x, y;
    2638             :     Word16 mean_x_fx, mean_y_fx;
    2639             :     Word32 mean_xy_fx, mean_x2_fx;
    2640             :     Word16 slope_fx;
    2641             :     Word16 tmp_tb_fx;
    2642             :     Word16 tmp_sb_fx;
    2643             :     Word16 sfbCnt;
    2644             :     Word32 tileSrcSpec_fx[MAX_IGF_SFB_LEN];
    2645             :     Word16 sfm;
    2646             :     Word16 crest;
    2647             :     Word16 temp;
    2648             :     Word16 mean_x_e, mean_y_e;             /*Stores exponent for mean_x and mean_y respectively*/
    2649             :     Word16 mean_xy_e, mean_x2_e;           /*stores exponent for mean_xy and mean_x2 respectively*/
    2650             :     Word16 tileSrcSpec_e[MAX_IGF_SFB_LEN]; /*Exponent for tileSrcSpec_fx*/
    2651             :     Word16 sfbEnergyTileR_e;               /*Exponent for sfbEnergyTileR_fx*/
    2652             :     Word16 sfbEnergyTileC_e;               /*Exponent for sfbEnergyTileC_fx*/
    2653             :     Word16 sfbEnergyC_e;                   /*Exponent for sfbEnergyC_fx*/
    2654             :     Word16 gain_e;                         /*exponent for gain_fx*/
    2655             :     Word16 crest_exp;                      /*stores exponent for output from crest*/
    2656             :     Word16 sfm_exp;                        /*stores exponent for ouput from sfm*/
    2657             :     Word16 tmp_tb_e;                       /*Stores exponent for tmp_tb_fx*/
    2658             :     Word16 tmp_sb_e;                       /*stores exponent for tmp_sb_fx*/
    2659             :     Word16 slope_e;                        /*stores exponent for slope_fx*/
    2660             :     Word16 sfbEnergyR_e;                   /*stores exponent for sfbEnergyR*/
    2661             :     Word16 tmp_e;
    2662             :     Word32 temp_pPowerSpectrumMsInv[N_MAX], length;
    2663      130074 :     Word16 q_temp_pPowerSpectrumMsInv = Q31, i;
    2664      130074 :     move16();
    2665             : 
    2666      130074 :     IF( pPowerSpectrumMsInv_fx != NULL )
    2667             :     {
    2668      107600 :         length = N_MAX;
    2669      107600 :         move16();
    2670      107600 :         if ( mct_on )
    2671             :         {
    2672       55168 :             length = L_FRAME48k;
    2673       55168 :             move16();
    2674             :         }
    2675   115987280 :         FOR( i = 0; i < length; i++ )
    2676             :         {
    2677   115879680 :             IF( pPowerSpectrumMsInv_fx[i] != 0 )
    2678             :             {
    2679    82719792 :                 q_temp_pPowerSpectrumMsInv = s_min( q_temp_pPowerSpectrumMsInv, add( q_pPowerSpectrumMsInv[i], norm_l( pPowerSpectrumMsInv_fx[i] ) ) );
    2680             :             }
    2681             :         }
    2682   115987280 :         FOR( i = 0; i < length; i++ )
    2683             :         {
    2684   115879680 :             temp_pPowerSpectrumMsInv[i] = L_shl( pPowerSpectrumMsInv_fx[i], sub( q_temp_pPowerSpectrumMsInv, q_pPowerSpectrumMsInv[i] ) );
    2685   115879680 :             move32();
    2686             :         }
    2687             :     }
    2688             : 
    2689      130074 :     hPrivateData = &hIGFEnc->igfData;
    2690      130074 :     hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx];
    2691      130074 :     swb_offset = hGrid->swb_offset;
    2692      130074 :     move16();
    2693             : 
    2694      130074 :     IF( igfGridIdx != IGF_GRID_LB_NORM )
    2695             :     {
    2696       32444 :         FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ )
    2697             :         {
    2698             :             /* reset filter */
    2699       26860 :             hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_TB_e[sfbCnt]
    2700       26860 :             hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_TB_e[sfbCnt]
    2701       26860 :             hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_FIR_SB_e[sfbCnt]
    2702       26860 :             hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; // exponent : hPrivateData->prevSFB_IIR_SB_e[sfbCnt]
    2703       26860 :             hPrivateData->prevSFB_FIR_TB_e[sfbCnt] = 0;
    2704       26860 :             hPrivateData->prevSFB_IIR_TB_e[sfbCnt] = 0;
    2705       26860 :             hPrivateData->prevSFB_FIR_SB_e[sfbCnt] = 0;
    2706       26860 :             hPrivateData->prevSFB_IIR_SB_e[sfbCnt] = 0;
    2707       26860 :             move16();
    2708       26860 :             move16();
    2709       26860 :             move16();
    2710       26860 :             move16();
    2711       26860 :             move16();
    2712       26860 :             move16();
    2713       26860 :             move16();
    2714       26860 :             move16();
    2715             :         }
    2716             :     }
    2717             : 
    2718      130074 :     IF( pPowerSpectrum_fx )
    2719             :     {
    2720    52245488 :         FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ )
    2721             :         {
    2722             :             /*hPrivateData->logSpec[sb] = max( 0, (Word16) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );*/
    2723    52137888 :             IF( LE_32( 1, pPowerSpectrum_fx[sb] ) )
    2724             :             {
    2725    52134689 :                 hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ), 25 ) );
    2726             :             }
    2727             :             ELSE
    2728             :             {
    2729        3199 :                 hPrivateData->logSpec[sb] = 0; /*max(0,-126) is always 0*/
    2730             :             }
    2731    52137888 :             move16();
    2732             :         }
    2733             :     }
    2734             : 
    2735      526406 :     FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ )
    2736             :     {
    2737      396332 :         strt_cpy = hGrid->sbWrap[tile_idx];
    2738      396332 :         move16();
    2739             : 
    2740     1067168 :         FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ )
    2741             :         {
    2742      670836 :             width = sub( swb_offset[sfb + 1], swb_offset[sfb] );
    2743      670836 :             sfbEnergyTileR_fx = EPSILON_FX;
    2744      670836 :             sfbEnergyTileC_fx = EPSILON_FX;
    2745      670836 :             sfbEnergyC_fx = EPSILON_FX;
    2746      670836 :             sfbEnergyTileR_e = 0;
    2747      670836 :             sfbEnergyTileC_e = 0;
    2748      670836 :             sfbEnergyC_e = 0;
    2749      670836 :             move16();
    2750      670836 :             move16();
    2751      670836 :             move16();
    2752      670836 :             move32();
    2753      670836 :             move32();
    2754      670836 :             move32();
    2755      670836 :             IF( pPowerSpectrum_fx )
    2756             :             {
    2757             :                 Word16 final_exp;
    2758             :                 Word16 norm_exp;
    2759             :                 Word32 scaled_value;
    2760      556278 :                 tmp = strt_cpy;
    2761      556278 :                 move16();
    2762             : 
    2763    29558038 :                 FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
    2764             :                 {
    2765    29001760 :                     IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) )
    2766             :                     {
    2767    17336628 :                         sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/
    2768    17336628 :                         norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] );
    2769    17336628 :                         final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp );
    2770    17336628 :                         scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp );
    2771    17336628 :                         sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e );                /*resultant exponent is stored in sfbEnergyTileR_e*/
    2772    17336628 :                         sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], sub( 31, q_pPowerSpectrumMsInv[strt_cpy] ), &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/
    2773    17336628 :                         tileSrcSpec_fx[strt_cpy - tmp] = temp_pPowerSpectrumMsInv[strt_cpy];                                                                                                                  /*resultant exponent is stored in tileSrcSpec_e*/
    2774    17336628 :                         tileSrcSpec_e[strt_cpy - tmp] = sub( 31, q_temp_pPowerSpectrumMsInv );
    2775             :                     }
    2776             :                     ELSE
    2777             :                     {
    2778    11665132 :                         sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/
    2779    11665132 :                         norm_exp = norm_l( pMDCTSpectrum_fx[strt_cpy] );
    2780    11665132 :                         final_exp = sub( pMDCTSpectrum_e, norm_exp );
    2781    11665132 :                         scaled_value = L_shl( pMDCTSpectrum_fx[strt_cpy], norm_exp );
    2782    11665132 :                         sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/
    2783    11665132 :                         sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e[strt_cpy], &sfbEnergyTileC_e );       /*resultant exponent is stored in sfbEnergyTileC_e*/
    2784    11665132 :                         tileSrcSpec_fx[strt_cpy - tmp] = pPowerSpectrum_fx[strt_cpy];                                                                                                          /*resultant exponent is stored in tileSrcSpec_e*/
    2785    11665132 :                         tileSrcSpec_e[strt_cpy - tmp] = pPowerSpectrum_e[strt_cpy];
    2786             :                     }
    2787    29001760 :                     move32();
    2788    29001760 :                     move16();
    2789    29001760 :                     strt_cpy = add( strt_cpy, 1 );
    2790             :                 }
    2791             : 
    2792      556278 :                 sfbEnergyTileR_fx = BASOP_Util_Divide3216_Scale( sfbEnergyTileR_fx, width, &tmp_e );
    2793      556278 :                 sfbEnergyTileR_e = sub( add( sfbEnergyTileR_e, tmp_e ), 15 ); /*stores the resultant exponent for sfbEnergyTileR_fx*/
    2794             : 
    2795             :                 /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/
    2796      556278 :                 temp = BASOP_Util_Divide3232_Scale( sfbEnergyC_fx, L_add( sfbEnergyTileC_fx, EPSILON_FX ), &tmp_e );
    2797      556278 :                 gain_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) );
    2798      556278 :                 gain_fx = Mult_32_16( sfbEnergyTileR_fx, temp );
    2799      556278 :                 gain_e = add( 16, add( gain_e, sfbEnergyTileR_e ) ); /*stores the resultant exponent for gain_fx*/
    2800             : 
    2801      556278 :                 IF( !isTransient )
    2802             :                 {
    2803             :                     Word16 diffSFM_fx;
    2804             :                     Word16 shiftedSFM_fx;
    2805             :                     Word16 shiftedSFM_e; /*stores the resultant exponent for shiftedSFM_fx*/
    2806      556278 :                     shiftedSFM_fx = 0;
    2807      556278 :                     shiftedSFM_e = 0;
    2808      556278 :                     move16();
    2809      556278 :                     move16();
    2810             : 
    2811             :                     // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]);
    2812      556278 :                     sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] );
    2813      556278 :                     crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] );
    2814      556278 :                     tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e );
    2815      556278 :                     tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/
    2816             : 
    2817             :                     // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp);
    2818      556278 :                     sfm = IGF_getSFM_ivas_fx( &sfm_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) );
    2819      556278 :                     crest = IGF_getCrest_ivas( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) );
    2820      556278 :                     tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e );
    2821      556278 :                     tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/
    2822             : 
    2823      556278 :                     IF( last_core_acelp || hPrivateData->wasTransient )
    2824             :                     {
    2825       10823 :                         hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] values stored in hPrivateData->sfb_tb_e[sfb] */
    2826       10823 :                         hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] values stored in hPrivateData->sfb_sb_e[sfb]*/
    2827       10823 :                         hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_sb_e;
    2828       10823 :                         hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_sb_e;
    2829       10823 :                         hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e;
    2830       10823 :                         hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e;
    2831       10823 :                         move16();
    2832       10823 :                         move16();
    2833       10823 :                         move16();
    2834       10823 :                         move16();
    2835       10823 :                         move16();
    2836       10823 :                         move16();
    2837       10823 :                         move16();
    2838       10823 :                         move16();
    2839             :                     }
    2840             :                     ELSE
    2841             :                     {
    2842             :                         /* Purpose of this block:
    2843             :                         -to make the exponent of hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] equal to that of tmp_tb_fx
    2844             :                         -to make the exponent of hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] equal to that of tmp_sb_fx
    2845             :                         */
    2846             :                         Word16 diff_sb_e; /*stores the difference of exponents for sb*/
    2847             :                         Word16 diff_tb_e; /*stores the difference of exponents for tb*/
    2848      545455 :                         diff_sb_e = sub( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] );
    2849      545455 :                         diff_tb_e = sub( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] );
    2850      545455 :                         IF( LE_16( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ) )
    2851             :                         {
    2852      536343 :                             tmp_tb_fx = shl( tmp_tb_fx, diff_tb_e );
    2853      536343 :                             tmp_tb_e = hPrivateData->sfb_tb_e[sfb];
    2854      536343 :                             move16();
    2855             :                         }
    2856             :                         ELSE
    2857             :                         {
    2858        9112 :                             hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], diff_tb_e );
    2859        9112 :                             hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], diff_tb_e );
    2860        9112 :                             move16();
    2861        9112 :                             move16();
    2862        9112 :                             hPrivateData->prevSFB_FIR_TB_e[sfb] = tmp_tb_e;
    2863        9112 :                             hPrivateData->prevSFB_IIR_TB_e[sfb] = tmp_tb_e;
    2864        9112 :                             move16();
    2865        9112 :                             move16();
    2866             :                         }
    2867      545455 :                         IF( LE_16( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ) )
    2868             :                         {
    2869      536144 :                             tmp_sb_fx = shl( tmp_sb_fx, diff_sb_e );
    2870      536144 :                             tmp_sb_e = hPrivateData->sfb_sb_e[sfb];
    2871      536144 :                             move16();
    2872             :                         }
    2873             :                         ELSE
    2874             :                         {
    2875        9311 :                             hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], diff_sb_e );
    2876        9311 :                             hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], diff_sb_e );
    2877        9311 :                             move16();
    2878        9311 :                             move16();
    2879        9311 :                             hPrivateData->prevSFB_FIR_SB_e[sfb] = tmp_sb_e;
    2880        9311 :                             hPrivateData->prevSFB_IIR_SB_e[sfb] = tmp_sb_e;
    2881        9311 :                             move16();
    2882        9311 :                             move16();
    2883             :                         }
    2884             :                     }
    2885      556278 :                     tmp_tb_fx = shr_sat( tmp_tb_fx, sub( 2, tmp_tb_e ) );                                                                                                                                                                                                           /* Since we're limiting max value to 2.7f we can saturate to Q13 */
    2886      556278 :                     tmp_sb_fx = shr_sat( tmp_sb_fx, sub( 2, tmp_sb_e ) );                                                                                                                                                                                                           /* Since we're limiting max value to 2.7f we can saturate to Q13 */
    2887      556278 :                     hPrivateData->SFM_tb_fx[sfb] = add_sat( tmp_tb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_TB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_TB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
    2888      556278 :                     hPrivateData->SFM_tb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_tb_fx[sfb] );                                                                                                                                                                       /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/
    2889      556278 :                     hPrivateData->SFM_sb_fx[sfb] = add_sat( tmp_sb_fx, add_sat( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], sub( 2, hPrivateData->prevSFB_FIR_SB_e[sfb] ) ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], sub( 3, hPrivateData->prevSFB_IIR_SB_e[sfb] ) ) ) ); /* Since we're limiting max value to 2.7f we can saturate to Q13 */
    2890      556278 :                     hPrivateData->SFM_sb_fx[sfb] = s_min( 22118 /*2.7f Q13*/, hPrivateData->SFM_sb_fx[sfb] );                                                                                                                                                                       /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/
    2891      556278 :                     move16();
    2892      556278 :                     move16();
    2893      556278 :                     move16();
    2894      556278 :                     move16();
    2895      556278 :                     hPrivateData->sfb_sb_e[sfb] = 2;
    2896      556278 :                     hPrivateData->sfb_tb_e[sfb] = 2;
    2897      556278 :                     move16();
    2898      556278 :                     move16();
    2899             : 
    2900      556278 :                     diffSFM_fx = sub( hPrivateData->SFM_sb_fx[sfb], hPrivateData->SFM_tb_fx[sfb] ); /*Q13*/
    2901             : 
    2902      556278 :                     test();
    2903      556278 :                     IF( diffSFM_fx > 0 && LT_16( hPrivateData->SFM_tb_fx[sfb], 819 /*0.1 Q13*/ ) ) /* check whether target SFB is more tonal than source SFB */
    2904        1390 :                     {
    2905             :                         Word16 currDampingFactor_fx, dampingFactor_fx, alpha_fx;
    2906             :                         Word16 threshold_e, threshold_fx, alpha_e, currDampingFactor_e, dampingFactor_e;
    2907             :                         /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */
    2908        1390 :                         x = 1;
    2909        1390 :                         mean_x_fx = mean_y_fx = 0;
    2910        1390 :                         mean_xy_fx = mean_x2_fx = 0;
    2911        1390 :                         mean_x_e = mean_y_e = 15;
    2912        1390 :                         mean_xy_e = mean_x2_e = 31;
    2913        1390 :                         move16();
    2914        1390 :                         move16();
    2915        1390 :                         move16();
    2916        1390 :                         move16();
    2917        1390 :                         move16();
    2918        1390 :                         move16();
    2919        1390 :                         move16();
    2920        1390 :                         move16();
    2921        1390 :                         move16();
    2922       77394 :                         FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ )
    2923             :                         {
    2924       76004 :                             mean_x_fx = add( mean_x_fx, x );                   /*Q0*/
    2925       76004 :                             mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/
    2926             : 
    2927             :                             /*y = 20 * (Word16) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/
    2928       76004 :                             IF( LT_32( pPowerSpectrum_fx[sb], 1 ) )
    2929             :                             {
    2930           0 :                                 y = 20 * ( -18 );
    2931           0 :                                 move16();
    2932             :                             }
    2933             :                             ELSE
    2934             :                             {
    2935       76004 :                                 y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/
    2936             :                             }
    2937       76004 :                             mean_y_fx = add( mean_y_fx, y );                   /*Q0*/
    2938       76004 :                             mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/
    2939             : 
    2940       76004 :                             x = add( x, 1 );
    2941             :                         }
    2942        1390 :                         mean_y_fx = BASOP_Util_Divide1616_Scale( mean_y_fx, width, &tmp_e ); /* resultant exp stores in mean_y_e*/
    2943        1390 :                         mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) );
    2944        1390 :                         mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* resultant exp stores in mean_x_e*/
    2945        1390 :                         mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) );
    2946        1390 :                         mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* resultant exp stores in mean_xy_e*/
    2947        1390 :                         mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) );
    2948        1390 :                         mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* resultant exp stores in mean_x2_e*/
    2949        1390 :                         mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) );
    2950             : 
    2951             :                         /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/
    2952        1390 :                         slope_fx = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e );
    2953        1390 :                         slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); /*stores resultant exponent for slope_fx*/
    2954             : 
    2955             :                         /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping)
    2956             :                                    or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/
    2957        1390 :                         threshold_fx = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); /*stores resultant exponent for threshold_fx*/
    2958        1390 :                         test();
    2959        1390 :                         IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), negate( threshold_fx ), add( threshold_e, 16 ) ), -1 ) )
    2960             :                         {
    2961          39 :                             Word16 shift = shr( width, 1 );
    2962             :                             // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift );
    2963          39 :                             sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) );
    2964          39 :                             crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) );
    2965          39 :                             shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e );
    2966             :                         }
    2967        1351 :                         ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), threshold_fx, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) )
    2968             :                         {
    2969             :                             Word16 shift;
    2970           2 :                             shift = shr( width, 1 );
    2971             :                             // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift );
    2972           2 :                             sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) );
    2973           2 :                             crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) );
    2974           2 :                             shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e );
    2975             :                         }
    2976        1390 :                         IF( shiftedSFM_fx )
    2977             :                         {
    2978          41 :                             shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); /* stores resultant exponent for shiftedSFM_fx*/
    2979             :                         }
    2980             : 
    2981             :                         // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f );
    2982        1390 :                         temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e );
    2983        1390 :                         alpha_fx = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); /* exponent is alpha_e*/
    2984        1390 :                         temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e );
    2985        1390 :                         tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); /* stores resultant exponent for temp */
    2986             : 
    2987             :                         // currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) );
    2988        1390 :                         currDampingFactor_fx = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), 25 ) ), alpha_fx ), add( alpha_e, 6 ), &currDampingFactor_e ) ); /*exp is currDampingFactor_e*/
    2989             : 
    2990        1390 :                         IF( GT_32( shiftedSFM_fx, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) )
    2991             :                         {
    2992           8 :                             currDampingFactor_fx = 32767; /*1.f Q15*/
    2993           8 :                             currDampingFactor_e = 0;
    2994           8 :                             move16();
    2995           8 :                             move16();
    2996             :                         }
    2997        1390 :                         test();
    2998        1390 :                         test();
    2999        1390 :                         IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( hPrivateData->prevDampingFactor_IIR_fx[sfb], L_shl( -1, sub( 15, hPrivateData->prevDampingFactor_IIR_e[sfb] ) ) ) )
    3000             :                         {
    3001         675 :                             tmp = BASOP_Util_Cmp_Mant32Exp( currDampingFactor_fx, currDampingFactor_e, 3277, 0 );
    3002         675 :                             IF( tmp >= 0 )
    3003             :                             {
    3004         673 :                                 hPrivateData->prevDampingFactor_IIR_fx[sfb] = currDampingFactor_fx;
    3005         673 :                                 hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e;
    3006             :                             }
    3007             :                             ELSE
    3008             :                             {
    3009           2 :                                 hPrivateData->prevDampingFactor_IIR_fx[sfb] = 3277; /* 0.1 in Q15 */
    3010           2 :                                 hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    3011             :                             }
    3012             : 
    3013         675 :                             move16();
    3014         675 :                             move16();
    3015             :                         }
    3016             : 
    3017             :                         {
    3018             :                             Word32 tonalToNoise;
    3019             :                             Word16 adap;
    3020             :                             Word16 adap_e;         /*stores exp for adap*/
    3021             :                             Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/
    3022        1390 :                             tonalToNoise_e = 9;    /*stores exponent for tonalToNoise*/
    3023        1390 :                             move16();
    3024        1390 :                             adap = BASOP_Util_Divide1616_Scale( width, 30, &adap_e );
    3025        1390 :                             tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/
    3026        1390 :                             IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) )
    3027             :                             {
    3028             :                                 // currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise );
    3029        1255 :                                 Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); /* resultant exp is tmp_e*/
    3030        1255 :                                 currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, extract_l( Mult_32_16( temp2, 3277 /*0.1f Q15*/ ) ), tmp_e, &currDampingFactor_fx ); /*stores resultant exp for currDampingFactor_fx*/
    3031             :                             }
    3032             :                         }
    3033             : 
    3034        1390 :                         dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor_fx );
    3035        1390 :                         dampingFactor_fx = shr( dampingFactor_fx, 1 ); /* resultant exponent is dampingFactor_e*/
    3036        1390 :                         IF( NE_16( BASOP_Util_Cmp_Mant32Exp( dampingFactor_fx, add( dampingFactor_e, 16 ), shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ), add( hPrivateData->prevDampingFactor_IIR_e[sfb], 16 ) ), -1 ) )
    3037             :                         {
    3038             :                             // do nothing
    3039             :                         }
    3040             :                         ELSE
    3041             :                         {
    3042         617 :                             dampingFactor_fx = shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ); /* resultant exponent is hPrivateData->prevDampingFactor_IIR_e[sfb]*/
    3043         617 :                             dampingFactor_e = hPrivateData->prevDampingFactor_IIR_e[sfb];
    3044         617 :                             move16();
    3045             :                         }
    3046        1390 :                         IF( dampingFactor_e < 0 )
    3047             :                         {
    3048          66 :                             dampingFactor_fx = shl( dampingFactor_fx, dampingFactor_e );
    3049          66 :                             dampingFactor_e = 0;
    3050          66 :                             move16();
    3051             :                         }
    3052        1390 :                         gain_fx = Mult_32_16( gain_fx, shl_sat( extract_l( L_min( L_add( dampingFactor_fx, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ );
    3053             : 
    3054        1390 :                         hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor_fx;
    3055        1390 :                         hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e;
    3056        1390 :                         move16();
    3057        1390 :                         move16();
    3058        1390 :                         if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 )
    3059             :                         {
    3060         795 :                             hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 );
    3061         795 :                             move16();
    3062             :                         }
    3063             :                     }
    3064             :                     ELSE
    3065             :                     {
    3066      554888 :                         hPrivateData->prevDampingFactor_IIR_fx[sfb] = -( 1 << 15 ); /* resultant exp which is 0 stores in hPrivateData->prevDampingFactor_IIR_e[sfb]*/
    3067      554888 :                         hPrivateData->prevDampingFactor_IIR_e[sfb] = 0;
    3068      554888 :                         hPrivateData->dampingFactorSmoothing[sfb] = 1;
    3069      554888 :                         move16();
    3070      554888 :                         move16();
    3071      554888 :                         move16();
    3072             :                     }
    3073             : 
    3074      556278 :                     hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb_fx;
    3075      556278 :                     hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb];
    3076      556278 :                     hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb_fx;
    3077      556278 :                     hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb];
    3078      556278 :                     hPrivateData->prevSFB_FIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb];
    3079      556278 :                     hPrivateData->prevSFB_IIR_TB_e[sfb] = hPrivateData->sfb_tb_e[sfb];
    3080      556278 :                     hPrivateData->prevSFB_FIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb];
    3081      556278 :                     hPrivateData->prevSFB_IIR_SB_e[sfb] = hPrivateData->sfb_sb_e[sfb];
    3082      556278 :                     move16();
    3083      556278 :                     move16();
    3084      556278 :                     move16();
    3085      556278 :                     move16();
    3086      556278 :                     move16();
    3087      556278 :                     move16();
    3088      556278 :                     move16();
    3089      556278 :                     move16();
    3090             :                 }
    3091             :                 ELSE
    3092             :                 {
    3093           0 :                     hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0;
    3094           0 :                     hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0;
    3095           0 :                     hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0;
    3096           0 :                     hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0;
    3097           0 :                     hPrivateData->prevSFB_FIR_TB_e[sfb] = 0;
    3098           0 :                     hPrivateData->prevSFB_IIR_TB_e[sfb] = 0;
    3099           0 :                     hPrivateData->prevSFB_FIR_SB_e[sfb] = 0;
    3100           0 :                     hPrivateData->prevSFB_IIR_SB_e[sfb] = 0;
    3101             : 
    3102           0 :                     hPrivateData->dampingFactorSmoothing[sfb] = 2;
    3103           0 :                     move16();
    3104           0 :                     move16();
    3105           0 :                     move16();
    3106           0 :                     move16();
    3107           0 :                     move16();
    3108           0 :                     move16();
    3109           0 :                     move16();
    3110           0 :                     move16();
    3111           0 :                     move16();
    3112             :                 }
    3113             :             }
    3114             :             ELSE
    3115             :             {
    3116      114558 :                 tmp_e = pMDCTSpectrum_e;
    3117      114558 :                 sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) );
    3118      114558 :                 sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); /* stores resultant exponent for sfbEnergyR_fx*/
    3119      114558 :                 gain_fx = sfbEnergyR_fx;                               /*resultant exponent stored in gain_e=sfbEnergyR_e*/
    3120      114558 :                 move32();
    3121      114558 :                 gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/
    3122             : 
    3123      114558 :                 hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0;
    3124      114558 :                 hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0;
    3125      114558 :                 hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0;
    3126      114558 :                 hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0;
    3127      114558 :                 hPrivateData->prevSFB_FIR_TB_e[sfb] = 0;
    3128      114558 :                 hPrivateData->prevSFB_IIR_TB_e[sfb] = 0;
    3129      114558 :                 hPrivateData->prevSFB_FIR_SB_e[sfb] = 0;
    3130      114558 :                 hPrivateData->prevSFB_IIR_SB_e[sfb] = 0;
    3131      114558 :                 move16();
    3132      114558 :                 move16();
    3133      114558 :                 move16();
    3134      114558 :                 move16();
    3135      114558 :                 move16();
    3136      114558 :                 move16();
    3137      114558 :                 move16();
    3138      114558 :                 move16();
    3139             :             }
    3140             :             /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/
    3141      670836 :             gain_fx = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain_fx ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/
    3142      670836 :             test();
    3143      670836 :             test();
    3144      670836 :             if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) )
    3145             :             {
    3146      136501 :                 gain_fx = L_add( gain_fx, ONE_IN_Q21 ); /* better preservation of original HF band energy */
    3147             :             }
    3148      670836 :             test();
    3149      670836 :             test();
    3150      670836 :             if ( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) )
    3151             :             {
    3152      268540 :                 gain_fx = L_add( gain_fx, ONE_IN_Q20 );
    3153             :             }
    3154      670836 :             gain_fx = L_min( gain_fx, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */
    3155      670836 :             gain_fx = L_max( gain_fx, 0 );
    3156      670836 :             gain_e = 8; /* stores exponent for gain_fx*/
    3157      670836 :             move16();
    3158      670836 :             hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 23 ) ); /*Q0*/
    3159      670836 :             move16();
    3160             :         }
    3161             :     }
    3162             : 
    3163      130074 :     return;
    3164             : }
    3165             : 
    3166             : 
    3167             : /*-------------------------------------------------------------------*
    3168             :  * IGF_WriteEnvelope()
    3169             :  *
    3170             :  * writes IGF SCF values
    3171             :  *-------------------------------------------------------------------*/
    3172             : /*! r: number of bits writen */
    3173     1408254 : static Word16 IGF_WriteEnvelope_ivas(
    3174             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                                               */
    3175             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle                                                     */
    3176             :     Word16 *pBitOffset,                    /* i  : ptr to bitOffset counter                                                     */
    3177             :     const Word16 igfGridIdx,               /* i  : igf grid index see declaration of IGF_GRID_IDX for details                   */
    3178             :     const Word16 isIndepFlag,              /* i  : if 1 frame is independent, 0 = frame is coded with data from previous frame  */
    3179             :     Word16 *igfAllZero                     /* i  : returns 1 if all IGF scfs are zero, else 0                                   */
    3180             : )
    3181             : {
    3182             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    3183             :     H_IGF_GRID hGrid;
    3184             :     Word16 sfb;
    3185             :     Word16 totBitCount;
    3186             :     Word16 startBitCount;
    3187             : 
    3188     1408254 :     startBitCount = *pBitOffset;
    3189     1408254 :     totBitCount = 0;
    3190     1408254 :     *igfAllZero = 1;
    3191     1408254 :     move16();
    3192     1408254 :     move16();
    3193     1408254 :     move16();
    3194     1408254 :     hPrivateData = &hIGFEnc->igfData;
    3195     1408254 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    3196             : 
    3197     1604162 :     FOR( sfb = hGrid->startSfb; sfb < hGrid->stopSfb; sfb++ )
    3198             :     {
    3199     1578152 :         IF( hPrivateData->igfScfQuantized[sfb] != 0 )
    3200             :         {
    3201     1382244 :             *igfAllZero = 0;
    3202     1382244 :             move16();
    3203     1382244 :             BREAK;
    3204             :         }
    3205             :     }
    3206             : 
    3207     1408254 :     IF( *igfAllZero != 0 )
    3208             :     {
    3209       26010 :         IGF_write_bit_fx( hBstr, pBitOffset, 1 );
    3210             : 
    3211       26010 :         if ( NULL == hBstr )
    3212             :         {
    3213       12978 :             IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
    3214             :         }
    3215             : 
    3216       26010 :         IGFSCFEncoderReset_fx( &hPrivateData->hIGFSCFArithEnc );
    3217             : 
    3218       26010 :         if ( NULL == hBstr )
    3219             :         {
    3220       12978 :             IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
    3221             :         }
    3222             :     }
    3223             :     ELSE
    3224             :     {
    3225     1382244 :         IGF_write_bit_fx( hBstr, pBitOffset, 0 );
    3226             : 
    3227     1382244 :         if ( NULL == hBstr )
    3228             :         {
    3229      676818 :             IGFSCFEncoderSaveContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
    3230             :         }
    3231             : 
    3232     1382244 :         *pBitOffset = IGFSCFEncoderEncode_ivas_fx( &hPrivateData->hIGFSCFArithEnc, hBstr, *pBitOffset, &hPrivateData->igfScfQuantized[hGrid->startSfb], igfGridIdx, isIndepFlag );
    3233     1382244 :         move16();
    3234             : 
    3235     1382244 :         if ( NULL == hBstr )
    3236             :         {
    3237      676818 :             IGFSCFEncoderRestoreContextState_fx( &hPrivateData->hIGFSCFArithEnc, igfGridIdx );
    3238             :         }
    3239             :     }
    3240     1408254 :     totBitCount = sub( *pBitOffset, startBitCount );
    3241             : 
    3242     1408254 :     return totBitCount;
    3243             : }
    3244             : 
    3245             : 
    3246             : /*-------------------------------------------------------------------*
    3247             :  * IGF_Whitening()
    3248             :  *
    3249             :  * calculates the IGF whitening levels by SFM and crest
    3250             :  *-------------------------------------------------------------------*/
    3251             : 
    3252      718458 : static void IGF_Whitening_ivas_fx(
    3253             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  :     | instance handle of IGF Encoder               */
    3254             :     Word32 *powerSpectrum,                 /* i  : Q31 | MDCT/MDST power spectrum                     */
    3255             :     Word16 *powerSpectrum_e,               /* i  : Q31 | MDCT/MDST power spectrum                     */
    3256             :     const Word16 igfGridIdx,               /* i  : Q0  | IGF grid index                               */
    3257             :     const Word16 isTransient,              /* i  : Q0  | flag indicating if transient is detected     */
    3258             :     const Word16 last_core_acelp,          /* i  : Q0  | indicator if last frame was ACELP core       */
    3259             :     const Word16 isTNSActive,              /* i  : Q0  | indicator if TNS is active                   */
    3260             :     const Word16 sp_aud_decision0,         /* i  : Q0  | first stage classifier decision              */
    3261             :     const Word32 brate,                    /* i  : Q0  | bitrate                                      */
    3262             :     const Word16 element_mode              /* i  : Q0  | element mode                                 */
    3263             : )
    3264             : {
    3265             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    3266             :     H_IGF_GRID hGrid;
    3267             :     Word16 p; /*Q0*/
    3268             :     Word16 tmp;
    3269             :     Word16 tmp_e;
    3270             :     Word16 SFM_src;
    3271             :     Word16 SFM_tar;
    3272             :     Word16 SFM_src_e;
    3273             :     Word16 SFM_tar_e;
    3274             :     Word16 num_Tiles;
    3275             :     Word16 SFM;
    3276             :     Word16 crest_e;
    3277             : 
    3278      718458 :     SFM = -ONE_IN_Q13; /*1.0f Q13*/
    3279      718458 :     move16();
    3280             : 
    3281      718458 :     hPrivateData = &hIGFEnc->igfData;
    3282      718458 :     hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx];
    3283             : 
    3284      718458 :     IF( NE_16( igfGridIdx, IGF_GRID_LB_NORM ) )
    3285             :     {
    3286      190063 :         FOR( p = 0; p < hGrid->nTiles; p++ )
    3287             :         {
    3288             :             /* reset filter */
    3289      148029 :             hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 );
    3290      148029 :             hPrivateData->prevSFM_IIR[p] = 0;
    3291      148029 :             move16();
    3292             : 
    3293             :             /* preset values: */
    3294      148029 :             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    3295      148029 :             move16();
    3296             :         }
    3297             :     }
    3298             : 
    3299     7903038 :     FOR( p = 0; p < IGF_MAX_TILES; p++ )
    3300             :     {
    3301             :         /* update prev data: */
    3302     7184580 :         hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p];
    3303             :         /* preset values: */
    3304     7184580 :         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    3305     7184580 :         move16();
    3306     7184580 :         move16();
    3307             :     }
    3308             : 
    3309      718458 :     test();
    3310      718458 :     IF( !( isTransient || hPrivateData->wasTransient ) )
    3311             :     {
    3312      673674 :         IF( powerSpectrum )
    3313             :         {
    3314     3071249 :             FOR( p = 0; p < hGrid->nTiles; p++ )
    3315             :             {
    3316             :                 Word16 sb;
    3317             : 
    3318     2399199 :                 IF( isTNSActive )
    3319             :                 {
    3320    17905515 :                     FOR( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ )
    3321             :                     {
    3322    17726418 :                         IF( LT_32( powerSpectrum[sb], 1 ) )
    3323       30784 :                         hPrivateData->logSpec[sb] = 0; /* max(0,FLT_MIN_EXP )*/
    3324             :                         ELSE
    3325    17695634 :                             hPrivateData->logSpec[sb] = extract_l( L_max( 0, L_shr( L_add( BASOP_Util_Log2( powerSpectrum[sb] ), L_shl( powerSpectrum_e[sb], Q25 ) ), Q25 ) ) );
    3326    17726418 :                         move16();
    3327             :                     }
    3328             :                 }
    3329             : 
    3330             :                 /* if current tile contains only a single SFB, reuse already computed SFM values */
    3331     2399199 :                 test();
    3332     2399199 :                 IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) )
    3333             :                 {
    3334     1480901 :                     tmp = hPrivateData->SFM_tb_fx[p];
    3335     1480901 :                     tmp_e = hPrivateData->sfb_tb_e[p];
    3336     1480901 :                     move16();
    3337     1480901 :                     move16();
    3338             :                 }
    3339             :                 ELSE
    3340             :                 {
    3341      918298 :                     tmp = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], powerSpectrum_e ), IGF_getCrest_new_fx( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], &crest_e ), &tmp_e );
    3342      918298 :                     tmp_e = sub( tmp_e, crest_e );
    3343             :                 }
    3344             : 
    3345     2399199 :                 test();
    3346     2399199 :                 IF( last_core_acelp || hPrivateData->wasTransient )
    3347             :                 {
    3348       76242 :                     hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*16-(15-exp)=>15Q16*/
    3349       76242 :                     hPrivateData->prevSFM_IIR[p] = shl( tmp, sub( tmp_e, 2 ) );   /*13-(15-exp)=>2Q13*/
    3350       76242 :                     move32();
    3351       76242 :                     move16();
    3352             :                 }
    3353             : 
    3354     2399199 :                 test();
    3355     2399199 :                 IF( LE_32( brate, IVAS_48k ) && EQ_16( element_mode, IVAS_CPE_MDCT ) )
    3356      501347 :                 {
    3357             :                     Word16 temp;
    3358      501347 :                     num_Tiles = 0;
    3359      501347 :                     SFM_src = 0;
    3360      501347 :                     SFM_tar = 0;
    3361      501347 :                     SFM_src_e = 0;
    3362      501347 :                     SFM_tar_e = 0;
    3363      501347 :                     move16();
    3364      501347 :                     move16();
    3365      501347 :                     move16();
    3366      501347 :                     move16();
    3367      501347 :                     move16();
    3368             : 
    3369     1036653 :                     FOR( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ )
    3370             :                     {
    3371      535306 :                         num_Tiles = add( num_Tiles, 1 );
    3372      535306 :                         SFM_src_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sb], hPrivateData->sfb_sb_e[sb], SFM_src, SFM_src_e, &SFM_src );
    3373      535306 :                         SFM_tar_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_tb_fx[sb], hPrivateData->sfb_tb_e[sb], SFM_tar, SFM_tar_e, &SFM_tar );
    3374             :                     }
    3375             : 
    3376             :                     /* compute the average */
    3377      501347 :                     SFM_src = shr( BASOP_Util_Divide1616_Scale( SFM_src, num_Tiles, &temp ), 2 );
    3378      501347 :                     SFM_src_e = add( SFM_src_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/
    3379      501347 :                     SFM_tar = shr( BASOP_Util_Divide1616_Scale( SFM_tar, num_Tiles, &temp ), 2 );
    3380      501347 :                     SFM_tar_e = add( SFM_tar_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/
    3381             : 
    3382      501347 :                     IF( LT_16( SFM_tar_e, SFM_src_e ) )
    3383             :                     {
    3384       40403 :                         SFM_tar = shl( SFM_tar, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/
    3385       40403 :                         SFM_tar_e = SFM_src_e;
    3386             :                     }
    3387             :                     ELSE
    3388             :                     {
    3389      460944 :                         SFM_src = shr( SFM_src, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/
    3390      460944 :                         SFM_src_e = SFM_tar_e;
    3391             :                     }
    3392      501347 :                     move16();
    3393             : 
    3394      501347 :                     test();
    3395      501347 :                     test();
    3396      501347 :                     IF( ( p > 0 ) && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) )
    3397             :                     {
    3398      423449 :                         test();
    3399      423449 :                         if ( EQ_16( p, 1 ) && EQ_16( abs_s( sub( hPrivateData->igfCurrWhiteningLevel[0], hPrivateData->igfCurrWhiteningLevel[1] ) ), 2 ) ) /* OFF vs. STRONG */
    3400             :                         {
    3401        6642 :                             hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID;
    3402        6642 :                             move16();
    3403             :                         }
    3404      423449 :                         hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1];
    3405      423449 :                         move16();
    3406             :                     }
    3407       77898 :                     ELSE IF( sp_aud_decision0 )
    3408             :                     {
    3409             :                         /* Music */
    3410             :                         /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */
    3411       38126 :                         test();
    3412       38126 :                         if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) )
    3413             :                         {
    3414       32065 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    3415       32065 :                             move16();
    3416             :                         }
    3417             : 
    3418             :                         /* whitening mid:  */
    3419       38126 :                         test();
    3420       38126 :                         if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) )
    3421             :                         {
    3422        5592 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    3423        5592 :                             move16();
    3424             :                         }
    3425             : 
    3426             :                         /* whitening strong */
    3427       38126 :                         if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) )
    3428             :                         {
    3429         469 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    3430         469 :                             move16();
    3431             :                         }
    3432             :                     }
    3433             :                     ELSE
    3434             :                     {
    3435             :                         /* Speech */
    3436             :                         /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */
    3437       39772 :                         test();
    3438       39772 :                         if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) )
    3439             :                         {
    3440       20212 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    3441       20212 :                             move16();
    3442             :                         }
    3443             : 
    3444             :                         /* whitening mid:  */
    3445       39772 :                         test();
    3446       39772 :                         if ( GT_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) )
    3447             :                         {
    3448       12711 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    3449       12711 :                             move16();
    3450             :                         }
    3451             : 
    3452             :                         /* whitening strong */
    3453       39772 :                         if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) )
    3454             :                         {
    3455        6849 :                             hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    3456        6849 :                             move16();
    3457             :                         }
    3458             :                     }
    3459             : 
    3460      501347 :                     SFM = shl( SFM_tar, sub( SFM_tar_e, 2 ) ); /*2Q13*/
    3461             :                 }
    3462             :                 ELSE
    3463             :                 {
    3464     1897852 :                     test();
    3465     1897852 :                     IF( element_mode > EVS_MONO && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) )
    3466             :                     {
    3467     1013513 :                         SFM = shl( tmp, sub( tmp_e, 2 ) ); /*2Q13*/
    3468             :                     }
    3469             :                     ELSE
    3470             :                     {
    3471             :                         Word32 temp;
    3472      884339 :                         temp = L_add( L_shl( tmp, sub( tmp_e, 2 ) ), L_add( L_shr( hPrivateData->prevSFM_FIR[p], 3 ), L_shr( hPrivateData->prevSFM_IIR[p], 1 ) ) );
    3473      884339 :                         SFM = extract_l( L_min( 22118 /*2.7*/, temp ) ); /*2Q13*/
    3474             :                     }
    3475     1897852 :                     hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*15Q16*/
    3476     1897852 :                     hPrivateData->prevSFM_IIR[p] = SFM;
    3477     1897852 :                     move32();
    3478     1897852 :                     move16();
    3479             : 
    3480     1897852 :                     IF( GT_16( SFM, hGrid->whiteningThreshold[1][p] ) )
    3481             :                     {
    3482      745409 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG;
    3483      745409 :                         move16();
    3484             :                     }
    3485     1152443 :                     ELSE IF( GT_16( SFM, hGrid->whiteningThreshold[0][p] ) )
    3486             :                     {
    3487      712176 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    3488      712176 :                         move16();
    3489             :                     }
    3490             :                     ELSE
    3491             :                     {
    3492      440267 :                         hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF;
    3493      440267 :                         move16();
    3494             :                     }
    3495             :                 }
    3496             : 
    3497     2399199 :                 IF( element_mode > EVS_MONO )
    3498             :                 {
    3499     2399199 :                     IF( last_core_acelp ) /* reset */
    3500             :                     {
    3501       76242 :                         set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN );
    3502       76242 :                         hPrivateData->igfWhiteningHangoverCnt[p] = 2;
    3503       76242 :                         move16();
    3504             :                     }
    3505             :                     ELSE
    3506             :                     {
    3507     2322957 :                         test();
    3508     2322957 :                         test();
    3509     2322957 :                         test();
    3510     2322957 :                         test();
    3511             :                         /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */
    3512     2322957 :                         IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) &&
    3513             :                             ( ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[0][p], 1229 /*0.15f Q13*/ ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[0][p], 1229 ) ) ) ||
    3514             :                               ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[1][p], 1229 ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[1][p], 1229 ) ) ) ) )
    3515             :                         {
    3516             :                             Word16 mean_past_SFM;
    3517             :                             Word16 mean_past_SFM_e;
    3518             :                             Word16 countable;
    3519             :                             Word16 i;
    3520      325521 :                             mean_past_SFM = 0;
    3521      325521 :                             mean_past_SFM_e = 0;
    3522      325521 :                             countable = 0;
    3523      325521 :                             move16();
    3524      325521 :                             move16();
    3525      325521 :                             move16();
    3526             : 
    3527             :                             /* compute mean of last (available) SFM values */
    3528     1953126 :                             FOR( i = 0; i < IGF_PAST_SFM_LEN; i++ )
    3529             :                             {
    3530     1627605 :                                 IF( hPrivateData->igfPastSFM_fx[p][i] >= 0 )
    3531             :                                 {
    3532     1355130 :                                     mean_past_SFM_e = BASOP_Util_Add_MantExp( mean_past_SFM, mean_past_SFM_e, hPrivateData->igfPastSFM_fx[p][i], 2, &mean_past_SFM );
    3533     1355130 :                                     countable = add( countable, 1 );
    3534             :                                 }
    3535             :                             }
    3536      325521 :                             IF( countable )
    3537             :                             {
    3538             :                                 Word16 temp;
    3539      317185 :                                 mean_past_SFM = BASOP_Util_Divide1616_Scale( mean_past_SFM, countable, &temp );
    3540      317185 :                                 mean_past_SFM_e = add( mean_past_SFM_e, sub( temp, 15 ) );
    3541      317185 :                                 mean_past_SFM = shl( mean_past_SFM, sub( mean_past_SFM_e, 2 ) ); /*mean_past_SFM_e=2*/
    3542             :                                 /* deny change in whitening level for small deviations from mean SFM */
    3543      317185 :                                 if ( LT_16( abs_s( sub( SFM, mean_past_SFM ) ), 1638 ) /*0.2 in Q13*/ )
    3544             :                                 {
    3545      149525 :                                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    3546      149525 :                                     move16();
    3547             :                                 }
    3548             :                             }
    3549             :                         }
    3550             :                     }
    3551             : 
    3552     2399199 :                     hPrivateData->igfPastSFM_fx[p][hPrivateData->igfPastSFM_pos] = SFM; /*2Q13*/
    3553     2399199 :                     move16();
    3554             :                 }
    3555             :             }
    3556             : 
    3557      672050 :             SWITCH( hPrivateData->igfInfo.bitRateIndex )
    3558             :             {
    3559      118412 :                 case IGF_BITRATE_WB_9600:
    3560             :                 case IGF_BITRATE_RF_WB_13200:
    3561             :                 case IGF_BITRATE_WB_13200_CPE:
    3562             :                 case IGF_BITRATE_WB_16400_CPE:
    3563             :                 case IGF_BITRATE_RF_SWB_13200:
    3564             :                 case IGF_BITRATE_SWB_9600:
    3565             :                 case IGF_BITRATE_SWB_13200_CPE:
    3566             :                 case IGF_BITRATE_SWB_16400:
    3567             :                 case IGF_BITRATE_SWB_24400:
    3568             :                 case IGF_BITRATE_SWB_24400_CPE:
    3569             :                 case IGF_BITRATE_SWB_32000_CPE:
    3570             :                 case IGF_BITRATE_SWB_32000:
    3571             :                 case IGF_BITRATE_FB_16400:
    3572             :                 case IGF_BITRATE_FB_24400:
    3573             :                 case IGF_BITRATE_FB_24400_CPE:
    3574             :                 case IGF_BITRATE_FB_32000_CPE:
    3575             :                 case IGF_BITRATE_FB_32000:
    3576      118412 :                     hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2];
    3577      118412 :                     move16();
    3578      118412 :                     break;
    3579      553638 :                 default:
    3580      553638 :                     break;
    3581             :             }
    3582             :         }
    3583             :         ELSE
    3584             :         {
    3585        7265 :             FOR( p = 0; p < hGrid->nTiles; p++ )
    3586             :             {
    3587        5641 :                 hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID;
    3588        5641 :                 move16();
    3589             :             }
    3590             :         }
    3591             :     }
    3592             :     ELSE
    3593             :     {
    3594             :         /* reset filter */
    3595      492624 :         FOR( p = 0; p < IGF_MAX_TILES; p++ )
    3596             :         {
    3597      447840 :             hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 );
    3598      447840 :             hPrivateData->prevSFM_IIR[p] = 0;
    3599      447840 :             move32();
    3600      447840 :             move16();
    3601             :         }
    3602             :     }
    3603             : 
    3604      718458 :     IF( element_mode > EVS_MONO )
    3605             :     {
    3606      718458 :         IF( EQ_16( SFM, -ONE_IN_Q13 /*1.0f 2Q13*/ ) ) /* reset */
    3607             :         {
    3608      178326 :             FOR( p = 0; p < hGrid->nTiles; p++ )
    3609             :             {
    3610      131918 :                 set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN );
    3611      131918 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 2;
    3612      131918 :                 move16();
    3613             :             }
    3614             :         }
    3615             : 
    3616             :         /* vibrato handling */
    3617     2222769 :         FOR( p = 0; p < hGrid->nTiles; p = p + 2 )
    3618             :         {
    3619     1504311 :             test();
    3620     1504311 :             test();
    3621     1504311 :             test();
    3622     1504311 :             IF( ( hPrivateData->igfPrevWhiteningLevel[p] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p] != IGF_WHITENING_OFF ) ||
    3623             :                 ( hPrivateData->igfPrevWhiteningLevel[p + 1] == IGF_WHITENING_OFF && hPrivateData->igfCurrWhiteningLevel[p + 1] != IGF_WHITENING_OFF ) )
    3624             :             {
    3625             :                 Word16 i;
    3626             :                 Word16 pastSfm_a[4], pastSfm_b[4];
    3627             :                 Word16 pastSfmDiffSum_a, pastSfmDiffSum_b;
    3628             : 
    3629     1197175 :                 FOR( i = 0; i < 4; i++ )
    3630             :                 {
    3631      957740 :                     pastSfm_a[i] = hPrivateData->igfPastSFM_fx[p][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN];
    3632      957740 :                     pastSfm_b[i] = hPrivateData->igfPastSFM_fx[p + 1][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN];
    3633      957740 :                     move16();
    3634      957740 :                     move16();
    3635             :                 }
    3636      239435 :                 pastSfmDiffSum_a = pastSfmDiffSum_b = 0;
    3637      239435 :                 move16();
    3638      239435 :                 move16();
    3639      636477 :                 FOR( i = 0; i < 3; i++ )
    3640             :                 {
    3641      530732 :                     IF( NE_16( pastSfm_a[i + 1], -ONE_IN_Q13 ) )
    3642             :                     {
    3643      397042 :                         pastSfmDiffSum_a = add( pastSfmDiffSum_a, sub( pastSfm_a[i], pastSfm_a[i + 1] ) );
    3644      397042 :                         pastSfmDiffSum_b = add( pastSfmDiffSum_b, sub( pastSfm_b[i], pastSfm_b[i + 1] ) );
    3645             :                     }
    3646             :                     ELSE
    3647             :                     {
    3648      133690 :                         break;
    3649             :                     }
    3650             :                 }
    3651      239435 :                 test();
    3652      239435 :                 test();
    3653      239435 :                 test();
    3654      239435 :                 test();
    3655             :                 /* if tonality oscillates between two tiles, turn whitening off in both */
    3656      239435 :                 IF( ( ( pastSfmDiffSum_a > 0 && pastSfmDiffSum_b < 0 ) ||
    3657             :                       ( pastSfmDiffSum_a < 0 && pastSfmDiffSum_b > 0 ) ) &&
    3658             :                     ( GT_32( L_abs( L_sub( pastSfmDiffSum_a, pastSfmDiffSum_b ) ), ONE_IN_Q12 /* 0.5 in Q13 */ ) ) )
    3659             :                 {
    3660       10588 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF;
    3661       10588 :                     move16();
    3662       10588 :                     move16();
    3663             :                 }
    3664             :             }
    3665             :         }
    3666             : 
    3667             :         /* hangover */
    3668     3249575 :         FOR( p = 0; p < hGrid->nTiles; p++ )
    3669             :         {
    3670     2531117 :             IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) )
    3671             :             {
    3672      523677 :                 hPrivateData->igfWhiteningHangoverCnt[p] = add( hPrivateData->igfWhiteningHangoverCnt[p], 1 );
    3673      523677 :                 IF( EQ_16( hPrivateData->igfWhiteningHangoverCnt[p], 3 ) )
    3674             :                 {
    3675      145618 :                     hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    3676             :                 }
    3677             :                 ELSE
    3678             :                 {
    3679      378059 :                     hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p];
    3680             :                 }
    3681      523677 :                 move16();
    3682      523677 :                 move16();
    3683             :             }
    3684             :             ELSE
    3685             :             {
    3686     2007440 :                 hPrivateData->igfWhiteningHangoverCnt[p] = 0;
    3687     2007440 :                 move16();
    3688             :             }
    3689             :         }
    3690             : 
    3691      718458 :         hPrivateData->igfPastSFM_pos = add( hPrivateData->igfPastSFM_pos, 1 ) % IGF_PAST_SFM_LEN;
    3692      718458 :         move16();
    3693             :     }
    3694             : 
    3695      718458 :     hPrivateData->wasTransient = isTransient;
    3696      718458 :     move16();
    3697             : 
    3698      718458 :     return;
    3699             : }
    3700             : 
    3701             : 
    3702             : /*-------------------------------------------------------------------*
    3703             :  * IGF_WriteWhiteningTile_fx()
    3704             :  *
    3705             :  * write whitening levels into bitstream
    3706             :  *-------------------------------------------------------------------*/
    3707             : 
    3708             : /*! r: number of bits written */
    3709     3040167 : static Word16 IGF_WriteWhiteningTile_ivas_fx(
    3710             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle       */
    3711             :     Word16 *pBitOffset,    /**< in:     | ptr to bitOffset counter   */
    3712             :     Word16 whiteningLevel  /**< in: Q0  | whitening levels to write  */
    3713             : )
    3714             : {
    3715             :     Word16 totBitCount;
    3716             :     Word16 startBitCount;
    3717             : 
    3718     3040167 :     totBitCount = 0;
    3719     3040167 :     startBitCount = *pBitOffset;
    3720     3040167 :     move16();
    3721     3040167 :     move16();
    3722             : 
    3723     3040167 :     IF( EQ_32( whiteningLevel, IGF_WHITENING_MID ) )
    3724             :     {
    3725     1120064 :         IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    3726             :     }
    3727             :     ELSE
    3728             :     {
    3729     1920103 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    3730     1920103 :         IF( whiteningLevel == IGF_WHITENING_OFF )
    3731             :         {
    3732      967623 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    3733             :         }
    3734             :         ELSE
    3735             :         {
    3736      952480 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    3737             :         }
    3738             :     }
    3739     3040167 :     totBitCount = sub( *pBitOffset, startBitCount );
    3740             : 
    3741     3040167 :     return totBitCount;
    3742             : }
    3743             : 
    3744             : 
    3745             : /*-------------------------------------------------------------------*
    3746             :  * IGF_WriteWhiteningLevels_fx()
    3747             :  *
    3748             :  * writes the whitening levels
    3749             :  *-------------------------------------------------------------------*/
    3750             : 
    3751             : /**< out: Q0 | total number of bits written                                                 */
    3752     1408254 : static Word16 IGF_WriteWhiteningLevels_ivas_fx(
    3753             :     const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF encoder                                               */
    3754             :     BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
    3755             :     Word16 *pBitOffset,                      /**< in:     | ptr to bitOffset counter                                                     */
    3756             :     const Word16 igfGridIdx,                 /**< in: Q0  | igf grid index see declaration of IGF_GRID_IDX for details                   */
    3757             :     const Word16 isIndepFlag                 /**< in: Q0  | if 1 frame is independent, 0 = frame is coded with data from previous frame  */
    3758             : )
    3759             : {
    3760             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    3761             :     H_IGF_GRID hGrid;
    3762             :     Word16 p;
    3763             :     Word16 nTiles;
    3764             :     Word16 isSame;
    3765             :     Word32 tmp32;
    3766             :     Word16 totBitCount;
    3767             :     Word16 startBitCount;
    3768             : 
    3769     1408254 :     totBitCount = 0;
    3770     1408254 :     move16();
    3771     1408254 :     isSame = 1;
    3772     1408254 :     move16();
    3773     1408254 :     startBitCount = *pBitOffset;
    3774     1408254 :     move16();
    3775     1408254 :     hPrivateData = &hInstance->igfData;
    3776     1408254 :     hGrid = &hPrivateData->igfInfo.grid[igfGridIdx];
    3777     1408254 :     nTiles = hGrid->nTiles;
    3778     1408254 :     move16();
    3779             : 
    3780     1408254 :     IF( isIndepFlag )
    3781             :     {
    3782     1393923 :         isSame = 0;
    3783     1393923 :         move16();
    3784             :     }
    3785             :     ELSE
    3786             :     {
    3787       14331 :         p = 0;
    3788       14331 :         move16();
    3789       14331 :         tmp32 = 0;
    3790       14331 :         move32();
    3791       14331 :         test();
    3792       47618 :         WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) )
    3793             :         {
    3794       33287 :             test();
    3795       33287 :             tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] );
    3796       33287 :             if ( tmp32 != 0 )
    3797             :             {
    3798         828 :                 isSame = 0;
    3799         828 :                 move16();
    3800             :             }
    3801       33287 :             p++;
    3802             :         }
    3803             :     }
    3804     1408254 :     IF( isSame )
    3805             :     {
    3806       13503 :         IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    3807             :     }
    3808             :     ELSE
    3809             :     {
    3810     1394751 :         IF( !isIndepFlag )
    3811             :         {
    3812         828 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    3813             :         }
    3814     1394751 :         IGF_WriteWhiteningTile_ivas_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[0] );
    3815     1394751 :         p = 1;
    3816     1394751 :         move16();
    3817     1394751 :         tmp32 = 0;
    3818     1394751 :         move32();
    3819     1394751 :         test();
    3820     1394751 :         IF( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) )
    3821             :         {
    3822      163881 :             isSame = 1;
    3823      163881 :             move16();
    3824             :         }
    3825             :         ELSE
    3826             :         {
    3827     1230870 :             if ( LT_16( p, nTiles ) )
    3828             :             {
    3829      673109 :                 isSame = 1;
    3830      673109 :                 move16();
    3831             :             }
    3832     1230870 :             test();
    3833     3026749 :             WHILE( ( LT_16( p, nTiles ) ) && ( tmp32 == 0 ) )
    3834             :             {
    3835     1795879 :                 test();
    3836     1795879 :                 tmp32 = L_sub( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfCurrWhiteningLevel[p - 1] );
    3837     1795879 :                 if ( tmp32 != 0 )
    3838             :                 {
    3839      361714 :                     isSame = 0;
    3840      361714 :                     move16();
    3841             :                 }
    3842     1795879 :                 p++;
    3843             :             }
    3844             :         }
    3845     1394751 :         test();
    3846     1394751 :         IF( !isSame )
    3847             :         {
    3848      919475 :             IGF_write_bits( hBstr, pBitOffset, 1, 1 );
    3849     2564891 :             FOR( p = 1; p < nTiles; p++ )
    3850             :             {
    3851     1645416 :                 IGF_WriteWhiteningTile_ivas_fx( hBstr, pBitOffset, hPrivateData->igfCurrWhiteningLevel[p] );
    3852             :             }
    3853             :         }
    3854      475276 :         ELSE IF( NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) && NE_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) )
    3855             :         {
    3856      311395 :             IGF_write_bits( hBstr, pBitOffset, 0, 1 );
    3857             :         }
    3858             :     }
    3859             : 
    3860     1408254 :     totBitCount = sub( *pBitOffset, startBitCount );
    3861             : 
    3862     1408254 :     return totBitCount;
    3863             : }
    3864             : 
    3865             : 
    3866             : /*-------------------------------------------------------------------*
    3867             :  * IGF_WriteFlatteningTrigger_fx()
    3868             :  *
    3869             :  * write flattening trigger
    3870             :  *-------------------------------------------------------------------*/
    3871             : 
    3872             : /*! r: number of bits written */
    3873     1408254 : static Word16 IGF_WriteFlatteningTrigger_ivas_fx(
    3874             :     const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in:     | instance handle of IGF Encoder */
    3875             :     BSTR_ENC_HANDLE hBstr,                   /* i/o: encoder bitstream handle       */
    3876             :     Word16 *pBitOffset                       /**< in:     | ptr to bitOffset counter       */
    3877             : )
    3878             : {
    3879             :     Word16 flatteningTrigger;
    3880             : 
    3881             :     Word16 totBitCount;
    3882             :     Word16 startBitCount;
    3883     1408254 :     totBitCount = 0;
    3884     1408254 :     startBitCount = *pBitOffset;
    3885     1408254 :     flatteningTrigger = hInstance->flatteningTrigger;
    3886     1408254 :     move16();
    3887     1408254 :     move16();
    3888     1408254 :     move16();
    3889             : 
    3890     1408254 :     IGF_write_bits( hBstr, pBitOffset, flatteningTrigger, 1 );
    3891     1408254 :     totBitCount = sub( *pBitOffset, startBitCount );
    3892             : 
    3893     1408254 :     return totBitCount;
    3894             : }
    3895             : 
    3896             : 
    3897             : /*-------------------------------------------------------------------*
    3898             :  * IGFEncWriteBitstream()
    3899             :  *
    3900             :  * IGF bitstream writer
    3901             :  *-------------------------------------------------------------------*/
    3902             : 
    3903             : /*! r: number of bits written per frame */
    3904     1408254 : Word16 IGFEncWriteBitstream_ivas_fx(
    3905             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i  : instance handle of IGF Encoder                                              */
    3906             :     BSTR_ENC_HANDLE hBstr,                 /* i/o: encoder bitstream handle                                                    */
    3907             :     Word16 *pBitOffset,                    /* i  : ptr to bitOffset counter                                                    */
    3908             :     const Word16 igfGridIdx,               /* i  : igf grid index see declaration of IGF_GRID_IDX for details                  */
    3909             :     const Word16 isIndepFlag               /* i  : if 1 frame is independent, 0 = frame is coded with data from previous frame */
    3910             : )
    3911             : {
    3912             :     Word16 igfAllZero;
    3913             :     Word16 startBitCount;
    3914             : 
    3915     1408254 :     startBitCount = *pBitOffset;
    3916     1408254 :     move16();
    3917     1408254 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    3918     1408254 :     move16();
    3919             : 
    3920     1408254 :     if ( isIndepFlag )
    3921             :     {
    3922     1393923 :         hIGFEnc->infoTotalBitsWritten = 0;
    3923     1393923 :         move16();
    3924             :     }
    3925             : 
    3926     1408254 :     IGF_WriteEnvelope_ivas( hIGFEnc,       /* i: instance handle of IGF Encoder                                              */
    3927             :                             hBstr,         /* i: encoder state                                                               */
    3928             :                             pBitOffset,    /* i: ptr to bitOffset counter                                                    */
    3929             :                             igfGridIdx,    /* i: igf grid index see definition of IGF_GRID_IDX for details                   */
    3930             :                             isIndepFlag,   /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */
    3931             :                             &igfAllZero ); /* o: *igfAllZero                                                                 */
    3932             : 
    3933     1408254 :     IGF_WriteWhiteningLevels_ivas_fx( hIGFEnc,       /* i: instance handle of IGF Encoder                                              */
    3934             :                                       hBstr,         /* i: encoder state                                                               */
    3935             :                                       pBitOffset,    /* i: ptr to bitOffset counter                                                    */
    3936             :                                       igfGridIdx,    /* i: igf grid index see definition of IGF_GRID_IDX for details                   */
    3937             :                                       isIndepFlag ); /* i: if 1 frame is independent, 0 = frame is coded with data from previous frame */
    3938             : 
    3939     1408254 :     IGF_WriteFlatteningTrigger_ivas_fx( hIGFEnc,      /* i: instance handle of IGF Encoder                                              */
    3940             :                                         hBstr,        /* i: encoder state                                                               */
    3941             :                                         pBitOffset ); /* i: ptr to bitOffset counter                                                    */
    3942             : 
    3943     1408254 :     hIGFEnc->infoTotalBitsPerFrameWritten = sub( *pBitOffset, startBitCount );
    3944     1408254 :     hIGFEnc->infoTotalBitsWritten = add( hIGFEnc->infoTotalBitsWritten, hIGFEnc->infoTotalBitsPerFrameWritten );
    3945     1408254 :     move16();
    3946     1408254 :     move16();
    3947             : 
    3948     1408254 :     return hIGFEnc->infoTotalBitsPerFrameWritten;
    3949             : }
    3950             : 
    3951             : 
    3952             : /*-------------------------------------------------------------------*
    3953             :  * IGFEncSetMode()
    3954             :  *
    3955             :  * sets the IGF mode according to given bitrate
    3956             :  *-------------------------------------------------------------------*/
    3957             : 
    3958       58638 : void IGFEncSetMode_ivas_fx(
    3959             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */
    3960             :     const Word32 total_brate,              /* i  : encoder total bitrate          */
    3961             :     const Word16 bwidth,                   /* i  : encoder audio bandwidth        */
    3962             :     const Word16 element_mode,             /* i  : IVAS element mode              */
    3963             :     const Word16 rf_mode                   /* i  : flag to signal the RF mode     */
    3964             : )
    3965             : {
    3966             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    3967             :     Word16 i;
    3968             : 
    3969       58638 :     hPrivateData = &hIGFEnc->igfData;
    3970       58638 :     hPrivateData->igfBitstreamBits = 0;
    3971       58638 :     move16();
    3972       58638 :     set16_fx( hPrivateData->igfScfQuantized, 0, IGF_MAX_SFB );
    3973       58638 :     set16_fx( hPrivateData->igfCurrWhiteningLevel, 0, IGF_MAX_TILES );
    3974       58638 :     set16_fx( hPrivateData->igfPrevWhiteningLevel, 0, IGF_MAX_TILES );
    3975       58638 :     set16_fx( hPrivateData->igfWhiteningHangoverCnt, 0, IGF_MAX_TILES );
    3976      645018 :     FOR( i = 0; i < IGF_MAX_TILES; i++ )
    3977             :     {
    3978      586380 :         set16_fx( hPrivateData->igfPastSFM_fx[i], -( ONE_IN_Q13 ), IGF_PAST_SFM_LEN );
    3979             :     }
    3980             : 
    3981       58638 :     hPrivateData->igfPastSFM_pos = 0;
    3982       58638 :     move16();
    3983             : 
    3984    18822798 :     FOR( i = 0; i < IGF_BITBUFSIZE / 8; i++ )
    3985             :     {
    3986    18764160 :         hPrivateData->igfBitstream[i] = 0;
    3987    18764160 :         move16();
    3988             :     }
    3989       58638 :     hPrivateData->wasTransient = 0;
    3990       58638 :     move16();
    3991       58638 :     set32_fx( hPrivateData->prevSFM_FIR, 0, IGF_MAX_TILES );
    3992       58638 :     set16_fx( hPrivateData->prevSFM_IIR, 0, IGF_MAX_TILES );
    3993       58638 :     set16_fx( hPrivateData->dampingFactorSmoothing, 2, IGF_MAX_SFB );
    3994       58638 :     set16_fx( hPrivateData->prevSFM_FIR_SFB_SB_fx, 0, IGF_MAX_SFB );
    3995       58638 :     set16_fx( hPrivateData->prevSFB_FIR_TB_e, 15, IGF_MAX_SFB );
    3996       58638 :     set16_fx( hPrivateData->prevSFB_FIR_SB_e, 15, IGF_MAX_SFB );
    3997       58638 :     set16_fx( hPrivateData->prevSFM_IIR_SFB_SB_fx, 0, IGF_MAX_SFB );
    3998       58638 :     set16_fx( hPrivateData->prevSFB_IIR_SB_e, 15, IGF_MAX_SFB );
    3999       58638 :     set16_fx( hPrivateData->prevSFM_FIR_SFB_TB_fx, 0, IGF_MAX_SFB );
    4000       58638 :     set16_fx( hPrivateData->prevSFB_IIR_TB_e, 15, IGF_MAX_SFB );
    4001       58638 :     set16_fx( hPrivateData->sfb_tb_e, 15, IGF_MAX_SFB );
    4002       58638 :     set16_fx( hPrivateData->sfb_sb_e, 15, IGF_MAX_SFB );
    4003       58638 :     set16_fx( hPrivateData->prevSFM_IIR_SFB_TB_fx, 0, IGF_MAX_SFB );
    4004       58638 :     set16_fx( hPrivateData->prevDampingFactor_IIR_fx, -( ONE_IN_Q15 ), IGF_MAX_SFB );
    4005       58638 :     set16_fx( hPrivateData->prevDampingFactor_IIR_e, 0, IGF_MAX_SFB );
    4006       58638 :     set16_fx( hPrivateData->logSpec, 0, L_FRAME_PLUS );
    4007       58638 :     set16_fx( hPrivateData->SFM_sb_fx, 0, IGF_MAX_SFB );
    4008       58638 :     set16_fx( hPrivateData->SFM_tb_fx, 0, IGF_MAX_SFB );
    4009             : 
    4010       58638 :     IF( IGFCommonFuncsIGFConfiguration_ivas_fx( total_brate, bwidth, element_mode, &hPrivateData->igfInfo, rf_mode ) != 0 )
    4011             :     {
    4012       58638 :         IGFSCFEncoderOpen_fx( &hPrivateData->hIGFSCFArithEnc, &hPrivateData->igfInfo, total_brate, bwidth, element_mode, rf_mode );
    4013             : 
    4014       58638 :         hIGFEnc->infoSamplingRate = hPrivateData->igfInfo.sampleRate;
    4015       58638 :         move32();
    4016       58638 :         hIGFEnc->infoStartFrequency = hPrivateData->igfInfo.grid[0].startFrequency;
    4017       58638 :         move16();
    4018       58638 :         hIGFEnc->infoStopFrequency = hPrivateData->igfInfo.grid[0].stopFrequency;
    4019       58638 :         move16();
    4020       58638 :         hIGFEnc->infoStartLine = hPrivateData->igfInfo.grid[0].startLine;
    4021       58638 :         move16();
    4022       58638 :         hIGFEnc->infoStopLine = hPrivateData->igfInfo.grid[0].stopLine;
    4023       58638 :         move16();
    4024             :     }
    4025             :     ELSE
    4026             :     {
    4027             :         /* IGF configuration failed -> error! */
    4028           0 :         hIGFEnc->infoSamplingRate = 0;
    4029           0 :         move32();
    4030           0 :         hIGFEnc->infoStartFrequency = -1;
    4031           0 :         move16();
    4032           0 :         hIGFEnc->infoStopFrequency = -1;
    4033           0 :         move16();
    4034           0 :         hIGFEnc->infoStartLine = -1;
    4035           0 :         move16();
    4036           0 :         hIGFEnc->infoStopLine = -1;
    4037           0 :         move16();
    4038           0 :         fprintf( stderr, "IGFEncSetMode_fx: initialization error!\n" );
    4039             :     }
    4040             : 
    4041             :     /* reset remaining variables */
    4042       58638 :     hIGFEnc->infoTotalBitsWritten = 0;
    4043       58638 :     move16();
    4044       58638 :     hIGFEnc->infoTotalBitsPerFrameWritten = 0;
    4045       58638 :     move16();
    4046       58638 :     hIGFEnc->flatteningTrigger = 0;
    4047       58638 :     move16();
    4048       58638 :     hIGFEnc->spec_be_igf_e = 0;
    4049       58638 :     move16();
    4050       58638 :     hIGFEnc->tns_predictionGain = 0;
    4051       58638 :     move16();
    4052       58638 :     set32_fx( hIGFEnc->spec_be_igf, 0, N_MAX_TCX - IGF_START_MN );
    4053             : 
    4054       58638 :     return;
    4055             : }
    4056             : 
    4057             : 
    4058             : /*-------------------------------------------------------------------*
    4059             :  * IGFEncResetTCX10BitCounter_fx()
    4060             :  *
    4061             :  * IGF reset bitstream bit counter for TCX10 modes
    4062             :  *-------------------------------------------------------------------*/
    4063             : 
    4064       14331 : void IGFEncResetTCX10BitCounter_fx(
    4065             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc /* i  : instance handle of IGF Encoder */
    4066             : )
    4067             : {
    4068             :     IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
    4069             : 
    4070       14331 :     hPrivateData = &hIGFEnc->igfData;
    4071       14331 :     hPrivateData->igfBitstreamBits = 0;
    4072       14331 :     hIGFEnc->infoTotalBitsWritten = 0;
    4073       14331 :     move16();
    4074       14331 :     move16();
    4075             : 
    4076       14331 :     return;
    4077             : }
    4078             : 
    4079             : 
    4080             : /*-------------------------------------------------------------------*
    4081             :  * IGFEncApplyMono()
    4082             :  *
    4083             :  * apply the IGF encoder, main encoder interface
    4084             :  *-------------------------------------------------------------------*/
    4085             : 
    4086      588384 : void IGFEncApplyMono_ivas_fx(
    4087             :     Encoder_State *st,             /* i  : Encoder state                                          */
    4088             :     Word16 powerSpectrum_len,      /* i: length of pPowerSpectrum_fx buffer                       */
    4089             :     const Word16 igfGridIdx,       /* i  : IGF grid index                                         */
    4090             :     Word32 *pMDCTSpectrum_fx,      /* i/o: MDCT spectrum                                          */
    4091             :     Word16 e_mdct,                 /* i : exponent of pMDCTspectrum                               */
    4092             :     Word32 *pPowerSpectrum_fx,     /* i/o: MDCT^2 + MDST^2 spectrum, or estimate                  */
    4093             :     Word16 *e_ps,                  /* i : exponent of pPowerSpectrum                              */
    4094             :     const Word16 isTCX20,          /* i  : flag indicating if the input is TCX20 or TCX10/2xTCX5  */
    4095             :     const Word8 isTNSActive,       /* i  : flag indicating if the TNS is active                   */
    4096             :     const Word16 sp_aud_decision0, /* i  : first stage switching decision                         */
    4097             :     const Word16 vad_hover_flag    /* i  : VAD hangover flag                                      */
    4098             : )
    4099             : {
    4100             :     Word32 *pPowerSpectrumParameter_fx;
    4101             :     Word16 *pPowerSpectrumParameter_exp;
    4102      588384 :     Word16 att_fx = MAX16B;
    4103             :     Word16 last_core_acelp;
    4104      588384 :     move16();
    4105             : 
    4106             :     Word32 common_pPowerSpectrum_fx[N_MAX + L_MDCT_OVLP_MAX];
    4107             : 
    4108      588384 :     set32_fx( common_pPowerSpectrum_fx, 0, N_MAX );
    4109             : 
    4110      588384 :     Word16 common_pPowerSpectrum_exp = MIN16B;
    4111      588384 :     move16();
    4112      588384 :     IF( st->last_core == ACELP_CORE )
    4113             :     {
    4114       13372 :         last_core_acelp = 1;
    4115       13372 :         move16();
    4116             :     }
    4117             :     ELSE
    4118             :     {
    4119      575012 :         last_core_acelp = 0;
    4120      575012 :         move16();
    4121             :     }
    4122             : 
    4123      588384 :     test();
    4124      588384 :     IF( !isTNSActive && isTCX20 )
    4125             :     {
    4126      513079 :         pPowerSpectrumParameter_fx = pPowerSpectrum_fx;
    4127      513079 :         pPowerSpectrumParameter_exp = e_ps;
    4128             :     }
    4129             :     ELSE
    4130             :     {
    4131       75305 :         pPowerSpectrumParameter_fx = NULL;
    4132       75305 :         pPowerSpectrumParameter_exp = NULL;
    4133             :     }
    4134             : 
    4135      588384 :     IGF_UpdateInfo( st->hIGFEnc, igfGridIdx );
    4136             : 
    4137      588384 :     test();
    4138      588384 :     IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
    4139             :     {
    4140       25950 :         calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag );
    4141             :     }
    4142             : 
    4143      588384 :     IGF_CalculateEnvelope_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, e_mdct, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, st->element_mode, att_fx );
    4144             : 
    4145      588384 :     IF( isTCX20 )
    4146             :     {
    4147      565306 :         pPowerSpectrumParameter_fx = pPowerSpectrum_fx;
    4148      565306 :         pPowerSpectrumParameter_exp = e_ps;
    4149             :     }
    4150             :     ELSE
    4151             :     {
    4152       23078 :         pPowerSpectrumParameter_fx = NULL;
    4153       23078 :         pPowerSpectrumParameter_exp = NULL;
    4154             :     }
    4155             : 
    4156      588384 :     IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
    4157             :     {
    4158      307027 :         IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->element_brate, st->element_mode );
    4159             :     }
    4160             :     ELSE
    4161             :     {
    4162      281357 :         IGF_Whitening_ivas_fx( st->hIGFEnc, pPowerSpectrumParameter_fx, pPowerSpectrumParameter_exp, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, st->total_brate, st->element_mode );
    4163             :     }
    4164             : 
    4165      588384 :     IF( pPowerSpectrumParameter_fx )
    4166             :     {
    4167   751834726 :         FOR( Word16 i = 0; i < powerSpectrum_len; i++ )
    4168             :         {
    4169   751269420 :             common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, pPowerSpectrumParameter_exp[i] );
    4170             :         }
    4171             : 
    4172   751834726 :         FOR( Word16 i = 0; i < powerSpectrum_len; i++ )
    4173             :         {
    4174   751269420 :             common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[i], sub( pPowerSpectrumParameter_exp[i], common_pPowerSpectrum_exp ) );
    4175   751269420 :             move16();
    4176             :         }
    4177      565306 :         pPowerSpectrumParameter_fx = common_pPowerSpectrum_fx;
    4178             :     }
    4179             : 
    4180      588384 :     IGF_ErodeSpectrum_ivas_fx( st->hIGFEnc, pMDCTSpectrum_fx, pPowerSpectrumParameter_fx, common_pPowerSpectrum_exp, igfGridIdx, 0 );
    4181             : 
    4182      588384 :     return;
    4183             : }
    4184             : 
    4185             : 
    4186             : /*-------------------------------------------------------------------*
    4187             :  * IGFEncApplyStereo()
    4188             :  *
    4189             :  * apply the IGF encoder, main encoder interface
    4190             :  *-------------------------------------------------------------------*/
    4191             : 
    4192       65037 : void IGFEncApplyStereo_fx(
    4193             :     STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,                /* i/o: MDCT stereo encoder structure           */
    4194             :     Word16 ms_mask[2][MAX_SFB],                             /* i  : bandwise MS mask                        */
    4195             :     const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS],    /* i  : instance handle of IGF Encoder          */
    4196             :     const Word16 igfGridIdx,                                /* i  : IGF grid index                          */
    4197             :     Encoder_State *sts[CPE_CHANNELS],                       /* i  : Encoder state                           */
    4198             :     Word32 *pPowerSpectrum_fx[CPE_CHANNELS],                /* i/o: MDCT^2 + MDST^2 spectrum, or estimate   */
    4199             :     Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS],            /* i/o: exp of pPowerSpectrum_fx                */
    4200             :     Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV],   /* i/o: inverse power spectrum                  */
    4201             :     Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx           */
    4202             :     Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV],          /* i  : inverse spectrum                        */
    4203             :     Word16 exp_inv_spectrum_fx[CPE_CHANNELS],               /* i  : exp of inverse spectrum                 */
    4204             :     const Word16 frameno,                                   /* i  : flag indicating index of current subfr. */
    4205             :     const Word16 sp_aud_decision0,                          /* i  : sp_aud_decision0                        */
    4206             :     const Word32 element_brate,                             /* i  : element bitrate                         */
    4207             :     const Word16 mct_on )
    4208             : {
    4209             :     Word32 *pPowerSpectrumParameter_fx[NB_DIV];     /* If it is NULL it informs a function that specific handling is needed */
    4210             :     Word16 *exp_pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */
    4211             :     Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV];
    4212             :     Word16 *q_pPowerSpectrumParameterMsInv_fx[NB_DIV];
    4213             :     Word16 coreMsMask[N_MAX];
    4214             :     Word16 sfb, ch, last_core_acelp;
    4215             :     STEREO_MDCT_BAND_PARAMETERS *sfbConf;
    4216             :     Word32 common_pPowerSpectrum_fx[N_MAX];
    4217             : 
    4218       65037 :     set32_fx( common_pPowerSpectrum_fx, 0, N_MAX );
    4219             : 
    4220       65037 :     Word16 common_pPowerSpectrum_exp = MIN16B;
    4221       65037 :     move16();
    4222             : 
    4223             :     /* assumptions: stereo filling was already done on the flattened spectra
    4224             :      *               IGF region is always coded M/S, never L/R (to be done in the encoder)
    4225             :      *               for residual bands with stereo filling infoTcxNoise is set to zero
    4226             :      *               both channels have the same IGF configuration
    4227             :      */
    4228             : 
    4229             :     /* sanity checks: check if both channels have the same configuration...*/
    4230       65037 :     assert( ( sts[0]->core == sts[1]->core ) );
    4231             : 
    4232             :     /* initialization */
    4233       65037 :     IF( EQ_16( sts[0]->core, TCX_20_CORE ) )
    4234             :     {
    4235       62245 :         sfbConf = &hStereoMdct->stbParamsTCX20;
    4236             :     }
    4237             :     ELSE
    4238             :     {
    4239        2792 :         sfbConf = &hStereoMdct->stbParamsTCX10;
    4240             :     }
    4241       65037 :     if ( sts[0]->last_core == ACELP_CORE )
    4242             :     {
    4243           0 :         sfbConf = &hStereoMdct->stbParamsTCX20afterACELP;
    4244             :     }
    4245             : 
    4246             :     /* create line wise ms mask for the core bands */
    4247       65037 :     set16_fx( coreMsMask, 0, N_MAX );
    4248     2777236 :     FOR( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ )
    4249             :     {
    4250     2712199 :         set16_fx( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sub( sfbConf->sfbOffset[sfb + 1], sfbConf->sfbOffset[sfb] ) );
    4251             :     }
    4252             : 
    4253       65037 :     test();
    4254       65037 :     test();
    4255       65037 :     IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] )
    4256             :     {
    4257       53800 :         pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0];
    4258       53800 :         exp_pPowerSpectrumParameter_fx[0] = &exp_pPowerSpectrum_fx[0][0];
    4259       53800 :         pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0];
    4260       53800 :         exp_pPowerSpectrumParameter_fx[1] = &exp_pPowerSpectrum_fx[1][0];
    4261       53800 :         pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0];
    4262       53800 :         pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0];
    4263       53800 :         q_pPowerSpectrumParameterMsInv_fx[0] = q_pPowerSpectrumMsInv_fx[0][0];
    4264       53800 :         q_pPowerSpectrumParameterMsInv_fx[1] = q_pPowerSpectrumMsInv_fx[1][0];
    4265             :     }
    4266             :     ELSE
    4267             :     {
    4268       11237 :         pPowerSpectrumParameter_fx[0] = NULL;
    4269       11237 :         pPowerSpectrumParameter_fx[1] = NULL;
    4270       11237 :         pPowerSpectrumParameterMsInv_fx[0] = NULL;
    4271       11237 :         pPowerSpectrumParameterMsInv_fx[1] = NULL;
    4272       11237 :         q_pPowerSpectrumParameterMsInv_fx[0] = NULL;
    4273       11237 :         q_pPowerSpectrumParameterMsInv_fx[1] = NULL;
    4274             :     }
    4275      195111 :     FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
    4276             :     {
    4277      130074 :         last_core_acelp = extract_l( EQ_16( sts[ch]->last_core, ACELP_CORE ) );
    4278             : 
    4279      130074 :         IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx );
    4280      130074 :         IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno],
    4281      130074 :                                         exp_inv_spectrum_fx[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrum_fx[ch], pPowerSpectrumParameterMsInv_fx[ch],
    4282      130074 :                                         q_pPowerSpectrumParameterMsInv_fx[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, mct_on );
    4283             : 
    4284      130074 :         IF( EQ_16( sts[ch]->core, TCX_20_CORE ) )
    4285             :         {
    4286      124490 :             pPowerSpectrumParameter_fx[ch] = pPowerSpectrum_fx[ch];
    4287      124490 :             exp_pPowerSpectrumParameter_fx[ch] = exp_pPowerSpectrum_fx[ch];
    4288             :         }
    4289             :         ELSE
    4290             :         {
    4291        5584 :             pPowerSpectrumParameter_fx[ch] = NULL;
    4292             :         }
    4293             : 
    4294      130074 :         IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrumParameter_fx[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode );
    4295             : 
    4296      130074 :         IF( pPowerSpectrumParameter_fx[ch] )
    4297             :         {
    4298      124490 :             Word16 length = N_MAX;
    4299      124490 :             move16();
    4300      124490 :             if ( mct_on )
    4301             :             {
    4302       65378 :                 length = L_FRAME48k;
    4303       65378 :                 move16();
    4304             :             }
    4305   133821770 :             FOR( Word16 i = 0; i < length; i++ )
    4306             :             {
    4307   133697280 :                 common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, exp_pPowerSpectrumParameter_fx[ch][i] );
    4308             :             }
    4309             : 
    4310   133821770 :             FOR( Word16 i = 0; i < length; i++ )
    4311             :             {
    4312   133697280 :                 common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[ch][i], sub( exp_pPowerSpectrumParameter_fx[ch][i], common_pPowerSpectrum_exp ) );
    4313   133697280 :                 move32();
    4314             :             }
    4315      124490 :             pPowerSpectrumParameter_fx[ch] = common_pPowerSpectrum_fx;
    4316             :         }
    4317      130074 :         IGF_ErodeSpectrum_ivas_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], common_pPowerSpectrum_exp, igfGridIdx, mct_on );
    4318             :     }
    4319             : 
    4320       65037 :     return;
    4321             : }
    4322             : 
    4323             : 
    4324             : /*-------------------------------------------------------------------*
    4325             :  * IGFSaveSpectrumForITF()
    4326             :  *
    4327             :  *
    4328             :  *-------------------------------------------------------------------*/
    4329             : 
    4330      718458 : void IGFSaveSpectrumForITF_ivas_fx(
    4331             :     IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder  */
    4332             :     const Word16 igfGridIdx,         /* i  : IGF grid index                  */
    4333             :     const Word32 *pITFSpectrum,      /* i  : MDCT spectrum                   */
    4334             :     Word16 exp_pITFSpectrum )
    4335             : {
    4336      718458 :     IGF_UpdateInfo( hIGFEnc, igfGridIdx );
    4337             : 
    4338      718458 :     Copy32( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ) );
    4339             : 
    4340      718458 :     scale_sig32( hIGFEnc->spec_be_igf, sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( exp_pITFSpectrum, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) );
    4341      718458 :     scale_sig32( hIGFEnc->spec_be_igf + sub( hIGFEnc->infoStopLine, IGF_START_MN ), sub( N_MAX_TCX - IGF_START_MN, sub( hIGFEnc->infoStopLine, IGF_START_MN ) ), sub( hIGFEnc->spec_be_igf_e, s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e ) ) );
    4342      718458 :     hIGFEnc->spec_be_igf_e = s_max( exp_pITFSpectrum, hIGFEnc->spec_be_igf_e );
    4343      718458 :     move16();
    4344             : 
    4345      718458 :     return;
    4346             : }
    4347             : 
    4348             : 
    4349             : /*-------------------------------------------------------------------*
    4350             :  * IGF_Reconfig()
    4351             :  *
    4352             :  *
    4353             :  *-------------------------------------------------------------------*/
    4354             : 
    4355        3962 : ivas_error IGF_Reconfig(
    4356             :     IGF_ENC_INSTANCE_HANDLE *hIGFEnc, /* i/o: instance handle of IGF Encoder  */
    4357             :     const Word16 igf,                 /* i  : IGF on/off                      */
    4358             :     const Word16 reset,               /* i  : reset flag                      */
    4359             :     const Word32 brate,               /* i  : bitrate for configuration       */
    4360             :     const Word16 bwidth,              /* i  : signal bandwidth                */
    4361             :     const Word16 element_mode,        /* i  : IVAS element mode               */
    4362             :     const Word16 rf_mode              /* i  : flag to signal the RF mode      */
    4363             : )
    4364             : {
    4365             :     ivas_error error;
    4366             : 
    4367        3962 :     error = IVAS_ERR_OK;
    4368        3962 :     move32();
    4369             : 
    4370        3962 :     test();
    4371        3962 :     test();
    4372        3962 :     test();
    4373        3962 :     IF( igf && *hIGFEnc == NULL )
    4374             :     {
    4375         516 :         IF( ( *hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
    4376             :         {
    4377           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
    4378             :         }
    4379         516 :         IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    4380             :     }
    4381        3446 :     ELSE IF( igf && reset )
    4382             :     {
    4383        2297 :         IGFEncSetMode_ivas_fx( *hIGFEnc, brate, bwidth, element_mode, rf_mode );
    4384             :     }
    4385        1149 :     ELSE IF( !igf && *hIGFEnc != NULL )
    4386             :     {
    4387         744 :         free( *hIGFEnc );
    4388         744 :         *hIGFEnc = NULL;
    4389             :     }
    4390             : 
    4391        3962 :     return error;
    4392             : }

Generated by: LCOV version 1.14