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