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 -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 726 759 95.7 %
Date: 2025-08-23 01:22:27 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       16341 : 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       16341 :     set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
      61       16341 :     set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER );
      62       16341 :     set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
      63             : 
      64       16341 :     hStereoICBWE->prev_Q_syn_shb_nonref = 31;
      65       16341 :     move16();
      66       16341 :     hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31;
      67       16341 :     move16();
      68       16341 :     hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31;
      69       16341 :     move16();
      70             : 
      71             :     /* inter-channel BWE SP and GSP mem reset */
      72       16341 :     hStereoICBWE->memShbSpecMapping_fx = 0;
      73       16341 :     move32();
      74       16341 :     hStereoICBWE->prev_Q_memshbspec = 31;
      75       16341 :     move16();
      76             : 
      77       16341 :     set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE );
      78       16341 :     set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
      79       16341 :     set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN );
      80             : 
      81       16341 :     hStereoICBWE->prev_Q_hilb = 31;
      82       16341 :     move16();
      83       16341 :     hStereoICBWE->prev_Q_interp = 31;
      84       16341 :     move16();
      85       16341 :     hStereoICBWE->prev_Q_fsout = 31;
      86       16341 :     move16();
      87             : 
      88       16341 :     hStereoICBWE->syn_dm_phase_nonref = 0;
      89       16341 :     move16();
      90             : 
      91       16341 :     return;
      92             : }
      93             : 
      94             : 
      95       97892 : 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       97892 :     maximum_abs_32_fx( buff, len, &maxVal );
     105       97892 :     norm_shift = norm_l( maxVal );
     106       97892 :     if ( maxVal == 0 )
     107             :     {
     108       11434 :         norm_shift = 31;
     109       11434 :         move16();
     110             :     }
     111             : 
     112       97892 :     Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) );
     113             : 
     114       97892 :     return Q_out;
     115             : }
     116             : 
     117             : 
     118      149278 : 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      149278 :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft;
     154      149278 :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
     155      149278 :     st = hCPE->hCoreCoder[0];
     156             : 
     157             :     /*--------------------------------------------------------------------*
     158             :      * skip IC-BWE in case of mono DMX output                             *
     159             :      * -------------------------------------------------------------------*/
     160             : 
     161      149278 :     test();
     162      149278 :     test();
     163      149278 :     test();
     164      149278 :     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        5355 :         hCPE->hStereoDft->core_hist[0] = st->core; /* Q0 */
     167        5355 :         move16();
     168             : 
     169        5355 :         return;
     170             :     }
     171      143923 :     ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) )
     172             :     {
     173       17050 :         return;
     174             :     }
     175             : 
     176             :     /*--------------------------------------------------------------------*
     177             :      * skip IC-BWE in case of SID or NO_DATA frame
     178             :      * -------------------------------------------------------------------*/
     179             : 
     180      126873 :     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      117231 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     191             :     {
     192       31817 :         hb_nrg_fx = 0;
     193       31817 :         move32();
     194       31817 :         move32();
     195       31817 :         maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal );
     196       31817 :         synthRef_shift = norm_l( maxVal );
     197       31817 :         if ( maxVal == 0 )
     198             :         {
     199       13159 :             synthRef_shift = 31;
     200       13159 :             move16();
     201             :         }
     202       31817 :         synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) );
     203       31817 :         test();
     204       31817 :         IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) )
     205       21517 :         {
     206       21517 :             Word64 W_tmp = 0;
     207       21517 :             move64();
     208       21517 :             tmp = shl_sat( 1, synthRef_shift );
     209     7032557 :             FOR( i = 0; i < output_frame / 2; i++ )
     210             :             {
     211             :                 // needed to be adjusted for q
     212     7011040 :                 L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
     213     7011040 :                 W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 29 */
     214             :             }
     215       21517 :             hb_nrg_fx = W_round48_L( W_tmp );                /* 2 * (Qsyn + SynthRef_shift) - 45 */
     216       21517 :             hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; /* 2 * (Qsyn + SynthRef_shift) - 45 */
     217       21517 :             move32();
     218       21517 :             hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 );
     219       21517 :             move16();
     220       21517 :             W_tmp = 0;
     221       21517 :             move64();
     222     7032557 :             FOR( ; i < output_frame; i++ )
     223             :             {
     224     7011040 :                 L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
     225     7011040 :                 W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 45 */
     226             :             }
     227             : 
     228       21517 :             hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp );                                    // 2 * (Qsyn + SynthRef_shift) - 45
     229       21517 :             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       21517 :             Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); /* Qsynth */
     233             :         }
     234             :         ELSE
     235             :         {
     236       10300 :             set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame );
     237       10300 :             hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0;
     238       10300 :             move32();
     239       10300 :             hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0;
     240       10300 :             move32();
     241             :         }
     242       31817 :         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       31817 :         move32();
     244       31817 :         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       31817 :         move32();
     246       31817 :         hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 );
     247       31817 :         hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31
     248       31817 :         move32();
     249       31817 :         hCPE->hStereoDft->td_gain_fx[0] = 0;
     250       31817 :         move32();
     251       31817 :         hCPE->hStereoDft->core_hist[0] = st->core;
     252       31817 :         move16();
     253             :     }
     254             : 
     255             :     /*--------------------------------------------------------------------*
     256             :      * IC-BWE                                                             *
     257             :      * -------------------------------------------------------------------*/
     258      117231 :     test();
     259      117231 :     test();
     260      117231 :     test();
     261      117231 :     test();
     262      117231 :     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       99031 :         return;
     265             :     }
     266       18200 :     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       18200 :     set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k );
     274             : 
     275             :     /* core switching reset */
     276       18200 :     test();
     277       18200 :     IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) )
     278             :     {
     279        3235 :         ic_bwe_dec_reset_fx( hStereoICBWE );
     280             : 
     281        3235 :         IF( st->last_core != ACELP_CORE )
     282             :         {
     283         599 :             hStereoICBWE->prevSpecMapping_fx = 0;
     284         599 :             move16();
     285         599 :             hStereoICBWE->prevgsMapping_fx = 16384; /* 1.f in Q14 */
     286         599 :             move16();
     287         599 :             hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.f in Q14 */
     288         599 :             move16();
     289             :         }
     290             : 
     291        3235 :         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       15512 :     IF( st->bfi == 0 )
     358             :     {
     359       15296 :         hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS );
     360       15296 :         IF( EQ_16( st->flag_ACELP16k, 1 ) )
     361             :         {
     362        8943 :             spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); /* Q0 */
     363             :         }
     364             :         ELSE
     365             :         {
     366        6353 :             spIndx = 3;
     367        6353 :             move16();
     368             :         }
     369       15296 :         IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
     370             :         {
     371          32 :             gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); /* Q0 */
     372             :         }
     373             :         ELSE
     374             :         {
     375       15264 :             gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); /* Q0 */
     376             :         }
     377             : 
     378             :         /* Store indices in case of frame loss */
     379       15296 :         hStereoICBWE->prev_spIndx = spIndx; /* Q0 */
     380       15296 :         move16();
     381       15296 :         hStereoICBWE->prev_gsIndx = gsIndx; /* Q0 */
     382       15296 :         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       15512 :     hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661 /* -0.6 in Q15 */, 3277 /* 0.2 in Q14 */ ); // Q15
     398             : 
     399             :     /* gs Mapping */
     400       15512 :     prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
     401       15512 :     move16();
     402             : 
     403       15512 :     IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
     404             :     {
     405          32 :         hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; /* Q14 */
     406          32 :         move16();
     407             :     }
     408             :     ELSE
     409             :     {
     410       15480 :         hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; /* Q14 */
     411       15480 :         move16();
     412             :     }
     413             : 
     414             :     // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping );
     415             : 
     416       15512 :     specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15
     417       15512 :     move16();
     418       15512 :     gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
     419       15512 :     move16();
     420             : 
     421       15512 :     test();
     422       15512 :     test();
     423       15512 :     IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) )
     424             :     {
     425        8725 :         Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15
     426        8725 :         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        8719 :             test();
     437        8719 :             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        8725 :         IF( st->flag_ACELP16k == 0 )
     445             :         {
     446           0 :             nbSubFr = NB_SUBFR;
     447           0 :             move16();
     448             :         }
     449             :         ELSE
     450             :         {
     451        8725 :             nbSubFr = NB_SUBFR16k;
     452        8725 :             move16();
     453             :         }
     454        8725 :         k = 0;
     455        8725 :         move16();
     456       52350 :         FOR( i = 0; i < nbSubFr; i++ )
     457             :         {
     458       43625 :             IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) )
     459             :             {
     460        9655 :                 temp1_fx = 0;
     461        9655 :                 move16();
     462        9655 :                 temp2_fx = 32767; /* 1.0f in Q15 */
     463        9655 :                 move16();
     464             :             }
     465             :             ELSE
     466             :             {
     467       33970 :                 tmp = 0;
     468       33970 :                 move16();
     469       33970 :                 temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp );
     470       33970 :                 IF( LT_16( tmp, 0 ) )
     471             :                 {
     472       21194 :                     temp1_fx = shl( temp1_fx, tmp );
     473             :                 }
     474       33970 :                 tmp = 0;
     475       33970 :                 move16();
     476       33970 :                 temp2_fx = Sqrt16( sub( 32767 /* 1.0f in Q15 */, nlMixFac_fx[i] ), &tmp );
     477       33970 :                 IF( LT_16( tmp, 0 ) )
     478             :                 {
     479         753 :                     temp2_fx = shl( temp2_fx, tmp );
     480             :                 }
     481             :             }
     482             : 
     483     2835625 :             FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ )
     484             :             {
     485             :                 // common Q for addition
     486     2792000 :                 L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] );                                                 // prev_q_bwe_exc - 16
     487     2792000 :                 L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] );                                               // Q_exc
     488     2792000 :                 L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) );                      // Q_icBWE
     489     2792000 :                 L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) );                    // Q_icBWE
     490     2792000 :                 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     2792000 :                 move32();
     492     2792000 :                 k++;
     493             :             }
     494             :         }
     495             : 
     496             :         /* LP synthesis */
     497        8725 :         Q_syn_shb = 31;
     498        8725 :         move16();
     499             : 
     500        8725 :         Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb );
     501        8725 :         Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb );
     502        8725 :         Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb );
     503        8725 :         Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb );
     504             : 
     505        8725 :         Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits
     506             : 
     507        8725 :         Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) );                                                  // Q_syn_shb
     508        8725 :         Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) );                                                             // Q_syn_shb
     509        8725 :         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        8725 :         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        8725 :         Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); // Q_syn_shb
     514             : 
     515        8725 :         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        8725 :         hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb;
     518        8725 :         move16();
     519             : 
     520        8725 :         maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb
     521             : 
     522        8725 :         shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) );
     523             : 
     524        8725 :         prev_pow_fx = 0;
     525        8725 :         move32();
     526        8725 :         curr_pow_fx = 0;
     527        8725 :         move32();
     528      270475 :         FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
     529             :         {
     530      261750 :             L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow );       // Qsyn_shb + shift_prev_pow
     531      261750 :             prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); /* 2 * ( Qsyn_shb + shift_prev_pow ) - 31 */
     532             :         }
     533      270475 :         FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
     534             :         {
     535      261750 :             L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); // Qsyn_shb + shift_prev_pow
     536      261750 :             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        8725 :         IF( prev_pow_fx == 0 )
     540             :         {
     541          12 :             e_scale_fx = 0;
     542          12 :             move16();
     543          12 :             scale_fx = 0;
     544          12 :             move16();
     545             :         }
     546             :         ELSE
     547             :         {
     548        8713 :             e_scale_fx = 0;
     549        8713 :             move16();
     550        8713 :             scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx );
     551        8713 :             scale_fx = Sqrt16( scale_fx, &e_scale_fx );
     552             :         }
     553        8725 :         IF( e_scale_fx < 0 )
     554             :         {
     555         895 :             scale_fx = shl( scale_fx, e_scale_fx ); /* exp(e_scale_fx) */
     556         895 :             e_scale_fx = 0;
     557         895 :             move16();
     558             :         }
     559      183225 :         FOR( i = 0; i < L_SHB_LAHEAD; i++ )
     560             :         {
     561      174500 :             shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); // Qsyn_shb
     562      174500 :             move32();
     563             :         }
     564        8725 :         tmp = 3276; /* 0.1 in Q15 */
     565        8725 :         move16();
     566       95975 :         FOR( ; i < L_SHB_LAHEAD + 10; i++ )
     567             :         {
     568       87250 :             IF( EQ_16( e_scale_fx, 0 ) )
     569             :             {
     570       46740 :                 temp1_fx = 32767; /* 1.0f in Q15 */
     571       46740 :                 move16();
     572             :             }
     573             :             ELSE
     574             :             {
     575       40510 :                 temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); /* 15 - e_scale_fx */
     576       40510 :                 move16();
     577             :             }
     578       87250 :             L_tmp = L_mult0( tmp, temp1_fx );                                                            /* Q15 + Q15 - e_scale_fx */
     579       87250 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0f in Q15 */, tmp ), scale_fx );                      /* Q15 + Q15 - e_scale_fx */
     580       87250 :             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       87250 :             move32();
     582       87250 :             IF( LT_16( tmp, 29492 /* 0.9f in Q15 */ ) )
     583             :             {
     584       78525 :                 tmp = add( tmp, 3276 /* 0.1f in Q15 */ );
     585             :             }
     586             :         }
     587             : 
     588             :         /* spec and gs adjustment */
     589        8725 :         Q_syn_shb = sub( Q_syn_shb, e_scale_fx );
     590        8725 :         Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); /* Q_syn_shb */
     591             : 
     592        8725 :         tmp = 31;
     593        8725 :         move16();
     594        8725 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     595        8725 :         temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx );
     596        8725 :         IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) )
     597             :         {
     598         570 :             temp1_fx = 31;
     599         570 :             move16();
     600             :         }
     601        8725 :         temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec );
     602        8725 :         tmp = s_min( temp1_fx, tmp );
     603             : 
     604        8725 :         tmp = sub( tmp, 9 );
     605             : 
     606        8725 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                          /* tmp */
     607        8725 :         hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); /* tmp */
     608             : 
     609        8725 :         hStereoICBWE->prev_Q_memshbspec = tmp;
     610        8725 :         move16();
     611        8725 :         Q_syn_shb = tmp;
     612        8725 :         move16();
     613             : 
     614        8725 :         deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) );
     615        8725 :         hStereoICBWE->prev_Q_memshbspec = Q_syn_shb;
     616        8725 :         move16();
     617        8725 :         Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */
     618        8725 :         hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb;
     619        8725 :         move16();
     620             : 
     621        8725 :         tmp = 31;
     622        8725 :         move16();
     623        8725 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     624        8725 :         tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp );
     625             : 
     626        8725 :         tmp = sub( tmp, 3 );
     627             : 
     628        8725 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                      /* tmp */
     629        8725 :         Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, sub( tmp, hStereoICBWE->prev_Q_syn_shb_ola_nonref ) ); /* tmp */
     630             : 
     631        8725 :         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        8725 :         hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp;
     634        8725 :         move16();
     635        8725 :         Q_syn_shb = tmp;
     636        8725 :         move16();
     637             : 
     638        8725 :         IF( EQ_16( st->extl, FB_TBE ) )
     639             :         {
     640        4143 :             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        8725 :         tmp = 31;
     646        8725 :         move16();
     647        8725 :         tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
     648        8725 :         tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp );
     649        8725 :         tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp );
     650             : 
     651        8725 :         tmp = sub( tmp, 3 );
     652             : 
     653        8725 :         Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) );                                        /* tmp */
     654        8725 :         Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) );               /* tmp */
     655        8725 :         Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); /* tmp */
     656             : 
     657        8725 :         hStereoICBWE->prev_Q_hilb = tmp;
     658        8725 :         move16();
     659        8725 :         hStereoICBWE->prev_Q_interp = tmp;
     660        8725 :         move16();
     661             : 
     662        8725 :         Q_syn_shb = tmp;
     663        8725 :         move16();
     664             : 
     665        8725 :         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        6787 :         Copy32( synthRef_fx, synth_fx, output_frame ); /* Q_syn */
     670             : 
     671        6787 :         winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
     672        6787 :         winSlope_fx = div_s( 1, winLen_fx );                       /* Q15 */
     673        6787 :         alpha_fx = winSlope_fx;                                    /* Q15 */
     674        6787 :         move16();
     675             : 
     676             : 
     677        6787 :         IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     678             :         {
     679        6775 :             ratio_L_fx = 16384; /* 0.5 in Q15 */
     680        6775 :             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        6787 :         icbweM2Ref_fx = gsMapping_fx; /* Q14 */
     689        6787 :         move16();
     690        6787 :         IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
     691             :         {
     692             : 
     693        2150 :             IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15 */ ) )
     694             :             {
     695        2146 :                 tmp = mult_r( sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ), sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ) ); // Q15
     696        2146 :                 tmp = mult_r( tmp, gsMapping_fx );                                                                    // Q14
     697        2146 :                 tmp = mult_r( tmp, gsMapping_fx );                                                                    // Q13
     698        2146 :                 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     699             :                 {
     700        2142 :                     temp1_fx = 0;
     701        2142 :                     move16();
     702        2142 :                     temp2_fx = 0;
     703        2142 :                     move16();
     704        2142 :                     tmp = shl( tmp, 2 ); /* Q13 + Q2 */
     705        2142 :                     icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
     706        2142 :                     icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
     707        2142 :                     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        4637 :             IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
     719             :             {
     720        4637 :                 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
     721        4637 :                 tmp = mult_r( tmp, gsMapping_fx );      // Q14
     722        4637 :                 tmp = mult_r( tmp, gsMapping_fx );      // Q13
     723        4637 :                 IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     724             :                 {
     725        4637 :                     temp1_fx = 0;
     726        4637 :                     move16();
     727        4637 :                     temp2_fx = 0;
     728        4637 :                     move16();
     729        4637 :                     tmp = shl( tmp, 2 );
     730        4637 :                     icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
     731        4637 :                     icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
     732        4637 :                     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        6787 :         icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx );
     743             : 
     744      259387 :         FOR( i = 0; i < winLen_fx; i++ )
     745             :         {
     746      252600 :             L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx );                                                        /* Q29 */
     747      252600 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
     748      252600 :             tmp = shl( round_fx( L_tmp ), 1 );                                                                 /* Q14 */
     749      252600 :             synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp );                                               /* Qsyn - 1*/
     750      252600 :             move32();
     751      252600 :             L_tmp = L_mult0( alpha_fx, gsMapping_fx );                                         /* Q29 */
     752      252600 :             L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), prevgsMapping_fx ); /* Q29 */
     753      252600 :             tmp = shl( round_fx( L_tmp ), 1 );                                                 /* Q14 */
     754      252600 :             synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp );                                     /* Qsyn - 1 */
     755      252600 :             move32();
     756      252600 :             IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) )
     757             :             {
     758      245813 :                 alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
     759             :             }
     760             :         }
     761     3795787 :         FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
     762             :         {
     763     3789000 :             synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
     764     3789000 :             move32();
     765     3789000 :             synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); /* Qsyn - 1 */
     766     3789000 :             move32();
     767             :         }
     768        6787 :         hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
     769        6787 :         move16();
     770             : 
     771        6787 :         ic_bwe_dec_reset_fx( hStereoICBWE );
     772        6787 :         hStereoICBWE->prevSpecMapping_fx = 0;
     773        6787 :         move16();
     774             : 
     775        6787 :         *Q_syn = sub( *Q_syn, 1 );
     776        6787 :         move16();
     777             : 
     778        6787 :         return;
     779             :     }
     780             : 
     781             :     /* resample to output FS */
     782             : 
     783             : 
     784        8725 :     IF( EQ_32( st->output_Fs, 48000 /* Q0 */ ) )
     785             :     {
     786        5321 :         tmp = 31;
     787        5321 :         move16();
     788        5321 :         tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp );
     789        5321 :         tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp );
     790        5321 :         tmp = sub( tmp, 4 );
     791             : 
     792        5321 :         Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) );                                                      /* tmp */
     793        5321 :         Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
     794        5321 :         interpolate_3_over_2_allpass_fx32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx );
     795        5321 :         hStereoICBWE->prev_Q_fsout = tmp;
     796        5321 :         move16();
     797             :     }
     798        3404 :     ELSE IF( EQ_32( st->output_Fs, 32000 /* Q0 */ ) )
     799             :     {
     800        3404 :         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        8725 :     Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); /* Qsyn - 1 */
     817             : 
     818        8725 :     *Q_syn = sub( *Q_syn, 1 );
     819             : 
     820        8725 :     test();
     821        8725 :     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        3202 :         tmp = shl_sat( 1, sub( Q11 + 15, Q_white_exc ) ); /* 29 - Q_white_exc */
     826        3202 :         IF( tmp != 0 )
     827             :         {
     828     2984866 :             FOR( i = 0; i < L_FRAME48k; i++ )
     829             :             {
     830     2981760 :                 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        8725 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     838             :     {
     839        8705 :         ratio_L_fx = 16384; /* 1.0 in Q15 */
     840        8705 :         move16();
     841             :     }
     842             :     ELSE
     843             :     {
     844          20 :         ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); /* Q15 */
     845          20 :         move16();
     846             :     }
     847             : 
     848        8725 :     icbweM2Ref_fx = gsMapping_fx;
     849        8725 :     move16();
     850        8725 :     IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
     851             :     {
     852        2818 :         IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15*/ ) )
     853             :         {
     854        2811 :             tmp = mult_r( sub( 32767 /* 1.0 in Q15*/, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15
     855        2811 :             tmp = mult_r( tmp, gsMapping_fx );                                                  // Q14
     856        2811 :             tmp = mult_r( tmp, gsMapping_fx );                                                  // Q13
     857        2811 :             IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     858             :             {
     859        2806 :                 temp1_fx = 0;
     860        2806 :                 move16();
     861        2806 :                 temp2_fx = 0;
     862        2806 :                 move16();
     863        2806 :                 tmp = shl( tmp, 2 );
     864        2806 :                 icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
     865        2806 :                 icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
     866        2806 :                 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        5907 :         IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
     878             :         {
     879        5907 :             tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
     880        5907 :             tmp = mult_r( tmp, gsMapping_fx );      // Q14
     881        5907 :             tmp = mult_r( tmp, gsMapping_fx );      // Q13
     882        5907 :             IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
     883             :             {
     884        5907 :                 temp1_fx = 0;
     885        5907 :                 move16();
     886        5907 :                 temp2_fx = 0;
     887        5907 :                 move16();
     888        5907 :                 tmp = shl( tmp, 2 );
     889        5907 :                 icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
     890        5907 :                 icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
     891        5907 :                 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        8725 :     icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); /* Q14 */
     902             : 
     903        8725 :     winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
     904        8725 :     winSlope_fx = div_s( 1, winLen_fx );                       /* Q15 */
     905        8725 :     alpha_fx = winSlope_fx;                                    /* Q15 */
     906        8725 :     move16();
     907        8725 :     Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx );
     908      464145 :     FOR( i = 0; i < winLen_fx; i++ )
     909             :     {
     910      455420 :         L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx );                                                        /* Q29 */
     911      455420 :         L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
     912      455420 :         tmp = shl( round_fx( L_tmp ), 1 );                                                                 /* Q14 */
     913      455420 :         synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp );                                               /* Qsyn - 1 */
     914      455420 :         move32();
     915      455420 :         if ( LE_16( alpha_fx, winSlope_fx_ ) )
     916             :         {
     917      446695 :             alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
     918             :         }
     919             :     }
     920             : 
     921     6840025 :     FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
     922             :     {
     923     6831300 :         synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
     924     6831300 :         move32();
     925             :     }
     926             : 
     927        8725 :     hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
     928        8725 :     move16();
     929             : 
     930        8725 :     return;
     931             : }
     932             : 
     933             : /*-------------------------------------------------------------------*
     934             :  * stereo_icBWE_decproc()
     935             :  *
     936             :  * Stereo (inter-channel) BWE mapping - decoder initialization
     937             :  *-------------------------------------------------------------------*/
     938             : 
     939      149278 : 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      149278 :     Word16 winSlope_fx = 0, alpha_fx;
     953      149278 :     move32();
     954             :     const Word16 *win_dft_fx;
     955             :     Word32 extl_brate, output_Fs;
     956             : 
     957      149278 :     STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
     958             : 
     959             :     /*--------------------------------------------------------------------*
     960             :      * skip IC-BWE in case of SID or NO_DATA frame
     961             :      * -------------------------------------------------------------------*/
     962             : 
     963      149278 :     test();
     964      149278 :     test();
     965      149278 :     test();
     966      149278 :     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      149278 :     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      134755 :     test();
     981      134755 :     test();
     982      134755 :     IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
     983             :     {
     984       17524 :         add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame );
     985       17524 :         return;
     986             :     }
     987      117231 :     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      111359 :     core = hCPE->hCoreCoder[0]->core; /* Q0 */
     997      111359 :     move16();
     998      111359 :     extl_brate = hCPE->hCoreCoder[0]->extl_brate; /* Q0 */
     999      111359 :     move32();
    1000      111359 :     output_Fs = hCPE->hCoreCoder[0]->output_Fs; /* Q0 */
    1001      111359 :     move32();
    1002             : 
    1003      111359 :     memOffset = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); /* Q0 */
    1004             : 
    1005             :     /* LRTD stereo mode - 2xBWEs used */
    1006      111359 :     test();
    1007      111359 :     IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag )
    1008             :     {
    1009             :         /* delay HB synth */
    1010       10815 :         FOR( n = 0; n < CPE_CHANNELS; n++ )
    1011             :         {
    1012        7210 :             Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset );    /* Q11 */
    1013        7210 :             Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); /* Q11 */
    1014        7210 :             Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset );              /* Q11 */
    1015        7210 :             Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset );                 /* Q11 */
    1016             :         }
    1017             : 
    1018        3605 :         IF( EQ_16( hCPE->nchan_out, 1 ) )
    1019             :         {
    1020             :             /* stereo to mono downmix */
    1021      776984 :             FOR( i = 0; i < output_frame; i++ )
    1022             :             {
    1023      775680 :                 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      775680 :                 move32();
    1025             :             }
    1026        1304 :             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        6903 :             FOR( n = 0; n < CPE_CHANNELS; n++ )
    1032             :             {
    1033        4602 :                 v_add_32( output[n], outputHB[n], output[n], output_frame );
    1034             :             }
    1035             :         }
    1036             :     }
    1037             :     ELSE
    1038             :     {
    1039      323262 :         FOR( n = 0; n < CPE_CHANNELS; n++ )
    1040             :         {
    1041      215508 :             set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset );
    1042             :         }
    1043             :     }
    1044             : 
    1045      111359 :     test();
    1046      111359 :     test();
    1047      111359 :     test();
    1048      111359 :     test();
    1049      111359 :     test();
    1050      111359 :     test();
    1051      111359 :     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       31898 :         IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
    1054             :         {
    1055         289 :             set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
    1056         289 :             set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
    1057             : 
    1058         289 :             set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1059         289 :             set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1060             :         }
    1061             : 
    1062       31898 :         test();
    1063       31898 :         IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 )
    1064             :         {
    1065       18186 :             refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe;
    1066       18186 :             move16();
    1067             : 
    1068       18186 :             test();
    1069       18186 :             test();
    1070       18186 :             test();
    1071       18186 :             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       18186 :             Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) );  /* Q11 */
    1109       18186 :             Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); /* Q11 */
    1110             : 
    1111       18186 :             decoderDelay = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS ); /* Q0 */
    1112             : 
    1113       18186 :             test();
    1114       18186 :             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         629 :                 icbweOLASize = NS2SA_FX2( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); /* Q0 */
    1118             : 
    1119       74781 :                 FOR( i = 0; i < decoderDelay; i++ )
    1120             :                 {
    1121       74152 :                     temp0_fx[i] = 0;
    1122       74152 :                     move32();
    1123       74152 :                     temp1_fx[i] = 0;
    1124       74152 :                     move32();
    1125             :                 }
    1126             : 
    1127         629 :                 assert( icbweOLASize > 0 );
    1128         629 :                 SWITCH( icbweOLASize )
    1129             :                 {
    1130         275 :                     case 60:
    1131         275 :                         winSlope_fx = 546; /* 0.0166 in Q15 */
    1132         275 :                         move16();
    1133         275 :                         BREAK;
    1134         247 :                     case 40:
    1135         247 :                         winSlope_fx = 819; /* 0.025 in Q15 */
    1136         247 :                         move16();
    1137         247 :                         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         629 :                 alpha_fx = winSlope_fx; // Q15
    1148         629 :                 move32();
    1149       29149 :                 FOR( ; i < add( decoderDelay, icbweOLASize ); i++ )
    1150             :                 {
    1151       28520 :                     temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11
    1152       28520 :                     move32();
    1153       28520 :                     temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); // Q11
    1154       28520 :                     move32();
    1155       28520 :                     alpha_fx = add_sat( alpha_fx, winSlope_fx ); // Q15
    1156             :                 }
    1157             :             }
    1158             :             ELSE
    1159             :             {
    1160       17557 :                 IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) )
    1161             :                 {
    1162        2334 :                     IF( memOffset > 0 )
    1163             :                     {
    1164        2334 :                         SWITCH( memOffset )
    1165             :                         {
    1166         330 :                             case 15:
    1167         330 :                                 winSlope_fx = 2185; /* 0.06 in Q15 */
    1168         330 :                                 move16();
    1169         330 :                                 BREAK;
    1170         870 :                             case 30:
    1171         870 :                                 winSlope_fx = 1092; /* 0.03 in Q15 */
    1172         870 :                                 move16();
    1173         870 :                                 BREAK;
    1174        1134 :                             case 45:
    1175        1134 :                                 winSlope_fx = 728; /* 0.022 in Q15 */
    1176        1134 :                                 move16();
    1177        1134 :                                 BREAK;
    1178             :                         }
    1179             :                         // memOffset for 16K 32K 48K are 15 30 45 respectively.camera
    1180        2334 :                     }
    1181             :                     ELSE
    1182             :                     {
    1183           0 :                         winSlope_fx = 0;
    1184           0 :                         move32();
    1185             :                     }
    1186        2334 :                     Word16 Incr = 0;
    1187        2334 :                     Word16 Decr = MAX_16;
    1188        2334 :                     move16();
    1189        2334 :                     move16();
    1190       84414 :                     FOR( i = 0; i < memOffset; i++ )
    1191             :                     {
    1192       82080 :                         Incr = add_sat( Incr, winSlope_fx );                                                                                                                                                     /* Q15 */
    1193       82080 :                         Decr = sub( Decr, winSlope_fx );                                                                                                                                                         /* Q15 */
    1194       82080 :                         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       82080 :                         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       82080 :                         move32();
    1197             :                     }
    1198             :                 }
    1199             :                 ELSE
    1200             :                 {
    1201       15223 :                     Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset );  /* Q11 */
    1202       15223 :                     Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); /* Q11 */
    1203             :                 }
    1204             :             }
    1205             : 
    1206       18186 :             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       18177 :                 v_add_32( temp0_fx, output[0], output[0], output_frame );
    1222       18177 :                 v_add_32( temp1_fx, output[1], output[1], output_frame );
    1223             :             }
    1224             : 
    1225       18186 :             Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); /* Q11*/
    1226       18186 :             Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); /* Q11 */
    1227             : 
    1228       18186 :             IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
    1229             :             {
    1230             :                 /*win_dft = hCPE->hStereoDft->win32ms;*/
    1231       18151 :                 win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
    1232       18151 :                 dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
    1233       18151 :                 move16();
    1234             : 
    1235             :                 /* Preparing buffers in anticipation of an ACELP to TCX switch */
    1236             : 
    1237       18151 :                 j = sub( dftOvlLen, 1 );
    1238      590821 :                 FOR( i = 0; i < memOffset; i++ )
    1239             :                 {
    1240      572670 :                     Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j );
    1241      572670 :                     hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); /* Q11 */
    1242      572670 :                     move32();
    1243      572670 :                     hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); /* Q11 */
    1244      572670 :                     move32();
    1245      572670 :                     j = sub( j, 1 );
    1246             :                 }
    1247             : 
    1248      608972 :                 FOR( i = 0; j < dftOvlLen; i++ )
    1249             :                 {
    1250      590821 :                     Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) );
    1251      590821 :                     hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
    1252      590821 :                     move32();
    1253      590821 :                     hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
    1254      590821 :                     move32();
    1255      590821 :                     j = add( j, 1 );
    1256             :                 }
    1257             :             }
    1258             : 
    1259       18186 :             hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe;
    1260       18186 :             move16();
    1261             :         }
    1262             :         ELSE
    1263             :         {
    1264       13712 :             IF( last_core == ACELP_CORE )
    1265             :             {
    1266        3253 :                 IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) )
    1267             :                 {
    1268          22 :                     v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset );
    1269          22 :                     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        3231 :                     v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1275        3231 :                     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        3253 :                 set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
    1279        3253 :                 set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
    1280             : 
    1281        3253 :                 set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1282        3253 :                 set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
    1283             :             }
    1284             :         }
    1285             :     }
    1286       79461 :     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       79461 :     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         539 :         Word16 delay_tdbwe = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS );
    1293             : 
    1294        1617 :         FOR( n = 0; n < hCPE->nchan_out; n++ )
    1295             :         {
    1296      107638 :             FOR( i = 0; i < delay_tdbwe; i++ )
    1297             :             {
    1298      106560 :                 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      106560 :                 move32();
    1300             :             }
    1301             :         }
    1302             : 
    1303             :         /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */
    1304         539 :         td_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs );
    1305         539 :         fd_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_FD );
    1306             : 
    1307         539 :         hCPE->hCoreCoder[0]->prev_Q_bwe_exc = 31;
    1308         539 :         move16();
    1309             :     }
    1310             : 
    1311      111359 :     test();
    1312      111359 :     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       17106 :         win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
    1317       17106 :         dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
    1318       17106 :         move16();
    1319             : 
    1320             :         // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12);
    1321             : 
    1322     1818406 :         FOR( i = 0; i < dftOvlLen; i++ )
    1323             :         {
    1324     1801300 :             j = i_mult( STEREO_DFT32MS_STEP, i );
    1325     1801300 :             win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */
    1326     1801300 :             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     1801300 :             W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); /* q_td_gain + Q31 + 1 */
    1331     1801300 :             if ( hCPE->hStereoDft->q_td_gain[0] != 0 )
    1332             :             {
    1333     1701050 :                 W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); /* Q63 */
    1334             :             }
    1335     1801300 :             W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); /* q_td_gain + Q31 + 1 */
    1336     1801300 :             if ( hCPE->hStereoDft->q_td_gain[1] != 0 )
    1337             :             {
    1338     1686100 :                 W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); /* Q63 */
    1339             :             }
    1340     1801300 :             tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) );                                 /* Q31 */
    1341     1801300 :             tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 */
    1342             : 
    1343     1801300 :             output[0][i] = L_add_sat( output[0][i], tmp_fx ); /* Q11 */
    1344     1801300 :             move32();
    1345     1801300 :             output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
    1346     1801300 :             move32();
    1347             :         }
    1348     9744126 :         FOR( i = dftOvlLen; i < output_frame; i++ )
    1349             :         {
    1350     9727020 :             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     9727020 :             output[0][i] = L_add_sat( output[0][i], tmp_fx );                                                              /* Q11 */
    1352     9727020 :             move32();
    1353     9727020 :             output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
    1354     9727020 :             move32();
    1355             :         }
    1356             :     }
    1357             : 
    1358      111359 :     return;
    1359             : }
    1360             : 
    1361             : /*-------------------------------------------------------------------*
    1362             :  * stereo_icBWE_init_dec()
    1363             :  *
    1364             :  * Stereo (inter-channel) BWE mapping - decoder initialization
    1365             :  *-------------------------------------------------------------------*/
    1366             : 
    1367        6319 : 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        6319 :     hStereoICBWE->refChanIndx_bwe = L_CH_INDX;
    1373        6319 :     move16();
    1374        6319 :     hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX;
    1375        6319 :     move16();
    1376             : 
    1377             :     /* SHB output memory */
    1378        6319 :     set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
    1379        6319 :     set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
    1380             : 
    1381             : 
    1382             :     /* SHB output memory */
    1383        6319 :     set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
    1384        6319 :     set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
    1385             : 
    1386             :     /* inter-channel BWE spectral shape adj. */
    1387        6319 :     hStereoICBWE->prevSpecMapping_fx = 0;
    1388        6319 :     move16();
    1389        6319 :     hStereoICBWE->prevgsMapping_fx = 16384; /* 1.0 in Q14 */
    1390        6319 :     move16();
    1391        6319 :     hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.0 in Q14 */
    1392        6319 :     move16();
    1393             : 
    1394        6319 :     hStereoICBWE->prev_spIndx = 0;
    1395        6319 :     move16();
    1396        6319 :     hStereoICBWE->prev_gsIndx = 0;
    1397        6319 :     move16();
    1398             : 
    1399        6319 :     ic_bwe_dec_reset_fx( hStereoICBWE );
    1400             : 
    1401        6319 :     return;
    1402             : }

Generated by: LCOV version 1.14