• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20 
21     3GPP TS 26.073
22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31 
32  Pathname: ./audio/gsm-amr/c/src/dec_amr.c
33  Funtions: Decoder_amr_init
34            Decoder_amr_reset
35            Decoder_amr
36 
37 ------------------------------------------------------------------------------
38  MODULE DESCRIPTION
39 
40  This file contains the function used to decode one speech frame using a given
41  codec mode. The functions used to initialize, reset, and exit are also
42  included in this file.
43 
44 ------------------------------------------------------------------------------
45 */
46 
47 /*----------------------------------------------------------------------------
48 ; INCLUDES
49 ----------------------------------------------------------------------------*/
50 #include <string.h>
51 
52 #include "dec_amr.h"
53 #include "typedef.h"
54 #include "cnst.h"
55 #include "copy.h"
56 #include "set_zero.h"
57 #include "syn_filt.h"
58 #include "d_plsf.h"
59 #include "agc.h"
60 #include "int_lpc.h"
61 #include "dec_gain.h"
62 #include "dec_lag3.h"
63 #include "dec_lag6.h"
64 #include "d2_9pf.h"
65 #include "d2_11pf.h"
66 #include "d3_14pf.h"
67 #include "d4_17pf.h"
68 #include "d8_31pf.h"
69 #include "d1035pf.h"
70 #include "pred_lt.h"
71 #include "d_gain_p.h"
72 #include "d_gain_c.h"
73 #include "dec_gain.h"
74 #include "ec_gains.h"
75 #include "ph_disp.h"
76 #include "c_g_aver.h"
77 #include "int_lsf.h"
78 #include "lsp_lsf.h"
79 #include "lsp_avg.h"
80 #include "bgnscd.h"
81 #include "ex_ctrl.h"
82 #include "sqrt_l.h"
83 #include "frame.h"
84 #include "bitno_tab.h"
85 #include "b_cn_cod.h"
86 #include "basic_op.h"
87 
88 /*----------------------------------------------------------------------------
89 ; MACROS
90 ; Define module specific macros here
91 ----------------------------------------------------------------------------*/
92 
93 /*----------------------------------------------------------------------------
94 ; DEFINES
95 ; Include all pre-processor statements here. Include conditional
96 ; compile variables also.
97 ----------------------------------------------------------------------------*/
98 
99 /*----------------------------------------------------------------------------
100 ; LOCAL FUNCTION DEFINITIONS
101 ; Function Prototype declaration
102 ----------------------------------------------------------------------------*/
103 
104 /*----------------------------------------------------------------------------
105 ; LOCAL VARIABLE DEFINITIONS
106 ; Variable declaration - defined here and used outside this module
107 ----------------------------------------------------------------------------*/
108 
109 
110 /*
111 ------------------------------------------------------------------------------
112  FUNCTION NAME: Decoder_amr_init
113 ------------------------------------------------------------------------------
114  INPUT AND OUTPUT DEFINITIONS
115 
116  Inputs:
117     state = pointer to a pointer to structures of type Decoder_amrState
118 
119  Outputs:
120     structure pointed to by the pointer which is pointed to by state is
121       initialized to each field's initial values
122 
123     state pointer points to the address of the memory allocated by
124       Decoder_amr_init function
125 
126  Returns:
127     return_value = 0, if the initialization was successful; -1, otherwise (int)
128 
129  Global Variables Used:
130     None
131 
132  Local Variables Needed:
133     None
134 
135 ------------------------------------------------------------------------------
136  FUNCTION DESCRIPTION
137 
138  This function allocates and initializes state memory used by the Decoder_amr
139  function. It stores the pointer to the filter status structure in state. This
140  pointer has to be passed to Decoder_amr in each call. The function returns
141  0, if initialization was successful and -1, otherwise.
142 
143 ------------------------------------------------------------------------------
144  REQUIREMENTS
145 
146  None
147 
148 ------------------------------------------------------------------------------
149  REFERENCES
150 
151  dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
152 
153 ------------------------------------------------------------------------------
154  PSEUDO-CODE
155 
156 int Decoder_amr_init (Decoder_amrState **state)
157 {
158   Decoder_amrState* s;
159   Word16 i;
160 
161   if (state == (Decoder_amrState **) NULL){
162       fprintf(stderr, "Decoder_amr_init: invalid parameter\n");
163       return -1;
164   }
165   *state = NULL;
166 
167   // allocate memory
168   if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){
169       fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n");
170       return -1;
171   }
172 
173   s->T0_lagBuff = 40;
174   s->inBackgroundNoise = 0;
175   s->voicedHangover = 0;
176   for (i = 0; i < 9; i++)
177      s->ltpGainHistory[i] = 0;
178 
179   s->lsfState = NULL;
180   s->ec_gain_p_st = NULL;
181   s->ec_gain_c_st = NULL;
182   s->pred_state = NULL;
183   s->ph_disp_st = NULL;
184   s->dtxDecoderState = NULL;
185 
186   if (D_plsf_init(&s->lsfState) ||
187       ec_gain_pitch_init(&s->ec_gain_p_st) ||
188       ec_gain_code_init(&s->ec_gain_c_st) ||
189       gc_pred_init(&s->pred_state) ||
190       Cb_gain_average_init(&s->Cb_gain_averState) ||
191       lsp_avg_init(&s->lsp_avg_st) ||
192       Bgn_scd_init(&s->background_state) ||
193       ph_disp_init(&s->ph_disp_st) ||
194       dtx_dec_init(&s->dtxDecoderState)) {
195       Decoder_amr_exit(&s);
196       return -1;
197   }
198 
199   Decoder_amr_reset(s, (enum Mode)0);
200   *state = s;
201 
202   return 0;
203 }
204 
205 ------------------------------------------------------------------------------
206  RESOURCES USED [optional]
207 
208  When the code is written for a specific target processor the
209  the resources used should be documented below.
210 
211  HEAP MEMORY USED: x bytes
212 
213  STACK MEMORY USED: x bytes
214 
215  CLOCK CYCLES: (cycle count equation for this function) + (variable
216                 used to represent cycle count for each subroutine
217                 called)
218      where: (cycle count variable) = cycle count for [subroutine
219                                      name]
220 
221 ------------------------------------------------------------------------------
222  CAUTION [optional]
223  [State any special notes, constraints or cautions for users of this function]
224 
225 ------------------------------------------------------------------------------
226 */
227 
Decoder_amr_init(Decoder_amrState * s)228 Word16 Decoder_amr_init(Decoder_amrState *s)
229 {
230     Word16 i;
231 
232     if (s == (Decoder_amrState *) NULL)
233     {
234         /* fprint(stderr, "Decoder_amr_init: invalid parameter\n");  */
235         return(-1);
236     }
237 
238     s->T0_lagBuff = 40;
239     s->inBackgroundNoise = 0;
240     s->voicedHangover = 0;
241 
242     /* Initialize overflow Flag */
243 
244     s->overflow = 0;
245 
246     for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
247     {
248         s->ltpGainHistory[i] = 0;
249     }
250 
251     D_plsf_reset(&s->lsfState);
252     ec_gain_pitch_reset(&s->ec_gain_p_st);
253     ec_gain_code_reset(&s->ec_gain_c_st);
254     Cb_gain_average_reset(&s->Cb_gain_averState);
255     lsp_avg_reset(&s->lsp_avg_st);
256     Bgn_scd_reset(&s->background_state);
257     ph_disp_reset(&s->ph_disp_st);
258     dtx_dec_reset(&s->dtxDecoderState);
259     gc_pred_reset(&s->pred_state);
260 
261     Decoder_amr_reset(s, MR475);
262 
263     return(0);
264 }
265 
266 /****************************************************************************/
267 
268 /*
269 ------------------------------------------------------------------------------
270  FUNCTION NAME: Decoder_amr_reset
271 ------------------------------------------------------------------------------
272  INPUT AND OUTPUT DEFINITIONS
273 
274  Inputs:
275     state = pointer to a structure of type Decoder_amrState
276     mode = codec mode (enum Mode)
277 
278  Outputs:
279     structure pointed to by state is initialized to its reset value
280 
281  Returns:
282     return_value = 0, if reset was successful; -1, otherwise (int)
283 
284  Global Variables Used:
285     None
286 
287  Local Variables Needed:
288     None
289 
290 ------------------------------------------------------------------------------
291  FUNCTION DESCRIPTION
292 
293  This function resets the state memory used by the Decoder_amr function. It
294  returns a 0, if reset was successful and -1, otherwise.
295 
296 ------------------------------------------------------------------------------
297  REQUIREMENTS
298 
299  None
300 
301 ------------------------------------------------------------------------------
302  REFERENCES
303 
304  dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
305 
306 ------------------------------------------------------------------------------
307  PSEUDO-CODE
308 
309 int Decoder_amr_reset (Decoder_amrState *state, enum Mode mode)
310 {
311   Word16 i;
312 
313   if (state == (Decoder_amrState *) NULL){
314       fprintf(stderr, "Decoder_amr_reset: invalid parameter\n");
315       return -1;
316   }
317 
318   // Initialize static pointer
319   state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
320 
321   // Static vectors to zero
322   Set_zero (state->old_exc, PIT_MAX + L_INTERPOL);
323 
324   if (mode != MRDTX)
325      Set_zero (state->mem_syn, M);
326 
327   // initialize pitch sharpening
328   state->sharp = SHARPMIN;
329   state->old_T0 = 40;
330 
331   // Initialize state->lsp_old []
332 
333   if (mode != MRDTX) {
334       Copy(lsp_init_data, &state->lsp_old[0], M);
335   }
336 
337   // Initialize memories of bad frame handling
338   state->prev_bf = 0;
339   state->prev_pdf = 0;
340   state->state = 0;
341 
342   state->T0_lagBuff = 40;
343   state->inBackgroundNoise = 0;
344   state->voicedHangover = 0;
345   if (mode != MRDTX) {
346       for (i=0;i<9;i++)
347           state->excEnergyHist[i] = 0;
348   }
349 
350   for (i = 0; i < 9; i++)
351      state->ltpGainHistory[i] = 0;
352 
353   Cb_gain_average_reset(state->Cb_gain_averState);
354   if (mode != MRDTX)
355      lsp_avg_reset(state->lsp_avg_st);
356   D_plsf_reset(state->lsfState);
357   ec_gain_pitch_reset(state->ec_gain_p_st);
358   ec_gain_code_reset(state->ec_gain_c_st);
359 
360   if (mode != MRDTX)
361      gc_pred_reset(state->pred_state);
362 
363   Bgn_scd_reset(state->background_state);
364   state->nodataSeed = 21845;
365   ph_disp_reset(state->ph_disp_st);
366   if (mode != MRDTX)
367      dtx_dec_reset(state->dtxDecoderState);
368 
369   return 0;
370 }
371 
372 ------------------------------------------------------------------------------
373  RESOURCES USED [optional]
374 
375  When the code is written for a specific target processor the
376  the resources used should be documented below.
377 
378  HEAP MEMORY USED: x bytes
379 
380  STACK MEMORY USED: x bytes
381 
382  CLOCK CYCLES: (cycle count equation for this function) + (variable
383                 used to represent cycle count for each subroutine
384                 called)
385      where: (cycle count variable) = cycle count for [subroutine
386                                      name]
387 
388 ------------------------------------------------------------------------------
389  CAUTION [optional]
390  [State any special notes, constraints or cautions for users of this function]
391 
392 ------------------------------------------------------------------------------
393 */
394 
Decoder_amr_reset(Decoder_amrState * state,enum Mode mode)395 Word16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode)
396 {
397     Word16 i;
398 
399     if (state == (Decoder_amrState *) NULL)
400     {
401         /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n");  */
402         return(-1);
403     }
404 
405     /* Initialize static pointer */
406     state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
407 
408     /* Static vectors to zero */
409     memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL));
410 
411     if (mode != MRDTX)
412     {
413         memset(state->mem_syn, 0, sizeof(Word16)*M);
414     }
415     /* initialize pitch sharpening */
416     state->sharp = SHARPMIN;
417     state->old_T0 = 40;
418 
419     /* Initialize overflow Flag */
420 
421     state->overflow = 0;
422 
423     /* Initialize state->lsp_old [] */
424 
425     if (mode != MRDTX)
426     {
427         state->lsp_old[0] = 30000;
428         state->lsp_old[1] = 26000;
429         state->lsp_old[2] = 21000;
430         state->lsp_old[3] = 15000;
431         state->lsp_old[4] = 8000;
432         state->lsp_old[5] = 0;
433         state->lsp_old[6] = -8000;
434         state->lsp_old[7] = -15000;
435         state->lsp_old[8] = -21000;
436         state->lsp_old[9] = -26000;
437     }
438 
439     /* Initialize memories of bad frame handling */
440     state->prev_bf = 0;
441     state->prev_pdf = 0;
442     state->state = 0;
443 
444     state->T0_lagBuff = 40;
445     state->inBackgroundNoise = 0;
446     state->voicedHangover = 0;
447     if (mode != MRDTX)
448     {
449         for (i = 0; i < EXC_ENERGY_HIST_LEN; i++)
450         {
451             state->excEnergyHist[i] = 0;
452         }
453     }
454 
455     for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
456     {
457         state->ltpGainHistory[i] = 0;
458     }
459 
460     Cb_gain_average_reset(&(state->Cb_gain_averState));
461     if (mode != MRDTX)
462     {
463         lsp_avg_reset(&(state->lsp_avg_st));
464     }
465     D_plsf_reset(&(state->lsfState));
466     ec_gain_pitch_reset(&(state->ec_gain_p_st));
467     ec_gain_code_reset(&(state->ec_gain_c_st));
468 
469     if (mode != MRDTX)
470     {
471         gc_pred_reset(&(state->pred_state));
472     }
473 
474     Bgn_scd_reset(&(state->background_state));
475     state->nodataSeed = 21845;
476     ph_disp_reset(&(state->ph_disp_st));
477     if (mode != MRDTX)
478     {
479         dtx_dec_reset(&(state->dtxDecoderState));
480     }
481 
482     return(0);
483 }
484 
485 /****************************************************************************/
486 
487 /*
488 ------------------------------------------------------------------------------
489  FUNCTION NAME: Decoder_amr
490 ------------------------------------------------------------------------------
491  INPUT AND OUTPUT DEFINITIONS
492 
493  Inputs:
494     st = pointer to a structure of type Decoder_amrState
495     mode = codec mode (enum Mode)
496     parm = buffer of synthesis parameters (Word16)
497     frame_type = received frame type (enum RXFrameType)
498     synth = buffer containing synthetic speech (Word16)
499     A_t = buffer containing decoded LP filter in 4 subframes (Word16)
500 
501  Outputs:
502     structure pointed to by st contains the newly calculated decoder
503       parameters
504     synth buffer contains the decoded speech samples
505     A_t buffer contains the decoded LP filter parameters
506 
507  Returns:
508     return_value = 0 (int)
509 
510  Global Variables Used:
511     None
512 
513  Local Variables Needed:
514     None
515 
516 ------------------------------------------------------------------------------
517  FUNCTION DESCRIPTION
518 
519  This function performs the decoding of one speech frame for a given codec
520  mode.
521 
522 ------------------------------------------------------------------------------
523  REQUIREMENTS
524 
525  None
526 
527 ------------------------------------------------------------------------------
528  REFERENCES
529 
530  dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
531 
532 ------------------------------------------------------------------------------
533  PSEUDO-CODE
534 
535 int Decoder_amr (
536     Decoder_amrState *st,      // i/o : State variables
537     enum Mode mode,            // i   : AMR mode
538     Word16 parm[],             // i   : vector of synthesis parameters
539                                         (PRM_SIZE)
540     enum RXFrameType frame_type, // i   : received frame type
541     Word16 synth[],            // o   : synthesis speech (L_FRAME)
542     Word16 A_t[]               // o   : decoded LP filter in 4 subframes
543                                         (AZ_SIZE)
544 )
545 {
546     // LPC coefficients
547 
548     Word16 *Az;                // Pointer on A_t
549 
550     // LSPs
551 
552     Word16 lsp_new[M];
553     Word16 lsp_mid[M];
554 
555     // LSFs
556 
557     Word16 prev_lsf[M];
558     Word16 lsf_i[M];
559 
560     // Algebraic codevector
561 
562     Word16 code[L_SUBFR];
563 
564     // excitation
565 
566     Word16 excp[L_SUBFR];
567     Word16 exc_enhanced[L_SUBFR];
568 
569     // Scalars
570 
571     Word16 i, i_subfr;
572     Word16 T0, T0_frac, index, index_mr475 = 0;
573     Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac;
574     Word16 t0_min, t0_max;
575     Word16 delta_frc_low, delta_frc_range;
576     Word16 tmp_shift;
577     Word16 temp;
578     Word32 L_temp;
579     Word16 flag4;
580     Word16 carefulFlag;
581     Word16 excEnergy;
582     Word16 subfrNr;
583     Word16 evenSubfr = 0;
584 
585     Word16 bfi = 0;   // bad frame indication flag
586     Word16 pdfi = 0;  // potential degraded bad frame flag
587 
588     enum DTXStateType newDTXState;  // SPEECH , DTX, DTX_MUTE
589 
590     // find the new  DTX state  SPEECH OR DTX
591     newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type);
592 
593     // DTX actions
594     if (sub(newDTXState, SPEECH) != 0 )
595     {
596        Decoder_amr_reset (st, MRDTX);
597 
598        dtx_dec(st->dtxDecoderState,
599                st->mem_syn,
600                st->lsfState,
601                st->pred_state,
602                st->Cb_gain_averState,
603                newDTXState,
604                mode,
605                parm, synth, A_t);
606        // update average lsp
607 
608        Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M);
609        lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
610        goto the_end;
611     }
612 
613     // SPEECH action state machine
614     if ((sub(frame_type, RX_SPEECH_BAD) == 0) ||
615         (sub(frame_type, RX_NO_DATA) == 0) ||
616         (sub(frame_type, RX_ONSET) == 0))
617     {
618        bfi = 1;
619        if ((sub(frame_type, RX_NO_DATA) == 0) ||
620            (sub(frame_type, RX_ONSET) == 0))
621        {
622       build_CN_param(&st->nodataSeed,
623              prmno[mode],
624              bitno[mode],
625              parm);
626        }
627     }
628     else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0)
629     {
630        pdfi = 1;
631     }
632 
633     if (bfi != 0)
634     {
635         st->state = add (st->state, 1);
636     }
637     else if (sub (st->state, 6) == 0)
638 
639     {
640         st->state = 5;
641     }
642     else
643     {
644         st->state = 0;
645     }
646 
647     if (sub (st->state, 6) > 0)
648     {
649         st->state = 6;
650     }
651 
652     // If this frame is the first speech frame after CNI period,
653     // set the BFH state machine to an appropriate state depending
654     // on whether there was DTX muting before start of speech or not
655     // If there was DTX muting, the first speech frame is muted.
656     // If there was no DTX muting, the first speech frame is not
657     // muted. The BFH state machine starts from state 5, however, to
658     // keep the audible noise resulting from a SID frame which is
659     // erroneously interpreted as a good speech frame as small as
660     // possible (the decoder output in this case is quickly muted)
661 
662     if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0)
663     {
664        st->state = 5;
665        st->prev_bf = 0;
666     }
667     else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0)
668     {
669        st->state = 5;
670        st->prev_bf = 1;
671     }
672 
673     // save old LSFs for CB gain smoothing
674     Copy (st->lsfState->past_lsf_q, prev_lsf, M);
675 
676     // decode LSF parameters and generate interpolated lpc coefficients
677        for the 4 subframes
678     if (sub (mode, MR122) != 0)
679     {
680        D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new);
681 
682        // Advance synthesis parameters pointer
683        parm += 3;
684 
685        Int_lpc_1to3(st->lsp_old, lsp_new, A_t);
686     }
687     else
688     {
689        D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new);
690 
691        // Advance synthesis parameters pointer
692        parm += 5;
693 
694        Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t);
695     }
696 
697     // update the LSPs for the next frame
698     for (i = 0; i < M; i++)
699     {
700        st->lsp_old[i] = lsp_new[i];
701     }
702 
703     *------------------------------------------------------------------------*
704     *          Loop for every subframe in the analysis frame                 *
705     *------------------------------------------------------------------------*
706     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
707     *  times                                                                 *
708     *     - decode the pitch delay                                           *
709     *     - decode algebraic code                                            *
710     *     - decode pitch and codebook gains                                  *
711     *     - find the excitation and compute synthesis speech                 *
712     *------------------------------------------------------------------------*
713 
714     // pointer to interpolated LPC parameters
715     Az = A_t;
716 
717     evenSubfr = 0;
718     subfrNr = -1;
719     for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
720     {
721        subfrNr = add(subfrNr, 1);
722        evenSubfr = sub(1, evenSubfr);
723 
724        // flag for first and 3th subframe
725        pit_flag = i_subfr;
726 
727        if (sub (i_subfr, L_FRAME_BY2) == 0)
728        {
729           if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0)
730           {
731              pit_flag = 0;
732           }
733        }
734 
735        // pitch index
736        index = *parm++;
737 
738         *-------------------------------------------------------*
739         * - decode pitch lag and find adaptive codebook vector. *
740         *-------------------------------------------------------*
741 
742        if (sub(mode, MR122) != 0)
743        {
744           // flag4 indicates encoding with 4 bit resolution;
745           // this is needed for mode MR475, MR515, MR59 and MR67
746 
747           flag4 = 0;
748           if ((sub (mode, MR475) == 0) ||
749               (sub (mode, MR515) == 0) ||
750               (sub (mode, MR59) == 0) ||
751               (sub (mode, MR67) == 0) ) {
752              flag4 = 1;
753           }
754 
755            *-------------------------------------------------------*
756            * - get ranges for the t0_min and t0_max                *
757            * - only needed in delta decoding                       *
758            *-------------------------------------------------------*
759 
760           delta_frc_low = 5;
761           delta_frc_range = 9;
762 
763           if ( sub(mode, MR795) == 0 )
764           {
765              delta_frc_low = 10;
766              delta_frc_range = 19;
767           }
768 
769           t0_min = sub(st->old_T0, delta_frc_low);
770           if (sub(t0_min, PIT_MIN) < 0)
771           {
772              t0_min = PIT_MIN;
773           }
774           t0_max = add(t0_min, delta_frc_range);
775           if (sub(t0_max, PIT_MAX) > 0)
776           {
777              t0_max = PIT_MAX;
778              t0_min = sub(t0_max, delta_frc_range);
779           }
780 
781           Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0,
782                     &T0, &T0_frac, flag4);
783 
784           st->T0_lagBuff = T0;
785 
786           if (bfi != 0)
787           {
788              if (sub (st->old_T0, PIT_MAX) < 0)
789              {                                      // Graceful pitch
790                 st->old_T0 = add(st->old_T0, 1);    // degradation
791              }
792              T0 = st->old_T0;
793              T0_frac = 0;
794 
795              if ( st->inBackgroundNoise != 0 &&
796                   sub(st->voicedHangover, 4) > 0 &&
797                   ((sub(mode, MR475) == 0 ) ||
798                    (sub(mode, MR515) == 0 ) ||
799                    (sub(mode, MR59) == 0) )
800                   )
801              {
802                 T0 = st->T0_lagBuff;
803              }
804           }
805 
806           Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1);
807        }
808        else
809        {
810           Dec_lag6 (index, PIT_MIN_MR122,
811                     PIT_MAX, pit_flag, &T0, &T0_frac);
812 
813           if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0))
814           {
815           }
816           else
817           {
818              st->T0_lagBuff = T0;
819              T0 = st->old_T0;
820              T0_frac = 0;
821           }
822 
823           Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0);
824        }
825 
826         *-------------------------------------------------------*
827         * - (MR122 only: Decode pitch gain.)                    *
828         * - Decode innovative codebook.                         *
829         * - set pitch sharpening factor                         *
830         *-------------------------------------------------------*
831 
832         if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
833         {   // MR475, MR515
834            index = *parm++;        // index of position
835            i = *parm++;            // signs
836 
837            decode_2i40_9bits (subfrNr, i, index, code);
838 
839            pit_sharp = shl (st->sharp, 1);
840         }
841         else if (sub (mode, MR59) == 0)
842         {   // MR59
843            index = *parm++;        // index of position
844            i = *parm++;            // signs
845 
846            decode_2i40_11bits (i, index, code);
847 
848            pit_sharp = shl (st->sharp, 1);
849         }
850         else if (sub (mode, MR67) == 0)
851         {   // MR67
852            index = *parm++;        // index of position
853            i = *parm++;            // signs
854 
855            decode_3i40_14bits (i, index, code);
856 
857            pit_sharp = shl (st->sharp, 1);
858         }
859         else if (sub (mode, MR795) <= 0)
860         {   // MR74, MR795
861            index = *parm++;        // index of position
862            i = *parm++;            // signs
863 
864            decode_4i40_17bits (i, index, code);
865 
866            pit_sharp = shl (st->sharp, 1);
867         }
868         else if (sub (mode, MR102) == 0)
869         {  // MR102
870            dec_8i40_31bits (parm, code);
871            parm += 7;
872 
873            pit_sharp = shl (st->sharp, 1);
874         }
875         else
876         {  // MR122
877            index = *parm++;
878            if (bfi != 0)
879            {
880               ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
881            }
882            else
883            {
884               gain_pit = d_gain_pitch (mode, index);
885            }
886            ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
887                                  &gain_pit);
888 
889            dec_10i40_35bits (parm, code);
890            parm += 10;
891 
892            // pit_sharp = gain_pit;
893            // if (pit_sharp > 1.0) pit_sharp = 1.0;
894 
895            pit_sharp = shl (gain_pit, 1);
896         }
897 
898          *-------------------------------------------------------*
899          * - Add the pitch contribution to code[].               *
900          *-------------------------------------------------------*
901         for (i = T0; i < L_SUBFR; i++)
902         {
903            temp = mult (code[i - T0], pit_sharp);
904            code[i] = add (code[i], temp);
905         }
906 
907          *------------------------------------------------------------*
908          * - Decode codebook gain (MR122) or both pitch               *
909          *   gain and codebook gain (all others)                      *
910          * - Update pitch sharpening "sharp" with quantized gain_pit  *
911          *------------------------------------------------------------*
912 
913         if (sub (mode, MR475) == 0)
914         {
915            // read and decode pitch and code gain
916            if (evenSubfr != 0)
917            {
918               index_mr475 = *parm++; // index of gain(s)
919            }
920 
921            if (bfi == 0)
922            {
923               Dec_gain(st->pred_state, mode, index_mr475, code,
924                        evenSubfr, &gain_pit, &gain_code);
925            }
926            else
927            {
928               ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
929               ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
930                             &gain_code);
931            }
932            ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
933                                  &gain_pit);
934            ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
935                                 &gain_code);
936 
937            pit_sharp = gain_pit;
938            if (sub (pit_sharp, SHARPMAX) > 0)
939            {
940                pit_sharp = SHARPMAX;
941            }
942 
943         }
944         else if ((sub (mode, MR74) <= 0) ||
945                  (sub (mode, MR102) == 0))
946         {
947             // read and decode pitch and code gain
948             index = *parm++; // index of gain(s)
949 
950             if (bfi == 0)
951             {
952                Dec_gain(st->pred_state, mode, index, code,
953                         evenSubfr, &gain_pit, &gain_code);
954             }
955             else
956             {
957                ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
958                ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
959                              &gain_code);
960             }
961             ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
962                                   &gain_pit);
963             ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
964                                  &gain_code);
965 
966             pit_sharp = gain_pit;
967             if (sub (pit_sharp, SHARPMAX) > 0)
968             {
969                pit_sharp = SHARPMAX;
970             }
971 
972             if (sub (mode, MR102) == 0)
973             {
974                if (sub (st->old_T0, add(L_SUBFR, 5)) > 0)
975                {
976                   pit_sharp = shr(pit_sharp, 2);
977                }
978             }
979         }
980         else
981         {
982            // read and decode pitch gain
983            index = *parm++; // index of gain(s)
984 
985            if (sub (mode, MR795) == 0)
986            {
987               // decode pitch gain
988               if (bfi != 0)
989               {
990                  ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
991               }
992               else
993               {
994                  gain_pit = d_gain_pitch (mode, index);
995               }
996               ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
997                                     &gain_pit);
998 
999               // read and decode code gain
1000               index = *parm++;
1001               if (bfi == 0)
1002               {
1003                  d_gain_code (st->pred_state, mode, index, code, &gain_code);
1004               }
1005               else
1006               {
1007                  ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
1008                                &gain_code);
1009               }
1010               ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
1011                                    &gain_code);
1012 
1013               pit_sharp = gain_pit;
1014               if (sub (pit_sharp, SHARPMAX) > 0)
1015               {
1016                  pit_sharp = SHARPMAX;
1017               }
1018            }
1019            else
1020            { // MR122
1021               if (bfi == 0)
1022               {
1023                  d_gain_code (st->pred_state, mode, index, code, &gain_code);
1024               }
1025               else
1026               {
1027                  ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
1028                                &gain_code);
1029               }
1030               ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
1031                                    &gain_code);
1032 
1033               pit_sharp = gain_pit;
1034            }
1035         }
1036 
1037         // store pitch sharpening for next subframe
1038         // (for modes which use the previous pitch gain for
1039         // pitch sharpening in the search phase)
1040         // do not update sharpening in even subframes for MR475
1041         if (sub(mode, MR475) != 0 || evenSubfr == 0)
1042         {
1043             st->sharp = gain_pit;
1044             if (sub (st->sharp, SHARPMAX) > 0)
1045             {
1046                 st->sharp = SHARPMAX;
1047             }
1048         }
1049 
1050         pit_sharp = shl (pit_sharp, 1);
1051         if (sub (pit_sharp, 16384) > 0)
1052         {
1053            for (i = 0; i < L_SUBFR; i++)
1054             {
1055                temp = mult (st->exc[i], pit_sharp);
1056                L_temp = L_mult (temp, gain_pit);
1057                if (sub(mode, MR122)==0)
1058                {
1059                   L_temp = L_shr (L_temp, 1);
1060                }
1061                excp[i] = pv_round (L_temp);
1062             }
1063         }
1064 
1065          *-------------------------------------------------------*
1066          * - Store list of LTP gains needed in the source        *
1067          *   characteristic detector (SCD)                       *
1068          *-------------------------------------------------------*
1069         if ( bfi == 0 )
1070         {
1071            for (i = 0; i < 8; i++)
1072            {
1073               st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
1074            }
1075            st->ltpGainHistory[8] = gain_pit;
1076         }
1077 
1078          *-------------------------------------------------------*
1079          * - Limit gain_pit if in background noise and BFI       *
1080          *   for MR475, MR515, MR59                              *
1081          *-------------------------------------------------------*
1082 
1083         if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
1084              ((sub(mode, MR475) == 0) ||
1085               (sub(mode, MR515) == 0) ||
1086               (sub(mode, MR59) == 0))
1087              )
1088         {
1089            if ( sub (gain_pit, 12288) > 0)    // if (gain_pit > 0.75) in Q14
1090               gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 );
1091               // gain_pit = (gain_pit-0.75)/2.0 + 0.75;
1092 
1093            if ( sub (gain_pit, 14745) > 0)    // if (gain_pit > 0.90) in Q14
1094            {
1095               gain_pit = 14745;
1096            }
1097         }
1098 
1099          *-------------------------------------------------------*
1100          *  Calculate CB mixed gain                              *
1101          *-------------------------------------------------------*
1102         Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i);
1103         gain_code_mix = Cb_gain_average(
1104             st->Cb_gain_averState, mode, gain_code,
1105             lsf_i, st->lsp_avg_st->lsp_meanSave, bfi,
1106             st->prev_bf, pdfi, st->prev_pdf,
1107             st->inBackgroundNoise, st->voicedHangover);
1108 
1109         // make sure that MR74, MR795, MR122 have original code_gain
1110         if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) )
1111            // MR74, MR795, MR122
1112         {
1113            gain_code_mix = gain_code;
1114         }
1115 
1116          *-------------------------------------------------------*
1117          * - Find the total excitation.                          *
1118          * - Find synthesis speech corresponding to st->exc[].   *
1119          *-------------------------------------------------------*
1120         if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102
1121         {
1122            pitch_fac = gain_pit;
1123            tmp_shift = 1;
1124         }
1125         else       // MR122
1126         {
1127            pitch_fac = shr (gain_pit, 1);
1128            tmp_shift = 2;
1129         }
1130 
1131         // copy unscaled LTP excitation to exc_enhanced (used in phase
1132          * dispersion below) and compute total excitation for LTP feedback
1133 
1134         for (i = 0; i < L_SUBFR; i++)
1135         {
1136            exc_enhanced[i] = st->exc[i];
1137 
1138            // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i];
1139            L_temp = L_mult (st->exc[i], pitch_fac);
1140                                                       // 12.2: Q0 * Q13
1141                                                       //  7.4: Q0 * Q14
1142            L_temp = L_mac (L_temp, code[i], gain_code);
1143                                                       // 12.2: Q12 * Q1
1144                                                       //  7.4: Q13 * Q1
1145            L_temp = L_shl (L_temp, tmp_shift);                   // Q16
1146            st->exc[i] = pv_round (L_temp);
1147         }
1148 
1149          *-------------------------------------------------------*
1150          * - Adaptive phase dispersion                           *
1151          *-------------------------------------------------------*
1152         ph_disp_release(st->ph_disp_st); // free phase dispersion adaption
1153 
1154         if ( ((sub(mode, MR475) == 0) ||
1155               (sub(mode, MR515) == 0) ||
1156               (sub(mode, MR59) == 0))   &&
1157              sub(st->voicedHangover, 3) > 0 &&
1158              st->inBackgroundNoise != 0 &&
1159              bfi != 0 )
1160         {
1161            ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp.
1162         }                                // if error in bg noise
1163 
1164         // apply phase dispersion to innovation (if enabled) and
1165            compute total excitation for synthesis part
1166         ph_disp(st->ph_disp_st, mode,
1167                 exc_enhanced, gain_code_mix, gain_pit, code,
1168                 pitch_fac, tmp_shift);
1169 
1170          *-------------------------------------------------------*
1171          * - The Excitation control module are active during BFI.*
1172          * - Conceal drops in signal energy if in bg noise.      *
1173          *-------------------------------------------------------*
1174 
1175         L_temp = 0;
1176         for (i = 0; i < L_SUBFR; i++)
1177         {
1178             L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] );
1179         }
1180 
1181         L_temp = L_shr (L_temp, 1);     // excEnergy = sqrt(L_temp) in Q0
1182         L_temp = sqrt_l_exp(L_temp, &temp); // function result
1183         L_temp = L_shr(L_temp, add( shr(temp, 1), 15));
1184         L_temp = L_shr(L_temp, 2);       // To cope with 16-bit and
1185         excEnergy = extract_l(L_temp);   // scaling in ex_ctrl()
1186 
1187         if ( ((sub (mode, MR475) == 0) ||
1188               (sub (mode, MR515) == 0) ||
1189               (sub (mode, MR59) == 0))  &&
1190              sub(st->voicedHangover, 5) > 0 &&
1191              st->inBackgroundNoise != 0 &&
1192              sub(st->state, 4) < 0 &&
1193              ( (pdfi != 0 && st->prev_pdf != 0) ||
1194                 bfi != 0 ||
1195                 st->prev_bf != 0) )
1196         {
1197            carefulFlag = 0;
1198            if ( pdfi != 0 && bfi == 0 )
1199            {
1200               carefulFlag = 1;
1201            }
1202 
1203            Ex_ctrl(exc_enhanced,
1204                    excEnergy,
1205                    st->excEnergyHist,
1206                    st->voicedHangover,
1207                    st->prev_bf,
1208                    carefulFlag);
1209         }
1210 
1211         if ( st->inBackgroundNoise != 0 &&
1212              ( bfi != 0 || st->prev_bf != 0 ) &&
1213              sub(st->state, 4) < 0 )
1214         {
1215            ; // do nothing!
1216         }
1217         else
1218         {
1219            // Update energy history for all modes
1220            for (i = 0; i < 8; i++)
1221            {
1222               st->excEnergyHist[i] = st->excEnergyHist[i+1];
1223            }
1224            st->excEnergyHist[8] = excEnergy;
1225         }
1226          *-------------------------------------------------------*
1227          * Excitation control module end.                        *
1228          *-------------------------------------------------------*
1229 
1230         if (sub (pit_sharp, 16384) > 0)
1231         {
1232            for (i = 0; i < L_SUBFR; i++)
1233            {
1234               excp[i] = add (excp[i], exc_enhanced[i]);
1235            }
1236            agc2 (exc_enhanced, excp, L_SUBFR);
1237            Overflow = 0;
1238            Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR,
1239                      st->mem_syn, 0);
1240         }
1241         else
1242         {
1243            Overflow = 0;
1244            Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
1245                      st->mem_syn, 0);
1246         }
1247 
1248         if (Overflow != 0)    // Test for overflow
1249         {
1250            for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++)
1251            {
1252               st->old_exc[i] = shr(st->old_exc[i], 2);
1253            }
1254            for (i = 0; i < L_SUBFR; i++)
1255            {
1256               exc_enhanced[i] = shr(exc_enhanced[i], 2);
1257            }
1258            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
1259         }
1260         else
1261         {
1262            Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
1263         }
1264 
1265          *--------------------------------------------------*
1266          * Update signal for next frame.                    *
1267          * -> shift to the left by L_SUBFR  st->exc[]       *
1268          *--------------------------------------------------*
1269 
1270         Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
1271 
1272         // interpolated LPC parameters for next subframe
1273         Az += MP1;
1274 
1275         // store T0 for next subframe
1276         st->old_T0 = T0;
1277     }
1278 
1279      *-------------------------------------------------------*
1280      * Call the Source Characteristic Detector which updates *
1281      * st->inBackgroundNoise and st->voicedHangover.         *
1282      *-------------------------------------------------------*
1283 
1284     st->inBackgroundNoise = Bgn_scd(st->background_state,
1285                                     &(st->ltpGainHistory[0]),
1286                                     &(synth[0]),
1287                                     &(st->voicedHangover) );
1288 
1289     dtx_dec_activity_update(st->dtxDecoderState,
1290                             st->lsfState->past_lsf_q,
1291                             synth);
1292 
1293     // store bfi for next subframe
1294     st->prev_bf = bfi;
1295     st->prev_pdf = pdfi;
1296 
1297      *--------------------------------------------------*
1298      * Calculate the LSF averages on the eight          *
1299      * previous frames                                  *
1300      *--------------------------------------------------*
1301 
1302     lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
1303 
1304 the_end:
1305     st->dtxDecoderState->dtxGlobalState = newDTXState;
1306 
1307     return 0;
1308 }
1309 
1310 ------------------------------------------------------------------------------
1311  RESOURCES USED [optional]
1312 
1313  When the code is written for a specific target processor the
1314  the resources used should be documented below.
1315 
1316  HEAP MEMORY USED: x bytes
1317 
1318  STACK MEMORY USED: x bytes
1319 
1320  CLOCK CYCLES: (cycle count equation for this function) + (variable
1321                 used to represent cycle count for each subroutine
1322                 called)
1323      where: (cycle count variable) = cycle count for [subroutine
1324                                      name]
1325 
1326 ------------------------------------------------------------------------------
1327  CAUTION [optional]
1328  [State any special notes, constraints or cautions for users of this function]
1329 
1330 ------------------------------------------------------------------------------
1331 */
1332 
Decoder_amr(Decoder_amrState * st,enum Mode mode,Word16 parm[],enum RXFrameType frame_type,Word16 synth[],Word16 A_t[])1333 void Decoder_amr(
1334     Decoder_amrState *st,      /* i/o : State variables                   */
1335     enum Mode mode,            /* i   : AMR mode                          */
1336     Word16 parm[],             /* i   : vector of synthesis parameters
1337                                         (PRM_SIZE)                        */
1338     enum RXFrameType frame_type, /* i   : received frame type             */
1339     Word16 synth[],            /* o   : synthesis speech (L_FRAME)        */
1340     Word16 A_t[]               /* o   : decoded LP filter in 4 subframes
1341                                         (AZ_SIZE)                         */
1342 )
1343 {
1344     /* LPC coefficients */
1345 
1346     Word16 *Az;                /* Pointer on A_t */
1347 
1348     /* LSPs */
1349 
1350     Word16 lsp_new[M];
1351     Word16 lsp_mid[M];
1352 
1353     /* LSFs */
1354 
1355     Word16 prev_lsf[M];
1356     Word16 lsf_i[M];
1357 
1358     /* Algebraic codevector */
1359 
1360     Word16 code[L_SUBFR];
1361 
1362     /* excitation */
1363 
1364     Word16 excp[L_SUBFR];
1365     Word16 exc_enhanced[L_SUBFR];
1366 
1367     /* Scalars */
1368 
1369     Word16 i;
1370     Word16 i_subfr;
1371     Word16 T0;
1372     Word16 T0_frac;
1373     Word16 index;
1374     Word16 index_mr475 = 0;
1375     Word16 gain_pit;
1376     Word16 gain_code;
1377     Word16 gain_code_mix;
1378     Word16 pit_sharp;
1379     Word16 pit_flag;
1380     Word16 pitch_fac;
1381     Word16 t0_min;
1382     Word16 t0_max;
1383     Word16 delta_frc_low;
1384     Word16 delta_frc_range;
1385     Word16 tmp_shift;
1386     Word16 temp;
1387     Word32 L_temp;
1388     Word16 flag4;
1389     Word16 carefulFlag;
1390     Word16 excEnergy;
1391     Word16 subfrNr;
1392     Word16 evenSubfr = 0;
1393 
1394     Word16 bfi = 0;   /* bad frame indication flag                          */
1395     Word16 pdfi = 0;  /* potential degraded bad frame flag                  */
1396 
1397     enum DTXStateType newDTXState;  /* SPEECH , DTX, DTX_MUTE */
1398     Flag   *pOverflow = &(st->overflow);     /* Overflow flag            */
1399 
1400 
1401     /* find the new  DTX state  SPEECH OR DTX */
1402     newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow);
1403 
1404     /* DTX actions */
1405 
1406     if (newDTXState != SPEECH)
1407     {
1408         Decoder_amr_reset(st, MRDTX);
1409 
1410         dtx_dec(&(st->dtxDecoderState),
1411                 st->mem_syn,
1412                 &(st->lsfState),
1413                 &(st->pred_state),
1414                 &(st->Cb_gain_averState),
1415                 newDTXState,
1416                 mode,
1417                 parm, synth, A_t, pOverflow);
1418 
1419         /* update average lsp */
1420         Lsf_lsp(
1421             st->lsfState.past_lsf_q,
1422             st->lsp_old,
1423             M,
1424             pOverflow);
1425 
1426         lsp_avg(
1427             &(st->lsp_avg_st),
1428             st->lsfState.past_lsf_q,
1429             pOverflow);
1430 
1431         goto the_end;
1432     }
1433 
1434     /* SPEECH action state machine  */
1435     if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) ||
1436             (frame_type == RX_ONSET))
1437     {
1438         bfi = 1;
1439 
1440         if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET))
1441         {
1442             build_CN_param(&st->nodataSeed,
1443                            prmno[mode],
1444                            bitno[mode],
1445                            parm,
1446                            pOverflow);
1447         }
1448     }
1449     else if (frame_type == RX_SPEECH_DEGRADED)
1450     {
1451         pdfi = 1;
1452     }
1453 
1454     if (bfi != 0)
1455     {
1456         st->state += 1;
1457     }
1458     else if (st->state == 6)
1459 
1460     {
1461         st->state = 5;
1462     }
1463     else
1464     {
1465         st->state = 0;
1466     }
1467 
1468 
1469     if (st->state > 6)
1470     {
1471         st->state = 6;
1472     }
1473 
1474     /* If this frame is the first speech frame after CNI period,     */
1475     /* set the BFH state machine to an appropriate state depending   */
1476     /* on whether there was DTX muting before start of speech or not */
1477     /* If there was DTX muting, the first speech frame is muted.     */
1478     /* If there was no DTX muting, the first speech frame is not     */
1479     /* muted. The BFH state machine starts from state 5, however, to */
1480     /* keep the audible noise resulting from a SID frame which is    */
1481     /* erroneously interpreted as a good speech frame as small as    */
1482     /* possible (the decoder output in this case is quickly muted)   */
1483 
1484     if (st->dtxDecoderState.dtxGlobalState == DTX)
1485     {
1486         st->state = 5;
1487         st->prev_bf = 0;
1488     }
1489     else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE)
1490     {
1491         st->state = 5;
1492         st->prev_bf = 1;
1493     }
1494 
1495     /* save old LSFs for CB gain smoothing */
1496     Copy(st->lsfState.past_lsf_q, prev_lsf, M);
1497 
1498     /* decode LSF parameters and generate interpolated lpc coefficients
1499        for the 4 subframes */
1500 
1501     if (mode != MR122)
1502     {
1503         D_plsf_3(
1504             &(st->lsfState),
1505             mode,
1506             bfi,
1507             parm,
1508             lsp_new,
1509             pOverflow);
1510 
1511         /* Advance synthesis parameters pointer */
1512         parm += 3;
1513 
1514         Int_lpc_1to3(
1515             st->lsp_old,
1516             lsp_new,
1517             A_t,
1518             pOverflow);
1519     }
1520     else
1521     {
1522         D_plsf_5(
1523             &(st->lsfState),
1524             bfi,
1525             parm,
1526             lsp_mid,
1527             lsp_new,
1528             pOverflow);
1529 
1530         /* Advance synthesis parameters pointer */
1531         parm += 5;
1532 
1533         Int_lpc_1and3(
1534             st->lsp_old,
1535             lsp_mid,
1536             lsp_new,
1537             A_t,
1538             pOverflow);
1539     }
1540 
1541     /* update the LSPs for the next frame */
1542     for (i = 0; i < M; i++)
1543     {
1544         st->lsp_old[i] = lsp_new[i];
1545     }
1546 
1547     /*------------------------------------------------------------------------*
1548      *          Loop for every subframe in the analysis frame                 *
1549      *------------------------------------------------------------------------*
1550      * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
1551      *  times                                                                 *
1552      *     - decode the pitch delay                                           *
1553      *     - decode algebraic code                                            *
1554      *     - decode pitch and codebook gains                                  *
1555      *     - find the excitation and compute synthesis speech                 *
1556      *------------------------------------------------------------------------*/
1557 
1558     /* pointer to interpolated LPC parameters */
1559     Az = A_t;
1560 
1561     evenSubfr = 0;
1562     subfrNr = -1;
1563     for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
1564     {
1565         subfrNr += 1;
1566         evenSubfr = 1 - evenSubfr;
1567 
1568         /* flag for first and 3th subframe */
1569         pit_flag = i_subfr;
1570 
1571 
1572         if (i_subfr == L_FRAME_BY2)
1573         {
1574             if ((mode != MR475) && (mode != MR515))
1575             {
1576                 pit_flag = 0;
1577             }
1578         }
1579 
1580         /* pitch index */
1581         index = *parm++;
1582 
1583         /*-------------------------------------------------------*
1584         * - decode pitch lag and find adaptive codebook vector. *
1585         *-------------------------------------------------------*/
1586 
1587         if (mode != MR122)
1588         {
1589             /* flag4 indicates encoding with 4 bit resolution;     */
1590             /* this is needed for mode MR475, MR515, MR59 and MR67 */
1591 
1592             flag4 = 0;
1593 
1594             if ((mode == MR475) || (mode == MR515) || (mode == MR59) ||
1595                     (mode == MR67))
1596             {
1597                 flag4 = 1;
1598             }
1599 
1600             /*-------------------------------------------------------*
1601             * - get ranges for the t0_min and t0_max                *
1602             * - only needed in delta decoding                       *
1603             *-------------------------------------------------------*/
1604 
1605             delta_frc_low = 5;
1606             delta_frc_range = 9;
1607 
1608             if (mode == MR795)
1609             {
1610                 delta_frc_low = 10;
1611                 delta_frc_range = 19;
1612             }
1613 
1614             t0_min = sub(st->old_T0, delta_frc_low, pOverflow);
1615 
1616             if (t0_min < PIT_MIN)
1617             {
1618                 t0_min = PIT_MIN;
1619             }
1620             t0_max = add(t0_min, delta_frc_range, pOverflow);
1621 
1622             if (t0_max > PIT_MAX)
1623             {
1624                 t0_max = PIT_MAX;
1625                 t0_min = t0_max - delta_frc_range;
1626             }
1627 
1628             Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0,
1629                      &T0, &T0_frac, flag4, pOverflow);
1630 
1631             st->T0_lagBuff = T0;
1632 
1633             if (bfi != 0)
1634             {
1635                 if (st->old_T0 < PIT_MAX)
1636                 {                               /* Graceful pitch */
1637                     st->old_T0 += 0;            /* degradation    */
1638                 }
1639                 T0 = st->old_T0;
1640                 T0_frac = 0;
1641 
1642                 if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) &&
1643                         ((mode == MR475) || (mode == MR515) || (mode == MR59)))
1644                 {
1645                     T0 = st->T0_lagBuff;
1646                 }
1647             }
1648 
1649             Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow);
1650         }
1651         else
1652         {
1653             Dec_lag6(index, PIT_MIN_MR122,
1654                      PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow);
1655 
1656 
1657             if (!(bfi == 0 && (pit_flag == 0 || index < 61)))
1658             {
1659                 st->T0_lagBuff = T0;
1660                 T0 = st->old_T0;
1661                 T0_frac = 0;
1662             }
1663 
1664             Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow);
1665         }
1666 
1667         /*-------------------------------------------------------*
1668          * - (MR122 only: Decode pitch gain.)                    *
1669          * - Decode innovative codebook.                         *
1670          * - set pitch sharpening factor                         *
1671          *-------------------------------------------------------*/
1672         if ((mode == MR475) || (mode == MR515))
1673         {   /* MR475, MR515 */
1674             index = *parm++;        /* index of position */
1675             i = *parm++;            /* signs             */
1676 
1677             decode_2i40_9bits(subfrNr, i, index, code, pOverflow);
1678 
1679             L_temp = (Word32)st->sharp << 1;
1680             if (L_temp != (Word32)((Word16) L_temp))
1681             {
1682                 pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1683             }
1684             else
1685             {
1686                 pit_sharp = (Word16) L_temp;
1687             }
1688         }
1689         else if (mode == MR59)
1690         {   /* MR59 */
1691             index = *parm++;        /* index of position */
1692             i = *parm++;            /* signs             */
1693 
1694             decode_2i40_11bits(i, index, code);
1695 
1696             L_temp = (Word32)st->sharp << 1;
1697             if (L_temp != (Word32)((Word16) L_temp))
1698             {
1699                 pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1700             }
1701             else
1702             {
1703                 pit_sharp = (Word16) L_temp;
1704             }
1705         }
1706         else if (mode == MR67)
1707         {   /* MR67 */
1708             index = *parm++;        /* index of position */
1709             i = *parm++;            /* signs             */
1710 
1711             decode_3i40_14bits(i, index, code);
1712 
1713             L_temp = (Word32)st->sharp << 1;
1714             if (L_temp != (Word32)((Word16) L_temp))
1715             {
1716                 pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1717             }
1718             else
1719             {
1720                 pit_sharp = (Word16) L_temp;
1721             }
1722         }
1723         else if (mode <= MR795)
1724         {   /* MR74, MR795 */
1725             index = *parm++;        /* index of position */
1726             i = *parm++;            /* signs             */
1727 
1728             decode_4i40_17bits(i, index, code);
1729 
1730             L_temp = (Word32)st->sharp << 1;
1731             if (L_temp != (Word32)((Word16) L_temp))
1732             {
1733                 pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1734             }
1735             else
1736             {
1737                 pit_sharp = (Word16) L_temp;
1738             }
1739         }
1740         else if (mode == MR102)
1741         {  /* MR102 */
1742             dec_8i40_31bits(parm, code, pOverflow);
1743             parm += 7;
1744 
1745             L_temp = (Word32)st->sharp << 1;
1746             if (L_temp != (Word32)((Word16) L_temp))
1747             {
1748                 pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1749             }
1750             else
1751             {
1752                 pit_sharp = (Word16) L_temp;
1753             }
1754         }
1755         else
1756         {  /* MR122 */
1757             index = *parm++;
1758 
1759             if (bfi != 0)
1760             {
1761                 ec_gain_pitch(
1762                     &(st->ec_gain_p_st),
1763                     st->state,
1764                     &gain_pit,
1765                     pOverflow);
1766             }
1767             else
1768             {
1769                 gain_pit = d_gain_pitch(mode, index);
1770             }
1771             ec_gain_pitch_update(
1772                 &(st->ec_gain_p_st),
1773                 bfi,
1774                 st->prev_bf,
1775                 &gain_pit,
1776                 pOverflow);
1777 
1778 
1779             dec_10i40_35bits(parm, code);
1780             parm += 10;
1781 
1782             /* pit_sharp = gain_pit;                   */
1783             /* if (pit_sharp > 1.0) pit_sharp = 1.0;   */
1784 
1785             L_temp = (Word32)gain_pit << 1;
1786             if (L_temp != (Word32)((Word16) L_temp))
1787             {
1788                 pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16;
1789             }
1790             else
1791             {
1792                 pit_sharp = (Word16) L_temp;
1793             }
1794         }
1795         /*-------------------------------------------------------*
1796          * - Add the pitch contribution to code[].               *
1797          *-------------------------------------------------------*/
1798         for (i = T0; i < L_SUBFR; i++)
1799         {
1800             temp = mult(*(code + i - T0), pit_sharp, pOverflow);
1801             *(code + i) = add(*(code + i), temp, pOverflow);
1802 
1803         }
1804 
1805         /*------------------------------------------------------------*
1806          * - Decode codebook gain (MR122) or both pitch               *
1807          *   gain and codebook gain (all others)                      *
1808          * - Update pitch sharpening "sharp" with quantized gain_pit  *
1809          *------------------------------------------------------------*/
1810         if (mode == MR475)
1811         {
1812             /* read and decode pitch and code gain */
1813 
1814             if (evenSubfr != 0)
1815             {
1816                 index_mr475 = *parm++;         /* index of gain(s) */
1817             }
1818 
1819             if (bfi == 0)
1820             {
1821                 Dec_gain(
1822                     &(st->pred_state),
1823                     mode,
1824                     index_mr475,
1825                     code,
1826                     evenSubfr,
1827                     &gain_pit,
1828                     &gain_code,
1829                     pOverflow);
1830             }
1831             else
1832             {
1833                 ec_gain_pitch(
1834                     &(st->ec_gain_p_st),
1835                     st->state,
1836                     &gain_pit,
1837                     pOverflow);
1838 
1839                 ec_gain_code(
1840                     &(st->ec_gain_c_st),
1841                     &(st->pred_state),
1842                     st->state,
1843                     &gain_code,
1844                     pOverflow);
1845             }
1846             ec_gain_pitch_update(
1847                 &st->ec_gain_p_st,
1848                 bfi,
1849                 st->prev_bf,
1850                 &gain_pit,
1851                 pOverflow);
1852 
1853             ec_gain_code_update(
1854                 &st->ec_gain_c_st,
1855                 bfi,
1856                 st->prev_bf,
1857                 &gain_code,
1858                 pOverflow);
1859 
1860             pit_sharp = gain_pit;
1861 
1862             if (pit_sharp > SHARPMAX)
1863             {
1864                 pit_sharp = SHARPMAX;
1865             }
1866 
1867         }
1868         else if ((mode <= MR74) || (mode == MR102))
1869         {
1870             /* read and decode pitch and code gain */
1871             index = *parm++;                 /* index of gain(s) */
1872 
1873             if (bfi == 0)
1874             {
1875                 Dec_gain(
1876                     &(st->pred_state),
1877                     mode,
1878                     index,
1879                     code,
1880                     evenSubfr,
1881                     &gain_pit,
1882                     &gain_code,
1883                     pOverflow);
1884             }
1885             else
1886             {
1887                 ec_gain_pitch(
1888                     &(st->ec_gain_p_st),
1889                     st->state,
1890                     &gain_pit,
1891                     pOverflow);
1892 
1893                 ec_gain_code(
1894                     &(st->ec_gain_c_st),
1895                     &(st->pred_state),
1896                     st->state,
1897                     &gain_code,
1898                     pOverflow);
1899             }
1900 
1901             ec_gain_pitch_update(
1902                 &(st->ec_gain_p_st),
1903                 bfi,
1904                 st->prev_bf,
1905                 &gain_pit,
1906                 pOverflow);
1907 
1908             ec_gain_code_update(
1909                 &(st->ec_gain_c_st),
1910                 bfi,
1911                 st->prev_bf,
1912                 &gain_code,
1913                 pOverflow);
1914 
1915             pit_sharp = gain_pit;
1916 
1917             if (pit_sharp > SHARPMAX)
1918             {
1919                 pit_sharp = SHARPMAX;
1920             }
1921 
1922             if (mode == MR102)
1923             {
1924                 if (st->old_T0 > (L_SUBFR + 5))
1925                 {
1926                     if (pit_sharp < 0)
1927                     {
1928                         pit_sharp = ~((~pit_sharp) >> 2);
1929                     }
1930                     else
1931                     {
1932                         pit_sharp = pit_sharp >> 2;
1933                     }
1934                 }
1935             }
1936         }
1937         else
1938         {
1939             /* read and decode pitch gain */
1940             index = *parm++;                 /* index of gain(s) */
1941 
1942             if (mode == MR795)
1943             {
1944                 /* decode pitch gain */
1945                 if (bfi != 0)
1946                 {
1947                     ec_gain_pitch(
1948                         &(st->ec_gain_p_st),
1949                         st->state,
1950                         &gain_pit,
1951                         pOverflow);
1952                 }
1953                 else
1954                 {
1955                     gain_pit = d_gain_pitch(mode, index);
1956                 }
1957                 ec_gain_pitch_update(
1958                     &(st->ec_gain_p_st),
1959                     bfi,
1960                     st->prev_bf,
1961                     &gain_pit,
1962                     pOverflow);
1963 
1964                 /* read and decode code gain */
1965                 index = *parm++;
1966 
1967                 if (bfi == 0)
1968                 {
1969                     d_gain_code(
1970                         &(st->pred_state),
1971                         mode,
1972                         index,
1973                         code,
1974                         &gain_code,
1975                         pOverflow);
1976                 }
1977                 else
1978                 {
1979                     ec_gain_code(
1980                         &(st->ec_gain_c_st),
1981                         &(st->pred_state),
1982                         st->state,
1983                         &gain_code,
1984                         pOverflow);
1985                 }
1986 
1987                 ec_gain_code_update(
1988                     &(st->ec_gain_c_st),
1989                     bfi,
1990                     st->prev_bf,
1991                     &gain_code,
1992                     pOverflow);
1993 
1994                 pit_sharp = gain_pit;
1995 
1996                 if (pit_sharp > SHARPMAX)
1997                 {
1998                     pit_sharp = SHARPMAX;
1999                 }
2000             }
2001             else
2002             { /* MR122 */
2003 
2004                 if (bfi == 0)
2005                 {
2006                     d_gain_code(
2007                         &(st->pred_state),
2008                         mode,
2009                         index,
2010                         code,
2011                         &gain_code,
2012                         pOverflow);
2013                 }
2014                 else
2015                 {
2016                     ec_gain_code(
2017                         &(st->ec_gain_c_st),
2018                         &(st->pred_state),
2019                         st->state,
2020                         &gain_code,
2021                         pOverflow);
2022                 }
2023 
2024                 ec_gain_code_update(
2025                     &(st->ec_gain_c_st),
2026                     bfi,
2027                     st->prev_bf,
2028                     &gain_code,
2029                     pOverflow);
2030 
2031                 pit_sharp = gain_pit;
2032             }
2033         }
2034 
2035         /* store pitch sharpening for next subframe             */
2036         /* (for modes which use the previous pitch gain for     */
2037         /* pitch sharpening in the search phase)                */
2038         /* do not update sharpening in even subframes for MR475 */
2039         if ((mode != MR475) || (evenSubfr == 0))
2040         {
2041             st->sharp = gain_pit;
2042 
2043             if (st->sharp > SHARPMAX)
2044             {
2045                 st->sharp = SHARPMAX;
2046             }
2047         }
2048 
2049         pit_sharp = shl(pit_sharp, 1, pOverflow);
2050 
2051         if (pit_sharp > 16384)
2052         {
2053             for (i = 0; i < L_SUBFR; i++)
2054             {
2055                 temp = mult(st->exc[i], pit_sharp, pOverflow);
2056                 L_temp = L_mult(temp, gain_pit, pOverflow);
2057 
2058                 if (mode == MR122)
2059                 {
2060                     if (L_temp < 0)
2061                     {
2062                         L_temp = ~((~L_temp) >> 1);
2063                     }
2064                     else
2065                     {
2066                         L_temp = L_temp >> 1;
2067                     }
2068                 }
2069                 *(excp + i) = pv_round(L_temp, pOverflow);
2070             }
2071         }
2072 
2073         /*-------------------------------------------------------*
2074          * - Store list of LTP gains needed in the source        *
2075          *   characteristic detector (SCD)                       *
2076          *-------------------------------------------------------*/
2077 
2078         if (bfi == 0)
2079         {
2080             for (i = 0; i < 8; i++)
2081             {
2082                 st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
2083             }
2084             st->ltpGainHistory[8] = gain_pit;
2085         }
2086 
2087         /*-------------------------------------------------------*
2088         * - Limit gain_pit if in background noise and BFI       *
2089         *   for MR475, MR515, MR59                              *
2090         *-------------------------------------------------------*/
2091 
2092 
2093         if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
2094                 ((mode == MR475) || (mode == MR515) || (mode == MR59)))
2095         {
2096 
2097             if (gain_pit > 12288)    /* if (gain_pit > 0.75) in Q14*/
2098             {
2099                 gain_pit = ((gain_pit - 12288) >> 1) + 12288;
2100                 /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
2101             }
2102 
2103             if (gain_pit > 14745)    /* if (gain_pit > 0.90) in Q14*/
2104             {
2105                 gain_pit = 14745;
2106             }
2107         }
2108 
2109         /*-------------------------------------------------------*
2110          *  Calculate CB mixed gain                              *
2111          *-------------------------------------------------------*/
2112         Int_lsf(
2113             prev_lsf,
2114             st->lsfState.past_lsf_q,
2115             i_subfr,
2116             lsf_i,
2117             pOverflow);
2118 
2119         gain_code_mix =
2120             Cb_gain_average(
2121                 &(st->Cb_gain_averState),
2122                 mode,
2123                 gain_code,
2124                 lsf_i,
2125                 st->lsp_avg_st.lsp_meanSave,
2126                 bfi,
2127                 st->prev_bf,
2128                 pdfi,
2129                 st->prev_pdf,
2130                 st->inBackgroundNoise,
2131                 st->voicedHangover,
2132                 pOverflow);
2133 
2134         /* make sure that MR74, MR795, MR122 have original code_gain*/
2135         if ((mode > MR67) && (mode != MR102))
2136             /* MR74, MR795, MR122 */
2137         {
2138             gain_code_mix = gain_code;
2139         }
2140 
2141         /*-------------------------------------------------------*
2142          * - Find the total excitation.                          *
2143          * - Find synthesis speech corresponding to st->exc[].   *
2144          *-------------------------------------------------------*/
2145         if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
2146         {
2147             pitch_fac = gain_pit;
2148             tmp_shift = 1;
2149         }
2150         else       /* MR122 */
2151         {
2152             if (gain_pit < 0)
2153             {
2154                 pitch_fac = ~((~gain_pit) >> 1);
2155             }
2156             else
2157             {
2158                 pitch_fac = gain_pit >> 1;
2159             }
2160             tmp_shift = 2;
2161         }
2162 
2163         /* copy unscaled LTP excitation to exc_enhanced (used in phase
2164          * dispersion below) and compute total excitation for LTP feedback
2165          */
2166         for (i = 0; i < L_SUBFR; i++)
2167         {
2168             exc_enhanced[i] = st->exc[i];
2169 
2170             /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */
2171             L_temp = L_mult(st->exc[i], pitch_fac, pOverflow);
2172             /* 12.2: Q0 * Q13 */
2173             /*  7.4: Q0 * Q14 */
2174             L_temp = L_mac(L_temp, code[i], gain_code, pOverflow);
2175             /* 12.2: Q12 * Q1 */
2176             /*  7.4: Q13 * Q1 */
2177             L_temp = L_shl(L_temp, tmp_shift, pOverflow);     /* Q16 */
2178             st->exc[i] = pv_round(L_temp, pOverflow);
2179         }
2180 
2181         /*-------------------------------------------------------*
2182          * - Adaptive phase dispersion                           *
2183          *-------------------------------------------------------*/
2184         ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */
2185 
2186 
2187         if (((mode == MR475) || (mode == MR515) || (mode == MR59)) &&
2188                 (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) &&
2189                 (bfi != 0))
2190         {
2191             ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */
2192         }                                 /* if error in bg noise       */
2193 
2194         /* apply phase dispersion to innovation (if enabled) and
2195            compute total excitation for synthesis part           */
2196         ph_disp(
2197             &(st->ph_disp_st),
2198             mode,
2199             exc_enhanced,
2200             gain_code_mix,
2201             gain_pit,
2202             code,
2203             pitch_fac,
2204             tmp_shift,
2205             pOverflow);
2206 
2207         /*-------------------------------------------------------*
2208          * - The Excitation control module are active during BFI.*
2209          * - Conceal drops in signal energy if in bg noise.      *
2210          *-------------------------------------------------------*/
2211         L_temp = 0;
2212         for (i = 0; i < L_SUBFR; i++)
2213         {
2214             L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow);
2215         }
2216 
2217         /* excEnergy = sqrt(L_temp) in Q0 */
2218         if (L_temp < 0)
2219         {
2220             L_temp = ~((~L_temp) >> 1);
2221         }
2222         else
2223         {
2224             L_temp = L_temp >> 1;
2225         }
2226 
2227         L_temp = sqrt_l_exp(L_temp, &temp, pOverflow);
2228         /* To cope with 16-bit and scaling in ex_ctrl() */
2229         L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow);
2230         if (L_temp < 0)
2231         {
2232             excEnergy = (Word16)(~((~L_temp) >> 2));
2233         }
2234         else
2235         {
2236             excEnergy = (Word16)(L_temp >> 2);
2237         }
2238 
2239         if (((mode == MR475) || (mode == MR515) || (mode == MR59))  &&
2240                 (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) &&
2241                 (st->state < 4) &&
2242                 ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0))
2243         {
2244             carefulFlag = 0;
2245 
2246             if (pdfi != 0 && bfi == 0)
2247             {
2248                 carefulFlag = 1;
2249             }
2250 
2251             Ex_ctrl(exc_enhanced,
2252                     excEnergy,
2253                     st->excEnergyHist,
2254                     st->voicedHangover,
2255                     st->prev_bf,
2256                     carefulFlag, pOverflow);
2257         }
2258 
2259         if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) &&
2260                 (st->state < 4)))
2261         {
2262             /* Update energy history for all modes */
2263             for (i = 0; i < 8; i++)
2264             {
2265                 st->excEnergyHist[i] = st->excEnergyHist[i+1];
2266             }
2267             st->excEnergyHist[8] = excEnergy;
2268         }
2269         /*-------------------------------------------------------*
2270          * Excitation control module end.                        *
2271          *-------------------------------------------------------*/
2272         if (pit_sharp > 16384)
2273         {
2274             for (i = 0; i < L_SUBFR; i++)
2275             {
2276                 *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow);
2277 
2278             }
2279             agc2(exc_enhanced, excp, L_SUBFR, pOverflow);
2280             *pOverflow = 0;
2281             Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR,
2282                      st->mem_syn, 0);
2283         }
2284         else
2285         {
2286             *pOverflow = 0;
2287             Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
2288                      st->mem_syn, 0);
2289         }
2290 
2291         if (*pOverflow != 0)    /* Test for overflow */
2292         {
2293             for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--)
2294             {
2295                 if (st->old_exc[i] < 0)
2296                 {
2297                     st->old_exc[i] = ~((~st->old_exc[i]) >> 2);
2298                 }
2299                 else
2300                 {
2301                     st->old_exc[i] = st->old_exc[i] >> 2;
2302                 }
2303 
2304             }
2305 
2306             for (i = L_SUBFR - 1; i >= 0; i--)
2307             {
2308                 if (*(exc_enhanced + i) < 0)
2309                 {
2310                     *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2);
2311                 }
2312                 else
2313                 {
2314                     *(exc_enhanced + i) = *(exc_enhanced + i) >> 2;
2315                 }
2316             }
2317             Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
2318         }
2319         else
2320         {
2321             Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
2322         }
2323 
2324         /*--------------------------------------------------*
2325          * Update signal for next frame.                    *
2326          * -> shift to the left by L_SUBFR  st->exc[]       *
2327          *--------------------------------------------------*/
2328 
2329         Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
2330 
2331         /* interpolated LPC parameters for next subframe */
2332         Az += MP1;
2333 
2334         /* store T0 for next subframe */
2335         st->old_T0 = T0;
2336     }
2337 
2338     /*-------------------------------------------------------*
2339      * Call the Source Characteristic Detector which updates *
2340      * st->inBackgroundNoise and st->voicedHangover.         *
2341      *-------------------------------------------------------*/
2342 
2343     st->inBackgroundNoise =
2344         Bgn_scd(
2345             &(st->background_state),
2346             &(st->ltpGainHistory[0]),
2347             &(synth[0]),
2348             &(st->voicedHangover),
2349             pOverflow);
2350 
2351     dtx_dec_activity_update(
2352         &(st->dtxDecoderState),
2353         st->lsfState.past_lsf_q,
2354         synth,
2355         pOverflow);
2356 
2357     /* store bfi for next subframe */
2358     st->prev_bf = bfi;
2359     st->prev_pdf = pdfi;
2360 
2361     /*--------------------------------------------------*
2362      * Calculate the LSF averages on the eight          *
2363      * previous frames                                  *
2364      *--------------------------------------------------*/
2365     lsp_avg(
2366         &(st->lsp_avg_st),
2367         st->lsfState.past_lsf_q,
2368         pOverflow);
2369 
2370 the_end:
2371     st->dtxDecoderState.dtxGlobalState = newDTXState;
2372 
2373 //    return(0);
2374 }
2375