LCOV - code coverage report
Current view: top level - lib_enc - hq_hr_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ cede165d26d1b794bfc5f5f6f9ec19d4d64a9a3b Lines: 187 192 97.4 %
Date: 2025-11-01 03:16:20 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h" /* Compilation switches                   */
       7             : #include "cnst.h"    /* Common constants                       */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : #include "prot_fx.h" /* Function prototypes                    */
      10             : #include "ivas_prot_fx.h"
      11             : #include "prot_fx_enc.h" /* Function prototypes                    */
      12             : 
      13             : 
      14             : /*--------------------------------------------------------------------------*
      15             :  * hq_hr_enc_fx()
      16             :  *
      17             :  * HQ High rate encoding routine
      18             :  *--------------------------------------------------------------------------*/
      19             : 
      20         392 : void hq_hr_enc_fx(
      21             :     Encoder_State *st_fx,       /* i/o: encoder state structure fx          */
      22             :     Word32 *t_audio,            /* i/o: transform-domain coefficients  Q12  */
      23             :     const Word16 length,        /* i  : length of spectrum             Q0   */
      24             :     Word16 *num_bits,           /* i  : number of available bits       Q0   */
      25             :     const Word16 is_transient,  /* i  : transient flag                 Q0   */
      26             :     const Word16 vad_hover_flag /* i  : VAD hangover flag              Q0   */
      27             : )
      28             : {
      29             :     Word16 nb_sfm;                                              /* Q0   */
      30             :     Word16 sum, hcode_l;                                        /* Q0   */
      31             :     Word16 difidx[NB_SFM];                                      /* Q0   */
      32             :     Word16 normqlg2[NB_SFM], ynrm[NB_SFM];                      /* Q0   */
      33             :     Word16 nf_idx;                                              /* Q0   */
      34             :     Word16 bits;                                                /*      */
      35             :     Word16 LCmode;                                              /* Q0   */
      36             :     Word16 shape_bits, num_sfm, numnrmibits;                    /* Q0   */
      37             :     Word16 hqswb_clas;                                          /* Q0   */
      38             :     Word16 num_env_bands;                                       /* Q0   */
      39             :     Word16 Npeaks, start_norm;                                  /* Q0   */
      40             :     Word16 difidx_org[NB_SFM];                                  /* Q0   */
      41             :     Word16 R[NB_SFM];                                           /* Q0   */
      42             :     Word16 peaks[HVQ_MAX_PEAKS];                                /* Q0   */
      43             :     Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM]; /* Q0   */
      44             :     Word16 npulses[NB_SFM], maxpulse[NB_SFM];                   /* Q0   */
      45             :     Word16 Rsubband[NB_SFM];                                    /* Q3   */
      46             :     Word32 t_audio_q[L_SPEC48k_EXT];                            /* Q12  */
      47             :     Word32 nf_gains[HVQ_NF_GROUPS];                             /* Q12  */
      48             :     Word32 pe_gains[HVQ_NF_GROUPS];                             /* Q12  */
      49             :     Word16 noise_level[HVQ_BWE_NOISE_BANDS];                    /* Q15  */
      50             :     Word16 hq_generic_offset;                                   /* Q0   */
      51             :     Word16 hq_generic_fenv[HQ_FB_FENV];                         /* Q1   */
      52         392 :     Word16 hq_generic_exc_clas = 0;                             /* Q0   */
      53         392 :     move16();
      54             :     Word16 core_sfm; /* Q0   */
      55             :     Word16 har_freq_est1, har_freq_est2;
      56             :     Word16 flag_dis;
      57             :     const Word16 *subband_search_offset;
      58             :     Word16 wBands[2];
      59             : 
      60             :     Word16 t_audio_norm[L_FRAME48k];
      61             :     Word16 t_audio_q_norm[L_FRAME48k];
      62             :     Word16 Q_audio;
      63             :     Word16 i;
      64             :     Word16 b_delta_env;
      65             :     Word16 Q_shift;
      66             :     Word16 att;
      67         392 :     HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
      68             : 
      69             :     /*------------------------------------------------------------------*
      70             :      * Initializations
      71             :      *------------------------------------------------------------------*/
      72             : 
      73         392 :     Npeaks = 0;
      74         392 :     Q_audio = 0; /* to avoid compilation warnings */
      75         392 :     move16();
      76         392 :     move16();
      77             : 
      78         392 :     set16_fx( npulses, 0, NB_SFM );
      79         392 :     set16_fx( maxpulse, 0, NB_SFM );
      80         392 :     set16_fx( difidx_org, 0, NB_SFM );
      81         392 :     set32_fx( t_audio_q, 0, L_FRAME48k );
      82         392 :     set32_fx( nf_gains, 0, HVQ_NF_GROUPS );
      83         392 :     set32_fx( pe_gains, 0, HVQ_NF_GROUPS );
      84         392 :     flag_dis = 1;
      85         392 :     move16();
      86         392 :     har_freq_est1 = 0;
      87         392 :     move16();
      88         392 :     har_freq_est2 = 0;
      89         392 :     move16();
      90             : 
      91             :     /*------------------------------------------------------------------*
      92             :      * Classification
      93             :      *------------------------------------------------------------------*/
      94             : 
      95         392 :     bits = hq_classifier_enc_fx( st_fx, length, t_audio, is_transient, &Npeaks, peaks, pe_gains, nf_gains, &hqswb_clas ); /* Q0 */
      96             : 
      97         392 :     *num_bits = sub( *num_bits, bits ); /* Q0 */
      98         392 :     move16();
      99             : 
     100             :     /*------------------------------------------------------------------*
     101             :      * set quantization parameters
     102             :      *------------------------------------------------------------------*/
     103             : 
     104         392 :     hq_configure_evs_fx( length, hqswb_clas, st_fx->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset,
     105             :                          sfmsize, sfm_start, sfm_end );
     106             : 
     107             :     /*------------------------------------------------------------------*
     108             :      * Transient frame handling
     109             :      *------------------------------------------------------------------*/
     110             : 
     111             :     /* Interleave MLT coefficients of 4 sub-vectors in case of transient */
     112         392 :     IF( EQ_16( is_transient, 1 ) )
     113             :     {
     114          35 :         interleave_spectrum_fx( t_audio, length );
     115             :     }
     116             : 
     117         392 :     test();
     118         392 :     IF( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) )
     119             :     {
     120           0 :         calculate_hangover_attenuation_gain_fx( st_fx, &att, vad_hover_flag );
     121           0 :         v_multc_att32( t_audio, att, t_audio, sfm_end[( num_sfm - 1 )] ); /* Q12 */
     122             :     }
     123             :     /*------------------------------------------------------------------*
     124             :      * Scalar quantization of norms
     125             :      * Encode norm indices
     126             :      *------------------------------------------------------------------*/
     127             : 
     128             :     /* calculate and quantize norms */
     129         392 :     calc_norm_fx( t_audio, 12, ynrm, normqlg2, start_norm, num_env_bands, sfmsize, sfm_start );
     130             : 
     131             :     /* create differential code of quantized norm indices */
     132         392 :     diff_envelope_coding_fx( is_transient, num_env_bands, start_norm, ynrm, normqlg2, difidx );
     133             : 
     134             :     /* Find coding mode and calculate bit rate */
     135         392 :     hcode_l = encode_envelope_indices_fx( st_fx->hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 0, NORMAL_HQ_CORE, is_transient ); /* Q0 */
     136         392 :     *num_bits = sub( *num_bits, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );                                                              /* Q0 */
     137         392 :     move16();
     138             : 
     139             :     /* Encode norm indices */
     140         392 :     encode_envelope_indices_fx( st_fx->hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 1, NORMAL_HQ_CORE, is_transient );
     141             : 
     142             :     /*------------------------------------------------------------------*
     143             :      * HQ Generic HF encoding
     144             :      *------------------------------------------------------------------*/
     145             : 
     146         392 :     test();
     147         392 :     IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     148             :     {
     149          46 :         hq_generic_encoding_fx( t_audio, hq_generic_fenv, hq_generic_offset, st_fx, &hq_generic_exc_clas /*, length*/ );
     150          46 :         IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
     151             :         {
     152          21 :             *num_bits = add( *num_bits, 1 ); /* conditional 1 bit saving for representing FD3 BWE excitation class Q0*/
     153          21 :             move16();
     154             :         }
     155          46 :         map_hq_generic_fenv_norm_fx( hqswb_clas, hq_generic_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
     156             :     }
     157             : 
     158             :     /*------------------------------------------------------------------*
     159             :      * Bit allocation
     160             :      *------------------------------------------------------------------*/
     161             : 
     162         392 :     hq_bit_allocation_fx( st_fx->core_brate, length, hqswb_clas, num_bits, normqlg2, nb_sfm, sfmsize, noise_level,
     163             :                           R, Rsubband, &sum, &core_sfm, num_env_bands );
     164             : 
     165             :     /*------------------------------------------------------------------*
     166             :      * Normalize coefficients with quantized norms
     167             :      *------------------------------------------------------------------*/
     168         392 :     IF( hqswb_clas != HQ_HVQ )
     169             :     {
     170         392 :         test();
     171         392 :         IF( hqswb_clas == HQ_GEN_SWB || hqswb_clas == HQ_GEN_FB )
     172             :         {
     173          46 :             b_delta_env = calc_nor_delta_hf_fx( st_fx->hBstr, t_audio, ynrm, Rsubband, num_env_bands, nb_sfm, sfmsize, sfm_start, core_sfm ); /* Q0 */
     174          46 :             sum = sub( sum, b_delta_env );
     175             :         }
     176         392 :         normalizecoefs_fx( t_audio, ynrm, nb_sfm, sfm_start, sfm_end, t_audio_norm );
     177         392 :         Q_audio = 12;
     178         392 :         move16();
     179             :     }
     180             : 
     181             :     /*------------------------------------------------------------------*
     182             :      * Quantize/code spectral fine structure using PVQ or HVQ
     183             :      *------------------------------------------------------------------*/
     184         392 :     IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     185             :     {
     186           0 :         sum = hvq_enc_fx( st_fx, st_fx->core_brate, *num_bits, Npeaks, ynrm, R, peaks, nf_gains, noise_level, pe_gains, t_audio, t_audio_q );
     187           0 :         *num_bits = sub( *num_bits, sum ); /* Q0 */
     188           0 :         move16();
     189             :     }
     190             :     ELSE
     191             :     {
     192         392 :         shape_bits = pvq_core_enc_fx( st_fx->hBstr, t_audio_norm, t_audio_q_norm, &Q_audio, sum, nb_sfm, sfm_start, sfm_end, sfmsize, Rsubband, R,
     193             :                                       npulses, maxpulse, HQ_CORE );
     194         392 :         *num_bits = add( *num_bits, sub( sum, shape_bits ) ); /* Q0 */
     195         392 :         move16();
     196             :     }
     197             : 
     198         392 :     test();
     199         392 :     IF( EQ_16( hqswb_clas, HQ_HVQ ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
     200             :     {
     201          20 :         subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
     202          20 :         wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR;                       /* Q0 */
     203          20 :         move16();
     204          20 :         wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
     205          20 :         move16();
     206             : 
     207          20 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     208             :         {
     209          20 :             Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
     210        6020 :             FOR( i = 0; i < 300; i++ )
     211             :             {
     212        6000 :                 t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
     213        6000 :                 move32();
     214             :             }
     215             :         }
     216             : 
     217          20 :         har_est_fx( t_audio_q, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
     218             : 
     219          20 :         hHQ_core->prev_frm_hfe2 = har_freq_est2; /* Q0 */
     220          20 :         move16();
     221             :     }
     222             : 
     223         392 :     test();
     224         392 :     test();
     225         392 :     hHQ_core->prev_frm_hfe2 = 0; /*reset*/
     226         392 :     move16();
     227         392 :     hHQ_core->prev_stab_hfe2 = 0; /*reset*/
     228         392 :     move16();
     229             : 
     230         392 :     nf_idx = 0;
     231         392 :     move16();
     232         392 :     test();
     233         392 :     test();
     234         392 :     test();
     235         392 :     IF( NE_16( is_transient, 1 ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
     236             :     {
     237         357 :         test();
     238         357 :         IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     239             :         {
     240          46 :             nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */
     241          46 :             push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 );
     242             :         }
     243             :         ELSE
     244             :         {
     245         311 :             nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */
     246         311 :             push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 );
     247             :         }
     248             :     }
     249             :     /* updates */
     250         392 :     hHQ_core->prev_hqswb_clas = hqswb_clas; /* Q0 */
     251         392 :     move16();
     252             : 
     253             :     /* Prepare synthesis for LB generation in case of switch to ACELP */
     254         392 :     return;
     255             : }
     256             : 
     257        7801 : void hq_hr_enc_ivas_fx(
     258             :     Encoder_State *st,          /* i/o: encoder state structure             */
     259             :     Word32 *t_audio_fx,         /* i/o: transform-domain coefficients       Q12*/
     260             :     const Word16 length,        /* i  : length of spectrum                  Q0*/
     261             :     Word16 *num_bits,           /* i/o: number of available bits            Q0*/
     262             :     const Word16 is_transient,  /* i  : transient flag                      Q0*/
     263             :     const Word16 vad_hover_flag /* i  : VAD hangover flag                   Q0*/
     264             : )
     265             : {
     266             :     Word16 nb_sfm;
     267             :     Word16 sum, hcode_l;
     268             :     Word16 difidx[NB_SFM];
     269             :     Word16 normqlg2[NB_SFM], ynrm[NB_SFM];
     270             :     Word16 nf_idx;
     271             :     Word16 bits;
     272             :     Word16 LCmode;
     273             :     Word16 shape_bits, num_sfm, numnrmibits;
     274             :     Word16 hqswb_clas;
     275             :     Word16 num_env_bands;
     276             :     Word16 Npeaks, start_norm;
     277             :     Word16 difidx_org[NB_SFM];
     278             :     Word16 R[NB_SFM];
     279             :     Word16 peaks[HVQ_MAX_PEAKS];
     280             :     Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
     281             :     Word16 npulses[NB_SFM], maxpulse[NB_SFM];
     282             :     Word16 Rsubband[NB_SFM]; /* Q3 */
     283             :     Word32 t_audio_q_fx[L_SPEC48k_EXT];
     284             :     Word16 noise_level_fx[HVQ_BWE_NOISE_BANDS];
     285             :     Word16 hq_generic_offset;
     286        7801 :     Word16 hq_generic_exc_clas = 0;
     287        7801 :     move16();
     288             :     Word16 core_sfm;
     289        7801 :     Word16 har_freq_est1 = 0, har_freq_est2 = 0;
     290        7801 :     move16();
     291        7801 :     move16();
     292        7801 :     Word16 flag_dis = 1;
     293        7801 :     move16();
     294             :     const Word16 *subband_search_offset;
     295             :     Word16 wBands[2];
     296             :     Word16 b_delta_env;
     297        7801 :     HQ_ENC_HANDLE hHQ_core = st->hHQ_core;
     298        7801 :     BSTR_ENC_HANDLE hBstr = st->hBstr;
     299             :     Word16 att_fx;
     300             :     Word16 t_audio_norm[L_FRAME48k_EXT];
     301             :     Word16 t_audio_q_norm[L_FRAME48k_EXT];
     302             :     Word32 nf_gains_fx[HVQ_NF_GROUPS], pe_gains_fx[HVQ_NF_GROUPS];
     303             :     Word16 hq_generic_fenv_fx[HQ_FB_FENV];
     304             :     /*------------------------------------------------------------------*
     305             :      * Initializations
     306             :      *------------------------------------------------------------------*/
     307             : 
     308        7801 :     Npeaks = 0;
     309        7801 :     move16();
     310        7801 :     set16_fx( npulses, 0, NB_SFM );
     311        7801 :     set16_fx( maxpulse, 0, NB_SFM );
     312        7801 :     set16_fx( difidx_org, 0, NB_SFM );
     313        7801 :     set32_fx( t_audio_q_fx, 0, L_FRAME48k );
     314        7801 :     set32_fx( nf_gains_fx, 0, HVQ_NF_GROUPS );
     315        7801 :     set32_fx( pe_gains_fx, 0, HVQ_NF_GROUPS );
     316             :     /*------------------------------------------------------------------*
     317             :      * Classification
     318             :      *------------------------------------------------------------------*/
     319        7801 :     bits = hq_classifier_enc_ivas_fx( st, length, t_audio_fx, is_transient, &Npeaks, peaks, pe_gains_fx, nf_gains_fx, &hqswb_clas ); /* Q0 */
     320        7801 :     *num_bits = sub( *num_bits, bits );
     321        7801 :     move16();
     322             : 
     323             :     /*------------------------------------------------------------------*
     324             :      * Set quantization parameters
     325             :      *------------------------------------------------------------------*/
     326             : 
     327        7801 :     hq_configure_fx( length, hqswb_clas, st->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
     328             : 
     329             :     /*------------------------------------------------------------------*
     330             :      * Transient frame handling
     331             :      *------------------------------------------------------------------*/
     332             :     /* Interleave MLT coefficients of 4 sub-vectors in case of transient frame */
     333        7801 :     IF( is_transient )
     334             :     {
     335         460 :         interleave_spectrum_ivas_fx( t_audio_fx, length );
     336             :     }
     337        7801 :     test();
     338        7801 :     IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
     339             :     {
     340         860 :         calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag );
     341         860 :         v_multc_att32( t_audio_fx, att_fx, t_audio_fx, sfm_end[( num_sfm - 1 )] ); /* Q12 */
     342             :     }
     343             : 
     344             :     /*------------------------------------------------------------------*
     345             :      * Scalar quantization of norms
     346             :      * Encode norm indices
     347             :      *------------------------------------------------------------------*/
     348             : 
     349             :     /* calculate and quantize norms */
     350        7801 :     calc_norm_ivas_fx( t_audio_fx, ynrm, normqlg2, start_norm, num_env_bands, sfmsize, sfm_start );
     351             :     /* create differential code of quantized norm indices */
     352        7801 :     diff_envelope_coding_fx( is_transient, num_env_bands, start_norm, ynrm, normqlg2, difidx );
     353             : 
     354             :     /* Find norm coding mode and calculate number of bits */
     355        7801 :     hcode_l = encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 0, NORMAL_HQ_CORE, is_transient ); /* Q0 */
     356             : 
     357        7801 :     *num_bits = sub( *num_bits, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );
     358        7801 :     move16();
     359             :     /* Encode norm indices */
     360        7801 :     encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 1, NORMAL_HQ_CORE, is_transient );
     361             : 
     362             :     /*------------------------------------------------------------------*
     363             :      * HQ GENERIC BWE encoding
     364             :      *------------------------------------------------------------------*/
     365             : 
     366        7801 :     test();
     367        7801 :     IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     368             :     {
     369        2815 :         hq_generic_hf_encoding_fx( t_audio_fx, hq_generic_fenv_fx, hq_generic_offset, st, &hq_generic_exc_clas, length );
     370             : 
     371        2815 :         IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
     372             :         {
     373          94 :             *num_bits = add( *num_bits, 1 ); /* conditional 1 bit saving for representing FD3 BWE excitation class */
     374          94 :             move16();
     375             :         }
     376        2815 :         map_hq_generic_fenv_norm_fx( hqswb_clas, hq_generic_fenv_fx, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
     377             :     }
     378             : 
     379             :     /*------------------------------------------------------------------*
     380             :      * Bit allocation
     381             :      *------------------------------------------------------------------*/
     382             : 
     383        7801 :     ivas_hq_bit_allocation_fx( st->core_brate, length, hqswb_clas, num_bits, normqlg2, nb_sfm, sfmsize, noise_level_fx, R, Rsubband, &sum, &core_sfm, num_env_bands );
     384             : 
     385             :     /*------------------------------------------------------------------*
     386             :      * Normalize coefficients with quantized norms
     387             :      *------------------------------------------------------------------*/
     388        7801 :     IF( NE_16( hqswb_clas, HQ_HVQ ) )
     389             :     {
     390        6334 :         test();
     391        6334 :         IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     392             :         {
     393        2815 :             b_delta_env = calc_nor_delta_hf_ivas_fx( hBstr, t_audio_fx, ynrm, Rsubband, num_env_bands, nb_sfm, sfmsize, sfm_start, core_sfm ); /* Q0 */
     394        2815 :             sum = sub( sum, b_delta_env );
     395             :         }
     396        6334 :         normalizecoefs_fx( t_audio_fx, ynrm, nb_sfm, sfm_start, sfm_end, t_audio_norm );
     397             :     }
     398        7801 :     Word16 Q_audio = 12, Q_shift;
     399        7801 :     move16();
     400             :     /*------------------------------------------------------------------*
     401             :      * Quantize/code spectral fine structure using PVQ or HVQ
     402             :      *------------------------------------------------------------------*/
     403        7801 :     IF( EQ_16( hqswb_clas, HQ_HVQ ) )
     404             :     {
     405        1467 :         sum = hvq_enc_ivas_fx( st, st->core_brate, *num_bits, Npeaks, ynrm, R, peaks, nf_gains_fx, noise_level_fx, pe_gains_fx, t_audio_fx, t_audio_q_fx );
     406        1467 :         *num_bits = sub( *num_bits, sum );
     407        1467 :         move16();
     408             :     }
     409             :     ELSE
     410             :     {
     411        6334 :         shape_bits = pvq_core_enc_ivas_fx( hBstr, t_audio_norm, t_audio_q_norm, &Q_audio, sum, nb_sfm, sfm_start, sfm_end, sfmsize, Rsubband, R, npulses, maxpulse, HQ_CORE ); /* Q0 */
     412        6334 :         *num_bits = add( *num_bits, sub( sum, shape_bits ) );
     413        6334 :         move16();
     414             :     }
     415             : 
     416        7801 :     test();
     417        7801 :     IF( EQ_16( hqswb_clas, HQ_HVQ ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
     418             :     {
     419        2258 :         subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
     420        2258 :         wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR;                       /* Q0 */
     421        2258 :         wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR;                       /* Q0 */
     422        2258 :         move16();
     423        2258 :         move16();
     424        2258 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
     425             :         {
     426         791 :             Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
     427      238091 :             FOR( Word16 i = 0; i < 300; i++ )
     428             :             {
     429      237300 :                 t_audio_q_fx[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
     430      237300 :                 move32();
     431             :             }
     432             :         }
     433        2258 :         har_est_fx( t_audio_q_fx, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
     434             : 
     435        2258 :         hHQ_core->prev_frm_hfe2 = har_freq_est2;
     436        2258 :         move16();
     437             :     }
     438             : 
     439             :     /* reset LR-HQ memories */
     440        7801 :     hHQ_core->prev_frm_hfe2 = 0; /*reset*/
     441        7801 :     hHQ_core->prev_stab_hfe2 = 0;
     442        7801 :     move16();
     443        7801 :     move16();
     444        7801 :     nf_idx = 0;
     445        7801 :     move16();
     446        7801 :     test();
     447        7801 :     test();
     448        7801 :     test();
     449        7801 :     IF( NE_16( is_transient, 1 ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st->core_brate, HQ_32k ) ) )
     450             :     {
     451        5510 :         test();
     452        5510 :         IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     453             :         {
     454        2815 :             nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */
     455        2815 :             push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
     456             :         }
     457             :         ELSE
     458             :         {
     459        2695 :             nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */
     460        2695 :             push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
     461             :         }
     462             :     }
     463             : 
     464             : 
     465             :     /* updates */
     466        7801 :     hHQ_core->prev_hqswb_clas = hqswb_clas; /* Q0 */
     467        7801 :     move16();
     468             :     /* Prepare synthesis for LB generation in case of switch to ACELP */
     469        7801 :     IF( NE_16( hqswb_clas, HQ_HVQ ) )
     470             :     {
     471        6334 :         apply_envelope_enc_ivas_fx( t_audio_q_norm, ynrm, num_sfm, sfm_start, sfm_end, t_audio_q_fx );
     472        6334 :         scale_sig32( t_audio_q_fx, length, sub( Q12, Q_audio ) ); // Q12
     473             :     }
     474             : 
     475        7801 :     IF( is_transient )
     476             :     {
     477         460 :         ivas_de_interleave_spectrum_fx( t_audio_q_fx, length );
     478             :     }
     479             : 
     480        7801 :     MVR2R_WORD32( t_audio_q_fx, t_audio_fx, length );
     481             : 
     482        7801 :     return;
     483             : }

Generated by: LCOV version 1.14