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

Generated by: LCOV version 1.14