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 : }
|