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 7331 : 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 7331 : IF( GE_16( length, L_FRAME32k ) )
28 : {
29 : /* calculate the switching parameters */
30 6702 : test();
31 6702 : test();
32 6702 : 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 6029 : st_fx->prev_ener_shb_fx = 0;
35 6029 : move16();
36 6029 : L_tmp = L_deposit_l( 0 );
37 42203 : FOR( i = 25; i < SFM_N_HARM; i++ )
38 : {
39 36174 : L_tmp = L_add( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
40 : }
41 6029 : L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) ); /* Q1 */
42 6029 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
43 6029 : st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
44 6029 : move16();
45 6029 : move16();
46 : }
47 : ELSE
48 : {
49 673 : st_fx->prev_ener_shb_fx = 0;
50 673 : move16();
51 673 : L_tmp = L_deposit_l( 0 );
52 8076 : FOR( i = 0; i < SWB_FENV - 3; i++ )
53 : {
54 7403 : L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
55 : }
56 673 : L_tmp = Mpy_32_16_1( L_tmp, 2979 ); // Q1
57 673 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
58 : }
59 : }
60 :
61 7331 : IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) && st_fx->hBWE_FD != NULL )
62 : {
63 6703 : set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
64 : }
65 :
66 7331 : return;
67 : }
68 :
69 397 : 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 397 : IF( GE_16( length, L_FRAME32k ) )
81 : {
82 : /* calculate the switching parameters */
83 397 : test();
84 397 : test();
85 397 : 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 351 : st_fx->prev_ener_shb_fx = 0;
88 351 : move16();
89 351 : L_tmp = L_deposit_l( 0 );
90 2457 : FOR( i = 25; i < SFM_N_HARM; i++ )
91 : {
92 2106 : L_tmp = L_add_sat( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
93 : }
94 351 : L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) ); /* Q1 */
95 351 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
96 351 : st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
97 351 : move16();
98 351 : move16();
99 : }
100 : ELSE
101 : {
102 46 : st_fx->prev_ener_shb_fx = 0;
103 46 : move16();
104 46 : L_tmp = L_deposit_l( 0 );
105 552 : FOR( i = 0; i < SWB_FENV - 3; i++ )
106 : {
107 506 : L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
108 : }
109 46 : L_tmp = Mpy_32_16_1( L_tmp, 2979 ); // Q1
110 46 : st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
111 46 : move16();
112 : }
113 : }
114 :
115 397 : IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) )
116 : {
117 396 : set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
118 : }
119 :
120 397 : return;
121 : }
122 : /*--------------------------------------------------------------------------*
123 : * hq_hr_dec_fx()
124 : *
125 : * HQ High rate decoding routine
126 : *--------------------------------------------------------------------------*/
127 7331 : 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 7331 : 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 7331 : 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 7331 : HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
169 :
170 7331 : move16();
171 7331 : move16();
172 :
173 7331 : Q_audio = 0; /* to avoid compilation warnings */
174 7331 : move16();
175 :
176 : /*------------------------------------------------------------------*
177 : * Initializations
178 : *------------------------------------------------------------------*/
179 :
180 7331 : set16_fx( pulses, 0, NB_SFM );
181 7331 : set16_fx( maxpulse, 0, NB_SFM );
182 7331 : flag_dis = 1;
183 7331 : move16();
184 7331 : har_freq_est1 = 0;
185 7331 : move16();
186 7331 : har_freq_est2 = 0;
187 7331 : move16();
188 7331 : set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
189 :
190 : /*------------------------------------------------------------------*
191 : * Decode classification
192 : *------------------------------------------------------------------*/
193 :
194 7331 : bits = ivas_hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas ); /* Q0 */
195 7331 : bits_left = sub( num_bits, bits ); /* Q0 */
196 :
197 : /*------------------------------------------------------------------*
198 : * set quantization parameters
199 : *------------------------------------------------------------------*/
200 7331 : 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 7331 : nf_idx = 0;
208 7331 : move16();
209 7331 : test();
210 7331 : test();
211 7331 : test();
212 7331 : IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
213 : {
214 5160 : nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */
215 : }
216 :
217 : /*------------------------------------------------------------------*
218 : * Decode envelope
219 : *------------------------------------------------------------------*/
220 :
221 7331 : hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
222 7331 : bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) ); /* Q0 */
223 :
224 7331 : dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
225 :
226 7331 : test();
227 7331 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
228 : {
229 2743 : 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 2743 : IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
231 : {
232 109 : bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/
233 : }
234 2743 : map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
235 : }
236 :
237 7331 : env_stab = 0;
238 7331 : move16();
239 :
240 7331 : csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
241 7331 : csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) ); /* Q0 */
242 7331 : test();
243 7331 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
244 : {
245 1229 : hHQ_core->mem_env_delta = 0;
246 1229 : move16();
247 : }
248 6102 : ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
249 : {
250 970 : 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 5132 : hHQ_core->mem_norm[0] = 31;
255 5132 : move16();
256 5132 : hHQ_core->mem_env_delta = 0;
257 5132 : move16();
258 : }
259 :
260 7331 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
261 : {
262 1229 : hHQ_core->env_stab_fx = 32767;
263 1229 : move16(); /* 1 in Q15, stable by definition */
264 : }
265 : ELSE
266 : {
267 6102 : IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
268 : {
269 970 : move16(); /* calculated stability */
270 970 : hHQ_core->env_stab_fx = env_stab; /* Q15 */
271 : }
272 : ELSE
273 : {
274 5132 : 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 5132 : move16();
276 : }
277 : }
278 7331 : 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 7331 : move16();
280 :
281 : /*------------------------------------------------------------------*
282 : * Bit allocation
283 : *------------------------------------------------------------------*/
284 :
285 7331 : 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 7331 : test();
289 7331 : test();
290 7331 : 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 7331 : test();
311 7331 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
312 : {
313 2743 : b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
314 2743 : sum = sub( sum, b_delta_env ); /* Q0 */
315 : }
316 :
317 : /*------------------------------------------------------------------*
318 : * Decode spectral fine structure using HVQ/PVQ
319 : *------------------------------------------------------------------*/
320 :
321 7331 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
322 : {
323 1229 : 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 6102 : 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 7331 : test();
331 7331 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
332 : {
333 1937 : subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
334 1937 : wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
335 1937 : move16();
336 1937 : wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
337 1937 : move16();
338 :
339 1937 : IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
340 : {
341 708 : Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
342 213108 : FOR( i = 0; i < 300; i++ )
343 : {
344 212400 : t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
345 212400 : move32();
346 : }
347 : }
348 :
349 1937 : 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 1937 : hHQ_core->prev_frm_hfe2 = har_freq_est2;
352 1937 : move16();
353 : }
354 :
355 7331 : test();
356 7331 : test();
357 : {
358 7331 : hHQ_core->prev_frm_hfe2 = 0; /*reset*/
359 7331 : move16();
360 7331 : hHQ_core->prev_stab_hfe2 = 0; /*reset*/
361 7331 : move16();
362 : }
363 :
364 : /*------------------------------------------------------------------*
365 : * Spectral filling
366 : *------------------------------------------------------------------*/
367 7331 : 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 7331 : 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 7331 : hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
371 7331 : &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 7331 : enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
374 :
375 :
376 7331 : IF( EQ_16( *is_transient, 1 ) )
377 : {
378 477 : ivas_de_interleave_spectrum_fx( t_audio_q, length );
379 : }
380 :
381 : /*------------------------------------------------------------------*
382 : * WB/SWB bandwidth switching
383 : *------------------------------------------------------------------*/
384 7331 : ivas_hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
385 :
386 : /* update */
387 7331 : hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
388 7331 : move16();
389 :
390 7331 : return;
391 : }
392 :
393 397 : 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 397 : 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 397 : 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 397 : move16();
434 397 : move16();
435 :
436 397 : HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
437 :
438 397 : move16();
439 :
440 397 : Q_audio = 0; /* to avoid compilation warnings */
441 :
442 : /*------------------------------------------------------------------*
443 : * Initializations
444 : *------------------------------------------------------------------*/
445 :
446 397 : set16_fx( pulses, 0, NB_SFM );
447 397 : set16_fx( maxpulse, 0, NB_SFM );
448 397 : flag_dis = 1;
449 397 : move16();
450 397 : har_freq_est1 = 0;
451 397 : move16();
452 397 : har_freq_est2 = 0;
453 397 : move16();
454 397 : set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
455 :
456 : /*------------------------------------------------------------------*
457 : * Decode classification
458 : *------------------------------------------------------------------*/
459 :
460 397 : bits = hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas );
461 397 : bits_left = sub( num_bits, bits );
462 :
463 : /*------------------------------------------------------------------*
464 : * set quantization parameters
465 : *------------------------------------------------------------------*/
466 397 : 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 397 : nf_idx = 0;
474 397 : move16();
475 397 : test();
476 397 : test();
477 397 : test();
478 397 : IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
479 : {
480 362 : nf_idx = get_next_indice( st_fx, 2 ); /* Q0 */
481 : }
482 :
483 : /*------------------------------------------------------------------*
484 : * Decode envelope
485 : *------------------------------------------------------------------*/
486 :
487 397 : hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
488 397 : bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) ); /* Q0 */
489 :
490 397 : dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
491 :
492 397 : test();
493 397 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
494 : {
495 46 : 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 46 : if ( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
497 : {
498 27 : bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class Q0*/
499 : }
500 46 : map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
501 : }
502 :
503 397 : env_stab = 0;
504 397 : move16();
505 :
506 397 : csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
507 397 : csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) ); /* Q0 */
508 397 : test();
509 397 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
510 : {
511 0 : hHQ_core->mem_env_delta = 0;
512 0 : move16();
513 : }
514 397 : ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
515 : {
516 397 : 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 397 : 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 397 : test();
534 397 : IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
535 : {
536 397 : move16(); /* calculated stability */
537 397 : 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 397 : 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 397 : 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 397 : test();
555 397 : test();
556 397 : 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 397 : test();
577 397 : IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
578 : {
579 46 : b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
580 46 : sum = sub( sum, b_delta_env ); /* Q0 */
581 : }
582 :
583 : /*------------------------------------------------------------------*
584 : * Decode spectral fine structure using HVQ/PVQ
585 : *------------------------------------------------------------------*/
586 :
587 397 : 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 397 : 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 397 : test();
597 397 : IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
598 : {
599 20 : subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
600 20 : wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
601 20 : move16();
602 20 : wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
603 20 : move16();
604 :
605 20 : IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
606 : {
607 20 : Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
608 6020 : FOR( i = 0; i < 300; i++ )
609 : {
610 6000 : t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
611 6000 : move32();
612 : }
613 : }
614 :
615 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 );
616 :
617 20 : hHQ_core->prev_frm_hfe2 = har_freq_est2;
618 20 : move16();
619 : }
620 :
621 : {
622 397 : hHQ_core->prev_frm_hfe2 = 0; /*reset*/
623 397 : move16();
624 397 : hHQ_core->prev_stab_hfe2 = 0; /*reset*/
625 397 : move16();
626 : }
627 :
628 : /*------------------------------------------------------------------*
629 : * Spectral filling
630 : *------------------------------------------------------------------*/
631 397 : 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 397 : 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 397 : hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
635 397 : &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 397 : enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
638 :
639 :
640 397 : 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 397 : hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
649 :
650 : /* update */
651 397 : hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
652 397 : move16();
653 :
654 397 : return;
655 : }
|