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 "prot_fx.h" /* Function prototypes */
7 : #include "rom_com.h" /* Static table prototypes */
8 : #include "ivas_prot_fx.h"
9 :
10 : /*--------------------------------------------------------------------------*
11 : * hq_pred_hb_bws()
12 : *
13 : * HQ core HB band-width switching handling
14 : *--------------------------------------------------------------------------*/
15 :
16 7432 : void ivas_hq_pred_hb_bws_fx(
17 : Decoder_State *st_fx, /* i/o: decoder state structure */
18 : const Word16 *ynrm, /* i : norm quantization index vector Q0*/
19 : const Word16 length, /* i : frame length Q0*/
20 : const Word16 hqswb_clas, /* i : HQ SWB class Q0*/
21 : const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/
22 : )
23 : {
24 : Word16 i;
25 : Word32 L_tmp;
26 :
27 7432 : IF( GE_16( length, L_FRAME32k ) )
28 : {
29 : /* calculate the switching parameters */
30 6798 : test();
31 6798 : test();
32 6798 : IF( ( NE_16( hqswb_clas, HQ_GEN_SWB ) && LE_32( st_fx->core_brate, HQ_32k ) ) || GT_32( st_fx->core_brate, HQ_32k ) )
33 : {
34 6112 : st_fx->prev_ener_shb_fx = 0;
35 6112 : move16();
36 6112 : L_tmp = L_deposit_l( 0 );
37 42784 : FOR( i = 25; i < SFM_N_HARM; i++ )
38 : {
39 36672 : L_tmp = L_add( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
40 : }
41 6112 : L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) ); /* Q1 */
42 6112 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
43 6112 : st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
44 6112 : move16();
45 6112 : move16();
46 : }
47 : ELSE
48 : {
49 686 : st_fx->prev_ener_shb_fx = 0;
50 686 : move16();
51 686 : L_tmp = L_deposit_l( 0 );
52 8232 : FOR( i = 0; i < SWB_FENV - 3; i++ )
53 : {
54 7546 : L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
55 : }
56 686 : L_tmp = Mpy_32_16_1( L_tmp, 2979 ); // Q1
57 686 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
58 : }
59 : }
60 :
61 7432 : IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) && st_fx->hBWE_FD != NULL )
62 : {
63 6799 : set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
64 : }
65 :
66 7432 : return;
67 : }
68 :
69 406 : void hq_pred_hb_bws_fx(
70 : Decoder_State *st_fx, /* i/o: decoder state structure */
71 : const Word16 *ynrm, /* i : norm quantization index vector Q0*/
72 : const Word16 length, /* i : frame length Q0*/
73 : const Word16 hqswb_clas, /* i : HQ SWB class Q0*/
74 : const Word16 *SWB_fenv /* i : SWB frequency envelopes Q1*/
75 : )
76 : {
77 : Word16 i;
78 : Word32 L_tmp;
79 :
80 406 : IF( GE_16( length, L_FRAME32k ) )
81 : {
82 : /* calculate the switching parameters */
83 406 : test();
84 406 : test();
85 406 : IF( ( NE_16( hqswb_clas, HQ_GEN_SWB ) && LE_32( st_fx->core_brate, HQ_32k ) ) || GT_32( st_fx->core_brate, HQ_32k ) )
86 : {
87 356 : st_fx->prev_ener_shb_fx = 0;
88 356 : move16();
89 356 : L_tmp = L_deposit_l( 0 );
90 2492 : FOR( i = 25; i < SFM_N_HARM; i++ )
91 : {
92 2136 : L_tmp = L_add_sat( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
93 : }
94 356 : L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) ); /* Q1 */
95 356 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
96 356 : st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
97 356 : move16();
98 356 : move16();
99 : }
100 : ELSE
101 : {
102 50 : st_fx->prev_ener_shb_fx = 0;
103 50 : move16();
104 50 : L_tmp = L_deposit_l( 0 );
105 600 : FOR( i = 0; i < SWB_FENV - 3; i++ )
106 : {
107 550 : L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
108 : }
109 50 : L_tmp = Mpy_32_16_1( L_tmp, 2979 ); // Q1
110 50 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
111 50 : move16();
112 : }
113 : }
114 :
115 406 : IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) )
116 : {
117 405 : set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
118 : }
119 :
120 406 : return;
121 : }
122 : /*--------------------------------------------------------------------------*
123 : * hq_hr_dec_fx()
124 : *
125 : * HQ High rate decoding routine
126 : *--------------------------------------------------------------------------*/
127 7432 : void ivas_hq_hr_dec_fx(
128 : Decoder_State *st_fx, /* i/o: decoder state structure fx */
129 : Word32 *t_audio_q, /* o : transform-domain coefficients Q12 */
130 : const Word16 length, /* i : frame length Q0 */
131 : Word16 num_bits, /* i : number of available bits Q0 */
132 : Word16 *ynrm, /* o : norm quantization index vector Q0 */
133 : Word16 *is_transient, /* o : transient flag Q0 */
134 : Word16 *hqswb_clas, /* o : HQ SWB class Q0 */
135 : Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */
136 : const Word16 core_switching_flag /* i : Core switching flag Q0 */
137 : )
138 : {
139 : Word16 nb_sfm;
140 : Word16 sum, hcode_l;
141 : Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
142 : Word16 num_sfm, numnrmibits;
143 : Word16 nf_idx;
144 : Word16 normqlg2[NB_SFM], R[NB_SFM];
145 : Word16 pulses[NB_SFM], maxpulse[NB_SFM];
146 : Word16 env_stab; /*Q15*/
147 : Word16 Rsubband[NB_SFM]; /*Q3*/
148 7432 : Word16 start_norm, Npeaks = 0;
149 : Word16 noise_level[HVQ_BWE_NOISE_BANDS]; /*Q15*/
150 : Word16 peak_idx[HVQ_MAX_PEAKS];
151 : Word16 hq_generic_offset;
152 : Word16 num_env_bands;
153 7432 : Word16 hq_generic_exc_clas = 0;
154 : Word16 core_sfm;
155 : Word16 har_freq_est1, har_freq_est2;
156 : Word16 flag_dis;
157 : const Word16 *subband_search_offset;
158 : Word16 wBands[2];
159 : Word16 bits, i;
160 : Word16 t_audio_q_norm[L_FRAME48k_EXT];
161 : Word16 Q_audio;
162 : Word16 b_delta_env;
163 : Word16 tmp, n_band;
164 : Word16 Q_shift;
165 : Word16 bits_left;
166 : Word16 csw_flag1, csw_flag2;
167 :
168 7432 : HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
169 :
170 7432 : move16();
171 7432 : move16();
172 :
173 7432 : Q_audio = 0; /* to avoid compilation warnings */
174 7432 : move16();
175 :
176 : /*------------------------------------------------------------------*
177 : * Initializations
178 : *------------------------------------------------------------------*/
179 :
180 7432 : set16_fx( pulses, 0, NB_SFM );
181 7432 : set16_fx( maxpulse, 0, NB_SFM );
182 7432 : flag_dis = 1;
183 7432 : move16();
184 7432 : har_freq_est1 = 0;
185 7432 : move16();
186 7432 : har_freq_est2 = 0;
187 7432 : move16();
188 7432 : set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
189 :
190 : /*------------------------------------------------------------------*
191 : * Decode classification
192 : *------------------------------------------------------------------*/
193 :
194 7432 : bits = ivas_hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas ); /* Q0 */
195 7432 : bits_left = sub( num_bits, bits ); /* Q0 */
196 :
197 : /*------------------------------------------------------------------*
198 : * set quantization parameters
199 : *------------------------------------------------------------------*/
200 7432 : ivas_hq_configure_fx( length, *hqswb_clas, st_fx->core_brate, &num_sfm, &nb_sfm, &start_norm,
201 : &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
202 :
203 : /*------------------------------------------------------------------*
204 : * Unpacking bitstream
205 : *------------------------------------------------------------------*/
206 :
207 7432 : nf_idx = 0;
208 7432 : move16();
209 7432 : test();
210 7432 : test();
211 7432 : test();
212 7432 : IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
213 : {
214 5243 : nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */
215 : }
216 :
217 : /*------------------------------------------------------------------*
218 : * Decode envelope
219 : *------------------------------------------------------------------*/
220 :
221 7432 : hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
222 7432 : bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) ); /* Q0 */
223 :
224 7432 : dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
225 :
226 7432 : test();
227 7432 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
228 : {
229 2801 : hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure */
230 2801 : IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
231 : {
232 112 : bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/
233 : }
234 2801 : map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
235 : }
236 :
237 7432 : env_stab = 0;
238 7432 : move16();
239 :
240 7432 : csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
241 7432 : csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) ); /* Q0 */
242 7432 : test();
243 7432 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
244 : {
245 1231 : hHQ_core->mem_env_delta = 0;
246 1231 : move16();
247 : }
248 6201 : ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
249 : {
250 997 : env_stab = env_stability_fx( ynrm, SFM_N_ENV_STAB, hHQ_core->mem_norm, &hHQ_core->mem_env_delta, csw_flag1 ); /* Q15 */
251 : }
252 : ELSE
253 : {
254 5204 : hHQ_core->mem_norm[0] = 31;
255 5204 : move16();
256 5204 : hHQ_core->mem_env_delta = 0;
257 5204 : move16();
258 : }
259 :
260 7432 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
261 : {
262 1231 : hHQ_core->env_stab_fx = 32767;
263 1231 : move16(); /* 1 in Q15, stable by definition */
264 : }
265 : ELSE
266 : {
267 6201 : IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
268 : {
269 997 : move16(); /* calculated stability */
270 997 : hHQ_core->env_stab_fx = env_stab; /* Q15 */
271 : }
272 : ELSE
273 : {
274 5204 : hHQ_core->env_stab_fx = env_stability_fx( ynrm, SFM_N_ENV_STAB_WB, hHQ_core->mem_norm_hqfec, &hHQ_core->mem_env_delta_hqfec, csw_flag1 ); /* Q15 */
275 5204 : move16();
276 : }
277 : }
278 7432 : hHQ_core->env_stab_plc_fx = env_stab_smo_fx( s_min( hHQ_core->env_stab_fx, sub( 32767 /* 1.0f in Q15 */, stab_trans_fx[L_STAB_TBL - 1] ) ), hHQ_core->env_stab_state_p_fx, &hHQ_core->envstabplc_hocnt ); /* Q0 */
279 7432 : move16();
280 :
281 : /*------------------------------------------------------------------*
282 : * Bit allocation
283 : *------------------------------------------------------------------*/
284 :
285 7432 : ivas_hq_bit_allocation_fx( st_fx->core_brate, length, *hqswb_clas, &bits_left, normqlg2, nb_sfm, sfmsize, noise_level,
286 : R, Rsubband, &sum, &core_sfm, num_env_bands );
287 :
288 7432 : test();
289 7432 : test();
290 7432 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) && st_fx->bws_cnt1 > 0 && LT_32( st_fx->core_brate, HQ_32k ) )
291 : {
292 0 : tmp = i_mult( st_fx->bws_cnt1, 1638 /* 1/20 in Q15 */ );
293 0 : move16();
294 0 : IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
295 : {
296 0 : FOR( n_band = 0; n_band < 4; n_band++ )
297 : {
298 0 : SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
299 0 : move16();
300 : }
301 : }
302 :
303 0 : FOR( n_band = 4; n_band < SWB_FENV; n_band++ )
304 : {
305 0 : SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
306 0 : move16();
307 : }
308 : }
309 :
310 7432 : test();
311 7432 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
312 : {
313 2801 : b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
314 2801 : sum = sub( sum, b_delta_env ); /* Q0 */
315 : }
316 :
317 : /*------------------------------------------------------------------*
318 : * Decode spectral fine structure using HVQ/PVQ
319 : *------------------------------------------------------------------*/
320 :
321 7432 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
322 : {
323 1231 : hvq_dec_fx( st_fx, bits_left, st_fx->core_brate, ynrm, R, noise_level, peak_idx, &Npeaks, t_audio_q, st_fx->core );
324 : }
325 : ELSE
326 : {
327 6201 : ivas_pvq_core_dec_fx( st_fx, sfm_start, sfm_end, sfmsize, t_audio_q_norm, &Q_audio, sum, nb_sfm, Rsubband, R, pulses, maxpulse, HQ_CORE );
328 : }
329 :
330 7432 : test();
331 7432 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
332 : {
333 1958 : subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
334 1958 : wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
335 1958 : move16();
336 1958 : wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
337 1958 : move16();
338 :
339 1958 : IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
340 : {
341 727 : Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
342 218827 : FOR( i = 0; i < 300; i++ )
343 : {
344 218100 : t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
345 218100 : move32();
346 : }
347 : }
348 :
349 1958 : 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 );
350 :
351 1958 : hHQ_core->prev_frm_hfe2 = har_freq_est2;
352 1958 : move16();
353 : }
354 :
355 7432 : test();
356 7432 : test();
357 : {
358 7432 : hHQ_core->prev_frm_hfe2 = 0; /*reset*/
359 7432 : move16();
360 7432 : hHQ_core->prev_stab_hfe2 = 0; /*reset*/
361 7432 : move16();
362 : }
363 :
364 : /*------------------------------------------------------------------*
365 : * Spectral filling
366 : *------------------------------------------------------------------*/
367 7432 : ivas_fill_spectrum_fx( t_audio_q_norm, t_audio_q, R, *is_transient, ynrm, SWB_fenv, hq_generic_offset, nf_idx, length, env_stab,
368 : &hHQ_core->no_att_hangover, &hHQ_core->energy_lt_fx, &hHQ_core->hq_generic_seed, hq_generic_exc_clas,
369 7432 : core_sfm, *hqswb_clas, noise_level, st_fx->core_brate, hHQ_core->prev_noise_level_fx, &hHQ_core->prev_R, hHQ_core->prev_coeff_out_fx, peak_idx, Npeaks, pulses, hHQ_core->old_is_transient[0],
370 7432 : hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
371 7432 : &st_fx->hBWE_FD->prev_L_swb_norm, hHQ_core->prev_hqswb_clas, num_sfm, hHQ_core->prev_env_Q, num_env_bands, st_fx->element_mode );
372 :
373 7432 : enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
374 :
375 :
376 7432 : IF( EQ_16( *is_transient, 1 ) )
377 : {
378 488 : ivas_de_interleave_spectrum_fx( t_audio_q, length );
379 : }
380 :
381 : /*------------------------------------------------------------------*
382 : * WB/SWB bandwidth switching
383 : *------------------------------------------------------------------*/
384 7432 : ivas_hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
385 :
386 : /* update */
387 7432 : hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
388 7432 : move16();
389 :
390 7432 : return;
391 : }
392 :
393 406 : void hq_hr_dec_fx(
394 : Decoder_State *st_fx, /* i/o: decoder state structure fx */
395 : Word32 *t_audio_q, /* o : transform-domain coefficients Q12 */
396 : const Word16 length, /* i : frame length Q0 */
397 : Word16 num_bits, /* i : number of available bits Q0 */
398 : Word16 *ynrm, /* o : norm quantization index vector Q0 */
399 : Word16 *is_transient, /* o : transient flag Q0 */
400 : Word16 *hqswb_clas, /* o : HQ SWB class Q0 */
401 : Word16 *SWB_fenv, /* o : SWB frequency envelopes Q1 */
402 : const Word16 core_switching_flag /* i : Core switching flag Q0 */
403 : )
404 : {
405 : Word16 nb_sfm;
406 : Word16 sum, hcode_l;
407 : Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
408 : Word16 num_sfm, numnrmibits;
409 : Word16 nf_idx;
410 : Word16 normqlg2[NB_SFM], R[NB_SFM];
411 : Word16 pulses[NB_SFM], maxpulse[NB_SFM];
412 : Word16 env_stab; /*Q15*/
413 : Word16 Rsubband[NB_SFM]; /*Q3*/
414 406 : Word16 start_norm, Npeaks = 0;
415 : Word16 noise_level[HVQ_BWE_NOISE_BANDS]; /*Q15*/
416 : Word16 peak_idx[HVQ_MAX_PEAKS];
417 : Word16 hq_generic_offset;
418 : Word16 num_env_bands;
419 406 : Word16 hq_generic_exc_clas = 0;
420 : Word16 core_sfm;
421 : Word16 har_freq_est1, har_freq_est2;
422 : Word16 flag_dis;
423 : const Word16 *subband_search_offset;
424 : Word16 wBands[2];
425 : Word16 bits, i;
426 : Word16 t_audio_q_norm[L_FRAME48k];
427 : Word16 Q_audio;
428 : Word16 b_delta_env;
429 : Word16 tmp, n_band;
430 : Word16 Q_shift;
431 : Word16 bits_left;
432 : Word16 csw_flag1, csw_flag2;
433 406 : move16();
434 406 : move16();
435 :
436 406 : HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
437 :
438 406 : move16();
439 :
440 406 : Q_audio = 0; /* to avoid compilation warnings */
441 :
442 : /*------------------------------------------------------------------*
443 : * Initializations
444 : *------------------------------------------------------------------*/
445 :
446 406 : set16_fx( pulses, 0, NB_SFM );
447 406 : set16_fx( maxpulse, 0, NB_SFM );
448 406 : flag_dis = 1;
449 406 : move16();
450 406 : har_freq_est1 = 0;
451 406 : move16();
452 406 : har_freq_est2 = 0;
453 406 : move16();
454 406 : set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
455 :
456 : /*------------------------------------------------------------------*
457 : * Decode classification
458 : *------------------------------------------------------------------*/
459 :
460 406 : bits = hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas );
461 406 : bits_left = sub( num_bits, bits );
462 :
463 : /*------------------------------------------------------------------*
464 : * set quantization parameters
465 : *------------------------------------------------------------------*/
466 406 : hq_configure_evs_fx( length, *hqswb_clas, st_fx->core_brate, &num_sfm, &nb_sfm, &start_norm,
467 : &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
468 :
469 : /*------------------------------------------------------------------*
470 : * Unpacking bitstream
471 : *------------------------------------------------------------------*/
472 :
473 406 : nf_idx = 0;
474 406 : move16();
475 406 : test();
476 406 : test();
477 406 : test();
478 406 : IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
479 : {
480 371 : nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */
481 : }
482 :
483 : /*------------------------------------------------------------------*
484 : * Decode envelope
485 : *------------------------------------------------------------------*/
486 :
487 406 : hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
488 406 : bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) ); /* Q0 */
489 :
490 406 : dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
491 :
492 406 : test();
493 406 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
494 : {
495 50 : hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure Q0*/
496 50 : if ( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
497 : {
498 25 : bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/
499 : }
500 50 : map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
501 : }
502 :
503 406 : env_stab = 0;
504 406 : move16();
505 :
506 406 : csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
507 406 : csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) ); /* Q0 */
508 406 : test();
509 406 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
510 : {
511 0 : hHQ_core->mem_env_delta = 0;
512 0 : move16();
513 : }
514 406 : ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
515 : {
516 406 : env_stab = env_stability_fx( ynrm, SFM_N_ENV_STAB, hHQ_core->mem_norm, &hHQ_core->mem_env_delta, csw_flag1 ); /* Q0 */
517 : }
518 : ELSE
519 : {
520 0 : hHQ_core->mem_norm[0] = 31;
521 0 : move16();
522 0 : hHQ_core->mem_env_delta = 0;
523 0 : move16();
524 : }
525 :
526 406 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
527 : {
528 0 : hHQ_core->env_stab_fx = 32767;
529 0 : move16(); /* 1 in Q15, stable by definition */
530 : }
531 : ELSE
532 : {
533 406 : test();
534 406 : IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
535 : {
536 406 : move16(); /* calculated stability */
537 406 : hHQ_core->env_stab_fx = env_stab; /* Q15 */
538 : }
539 : ELSE
540 : {
541 0 : hHQ_core->env_stab_fx = env_stability_fx( ynrm, SFM_N_ENV_STAB_WB, hHQ_core->mem_norm_hqfec, &hHQ_core->mem_env_delta_hqfec, csw_flag1 ); /* Q15 */
542 0 : move16();
543 : }
544 : }
545 406 : hHQ_core->env_stab_plc_fx = env_stab_smo_fx( s_min( hHQ_core->env_stab_fx, sub( 32767, stab_trans_fx[L_STAB_TBL - 1] ) ), hHQ_core->env_stab_state_p_fx, &hHQ_core->envstabplc_hocnt ); /* Q0 */
546 :
547 : /*------------------------------------------------------------------*
548 : * Bit allocation
549 : *------------------------------------------------------------------*/
550 :
551 406 : hq_bit_allocation_fx( st_fx->core_brate, length, *hqswb_clas, &bits_left, normqlg2, nb_sfm, sfmsize, noise_level,
552 : R, Rsubband, &sum, &core_sfm, num_env_bands );
553 :
554 406 : test();
555 406 : test();
556 406 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) && st_fx->bws_cnt1 > 0 && LT_32( st_fx->core_brate, HQ_32k ) )
557 : {
558 0 : tmp = i_mult( st_fx->bws_cnt1, 1638 /* 1/20 in Q15 */ ); /* Q15 */
559 0 : move16();
560 0 : IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
561 : {
562 0 : FOR( n_band = 0; n_band < 4; n_band++ )
563 : {
564 0 : SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
565 0 : move16();
566 : }
567 : }
568 :
569 0 : FOR( n_band = 4; n_band < SWB_FENV; n_band++ )
570 : {
571 0 : SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
572 0 : move16();
573 : }
574 : }
575 :
576 406 : test();
577 406 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
578 : {
579 50 : b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
580 50 : sum = sub( sum, b_delta_env ); /* Q0 */
581 : }
582 :
583 : /*------------------------------------------------------------------*
584 : * Decode spectral fine structure using HVQ/PVQ
585 : *------------------------------------------------------------------*/
586 :
587 406 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
588 : {
589 0 : hvq_dec_fx( st_fx, bits_left, st_fx->core_brate, ynrm, R, noise_level, peak_idx, &Npeaks, t_audio_q, st_fx->core );
590 : }
591 : ELSE
592 : {
593 406 : pvq_core_dec_fx( st_fx, sfm_start, sfm_end, sfmsize, t_audio_q_norm, &Q_audio, sum, nb_sfm, Rsubband, R, pulses, maxpulse, HQ_CORE );
594 : }
595 :
596 406 : test();
597 406 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
598 : {
599 25 : subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
600 25 : wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
601 25 : move16();
602 25 : wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
603 25 : move16();
604 :
605 25 : IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
606 : {
607 25 : Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
608 7525 : FOR( i = 0; i < 300; i++ )
609 : {
610 7500 : t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
611 7500 : move32();
612 : }
613 : }
614 :
615 25 : 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 );
616 :
617 25 : hHQ_core->prev_frm_hfe2 = har_freq_est2;
618 25 : move16();
619 : }
620 :
621 : {
622 406 : hHQ_core->prev_frm_hfe2 = 0; /*reset*/
623 406 : move16();
624 406 : hHQ_core->prev_stab_hfe2 = 0; /*reset*/
625 406 : move16();
626 : }
627 :
628 : /*------------------------------------------------------------------*
629 : * Spectral filling
630 : *------------------------------------------------------------------*/
631 406 : fill_spectrum_fx( t_audio_q_norm, t_audio_q, R, *is_transient, ynrm, SWB_fenv, hq_generic_offset, nf_idx, length, env_stab,
632 : &hHQ_core->no_att_hangover, &hHQ_core->energy_lt_fx, &hHQ_core->hq_generic_seed, hq_generic_exc_clas,
633 406 : core_sfm, *hqswb_clas, noise_level, st_fx->core_brate, hHQ_core->prev_noise_level_fx, &hHQ_core->prev_R, hHQ_core->prev_coeff_out_fx, peak_idx, Npeaks, pulses, hHQ_core->old_is_transient[0],
634 406 : hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
635 406 : &st_fx->hBWE_FD->prev_L_swb_norm, hHQ_core->prev_hqswb_clas, num_sfm, hHQ_core->prev_env_Q, num_env_bands, st_fx->element_mode );
636 :
637 406 : enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
638 :
639 :
640 406 : IF( EQ_16( *is_transient, 1 ) )
641 : {
642 35 : de_interleave_spectrum_fx( t_audio_q, length );
643 : }
644 :
645 : /*------------------------------------------------------------------*
646 : * WB/SWB bandwidth switching
647 : *------------------------------------------------------------------*/
648 406 : hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
649 :
650 : /* update */
651 406 : hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
652 406 : move16();
653 :
654 406 : return;
655 : }
|