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

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "ivas_cnst.h"
      39             : #include "prot_fx.h"
      40             : #include "ivas_prot_fx.h"
      41             : #include "wmc_auto.h"
      42             : #include "rom_com.h"
      43             : #include "ivas_rom_com.h"
      44             : #include "ivas_rom_com_fx.h"
      45             : 
      46             : 
      47             : #define Q_icBWE 16
      48             : 
      49             : /*-------------------------------------------------------------------*
      50             :  * ic_bwe_dec_reset()
      51             :  *
      52             :  * core switching reset of IC BWE memory
      53             :  *-------------------------------------------------------------------*/
      54             : 
      55       16099 : static void ic_bwe_dec_reset_fx(
      56             :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */
      57             : )
      58             : {
      59             :     /* unscaled & scaled SHB synthesis memory */
      60       16099 :     set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
      61       16099 :     set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER );
      62       16099 :     set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
      63             : 
      64       16099 :     hStereoICBWE->prev_Q_syn_shb_nonref = 31;
      65       16099 :     move16();
      66       16099 :     hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31;
      67       16099 :     move16();
      68       16099 :     hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31;
      69       16099 :     move16();
      70             : 
      71             :     /* inter-channel BWE SP and GSP mem reset */
      72       16099 :     hStereoICBWE->memShbSpecMapping_fx = 0;
      73       16099 :     move32();
      74       16099 :     hStereoICBWE->prev_Q_memshbspec = 31;
      75       16099 :     move16();
      76             : 
      77       16099 :     set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE );
      78       16099 :     set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
      79       16099 :     set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN );
      80             : 
      81       16099 :     hStereoICBWE->prev_Q_hilb = 31;
      82       16099 :     move16();
      83       16099 :     hStereoICBWE->prev_Q_interp = 31;
      84       16099 :     move16();
      85       16099 :     hStereoICBWE->prev_Q_fsout = 31;
      86       16099 :     move16();
      87             : 
      88       16099 :     hStereoICBWE->syn_dm_phase_nonref = 0;
      89       16099 :     move16();
      90             : 
      91       16099 :     return;
      92             : }
      93             : 
      94             : 
      95       95958 : static Word16 FindScale(
      96             :     Word32 *buff, /* Q_buff */
      97             :     Word16 len,   /* Q0 */
      98             :     Word16 Q_buff,
      99             :     Word16 Q_prev )
     100             : {
     101             :     Word32 maxVal;
     102             :     Word16 norm_shift, Q_out;
     103             : 
     104       95958 :     maximum_abs_32_fx( buff, len, &maxVal );
     105       95958 :     norm_shift = norm_l( maxVal );
     106       95958 :     if ( maxVal == 0 )
     107             :     {
     108       11153 :         norm_shift = 31;
     109       11153 :         move16();
     110             :     }
     111             : 
     112       95958 :     Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) );
     113             : 
     114       95958 :     return Q_out;
     115             : }
     116             : 
     117             : 
     118      145402 : void stereo_icBWE_dec_fx(
     119             :     CPE_DEC_HANDLE hCPE,            /* i/o: CPE decoder structure                                                                               */
     120             :     Word32 *synthRef_fx,            /* i/o: Reference channel HB synthesis at output Fs                         Q11 */
     121             :     Word32 *synth_fx,               /* o  : Non reference channel HB synthesis at output Fs                     Q11 */
     122             :     const Word16 *fb_synth_ref_fx,  /* i  : ref. high-band synthesis 16-20 kHz               Q_white_exc*/
     123             :     const Word16 *voice_factors_fx, /* i  : voicing factors                                                                                     Q15 */
     124             :     const Word16 output_frame,      /* i  : frame length                                                                                         Q0 */
     125             :     Word16 *Q_syn                   /* i  : Q of synth and synthRef buffers                                                             */
     126             :     ,
     127             :     const Word16 Q_white_exc /* i  : Q of fb_synth_ref_fx                                                                                               */
     128             : )
     129             : {
     130             :     Word16 i, j, k, nbSubFr;
     131             :     Decoder_State *st; /* i/o: decoder state structure, primary channel        */
     132             :     Word16 spIndx, gsIndx;
     133             :     Word32 excSHB_nonref_fx[L_FRAME16k];
     134             :     Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD];
     135             :     Word32 error_fx[L_FRAME32k];
     136             :     Word16 nlMixFac_fx[NB_SUBFR16k];
     137             :     Word16 specMapping_fx;
     138             :     Word16 fb_synth_nonref_fx[L_FRAME48k];
     139             :     Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal;
     140             :     Word16 scale_fx, e_scale_fx;
     141             :     Word16 alpha_fx, winSlope_fx, winLen_fx;
     142             :     Word16 prevgsMapping_fx;
     143             :     Word16 temp1_fx, temp2_fx;
     144             :     Word16 icbweM2Ref_fx, ratio_L_fx;
     145             :     Word16 gsMapping_fx;
     146             :     Word32 hb_nrg_fx;
     147             :     Word16 Q_syn_shb;
     148             :     Word16 shift_prev_pow, synthRef_shift;
     149             :     Word32 L_tmp;
     150             :     Word16 tmp;
     151             :     Word32 L_nlExc16k, L_mixExc16k;
     152             : 
     153      145402 :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft;
     154      145402 :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
     155      145402 :     st = hCPE->hCoreCoder[0];
     156             : 
     157             :     /*--------------------------------------------------------------------*
     158             :      * skip IC-BWE in case of mono DMX output                             *
     159             :      * -------------------------------------------------------------------*/
     160             : 
     161      145402 :     test();
     162      145402 :     test();
     163      145402 :     test();
     164      145402 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
     165             :     {
     166        5345 :         hCPE->hStereoDft->core_hist[0] = st->core; /* Q0 */
     167        5345 :         move16();
     168             : 
     169        5345 :         return;
     170             :     }
     171      140057 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) )
     172             :     {
     173       17001 :         return;
     174             :     }
     175             : 
     176             :     /*--------------------------------------------------------------------*
     177             :      * skip IC-BWE in case of SID or NO_DATA frame
     178             :      * -------------------------------------------------------------------*/
     179             : 
     180      123056 :     IF( LE_32( st->core_brate, SID_2k40 ) )
     181             :     {
     182        9642 :         return;
     183             :     }
     184             : 
     185             :     /*--------------------------------------------------------------------*
     186             :      * TD high band stereo filling                                        *
     187             :      * -------------------------------------------------------------------*/
     188             : 
     189             :     /* update buffers for TD stereo filling */
     190      113414 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     191             :     {
     192       31231 :         hb_nrg_fx = 0;
     193       31231 :         move32();
     194       31231 :         move32();
     195       31231 :         maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal );
     196       31231 :         synthRef_shift = norm_l( maxVal );
     197       31231 :         if ( maxVal == 0 )
     198             :         {
     199       12936 :             synthRef_shift = 31;
     200       12936 :             move16();
     201             :         }
     202       31231 :         synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) );
     203       31231 :         test();
     204       31231 :         IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) )
     205       21152 :         {
     206       21152 :             Word64 W_tmp = 0;
     207       21152 :             move64();
     208       21152 :             tmp = shl_sat( 1, synthRef_shift );
     209     6866752 :             FOR( i = 0; i < output_frame / 2; i++ )
     210             :             {
     211             :                 // needed to be adjusted for q
     212     6845600 :                 L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
     213     6845600 :                 W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 29 */
     214             :             }
     215       21152 :             hb_nrg_fx = W_round48_L( W_tmp );                /* 2 * (Qsyn + SynthRef_shift) - 45 */
     216       21152 :             hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; /* 2 * (Qsyn + SynthRef_shift) - 45 */
     217       21152 :             move32();
     218       21152 :             hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 );
     219       21152 :             move16();
     220       21152 :             W_tmp = 0;
     221       21152 :             move64();
     222     6866752 :             FOR( ; i < output_frame; i++ )
     223             :             {
     224     6845600 :                 L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
     225     6845600 :                 W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 45 */
     226             :             }
     227             : 
     228       21152 :             hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp );                                    // 2 * (Qsyn + SynthRef_shift) - 45
     229       21152 :             hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); // 2 * (Qsyn + SynthRef_shift) - 45
     230             : 
     231             : 
     232       21152 :             Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); /* Qsynth */
     233             :         }
     234             :         ELSE
     235             :         {
     236       10079 :             set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame );
     237       10079 :             hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0;
     238       10079 :             move32();
     239       10079 :             hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0;
     240       10079 :             move32();
     241             :         }
     242       31231 :         hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( shr( hCPE->hStereoDft->NFFT, 1 ), 6 ) ) ); // 2 * (Qsynth + SynthRef_shift) - 40                                       // 2 * (Qx + SynthRef_shift) - 31 - 15
     243       31231 :         move32();
     244       31231 :         hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( shr( hCPE->hStereoDft->NFFT, 1 ), 6 ) ) ); // 2 * (Qsynth + SynthRef_shift) - 40
     245       31231 :         move32();
     246       31231 :         hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 );
     247       31231 :         hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31
     248       31231 :         move32();
     249       31231 :         hCPE->hStereoDft->td_gain_fx[0] = 0;
     250       31231 :         move32();
     251       31231 :         hCPE->hStereoDft->core_hist[0] = st->core;
     252       31231 :         move16();
     253             :     }
     254             : 
     255             :     /*--------------------------------------------------------------------*
     256             :      * IC-BWE                                                             *
     257             :      * -------------------------------------------------------------------*/
     258      113414 :     test();
     259      113414 :     test();
     260      113414 :     test();
     261      113414 :     test();
     262      113414 :     IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) )
     263             :     {
     264       95561 :         return;
     265             :     }
     266       17853 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) )
     267             :     {
     268           0 :         Copy32( synthRef_fx, synth_fx, output_frame ); /* Qsynth */
     269           0 :         return;
     270             :     }
     271             : 
     272             : 
     273       17853 :     set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k );
     274             : 
     275             :     /* core switching reset */
     276       17853 :     test();
     277       17853 :     IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) )
     278             :     {
     279        3210 :         ic_bwe_dec_reset_fx( hStereoICBWE );
     280             : 
     281        3210 :         IF( st->last_core != ACELP_CORE )
     282             :         {
     283         574 :             hStereoICBWE->prevSpecMapping_fx = 0;
     284         574 :             move16();
     285         574 :             hStereoICBWE->prevgsMapping_fx = 16384; /* 1.f in Q14 */
     286         574 :             move16();
     287         574 :             hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.f in Q14 */
     288         574 :             move16();
     289             :         }
     290             : 
     291        3210 :         IF( EQ_16( st->bwidth, WB ) )
     292             :         {
     293             :             /* copy to outputHB and reset hb_synth values */
     294        2688 :             Copy32( synthRef_fx, synth_fx, output_frame );
     295             : 
     296        2688 :             IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
     297             :             {
     298           3 :                 hStereoICBWE->prevSpecMapping_fx = 0;
     299           3 :                 move16();
     300           3 :                 hStereoICBWE->prevgsMapping_fx = 16384; /* 1.f in Q14 */
     301           3 :                 move16();
     302           3 :                 hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.f in Q14 */
     303           3 :                 move16();
     304             :             }
     305        2685 :             ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
     306             :             {
     307             :                 Word32 temp;
     308        2685 :                 hStereoICBWE->refChanIndx_bwe = L_CH_INDX;
     309        2685 :                 move16();
     310        2685 :                 hStereoICBWE->prevSpecMapping_fx = 0;
     311        2685 :                 move16();
     312             : 
     313        2685 :                 prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx;
     314        2685 :                 move16();
     315        2685 :                 temp = L_shr( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1], 1 ); // Q30
     316        2685 :                 icbweM2Ref_fx = extract_h( L_add( ONE_IN_Q30, temp ) );                                        // Q14
     317        2685 :                 gsMapping_fx = extract_h( L_sub( ONE_IN_Q30, temp ) );                                         // Q14
     318             : 
     319        2685 :                 winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000);        Q0
     320        2685 :                 winSlope_fx = div_s( 1, winLen_fx );                       /* Q15 */
     321        2685 :                 alpha_fx = winSlope_fx;                                    /* Q15 */
     322        2685 :                 move16();
     323       60145 :                 FOR( i = 0; i < winLen_fx; i++ )
     324             :                 {
     325             :                     /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/
     326       57460 :                     temp1_fx = sub( 32767, alpha_fx );                                  /* 1.f in Q15 */
     327       57460 :                     L_tmp = L_mult( alpha_fx, icbweM2Ref_fx );                          // Q15 + Q14 + 1
     328       57460 :                     L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 + 1
     329       57460 :                     synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 );    // Qsynth
     330       57460 :                     move32();
     331             :                     /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/
     332       57460 :                     L_tmp = L_mult( alpha_fx, gsMapping_fx );                  // Q15 + Q14 + 1
     333       57460 :                     L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx );        // Q15 + Q14  +1
     334       57460 :                     synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); // Qsynth
     335       57460 :                     move32();
     336       57460 :                     alpha_fx = add_sat( alpha_fx, winSlope_fx ); /* Q15 */
     337             :                 }
     338      864585 :                 FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
     339             :                 {
     340      861900 :                     synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); // Qsyth - 1
     341      861900 :                     move32();
     342      861900 :                     synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); // Qsynth - 1
     343      861900 :                     move32();
     344             :                 }
     345        2685 :                 hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; // Q14
     346        2685 :                 move16();
     347        2685 :                 hStereoICBWE->prevgsMapping_fx = gsMapping_fx; // Q14
     348        2685 :                 move16();
     349             : 
     350        2685 :                 *Q_syn = sub( *Q_syn, 1 );
     351             :             }
     352             : 
     353        2688 :             return;
     354             :         }
     355             :     }
     356             : 
     357       15165 :     IF( st->bfi == 0 )
     358             :     {
     359       14949 :         hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS );
     360       14949 :         IF( EQ_16( st->flag_ACELP16k, 1 ) )
     361             :         {
     362        8766 :             spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); /* Q0 */
     363             :         }
     364             :         ELSE
     365             :         {
     366        6183 :             spIndx = 3;
     367        6183 :             move16();
     368             :         }
     369       14949 :         IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
     370             :         {
     371          34 :             gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); /* Q0 */
     372             :         }
     373             :         ELSE
     374             :         {
     375       14915 :             gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); /* Q0 */
     376             :         }
     377             : 
     378             :         /* Store indices in case of frame loss */
     379       14949 :         hStereoICBWE->prev_spIndx = spIndx; /* Q0 */
     380       14949 :         move16();
     381       14949 :         hStereoICBWE->prev_gsIndx = gsIndx; /* Q0 */
     382       14949 :         move16();
     383             :     }
     384             :     ELSE /*bfi*/
     385             :     {
     386             :         /* Retrieve last decoded indices */
     387         216 :         spIndx = hStereoICBWE->prev_spIndx; /* Q0 */
     388         216 :         move16();
     389         216 :         gsIndx = hStereoICBWE->prev_gsIndx; /* Q0 */
     390         216 :         move16();
     391         216 :         hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; /* Q0 */
     392         216 :         move16();
     393             :     }
     394             : 
     395             :     /* IC-BWE parameter de-quant */
     396             :     /* sp Mapping */
     397       15165 :     hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661 /* -0.6 in Q15 */, 3277 /* 0.2 in Q14 */ ); // Q15
     398             : 
     399             :     /* gs Mapping */
     400       15165 :     prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
     401       15165 :     move16();
     402             : 
     403       15165 :     IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
     404             :     {
     405          34 :         hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; /* Q14 */
     406          34 :         move16();
     407             :     }
     408             :     ELSE
     409             :     {
     410       15131 :         hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; /* Q14 */
     411       15131 :         move16();
     412             :     }
     413             : 
     414             :     // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping );
     415             : 
     416       15165 :     specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15
     417       15165 :     move16();
     418       15165 :     gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
     419       15165 :     move16();
     420             : 
     421       15165 :     test();
     422       15165 :     test();
     423       15165 :     IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) )
     424             :     {
     425        8556 :         Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15
     426        8556 :         IF( hCPE->hStereoDftDmx != NULL )
     427             :         {
     428           6 :             test();
     429           6 :             IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) )
     430             :             {
     431           0 :                 v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k );
     432             :             }
     433             :         }
     434             :         ELSE
     435             :         {
     436        8550 :             test();
     437        8550 :             IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) )
     438             :             {
     439           0 :                 v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k );
     440             :             }
     441             :         }
     442             : 
     443             :         // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k;
     444        8556 :         IF( st->flag_ACELP16k == 0 )
     445             :         {
     446           0 :             nbSubFr = NB_SUBFR;
     447           0 :             move16();
     448             :         }
     449             :         ELSE
     450             :         {
     451        8556 :             nbSubFr = NB_SUBFR16k;
     452        8556 :             move16();
     453             :         }
     454        8556 :         k = 0;
     455        8556 :         move16();
     456       51336 :         FOR( i = 0; i < nbSubFr; i++ )
     457             :         {
     458       42780 :             IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) )
     459             :             {
     460        9305 :                 temp1_fx = 0;
     461        9305 :                 move16();
     462        9305 :                 temp2_fx = 32767; /* 1.0f in Q15 */
     463        9305 :                 move16();
     464             :             }
     465             :             ELSE
     466             :             {
     467       33475 :                 tmp = 0;
     468       33475 :                 move16();
     469       33475 :                 temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp );
     470       33475 :                 IF( LT_16( tmp, 0 ) )
     471             :                 {
     472       20998 :                     temp1_fx = shl( temp1_fx, tmp );
     473             :                 }
     474       33475 :                 tmp = 0;
     475       33475 :                 move16();
     476       33475 :                 temp2_fx = Sqrt16( sub( 32767 /* 1.0f in Q15 */, nlMixFac_fx[i] ), &tmp );
     477       33475 :                 IF( LT_16( tmp, 0 ) )
     478             :                 {
     479         707 :                     temp2_fx = shl( temp2_fx, tmp );
     480             :                 }
     481             :             }
     482             : 
     483     2780700 :             FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ )
     484             :             {
     485             :                 // common Q for addition
     486     2737920 :                 L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] );                                                 // prev_q_bwe_exc - 16
     487     2737920 :                 L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] );                                               // Q_exc
     488     2737920 :                 L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) );                      // Q_icBWE
     489     2737920 :                 L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) );                    // Q_icBWE
     490     2737920 :                 excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE
     491     2737920 :                 move32();
     492     2737920 :                 k++;
     493             :             }
     494             :         }
     495             : 
     496             :         /* LP synthesis */
     497        8556 :         Q_syn_shb = 31;
     498        8556 :         move16();
     499             : 
     500        8556 :         Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb );
     501        8556 :         Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb );
     502        8556 :         Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb );
     503        8556 :         Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb );
     504             : 
     505        8556 :         Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits
     506             : 
     507        8556 :         Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) );                                                  // Q_syn_shb
     508        8556 :         Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) );                                                             // Q_syn_shb
     509        8556 :         Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); // Q_syn_shb
     510        8556 :         Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) );            // Q_syn_shb
     511             : 
     512             : 
     513        8556 :         Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); // Q_syn_shb
     514             : 
     515        8556 :         E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER );
     516             : 
     517        8556 :         hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb;
     518        8556 :         move16();
     519             : 
     520        8556 :         maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb
     521             : 
     522        8556 :         shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) );
     523             : 
     524        8556 :         prev_pow_fx = 0;
     525        8556 :         move32();
     526        8556 :         curr_pow_fx = 0;
     527        8556 :         move32();
     528      265236 :         FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
     529             :         {
     530      256680 :             L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow );       // Qsyn_shb + shift_prev_pow
     531      256680 :             prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); /* 2 * ( Qsyn_shb + shift_prev_pow ) - 31 */
     532             :         }
     533      265236 :         FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
     534             :         {
     535      256680 :             L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); // Qsyn_shb + shift_prev_pow
     536      256680 :             curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) );               /* 2 * ( Qsyn_shb + shift_prev_pow ) - 31 */
     537             :         }
     538             : 
     539        8556 :         IF( prev_pow_fx == 0 )
     540             :         {
     541          11 :             e_scale_fx = 0;
     542          11 :             move16();
     543          11 :             scale_fx = 0;
     544          11 :             move16();
     545             :         }
     546             :         ELSE
     547             :         {
     548        8545 :             e_scale_fx = 0;
     549        8545 :             move16();
     550        8545 :             scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx );
     551        8545 :             scale_fx = Sqrt16( scale_fx, &e_scale_fx );
     552             :         }
     553        8556 :         IF( e_scale_fx < 0 )
     554             :         {
     555         889 :             scale_fx = shl( scale_fx, e_scale_fx ); /* exp(e_scale_fx) */
     556         889 :             e_scale_fx = 0;
     557         889 :             move16();
     558             :         }
     559      179676 :         FOR( i = 0; i < L_SHB_LAHEAD; i++ )
     560             :         {
     561      171120 :             shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); // Qsyn_shb
     562      171120 :             move32();
     563             :         }
     564        8556 :         tmp = 3276; /* 0.1 in Q15 */
     565        8556 :         move16();
     566       94116 :         FOR( ; i < L_SHB_LAHEAD + 10; i++ )
     567             :         {
     568       85560 :             IF( EQ_16( e_scale_fx, 0 ) )
     569             :             {
     570       45910 :                 temp1_fx = 32767; /* 1.0f in Q15 */
     571       45910 :                 move16();
     572             :             }
     573             :             ELSE
     574             :             {
     575       39650 :                 temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); /* 15 - e_scale_fx */
     576       39650 :                 move16();
     577             :             }
     578       85560 :             L_tmp = L_mult0( tmp, temp1_fx );                                                            /* Q15 + Q15 - e_scale_fx */
     579       85560 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0f in Q15 */, tmp ), scale_fx );                      /* Q15 + Q15 - e_scale_fx */
     580       85560 :             shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); // Q_syn_shb - e_scale_fx
     581       85560 :             move32();
     582       85560 :             IF( LT_16( tmp, 29492 /* 0.9f in Q15 */ ) )
     583             :             {
     584       77004 :                 tmp = add( tmp, 3276 /* 0.1f in Q15 */ );
     585             :             }
     586             :         }
     587             : 
     588             :         /* spec and gs adjustment */
     589        8556 :         Q_syn_shb = sub( Q_syn_shb, e_scale_fx );
     590        8556 :         Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); /* Q_syn_shb */
     591             : 
     592        8556 :         tmp = 31;
     593        8556 :         move16();
     594        8556 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     595        8556 :         temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx );
     596        8556 :         IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) )
     597             :         {
     598         548 :             temp1_fx = 31;
     599         548 :             move16();
     600             :         }
     601        8556 :         temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec );
     602        8556 :         tmp = s_min( temp1_fx, tmp );
     603             : 
     604        8556 :         tmp = sub( tmp, 9 );
     605             : 
     606        8556 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                          /* tmp */
     607        8556 :         hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); /* tmp */
     608             : 
     609        8556 :         hStereoICBWE->prev_Q_memshbspec = tmp;
     610        8556 :         move16();
     611        8556 :         Q_syn_shb = tmp;
     612        8556 :         move16();
     613             : 
     614        8556 :         deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) );
     615        8556 :         hStereoICBWE->prev_Q_memshbspec = Q_syn_shb;
     616        8556 :         move16();
     617        8556 :         Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */
     618        8556 :         hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb;
     619        8556 :         move16();
     620             : 
     621        8556 :         tmp = 31;
     622        8556 :         move16();
     623        8556 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     624        8556 :         tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp );
     625             : 
     626        8556 :         tmp = sub( tmp, 3 );
     627             : 
     628        8556 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                      /* tmp */
     629        8556 :         Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, sub( tmp, hStereoICBWE->prev_Q_syn_shb_ola_nonref ) ); /* tmp */
     630             : 
     631        8556 :         ScaleShapedSHB_fx32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 /* 0.9 in Q15 */ ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx );
     632             : 
     633        8556 :         hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp;
     634        8556 :         move16();
     635        8556 :         Q_syn_shb = tmp;
     636        8556 :         move16();
     637             : 
     638        8556 :         IF( EQ_16( st->extl, FB_TBE ) )
     639             :         {
     640        4093 :             v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k );
     641             :         }
     642             : 
     643             :         /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */
     644             : 
     645        8556 :         tmp = 31;
     646        8556 :         move16();
     647        8556 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     648        8556 :         tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp );
     649        8556 :         tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp );
     650             : 
     651        8556 :         tmp = sub( tmp, 3 );
     652             : 
     653        8556 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                        /* tmp */
     654        8556 :         Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) );               /* tmp */
     655        8556 :         Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); /* tmp */
     656             : 
     657        8556 :         hStereoICBWE->prev_Q_hilb = tmp;
     658        8556 :         move16();
     659        8556 :         hStereoICBWE->prev_Q_interp = tmp;
     660        8556 :         move16();
     661             : 
     662        8556 :         Q_syn_shb = tmp;
     663        8556 :         move16();
     664             : 
     665        8556 :         GenSHBSynth_fx32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) );
     666             :     }
     667             :     ELSE
     668             :     {
     669        6609 :         Copy32( synthRef_fx, synth_fx, output_frame ); /* Q_syn */
     670             : 
     671        6609 :         winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
     672        6609 :         winSlope_fx = div_s( 1, winLen_fx );                       /* Q15 */
     673        6609 :         alpha_fx = winSlope_fx;                                    /* Q15 */
     674        6609 :         move16();
     675             : 
     676             : 
     677        6609 :         IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     678             :         {
     679        6597 :             ratio_L_fx = 16384; /* 0.5 in Q15 */
     680        6597 :             move16();
     681             :         }
     682             :         ELSE
     683             :         {
     684          12 :             ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); /* Q15 */
     685          12 :             move16();
     686             :         }
     687             : 
     688        6609 :         icbweM2Ref_fx = gsMapping_fx; /* Q14 */
     689        6609 :         move16();
     690        6609 :         IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
     691             :         {
     692             : 
     693        2088 :             IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15 */ ) )
     694             :             {
     695        2084 :                 tmp = mult_r( sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ), sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ) ); // Q15
     696        2084 :                 tmp = mult_r( tmp, gsMapping_fx );                                                                    // Q14
     697        2084 :                 tmp = mult_r( tmp, gsMapping_fx );                                                                    // Q13
     698        2084 :                 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     699             :                 {
     700        2080 :                     temp1_fx = 0;
     701        2080 :                     move16();
     702        2080 :                     temp2_fx = 0;
     703        2080 :                     move16();
     704        2080 :                     tmp = shl( tmp, 2 ); /* Q13 + Q2 */
     705        2080 :                     icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
     706        2080 :                     icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
     707        2080 :                     icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
     708             :                 }
     709             :                 ELSE
     710             :                 {
     711           4 :                     icbweM2Ref_fx = 0;
     712           4 :                     move16();
     713             :                 }
     714             :             }
     715             :         }
     716             :         ELSE
     717             :         {
     718        4521 :             IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
     719             :             {
     720        4521 :                 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
     721        4521 :                 tmp = mult_r( tmp, gsMapping_fx );      // Q14
     722        4521 :                 tmp = mult_r( tmp, gsMapping_fx );      // Q13
     723        4521 :                 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     724             :                 {
     725        4521 :                     temp1_fx = 0;
     726        4521 :                     move16();
     727        4521 :                     temp2_fx = 0;
     728        4521 :                     move16();
     729        4521 :                     tmp = shl( tmp, 2 );
     730        4521 :                     icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
     731        4521 :                     icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
     732        4521 :                     icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
     733             :                 }
     734             :                 ELSE
     735             :                 {
     736           0 :                     icbweM2Ref_fx = 0;
     737           0 :                     move16();
     738             :                 }
     739             :             }
     740             :         }
     741             : 
     742        6609 :         icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx );
     743             : 
     744      248749 :         FOR( i = 0; i < winLen_fx; i++ )
     745             :         {
     746      242140 :             L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx );                                                        /* Q29 */
     747      242140 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
     748      242140 :             tmp = shl( round_fx( L_tmp ), 1 );                                                                 /* Q14 */
     749      242140 :             synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp );                                               /* Qsyn - 1*/
     750      242140 :             move32();
     751      242140 :             L_tmp = L_mult0( alpha_fx, gsMapping_fx );                                         /* Q29 */
     752      242140 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), prevgsMapping_fx ); /* Q29 */
     753      242140 :             tmp = shl( round_fx( L_tmp ), 1 );                                                 /* Q14 */
     754      242140 :             synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp );                                     /* Qsyn - 1 */
     755      242140 :             move32();
     756      242140 :             IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) )
     757             :             {
     758      235531 :                 alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
     759             :             }
     760             :         }
     761     3638709 :         FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
     762             :         {
     763     3632100 :             synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
     764     3632100 :             move32();
     765     3632100 :             synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); /* Qsyn - 1 */
     766     3632100 :             move32();
     767             :         }
     768        6609 :         hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
     769        6609 :         move16();
     770             : 
     771        6609 :         ic_bwe_dec_reset_fx( hStereoICBWE );
     772        6609 :         hStereoICBWE->prevSpecMapping_fx = 0;
     773        6609 :         move16();
     774             : 
     775        6609 :         *Q_syn = sub( *Q_syn, 1 );
     776        6609 :         move16();
     777             : 
     778        6609 :         return;
     779             :     }
     780             : 
     781             :     /* resample to output FS */
     782             : 
     783             : 
     784        8556 :     IF( EQ_32( st->output_Fs, 48000 /* Q0 */ ) )
     785             :     {
     786        5199 :         tmp = 31;
     787        5199 :         move16();
     788        5199 :         tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp );
     789        5199 :         tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp );
     790        5199 :         tmp = sub( tmp, 4 );
     791             : 
     792        5199 :         Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) );                                                      /* tmp */
     793        5199 :         Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
     794        5199 :         interpolate_3_over_2_allpass_fx32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx );
     795        5199 :         hStereoICBWE->prev_Q_fsout = tmp;
     796        5199 :         move16();
     797             :     }
     798        3357 :     ELSE IF( EQ_32( st->output_Fs, 32000 /* Q0 */ ) )
     799             :     {
     800        3357 :         Copy32( error_fx, synth_fx, L_FRAME32k ); /* tmp */
     801             :     }
     802           0 :     ELSE IF( EQ_32( st->output_Fs, 16000 /* Q0 */ ) )
     803             :     {
     804           0 :         tmp = 31;
     805           0 :         move16();
     806           0 :         tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp );
     807           0 :         tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp );
     808           0 :         tmp = sub( tmp, 4 );
     809             : 
     810           0 :         Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) );                                                      /* tmp */
     811           0 :         Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
     812           0 :         Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx );
     813           0 :         hStereoICBWE->prev_Q_fsout = tmp;
     814           0 :         move16();
     815             :     }
     816        8556 :     Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); /* Qsyn - 1 */
     817             : 
     818        8556 :     *Q_syn = sub( *Q_syn, 1 );
     819             : 
     820        8556 :     test();
     821        8556 :     IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 /* Q0*/ ) )
     822             :     {
     823             : 
     824             :         // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 );
     825        3152 :         tmp = shl_sat( 1, sub( Q11 + 15, Q_white_exc ) ); /* 29 - Q_white_exc */
     826        3152 :         IF( tmp != 0 )
     827             :         {
     828     2934894 :             FOR( i = 0; i < L_FRAME48k; i++ )
     829             :             {
     830     2931840 :                 synth_fx[i] = L_mac( synth_fx[i], fb_synth_nonref_fx[i], tmp ); /* Q_syn */
     831             :             }
     832             :         }
     833             :     }
     834             : 
     835             :     /* copy to outputHB and reset hb_synth values */
     836             : 
     837        8556 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     838             :     {
     839        8534 :         ratio_L_fx = 16384; /* 1.0 in Q15 */
     840        8534 :         move16();
     841             :     }
     842             :     ELSE
     843             :     {
     844          22 :         ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); /* Q15 */
     845          22 :         move16();
     846             :     }
     847             : 
     848        8556 :     icbweM2Ref_fx = gsMapping_fx;
     849        8556 :     move16();
     850        8556 :     IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
     851             :     {
     852        2743 :         IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15*/ ) )
     853             :         {
     854        2735 :             tmp = mult_r( sub( 32767 /* 1.0 in Q15*/, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15
     855        2735 :             tmp = mult_r( tmp, gsMapping_fx );                                                  // Q14
     856        2735 :             tmp = mult_r( tmp, gsMapping_fx );                                                  // Q13
     857        2735 :             IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     858             :             {
     859        2730 :                 temp1_fx = 0;
     860        2730 :                 move16();
     861        2730 :                 temp2_fx = 0;
     862        2730 :                 move16();
     863        2730 :                 tmp = shl( tmp, 2 );
     864        2730 :                 icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
     865        2730 :                 icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
     866        2730 :                 icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14
     867             :             }
     868             :             ELSE
     869             :             {
     870           5 :                 icbweM2Ref_fx = 0;
     871           5 :                 move16();
     872             :             }
     873             :         }
     874             :     }
     875             :     ELSE
     876             :     {
     877        5813 :         IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
     878             :         {
     879        5813 :             tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
     880        5813 :             tmp = mult_r( tmp, gsMapping_fx );      // Q14
     881        5813 :             tmp = mult_r( tmp, gsMapping_fx );      // Q13
     882        5813 :             IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     883             :             {
     884        5813 :                 temp1_fx = 0;
     885        5813 :                 move16();
     886        5813 :                 temp2_fx = 0;
     887        5813 :                 move16();
     888        5813 :                 tmp = shl( tmp, 2 );
     889        5813 :                 icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
     890        5813 :                 icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
     891        5813 :                 icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
     892             :             }
     893             :             ELSE
     894             :             {
     895           0 :                 icbweM2Ref_fx = 0;
     896           0 :                 move16();
     897             :             }
     898             :         }
     899             :     }
     900             : 
     901        8556 :     icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); /* Q14 */
     902             : 
     903        8556 :     winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
     904        8556 :     winSlope_fx = div_s( 1, winLen_fx );                       /* Q15 */
     905        8556 :     alpha_fx = winSlope_fx;                                    /* Q15 */
     906        8556 :     move16();
     907        8556 :     Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx );
     908      454776 :     FOR( i = 0; i < winLen_fx; i++ )
     909             :     {
     910      446220 :         L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx );                                                        /* Q29 */
     911      446220 :         L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
     912      446220 :         tmp = shl( round_fx( L_tmp ), 1 );                                                                 /* Q14 */
     913      446220 :         synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp );                                               /* Qsyn - 1 */
     914      446220 :         move32();
     915      446220 :         if ( LE_16( alpha_fx, winSlope_fx_ ) )
     916             :         {
     917      437664 :             alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
     918             :         }
     919             :     }
     920             : 
     921     6701856 :     FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
     922             :     {
     923     6693300 :         synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
     924     6693300 :         move32();
     925             :     }
     926             : 
     927        8556 :     hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
     928        8556 :     move16();
     929             : 
     930        8556 :     return;
     931             : }
     932             : 
     933             : /*-------------------------------------------------------------------*
     934             :  * stereo_icBWE_decproc()
     935             :  *
     936             :  * Stereo (inter-channel) BWE mapping - decoder initialization
     937             :  *-------------------------------------------------------------------*/
     938             : 
     939      145402 : void stereo_icBWE_decproc_fx(
     940             :     CPE_DEC_HANDLE hCPE,                       /* i/o: CPE decoder structure       */
     941             :     Word32 *output[CPE_CHANNELS],              /* i/o: output synthesis            Q11*/
     942             :     Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i  : HB synthesis                Q11*/
     943             :     const Word16 last_core,                    /* i  : last core, primary channel       Q0*/
     944             :     const Word16 last_bwidth,                  /* i  : last bandwidth               Q0*/
     945             :     const Word16 output_frame                  /* i  : frame length                 Q0*/
     946             : )
     947             : {
     948             :     Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen;
     949             :     Word16 core, memOffset, refChanIndx_bwe;
     950             : 
     951             :     Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )];
     952      145402 :     Word16 winSlope_fx = 0, alpha_fx;
     953      145402 :     move32();
     954             :     const Word16 *win_dft_fx;
     955             :     Word32 extl_brate, output_Fs;
     956             : 
     957      145402 :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
     958             : 
     959             :     /*--------------------------------------------------------------------*
     960             :      * skip IC-BWE in case of SID or NO_DATA frame
     961             :      * -------------------------------------------------------------------*/
     962             : 
     963      145402 :     test();
     964      145402 :     test();
     965      145402 :     test();
     966      145402 :     IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) )
     967             :     {
     968        5470 :         stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE );
     969             :     }
     970             : 
     971      145402 :     IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) )
     972             :     {
     973       14523 :         return;
     974             :     }
     975             : 
     976             :     /*--------------------------------------------------------------------*
     977             :      * skip IC-BWE in case of mono DMX output                             *
     978             :      * -------------------------------------------------------------------*/
     979             : 
     980      130879 :     test();
     981      130879 :     test();
     982      130879 :     IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     983             :     {
     984       17465 :         add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame );
     985       17465 :         return;
     986             :     }
     987      113414 :     ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) )
     988             :     {
     989        5872 :         return;
     990             :     }
     991             : 
     992             :     /*--------------------------------------------------------------------*
     993             :      * IC-BWE processing
     994             :      * -------------------------------------------------------------------*/
     995             : 
     996      107542 :     core = hCPE->hCoreCoder[0]->core; /* Q0 */
     997      107542 :     move16();
     998      107542 :     extl_brate = hCPE->hCoreCoder[0]->extl_brate; /* Q0 */
     999      107542 :     move32();
    1000      107542 :     output_Fs = hCPE->hCoreCoder[0]->output_Fs; /* Q0 */
    1001      107542 :     move32();
    1002             : 
    1003      107542 :     memOffset = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); /* Q0 */
    1004             : 
    1005             :     /* LRTD stereo mode - 2xBWEs used */
    1006      107542 :     test();
    1007      107542 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag )
    1008             :     {
    1009             :         /* delay HB synth */
    1010       10875 :         FOR( n = 0; n < CPE_CHANNELS; n++ )
    1011             :         {
    1012        7250 :             Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset );    /* Q11 */
    1013        7250 :             Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); /* Q11 */
    1014        7250 :             Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset );              /* Q11 */
    1015        7250 :             Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset );                 /* Q11 */
    1016             :         }
    1017             : 
    1018        3625 :         IF( EQ_16( hCPE->nchan_out, 1 ) )
    1019             :         {
    1020             :             /* stereo to mono downmix */
    1021      791399 :             FOR( i = 0; i < output_frame; i++ )
    1022             :             {
    1023      790080 :                 outputHB[0][i] = W_extract_l( W_shr( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ), Q16 ) ); /* Q11 */
    1024      790080 :                 move32();
    1025             :             }
    1026        1319 :             v_add_32( output[0], outputHB[0], output[0], output_frame );
    1027             :         }
    1028             :         ELSE
    1029             :         {
    1030             :             /* Add the delayed hb_synth component to the delayed ACELP synthesis */
    1031        6918 :             FOR( n = 0; n < CPE_CHANNELS; n++ )
    1032             :             {
    1033        4612 :                 v_add_32( output[n], outputHB[n], output[n], output_frame );
    1034             :             }
    1035             :         }
    1036             :     }
    1037             :     ELSE
    1038             :     {
    1039      311751 :         FOR( n = 0; n < CPE_CHANNELS; n++ )
    1040             :         {
    1041      207834 :             set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset );
    1042             :         }
    1043             :     }
    1044             : 
    1045      107542 :     test();
    1046      107542 :     test();
    1047      107542 :     test();
    1048      107542 :     test();
    1049      107542 :     test();
    1050      107542 :     test();
    1051      107542 :     IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) )
    1052             :     {
    1053       31357 :         IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
    1054             :         {
    1055         262 :             set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
    1056         262 :             set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
    1057             : 
    1058         262 :             set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1059         262 :             set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1060             :         }
    1061             : 
    1062       31357 :         test();
    1063       31357 :         IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 )
    1064             :         {
    1065       17839 :             refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe;
    1066       17839 :             move16();
    1067             : 
    1068       17839 :             test();
    1069       17839 :             test();
    1070       17839 :             test();
    1071       17839 :             IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ )
    1072             :             {
    1073             :                 /* fad-in reference HB signal */
    1074          21 :                 IF( GT_16( memOffset, 0 ) )
    1075             :                 {
    1076          21 :                     SWITCH( memOffset )
    1077             :                     {
    1078           0 :                         case 15:
    1079           0 :                             winSlope_fx = 2185; /* 0.06 in Q15 */
    1080           0 :                             move32();
    1081           0 :                             BREAK;
    1082          10 :                         case 30:
    1083          10 :                             winSlope_fx = 1092; /* 0.03 in Q15 */
    1084          10 :                             move32();
    1085          10 :                             BREAK;
    1086          11 :                         case 45:
    1087          11 :                             winSlope_fx = 728; /* 0.02 in Q15 */
    1088          11 :                             move32();
    1089          11 :                             BREAK;
    1090             :                     }
    1091             :                     // memOffset for 16K 32K 48K are 15 30 45 respectively.camera
    1092          21 :                 }
    1093             :                 ELSE
    1094             :                 {
    1095           0 :                     winSlope_fx = 0;
    1096           0 :                     move32();
    1097             :                 }
    1098          21 :                 alpha_fx = 0;
    1099          21 :                 move16();
    1100         816 :                 FOR( i = 0; i < memOffset; i++ )
    1101             :                 {
    1102         795 :                     alpha_fx = add_sat( alpha_fx, winSlope_fx );                                                                                            /* Q15 */
    1103         795 :                     outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // Q11
    1104         795 :                     move32();
    1105             :                 }
    1106             :             }
    1107             :             /* Resampled LB and HB offset */
    1108       17839 :             Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) );  /* Q11 */
    1109       17839 :             Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); /* Q11 */
    1110             : 
    1111       17839 :             decoderDelay = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS ); /* Q0 */
    1112             : 
    1113       17839 :             test();
    1114       17839 :             IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
    1115             :             {
    1116             :                 /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */
    1117         603 :                 icbweOLASize = NS2SA_FX2( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); /* Q0 */
    1118             : 
    1119       70751 :                 FOR( i = 0; i < decoderDelay; i++ )
    1120             :                 {
    1121       70148 :                     temp0_fx[i] = 0;
    1122       70148 :                     move32();
    1123       70148 :                     temp1_fx[i] = 0;
    1124       70148 :                     move32();
    1125             :                 }
    1126             : 
    1127         603 :                 assert( icbweOLASize > 0 );
    1128         603 :                 SWITCH( icbweOLASize )
    1129             :                 {
    1130         250 :                     case 60:
    1131         250 :                         winSlope_fx = 546; /* 0.0166 in Q15 */
    1132         250 :                         move16();
    1133         250 :                         BREAK;
    1134         246 :                     case 40:
    1135         246 :                         winSlope_fx = 819; /* 0.025 in Q15 */
    1136         246 :                         move16();
    1137         246 :                         BREAK;
    1138         107 :                     case 20:
    1139         107 :                         winSlope_fx = 1638; /* 0.05 in Q15 */
    1140         107 :                         move16();
    1141         107 :                         BREAK;
    1142           0 :                     default:
    1143           0 :                         fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize );
    1144           0 :                         assert( 0 );
    1145             :                         BREAK;
    1146             :                 }
    1147         603 :                 alpha_fx = winSlope_fx; // Q15
    1148         603 :                 move32();
    1149       27583 :                 FOR( ; i < add( decoderDelay, icbweOLASize ); i++ )
    1150             :                 {
    1151       26980 :                     temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11
    1152       26980 :                     move32();
    1153       26980 :                     temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); // Q11
    1154       26980 :                     move32();
    1155       26980 :                     alpha_fx = add_sat( alpha_fx, winSlope_fx ); // Q15
    1156             :                 }
    1157             :             }
    1158             :             ELSE
    1159             :             {
    1160       17236 :                 IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) )
    1161             :                 {
    1162        2287 :                     IF( memOffset > 0 )
    1163             :                     {
    1164        2287 :                         SWITCH( memOffset )
    1165             :                         {
    1166         330 :                             case 15:
    1167         330 :                                 winSlope_fx = 2185; /* 0.06 in Q15 */
    1168         330 :                                 move16();
    1169         330 :                                 BREAK;
    1170         863 :                             case 30:
    1171         863 :                                 winSlope_fx = 1092; /* 0.03 in Q15 */
    1172         863 :                                 move16();
    1173         863 :                                 BREAK;
    1174        1094 :                             case 45:
    1175        1094 :                                 winSlope_fx = 728; /* 0.022 in Q15 */
    1176        1094 :                                 move16();
    1177        1094 :                                 BREAK;
    1178             :                         }
    1179             :                         // memOffset for 16K 32K 48K are 15 30 45 respectively.camera
    1180        2287 :                     }
    1181             :                     ELSE
    1182             :                     {
    1183           0 :                         winSlope_fx = 0;
    1184           0 :                         move32();
    1185             :                     }
    1186        2287 :                     Word16 Incr = 0;
    1187        2287 :                     Word16 Decr = MAX_16;
    1188        2287 :                     move16();
    1189        2287 :                     move16();
    1190       82357 :                     FOR( i = 0; i < memOffset; i++ )
    1191             :                     {
    1192       80070 :                         Incr = add_sat( Incr, winSlope_fx );                                                                                                                                                     /* Q15 */
    1193       80070 :                         Decr = sub( Decr, winSlope_fx );                                                                                                                                                         /* Q15 */
    1194       80070 :                         temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); /* Q11 */
    1195       80070 :                         temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); /* Q11 */
    1196       80070 :                         move32();
    1197             :                     }
    1198             :                 }
    1199             :                 ELSE
    1200             :                 {
    1201       14949 :                     Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset );  /* Q11 */
    1202       14949 :                     Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); /* Q11 */
    1203             :                 }
    1204             :             }
    1205             : 
    1206       17839 :             IF( EQ_16( hCPE->nchan_out, 1 ) )
    1207             :             {
    1208             :                 Word64 W_tmp;
    1209             :                 /* stereo to mono downmix */
    1210        5769 :                 FOR( i = 0; i < output_frame; i++ )
    1211             :                 {
    1212        5760 :                     W_tmp = W_mult_32_16( output[0][i], 32767 /* 1.0 in Q15*/ );                            /* Q11 */
    1213        5760 :                     W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 /* 0.5 in Q15*/ );                       /* Q11*/
    1214        5760 :                     output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 /* 0.5 in Q15*/ ) ); /* Q11 */
    1215        5760 :                     move32();
    1216        5760 :                     move32();
    1217             :                 }
    1218             :             }
    1219             :             ELSE
    1220             :             {
    1221       17830 :                 v_add_32( temp0_fx, output[0], output[0], output_frame );
    1222       17830 :                 v_add_32( temp1_fx, output[1], output[1], output_frame );
    1223             :             }
    1224             : 
    1225       17839 :             Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); /* Q11*/
    1226       17839 :             Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); /* Q11 */
    1227             : 
    1228       17839 :             IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
    1229             :             {
    1230             :                 /*win_dft = hCPE->hStereoDft->win32ms;*/
    1231       17802 :                 win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
    1232       17802 :                 dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
    1233       17802 :                 move16();
    1234             : 
    1235             :                 /* Preparing buffers in anticipation of an ACELP to TCX switch */
    1236             : 
    1237       17802 :                 j = sub( dftOvlLen, 1 );
    1238      575667 :                 FOR( i = 0; i < memOffset; i++ )
    1239             :                 {
    1240      557865 :                     Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j );
    1241      557865 :                     hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); /* Q11 */
    1242      557865 :                     move32();
    1243      557865 :                     hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); /* Q11 */
    1244      557865 :                     move32();
    1245      557865 :                     j = sub( j, 1 );
    1246             :                 }
    1247             : 
    1248      593469 :                 FOR( i = 0; j < dftOvlLen; i++ )
    1249             :                 {
    1250      575667 :                     Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) );
    1251      575667 :                     hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
    1252      575667 :                     move32();
    1253      575667 :                     hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
    1254      575667 :                     move32();
    1255      575667 :                     j = add( j, 1 );
    1256             :                 }
    1257             :             }
    1258             : 
    1259       17839 :             hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe;
    1260       17839 :             move16();
    1261             :         }
    1262             :         ELSE
    1263             :         {
    1264       13518 :             IF( last_core == ACELP_CORE )
    1265             :             {
    1266        3238 :                 IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) )
    1267             :                 {
    1268          23 :                     v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset );
    1269          23 :                     v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset );
    1270             :                 }
    1271             :                 ELSE
    1272             :                 {
    1273             :                     /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */
    1274        3215 :                     v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1275        3215 :                     v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1276             :                 }
    1277             : 
    1278        3238 :                 set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
    1279        3238 :                 set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
    1280             : 
    1281        3238 :                 set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1282        3238 :                 set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1283             :             }
    1284             :         }
    1285             :     }
    1286       76185 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL )
    1287             :     {
    1288           0 :         stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE );
    1289             :     }
    1290       76185 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) )
    1291             :     {
    1292         511 :         Word16 delay_tdbwe = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS );
    1293             : 
    1294        1533 :         FOR( n = 0; n < hCPE->nchan_out; n++ )
    1295             :         {
    1296      101366 :             FOR( i = 0; i < delay_tdbwe; i++ )
    1297             :             {
    1298      100344 :                 output[n][NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] );
    1299      100344 :                 move32();
    1300             :             }
    1301             :         }
    1302             : 
    1303             :         /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */
    1304         511 :         td_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs );
    1305         511 :         fd_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_FD );
    1306             : 
    1307         511 :         hCPE->hCoreCoder[0]->prev_Q_bwe_exc = 31;
    1308         511 :         move16();
    1309             :     }
    1310             : 
    1311      107542 :     test();
    1312      107542 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) )
    1313             :     {
    1314             :         Word32 win_in_fx, win_out_fx, tmp_fx;
    1315             :         Word64 W_tmp, W_tmp1;
    1316       16790 :         win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
    1317       16790 :         dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
    1318       16790 :         move16();
    1319             : 
    1320             :         // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12);
    1321             : 
    1322     1773790 :         FOR( i = 0; i < dftOvlLen; i++ )
    1323             :         {
    1324     1757000 :             j = i_mult( STEREO_DFT32MS_STEP, i );
    1325     1757000 :             win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */
    1326     1757000 :             win_out_fx = L_sub( ONE_IN_Q31, win_in_fx );        /* Q31 */
    1327             :             /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */
    1328             :             /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */
    1329             : 
    1330     1757000 :             W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); /* q_td_gain + Q31 + 1 */
    1331     1757000 :             if ( hCPE->hStereoDft->q_td_gain[0] != 0 )
    1332             :             {
    1333     1659250 :                 W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); /* Q63 */
    1334             :             }
    1335     1757000 :             W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); /* q_td_gain + Q31 + 1 */
    1336     1757000 :             if ( hCPE->hStereoDft->q_td_gain[1] != 0 )
    1337             :             {
    1338     1644900 :                 W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); /* Q63 */
    1339             :             }
    1340     1757000 :             tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) );                                 /* Q31 */
    1341     1757000 :             tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 */
    1342             : 
    1343     1757000 :             output[0][i] = L_add_sat( output[0][i], tmp_fx ); /* Q11 */
    1344     1757000 :             move32();
    1345     1757000 :             output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
    1346     1757000 :             move32();
    1347             :         }
    1348     9504590 :         FOR( i = dftOvlLen; i < output_frame; i++ )
    1349             :         {
    1350     9487800 :             tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */
    1351     9487800 :             output[0][i] = L_add_sat( output[0][i], tmp_fx );                                                              /* Q11 */
    1352     9487800 :             move32();
    1353     9487800 :             output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
    1354     9487800 :             move32();
    1355             :         }
    1356             :     }
    1357             : 
    1358      107542 :     return;
    1359             : }
    1360             : 
    1361             : /*-------------------------------------------------------------------*
    1362             :  * stereo_icBWE_init_dec()
    1363             :  *
    1364             :  * Stereo (inter-channel) BWE mapping - decoder initialization
    1365             :  *-------------------------------------------------------------------*/
    1366             : 
    1367        6280 : void stereo_icBWE_init_dec_fx(
    1368             :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle   */
    1369             : )
    1370             : {
    1371             :     /* BWE ref channel */
    1372        6280 :     hStereoICBWE->refChanIndx_bwe = L_CH_INDX;
    1373        6280 :     move16();
    1374        6280 :     hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX;
    1375        6280 :     move16();
    1376             : 
    1377             :     /* SHB output memory */
    1378        6280 :     set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
    1379        6280 :     set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
    1380             : 
    1381             : 
    1382             :     /* SHB output memory */
    1383        6280 :     set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
    1384        6280 :     set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
    1385             : 
    1386             :     /* inter-channel BWE spectral shape adj. */
    1387        6280 :     hStereoICBWE->prevSpecMapping_fx = 0;
    1388        6280 :     move16();
    1389        6280 :     hStereoICBWE->prevgsMapping_fx = 16384; /* 1.0 in Q14 */
    1390        6280 :     move16();
    1391        6280 :     hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.0 in Q14 */
    1392        6280 :     move16();
    1393             : 
    1394        6280 :     hStereoICBWE->prev_spIndx = 0;
    1395        6280 :     move16();
    1396        6280 :     hStereoICBWE->prev_gsIndx = 0;
    1397        6280 :     move16();
    1398             : 
    1399        6280 :     ic_bwe_dec_reset_fx( hStereoICBWE );
    1400             : 
    1401        6280 :     return;
    1402             : }

Generated by: LCOV version 1.14