FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/dec_amr.c @ 426:7bef001cd8b8
libtwamr: integrate dec_amr.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 07 May 2024 20:33:01 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
425:9499d12d315b | 426:7bef001cd8b8 |
---|---|
1 /************************************************************************* | |
2 * | |
3 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 | |
4 * R99 Version 3.3.0 | |
5 * REL-4 Version 4.1.0 | |
6 * | |
7 ***************************************************************************** | |
8 * | |
9 * File : dec_amr.c | |
10 * Purpose : Decoding of one speech frame using given codec mode | |
11 * | |
12 ***************************************************************************** | |
13 */ | |
14 | |
15 /* | |
16 ***************************************************************************** | |
17 * MODULE INCLUDE FILE AND VERSION ID | |
18 ***************************************************************************** | |
19 */ | |
20 #include "namespace.h" | |
21 #include "dec_amr.h" | |
22 | |
23 #include "typedef.h" | |
24 #include "basic_op.h" | |
25 #include "no_count.h" | |
26 #include "cnst.h" | |
27 #include "memops.h" | |
28 #include "syn_filt.h" | |
29 #include "d_plsf.h" | |
30 #include "agc.h" | |
31 #include "int_lpc.h" | |
32 #include "dec_gain.h" | |
33 #include "dec_lag3.h" | |
34 #include "dec_lag6.h" | |
35 #include "d2_9pf.h" | |
36 #include "d2_11pf.h" | |
37 #include "d3_14pf.h" | |
38 #include "d4_17pf.h" | |
39 #include "d8_31pf.h" | |
40 #include "d1035pf.h" | |
41 #include "pred_lt.h" | |
42 #include "d_gain_p.h" | |
43 #include "d_gain_c.h" | |
44 #include "dec_gain.h" | |
45 #include "ec_gains.h" | |
46 #include "ph_disp.h" | |
47 #include "c_g_aver.h" | |
48 #include "int_lsf.h" | |
49 #include "lsp_lsf.h" | |
50 #include "lsp_avg.h" | |
51 #include "bgnscd.h" | |
52 #include "ex_ctrl.h" | |
53 #include "sqrt_l.h" | |
54 | |
55 #include "lsp_tab.h" | |
56 #include "bitno.h" | |
57 #include "b_cn_cod.h" | |
58 | |
59 /* | |
60 ***************************************************************************** | |
61 * LOCAL VARIABLES AND TABLES | |
62 ***************************************************************************** | |
63 */ | |
64 /*-----------------------------------------------------------------* | |
65 * Decoder constant parameters (defined in "cnst.h") * | |
66 *-----------------------------------------------------------------* | |
67 * L_FRAME : Frame size. * | |
68 * L_FRAME_BY2 : Half the frame size. * | |
69 * L_SUBFR : Sub-frame size. * | |
70 * M : LPC order. * | |
71 * MP1 : LPC order+1 * | |
72 * PIT_MIN : Minimum pitch lag. * | |
73 * PIT_MIN_MR122 : Minimum pitch lag for the MR122 mode. * | |
74 * PIT_MAX : Maximum pitch lag. * | |
75 * L_INTERPOL : Length of filter for interpolation * | |
76 * PRM_SIZE : size of vector containing analysis parameters * | |
77 *-----------------------------------------------------------------*/ | |
78 | |
79 /* | |
80 ***************************************************************************** | |
81 * PUBLIC PROGRAM CODE | |
82 ***************************************************************************** | |
83 */ | |
84 | |
85 /* | |
86 ************************************************************************** | |
87 * | |
88 * Function : Decoder_amr_reset | |
89 * Purpose : Resets state memory | |
90 * | |
91 ************************************************************************** | |
92 */ | |
93 void Decoder_amr_reset (Decoder_amrState *state, Flag dtx_partial_reset) | |
94 { | |
95 Word16 i; | |
96 | |
97 /* Initialize static pointer */ | |
98 state->exc = state->old_exc + PIT_MAX + L_INTERPOL; | |
99 | |
100 /* Static vectors to zero */ | |
101 Set_zero (state->old_exc, PIT_MAX + L_INTERPOL); | |
102 | |
103 if (!dtx_partial_reset) | |
104 Set_zero (state->mem_syn, M); | |
105 | |
106 /* initialize pitch sharpening */ | |
107 state->sharp = SHARPMIN; | |
108 state->old_T0 = 40; | |
109 | |
110 /* Initialize state->lsp_old [] */ | |
111 | |
112 if (!dtx_partial_reset) { | |
113 Copy(lsp_init_data, &state->lsp_old[0], M); | |
114 } | |
115 | |
116 /* Initialize memories of bad frame handling */ | |
117 state->prev_bf = 0; | |
118 state->prev_pdf = 0; | |
119 state->state = 0; | |
120 | |
121 state->T0_lagBuff = 40; | |
122 state->inBackgroundNoise = 0; | |
123 state->voicedHangover = 0; | |
124 if (!dtx_partial_reset) { | |
125 for (i=0;i<9;i++) | |
126 state->excEnergyHist[i] = 0; | |
127 } | |
128 | |
129 for (i = 0; i < 9; i++) | |
130 state->ltpGainHistory[i] = 0; | |
131 | |
132 Cb_gain_average_reset(&state->Cb_gain_averState); | |
133 if (!dtx_partial_reset) | |
134 lsp_avg_reset(&state->lsp_avg_st); | |
135 D_plsf_reset(&state->lsfState); | |
136 ec_gain_pitch_reset(&state->ec_gain_p_st); | |
137 ec_gain_code_reset(&state->ec_gain_c_st); | |
138 | |
139 if (!dtx_partial_reset) | |
140 gc_pred_reset(&state->pred_state); | |
141 | |
142 Bgn_scd_reset(&state->background_state); | |
143 state->nodataSeed = 21845; | |
144 ph_disp_reset(&state->ph_disp_st); | |
145 if (!dtx_partial_reset) | |
146 dtx_dec_reset(&state->dtxDecoderState); | |
147 } | |
148 | |
149 /* | |
150 ************************************************************************** | |
151 * | |
152 * Function : Decoder_amr | |
153 * Purpose : Speech decoder routine. | |
154 * | |
155 ************************************************************************** | |
156 */ | |
157 int Decoder_amr ( | |
158 Decoder_amrState *st, /* i/o : State variables */ | |
159 enum Mode mode, /* i : AMR mode */ | |
160 Word16 parm[], /* i : vector of synthesis parameters | |
161 (PRM_SIZE) */ | |
162 enum RXFrameType frame_type, /* i : received frame type */ | |
163 Word16 synth[], /* o : synthesis speech (L_FRAME) */ | |
164 Word16 A_t[] /* o : decoded LP filter in 4 subframes | |
165 (AZ_SIZE) */ | |
166 ) | |
167 { | |
168 /* LPC coefficients */ | |
169 | |
170 Word16 *Az; /* Pointer on A_t */ | |
171 | |
172 /* LSPs */ | |
173 | |
174 Word16 lsp_new[M]; | |
175 Word16 lsp_mid[M]; | |
176 | |
177 /* LSFs */ | |
178 | |
179 Word16 prev_lsf[M]; | |
180 Word16 lsf_i[M]; | |
181 | |
182 /* Algebraic codevector */ | |
183 | |
184 Word16 code[L_SUBFR]; | |
185 | |
186 /* excitation */ | |
187 | |
188 Word16 excp[L_SUBFR]; | |
189 Word16 exc_enhanced[L_SUBFR]; | |
190 | |
191 /* Scalars */ | |
192 | |
193 Word16 i, i_subfr; | |
194 Word16 T0, T0_frac, index, index_mr475 = 0; | |
195 Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac; | |
196 Word16 t0_min, t0_max; | |
197 Word16 delta_frc_low, delta_frc_range; | |
198 Word16 tmp_shift; | |
199 Word16 temp; | |
200 Word32 L_temp; | |
201 Word16 flag4; | |
202 Word16 carefulFlag; | |
203 Word16 excEnergy; | |
204 Word16 subfrNr; | |
205 Word16 evenSubfr = 0; | |
206 | |
207 Word16 bfi = 0; /* bad frame indication flag */ | |
208 Word16 pdfi = 0; /* potential degraded bad frame flag */ | |
209 | |
210 enum DTXStateType newDTXState; /* SPEECH , DTX, DTX_MUTE */ | |
211 | |
212 /* find the new DTX state SPEECH OR DTX */ | |
213 newDTXState = rx_dtx_handler(&st->dtxDecoderState, frame_type); | |
214 | |
215 /* DTX actions */ | |
216 if (sub(newDTXState, SPEECH) != 0 ) | |
217 { | |
218 Decoder_amr_reset (st, 1); | |
219 | |
220 dtx_dec(&st->dtxDecoderState, | |
221 st->mem_syn, | |
222 &st->lsfState, | |
223 &st->pred_state, | |
224 &st->Cb_gain_averState, | |
225 newDTXState, | |
226 mode, | |
227 parm, synth, A_t); | |
228 /* update average lsp */ | |
229 | |
230 Lsf_lsp(st->lsfState.past_lsf_q, st->lsp_old, M); | |
231 lsp_avg(&st->lsp_avg_st, st->lsfState.past_lsf_q); | |
232 goto the_end; | |
233 } | |
234 | |
235 /* SPEECH action state machine */ | |
236 if ((sub(frame_type, RX_SPEECH_BAD) == 0) || | |
237 (sub(frame_type, RX_NO_DATA) == 0) || | |
238 (sub(frame_type, RX_ONSET) == 0)) | |
239 { | |
240 bfi = 1; | |
241 if ((sub(frame_type, RX_NO_DATA) == 0) || | |
242 (sub(frame_type, RX_ONSET) == 0)) | |
243 { | |
244 build_CN_param(&st->nodataSeed, | |
245 prmno[mode], | |
246 bitno[mode], | |
247 parm); | |
248 } | |
249 } | |
250 else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0) | |
251 { | |
252 pdfi = 1; | |
253 } | |
254 | |
255 if (bfi != 0) | |
256 { | |
257 st->state = add (st->state, 1); | |
258 } | |
259 else if (sub (st->state, 6) == 0) | |
260 { | |
261 st->state = 5; move16 (); | |
262 } | |
263 else | |
264 { | |
265 st->state = 0; move16 (); | |
266 } | |
267 | |
268 if (sub (st->state, 6) > 0) | |
269 { | |
270 st->state = 6; move16 (); | |
271 } | |
272 | |
273 /* If this frame is the first speech frame after CNI period, */ | |
274 /* set the BFH state machine to an appropriate state depending */ | |
275 /* on whether there was DTX muting before start of speech or not */ | |
276 /* If there was DTX muting, the first speech frame is muted. */ | |
277 /* If there was no DTX muting, the first speech frame is not */ | |
278 /* muted. The BFH state machine starts from state 5, however, to */ | |
279 /* keep the audible noise resulting from a SID frame which is */ | |
280 /* erroneously interpreted as a good speech frame as small as */ | |
281 /* possible (the decoder output in this case is quickly muted) */ | |
282 | |
283 if (sub(st->dtxDecoderState.dtxGlobalState, DTX) == 0) | |
284 { | |
285 st->state = 5; | |
286 st->prev_bf = 0; | |
287 } | |
288 else if (test (), sub(st->dtxDecoderState.dtxGlobalState, DTX_MUTE) == 0) | |
289 { | |
290 st->state = 5; | |
291 st->prev_bf = 1; | |
292 } | |
293 | |
294 /* save old LSFs for CB gain smoothing */ | |
295 Copy (st->lsfState.past_lsf_q, prev_lsf, M); | |
296 | |
297 /* decode LSF parameters and generate interpolated lpc coefficients | |
298 for the 4 subframes */ | |
299 if (sub (mode, MR122) != 0) | |
300 { | |
301 D_plsf_3(&st->lsfState, mode, bfi, parm, lsp_new); | |
302 | |
303 /* Advance synthesis parameters pointer */ | |
304 parm += 3; move16 (); | |
305 | |
306 Int_lpc_1to3(st->lsp_old, lsp_new, A_t); | |
307 } | |
308 else | |
309 { | |
310 D_plsf_5(&st->lsfState, bfi, parm, lsp_mid, lsp_new); | |
311 | |
312 /* Advance synthesis parameters pointer */ | |
313 parm += 5; move16 (); | |
314 | |
315 Int_lpc_1and3(st->lsp_old, lsp_mid, lsp_new, A_t); | |
316 } | |
317 | |
318 /* update the LSPs for the next frame */ | |
319 for (i = 0; i < M; i++) | |
320 { | |
321 st->lsp_old[i] = lsp_new[i]; move16 (); | |
322 } | |
323 | |
324 /*------------------------------------------------------------------------* | |
325 * Loop for every subframe in the analysis frame * | |
326 *------------------------------------------------------------------------* | |
327 * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR * | |
328 * times * | |
329 * - decode the pitch delay * | |
330 * - decode algebraic code * | |
331 * - decode pitch and codebook gains * | |
332 * - find the excitation and compute synthesis speech * | |
333 *------------------------------------------------------------------------*/ | |
334 | |
335 /* pointer to interpolated LPC parameters */ | |
336 Az = A_t; move16 (); | |
337 | |
338 evenSubfr = 0; move16(); | |
339 subfrNr = -1; move16(); | |
340 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) | |
341 { | |
342 subfrNr = add(subfrNr, 1); | |
343 evenSubfr = sub(1, evenSubfr); | |
344 | |
345 /* flag for first and 3th subframe */ | |
346 pit_flag = i_subfr; move16 (); | |
347 | |
348 test(); | |
349 if (sub (i_subfr, L_FRAME_BY2) == 0) | |
350 { | |
351 test(); test(); | |
352 if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0) | |
353 { | |
354 pit_flag = 0; move16 (); | |
355 } | |
356 } | |
357 | |
358 /* pitch index */ | |
359 index = *parm++; move16 (); | |
360 | |
361 /*-------------------------------------------------------* | |
362 * - decode pitch lag and find adaptive codebook vector. * | |
363 *-------------------------------------------------------*/ | |
364 | |
365 test (); | |
366 if (sub(mode, MR122) != 0) | |
367 { | |
368 /* flag4 indicates encoding with 4 bit resolution; */ | |
369 /* this is needed for mode MR475, MR515, MR59 and MR67 */ | |
370 | |
371 flag4 = 0; move16 (); | |
372 test (); test (); test (); test (); | |
373 if ((sub (mode, MR475) == 0) || | |
374 (sub (mode, MR515) == 0) || | |
375 (sub (mode, MR59) == 0) || | |
376 (sub (mode, MR67) == 0) ) { | |
377 flag4 = 1; move16 (); | |
378 } | |
379 | |
380 /*-------------------------------------------------------* | |
381 * - get ranges for the t0_min and t0_max * | |
382 * - only needed in delta decoding * | |
383 *-------------------------------------------------------*/ | |
384 | |
385 delta_frc_low = 5; move16(); | |
386 delta_frc_range = 9; move16(); | |
387 | |
388 test (); | |
389 if ( sub(mode, MR795) == 0 ) | |
390 { | |
391 delta_frc_low = 10; move16(); | |
392 delta_frc_range = 19; move16(); | |
393 } | |
394 | |
395 t0_min = sub(st->old_T0, delta_frc_low); | |
396 test (); | |
397 if (sub(t0_min, PIT_MIN) < 0) | |
398 { | |
399 t0_min = PIT_MIN; move16(); | |
400 } | |
401 t0_max = add(t0_min, delta_frc_range); | |
402 test (); | |
403 if (sub(t0_max, PIT_MAX) > 0) | |
404 { | |
405 t0_max = PIT_MAX; move16(); | |
406 t0_min = sub(t0_max, delta_frc_range); | |
407 } | |
408 | |
409 Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0, | |
410 &T0, &T0_frac, flag4); | |
411 | |
412 st->T0_lagBuff = T0; move16 (); | |
413 | |
414 test (); | |
415 if (bfi != 0) | |
416 { | |
417 test (); | |
418 if (sub (st->old_T0, PIT_MAX) < 0) | |
419 { /* Graceful pitch */ | |
420 st->old_T0 = add(st->old_T0, 1); /* degradation */ | |
421 } | |
422 T0 = st->old_T0; move16 (); | |
423 T0_frac = 0; move16 (); | |
424 | |
425 test (); test (); test (); test (); test (); | |
426 if ( st->inBackgroundNoise != 0 && | |
427 sub(st->voicedHangover, 4) > 0 && | |
428 ((sub(mode, MR475) == 0 ) || | |
429 (sub(mode, MR515) == 0 ) || | |
430 (sub(mode, MR59) == 0) ) | |
431 ) | |
432 { | |
433 T0 = st->T0_lagBuff; move16 (); | |
434 } | |
435 } | |
436 | |
437 Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1); | |
438 } | |
439 else | |
440 { | |
441 Dec_lag6 (index, PIT_MIN_MR122, | |
442 PIT_MAX, pit_flag, &T0, &T0_frac); | |
443 | |
444 test (); test (); test (); | |
445 if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0)) | |
446 { | |
447 } | |
448 else | |
449 { | |
450 st->T0_lagBuff = T0; move16 (); | |
451 T0 = st->old_T0; move16 (); | |
452 T0_frac = 0; move16 (); | |
453 } | |
454 | |
455 Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0); | |
456 } | |
457 | |
458 /*-------------------------------------------------------* | |
459 * - (MR122 only: Decode pitch gain.) * | |
460 * - Decode innovative codebook. * | |
461 * - set pitch sharpening factor * | |
462 *-------------------------------------------------------*/ | |
463 | |
464 if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0) | |
465 { /* MR475, MR515 */ | |
466 index = *parm++; /* index of position */ move16 (); | |
467 i = *parm++; /* signs */ move16 (); | |
468 | |
469 decode_2i40_9bits (subfrNr, i, index, code); | |
470 | |
471 pit_sharp = shl (st->sharp, 1); | |
472 } | |
473 else if (sub (mode, MR59) == 0) | |
474 { /* MR59 */ | |
475 test (); | |
476 index = *parm++; /* index of position */ move16 (); | |
477 i = *parm++; /* signs */ move16 (); | |
478 | |
479 decode_2i40_11bits (i, index, code); | |
480 | |
481 pit_sharp = shl (st->sharp, 1); | |
482 } | |
483 else if (sub (mode, MR67) == 0) | |
484 { /* MR67 */ | |
485 test (); test (); | |
486 index = *parm++; /* index of position */ move16 (); | |
487 i = *parm++; /* signs */ move16 (); | |
488 | |
489 decode_3i40_14bits (i, index, code); | |
490 | |
491 pit_sharp = shl (st->sharp, 1); | |
492 } | |
493 else if (sub (mode, MR795) <= 0) | |
494 { /* MR74, MR795 */ | |
495 test (); test (); test (); | |
496 index = *parm++; /* index of position */ move16 (); | |
497 i = *parm++; /* signs */ move16 (); | |
498 | |
499 decode_4i40_17bits (i, index, code); | |
500 | |
501 pit_sharp = shl (st->sharp, 1); | |
502 } | |
503 else if (sub (mode, MR102) == 0) | |
504 { /* MR102 */ | |
505 test (); test (); test (); | |
506 | |
507 dec_8i40_31bits (parm, code); | |
508 parm += 7; move16 (); | |
509 | |
510 pit_sharp = shl (st->sharp, 1); | |
511 } | |
512 else | |
513 { /* MR122 */ | |
514 test (); test (); test (); | |
515 index = *parm++; move16 (); | |
516 test(); | |
517 if (bfi != 0) | |
518 { | |
519 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit); | |
520 } | |
521 else | |
522 { | |
523 gain_pit = d_gain_pitch (mode, index); move16 (); | |
524 } | |
525 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf, | |
526 &gain_pit); | |
527 | |
528 dec_10i40_35bits (parm, code); | |
529 parm += 10; move16 (); | |
530 | |
531 /* pit_sharp = gain_pit; */ | |
532 /* if (pit_sharp > 1.0) pit_sharp = 1.0; */ | |
533 | |
534 pit_sharp = shl (gain_pit, 1); | |
535 } | |
536 | |
537 /*-------------------------------------------------------* | |
538 * - Add the pitch contribution to code[]. * | |
539 *-------------------------------------------------------*/ | |
540 for (i = T0; i < L_SUBFR; i++) | |
541 { | |
542 temp = mult (code[i - T0], pit_sharp); | |
543 code[i] = add (code[i], temp); | |
544 move16 (); | |
545 } | |
546 | |
547 /*------------------------------------------------------------* | |
548 * - Decode codebook gain (MR122) or both pitch * | |
549 * gain and codebook gain (all others) * | |
550 * - Update pitch sharpening "sharp" with quantized gain_pit * | |
551 *------------------------------------------------------------*/ | |
552 | |
553 if (test(), sub (mode, MR475) == 0) | |
554 { | |
555 /* read and decode pitch and code gain */ | |
556 test(); | |
557 if (evenSubfr != 0) | |
558 { | |
559 index_mr475 = *parm++; move16 (); /* index of gain(s) */ | |
560 } | |
561 | |
562 test(); | |
563 if (bfi == 0) | |
564 { | |
565 Dec_gain(&st->pred_state, mode, index_mr475, code, | |
566 evenSubfr, &gain_pit, &gain_code); | |
567 } | |
568 else | |
569 { | |
570 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit); | |
571 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state, | |
572 &gain_code); | |
573 } | |
574 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf, | |
575 &gain_pit); | |
576 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf, | |
577 &gain_code); | |
578 | |
579 pit_sharp = gain_pit; move16 (); | |
580 test (); | |
581 if (sub (pit_sharp, SHARPMAX) > 0) | |
582 { | |
583 pit_sharp = SHARPMAX; move16 (); | |
584 } | |
585 | |
586 } | |
587 else if (test(), test(), (sub (mode, MR74) <= 0) || | |
588 (sub (mode, MR102) == 0)) | |
589 { | |
590 /* read and decode pitch and code gain */ | |
591 index = *parm++; move16 (); /* index of gain(s) */ | |
592 | |
593 test(); | |
594 if (bfi == 0) | |
595 { | |
596 Dec_gain(&st->pred_state, mode, index, code, | |
597 evenSubfr, &gain_pit, &gain_code); | |
598 } | |
599 else | |
600 { | |
601 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit); | |
602 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state, | |
603 &gain_code); | |
604 } | |
605 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf, | |
606 &gain_pit); | |
607 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf, | |
608 &gain_code); | |
609 | |
610 pit_sharp = gain_pit; move16 (); | |
611 test (); | |
612 if (sub (pit_sharp, SHARPMAX) > 0) | |
613 { | |
614 pit_sharp = SHARPMAX; move16 (); | |
615 } | |
616 | |
617 if (sub (mode, MR102) == 0) | |
618 { | |
619 if (sub (st->old_T0, add(L_SUBFR, 5)) > 0) | |
620 { | |
621 pit_sharp = shr(pit_sharp, 2); | |
622 } | |
623 } | |
624 } | |
625 else | |
626 { | |
627 /* read and decode pitch gain */ | |
628 index = *parm++; move16 (); /* index of gain(s) */ | |
629 | |
630 test (); | |
631 if (sub (mode, MR795) == 0) | |
632 { | |
633 /* decode pitch gain */ | |
634 test(); | |
635 if (bfi != 0) | |
636 { | |
637 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit); | |
638 } | |
639 else | |
640 { | |
641 gain_pit = d_gain_pitch (mode, index); move16 (); | |
642 } | |
643 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf, | |
644 &gain_pit); | |
645 | |
646 /* read and decode code gain */ | |
647 index = *parm++; move16 (); | |
648 test(); | |
649 if (bfi == 0) | |
650 { | |
651 d_gain_code (&st->pred_state, mode, index, code, &gain_code); | |
652 } | |
653 else | |
654 { | |
655 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state, | |
656 &gain_code); | |
657 } | |
658 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf, | |
659 &gain_code); | |
660 | |
661 pit_sharp = gain_pit; move16 (); | |
662 test (); | |
663 if (sub (pit_sharp, SHARPMAX) > 0) | |
664 { | |
665 pit_sharp = SHARPMAX; move16 (); | |
666 } | |
667 } | |
668 else | |
669 { /* MR122 */ | |
670 test(); | |
671 if (bfi == 0) | |
672 { | |
673 d_gain_code (&st->pred_state, mode, index, code, &gain_code); | |
674 } | |
675 else | |
676 { | |
677 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state, | |
678 &gain_code); | |
679 } | |
680 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf, | |
681 &gain_code); | |
682 | |
683 pit_sharp = gain_pit; move16 (); | |
684 } | |
685 } | |
686 | |
687 /* store pitch sharpening for next subframe */ | |
688 /* (for modes which use the previous pitch gain for | |
689 pitch sharpening in the search phase) */ | |
690 /* do not update sharpening in even subframes for MR475 */ | |
691 test(); test(); | |
692 if (sub(mode, MR475) != 0 || evenSubfr == 0) | |
693 { | |
694 st->sharp = gain_pit; move16 (); | |
695 test (); | |
696 if (sub (st->sharp, SHARPMAX) > 0) | |
697 { | |
698 st->sharp = SHARPMAX; move16 (); | |
699 } | |
700 } | |
701 | |
702 pit_sharp = shl (pit_sharp, 1); | |
703 test (); | |
704 if (sub (pit_sharp, 16384) > 0) | |
705 { | |
706 for (i = 0; i < L_SUBFR; i++) | |
707 { | |
708 temp = mult (st->exc[i], pit_sharp); | |
709 L_temp = L_mult (temp, gain_pit); | |
710 test (); | |
711 if (sub(mode, MR122)==0) | |
712 { | |
713 L_temp = L_shr (L_temp, 1); | |
714 } | |
715 excp[i] = round (L_temp); move16 (); | |
716 } | |
717 } | |
718 | |
719 /*-------------------------------------------------------* | |
720 * - Store list of LTP gains needed in the source * | |
721 * characteristic detector (SCD) * | |
722 *-------------------------------------------------------*/ | |
723 test (); | |
724 if ( bfi == 0 ) | |
725 { | |
726 for (i = 0; i < 8; i++) | |
727 { | |
728 st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; move16 (); | |
729 } | |
730 st->ltpGainHistory[8] = gain_pit; move16 (); | |
731 } | |
732 | |
733 /*-------------------------------------------------------* | |
734 * - Limit gain_pit if in background noise and BFI * | |
735 * for MR475, MR515, MR59 * | |
736 *-------------------------------------------------------*/ | |
737 | |
738 test (); test (); test (); test (); test (); test (); | |
739 if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && | |
740 ((sub(mode, MR475) == 0) || | |
741 (sub(mode, MR515) == 0) || | |
742 (sub(mode, MR59) == 0)) | |
743 ) | |
744 { | |
745 test (); | |
746 if ( sub (gain_pit, 12288) > 0) /* if (gain_pit > 0.75) in Q14*/ | |
747 gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 ); | |
748 /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */ | |
749 | |
750 test (); | |
751 if ( sub (gain_pit, 14745) > 0) /* if (gain_pit > 0.90) in Q14*/ | |
752 { | |
753 gain_pit = 14745; move16 (); | |
754 } | |
755 } | |
756 | |
757 /*-------------------------------------------------------* | |
758 * Calculate CB mixed gain * | |
759 *-------------------------------------------------------*/ | |
760 Int_lsf(prev_lsf, st->lsfState.past_lsf_q, i_subfr, lsf_i); | |
761 gain_code_mix = Cb_gain_average( | |
762 &st->Cb_gain_averState, mode, gain_code, | |
763 lsf_i, st->lsp_avg_st.lsp_meanSave, bfi, | |
764 st->prev_bf, pdfi, st->prev_pdf, | |
765 st->inBackgroundNoise, st->voicedHangover); move16 (); | |
766 | |
767 /* make sure that MR74, MR795, MR122 have original code_gain*/ | |
768 test(); | |
769 if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) ) | |
770 /* MR74, MR795, MR122 */ | |
771 { | |
772 gain_code_mix = gain_code; move16 (); | |
773 } | |
774 | |
775 /*-------------------------------------------------------* | |
776 * - Find the total excitation. * | |
777 * - Find synthesis speech corresponding to st->exc[]. * | |
778 *-------------------------------------------------------*/ | |
779 test (); | |
780 if (sub(mode, MR102) <= 0) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/ | |
781 { | |
782 pitch_fac = gain_pit; move16 (); | |
783 tmp_shift = 1; move16 (); | |
784 } | |
785 else /* MR122 */ | |
786 { | |
787 pitch_fac = shr (gain_pit, 1); move16 (); | |
788 tmp_shift = 2; move16 (); | |
789 } | |
790 | |
791 /* copy unscaled LTP excitation to exc_enhanced (used in phase | |
792 * dispersion below) and compute total excitation for LTP feedback | |
793 */ | |
794 for (i = 0; i < L_SUBFR; i++) | |
795 { | |
796 exc_enhanced[i] = st->exc[i]; move16 (); | |
797 | |
798 /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */ | |
799 L_temp = L_mult (st->exc[i], pitch_fac); | |
800 /* 12.2: Q0 * Q13 */ | |
801 /* 7.4: Q0 * Q14 */ | |
802 L_temp = L_mac (L_temp, code[i], gain_code); | |
803 /* 12.2: Q12 * Q1 */ | |
804 /* 7.4: Q13 * Q1 */ | |
805 L_temp = L_shl (L_temp, tmp_shift); /* Q16 */ | |
806 st->exc[i] = round (L_temp); move16 (); | |
807 } | |
808 | |
809 /*-------------------------------------------------------* | |
810 * - Adaptive phase dispersion * | |
811 *-------------------------------------------------------*/ | |
812 ph_disp_release(&st->ph_disp_st); /* free phase dispersion adaption */ | |
813 | |
814 test (); test (); test (); test (); test (); test (); | |
815 if ( ((sub(mode, MR475) == 0) || | |
816 (sub(mode, MR515) == 0) || | |
817 (sub(mode, MR59) == 0)) && | |
818 sub(st->voicedHangover, 3) > 0 && | |
819 st->inBackgroundNoise != 0 && | |
820 bfi != 0 ) | |
821 { | |
822 ph_disp_lock(&st->ph_disp_st); /* Always Use full Phase Disp. */ | |
823 } /* if error in bg noise */ | |
824 | |
825 /* apply phase dispersion to innovation (if enabled) and | |
826 compute total excitation for synthesis part */ | |
827 ph_disp(&st->ph_disp_st, mode, | |
828 exc_enhanced, gain_code_mix, gain_pit, code, | |
829 pitch_fac, tmp_shift); | |
830 | |
831 /*-------------------------------------------------------* | |
832 * - The Excitation control module are active during BFI.* | |
833 * - Conceal drops in signal energy if in bg noise. * | |
834 *-------------------------------------------------------*/ | |
835 | |
836 L_temp = 0; move32 (); | |
837 for (i = 0; i < L_SUBFR; i++) | |
838 { | |
839 L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] ); | |
840 } | |
841 | |
842 L_temp = L_shr (L_temp, 1); /* excEnergy = sqrt(L_temp) in Q0 */ | |
843 L_temp = sqrt_l_exp(L_temp, &temp); move32 (); /* function result */ | |
844 L_temp = L_shr(L_temp, add( shr(temp, 1), 15)); | |
845 L_temp = L_shr(L_temp, 2); /* To cope with 16-bit and */ | |
846 excEnergy = extract_l(L_temp); /* scaling in ex_ctrl() */ | |
847 | |
848 test (); test (); test (); test (); test (); | |
849 test (); test (); test (); test (); test (); | |
850 if ( ((sub (mode, MR475) == 0) || | |
851 (sub (mode, MR515) == 0) || | |
852 (sub (mode, MR59) == 0)) && | |
853 sub(st->voicedHangover, 5) > 0 && | |
854 st->inBackgroundNoise != 0 && | |
855 sub(st->state, 4) < 0 && | |
856 ( (pdfi != 0 && st->prev_pdf != 0) || | |
857 bfi != 0 || | |
858 st->prev_bf != 0) ) | |
859 { | |
860 carefulFlag = 0; move32 (); | |
861 test (); test (); | |
862 if ( pdfi != 0 && bfi == 0 ) | |
863 { | |
864 carefulFlag = 1; move16 (); | |
865 } | |
866 | |
867 Ex_ctrl(exc_enhanced, | |
868 excEnergy, | |
869 st->excEnergyHist, | |
870 st->voicedHangover, | |
871 st->prev_bf, | |
872 carefulFlag); | |
873 } | |
874 | |
875 test (); test (); test (); test (); | |
876 if ( st->inBackgroundNoise != 0 && | |
877 ( bfi != 0 || st->prev_bf != 0 ) && | |
878 sub(st->state, 4) < 0 ) | |
879 { | |
880 ; /* do nothing! */ | |
881 } | |
882 else | |
883 { | |
884 /* Update energy history for all modes */ | |
885 for (i = 0; i < 8; i++) | |
886 { | |
887 st->excEnergyHist[i] = st->excEnergyHist[i+1]; move16 (); | |
888 } | |
889 st->excEnergyHist[8] = excEnergy; move16 (); | |
890 } | |
891 /*-------------------------------------------------------* | |
892 * Excitation control module end. * | |
893 *-------------------------------------------------------*/ | |
894 | |
895 test (); | |
896 if (sub (pit_sharp, 16384) > 0) | |
897 { | |
898 for (i = 0; i < L_SUBFR; i++) | |
899 { | |
900 excp[i] = add (excp[i], exc_enhanced[i]); | |
901 move16 (); | |
902 } | |
903 agc2 (exc_enhanced, excp, L_SUBFR); | |
904 Overflow = 0; move16 (); | |
905 Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR, | |
906 st->mem_syn, 0); | |
907 } | |
908 else | |
909 { | |
910 Overflow = 0; move16 (); | |
911 Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR, | |
912 st->mem_syn, 0); | |
913 } | |
914 | |
915 test (); | |
916 if (Overflow != 0) /* Test for overflow */ | |
917 { | |
918 for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++) | |
919 { | |
920 st->old_exc[i] = shr(st->old_exc[i], 2); move16 (); | |
921 } | |
922 for (i = 0; i < L_SUBFR; i++) | |
923 { | |
924 exc_enhanced[i] = shr(exc_enhanced[i], 2); move16 (); | |
925 } | |
926 Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); | |
927 } | |
928 else | |
929 { | |
930 Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M); | |
931 } | |
932 | |
933 /*--------------------------------------------------* | |
934 * Update signal for next frame. * | |
935 * -> shift to the left by L_SUBFR st->exc[] * | |
936 *--------------------------------------------------*/ | |
937 | |
938 Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL); | |
939 | |
940 /* interpolated LPC parameters for next subframe */ | |
941 Az += MP1; move16 (); | |
942 | |
943 /* store T0 for next subframe */ | |
944 st->old_T0 = T0; move16 (); | |
945 } | |
946 | |
947 /*-------------------------------------------------------* | |
948 * Call the Source Characteristic Detector which updates * | |
949 * st->inBackgroundNoise and st->voicedHangover. * | |
950 *-------------------------------------------------------*/ | |
951 | |
952 st->inBackgroundNoise = Bgn_scd(&st->background_state, | |
953 &(st->ltpGainHistory[0]), | |
954 &(synth[0]), | |
955 &(st->voicedHangover) ); | |
956 | |
957 dtx_dec_activity_update(&st->dtxDecoderState, | |
958 st->lsfState.past_lsf_q, | |
959 synth); | |
960 | |
961 /* store bfi for next subframe */ | |
962 st->prev_bf = bfi; move16 (); | |
963 st->prev_pdf = pdfi; move16 (); | |
964 | |
965 /*--------------------------------------------------* | |
966 * Calculate the LSF averages on the eight * | |
967 * previous frames * | |
968 *--------------------------------------------------*/ | |
969 | |
970 lsp_avg(&st->lsp_avg_st, st->lsfState.past_lsf_q); | |
971 | |
972 the_end: | |
973 st->dtxDecoderState.dtxGlobalState = newDTXState; | |
974 | |
975 return 0; | |
976 } |