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

Generated by: LCOV version 1.14