Home | History | Annotate | Download | only in src
      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 
     33 
     34  Pathname: ./audio/gsm-amr/c/src/dtx_dec.c
     35  Functions:
     36            dtx_dec_reset
     37            dtx_dec
     38            dtx_dec_activity_update
     39            rx_dtx_handler
     40 
     41 ------------------------------------------------------------------------------
     42  MODULE DESCRIPTION
     43 
     44  These modules decode the comfort noise when in DTX.
     45 
     46 ------------------------------------------------------------------------------
     47 */
     48 
     49 
     50 /*----------------------------------------------------------------------------
     51 ; INCLUDES
     52 ----------------------------------------------------------------------------*/
     53 #include <string.h>
     54 
     55 #include "dtx_dec.h"
     56 #include "typedef.h"
     57 #include "basic_op.h"
     58 #include "copy.h"
     59 #include "set_zero.h"
     60 #include "mode.h"
     61 #include "log2.h"
     62 #include "lsp_az.h"
     63 #include "pow2.h"
     64 #include "a_refl.h"
     65 #include "b_cn_cod.h"
     66 #include "syn_filt.h"
     67 #include "lsp_lsf.h"
     68 #include "reorder.h"
     69 #include "lsp_tab.h"
     70 
     71 /*----------------------------------------------------------------------------
     72 ; MACROS
     73 ; Define module specific macros here
     74 ----------------------------------------------------------------------------*/
     75 
     76 
     77 /*----------------------------------------------------------------------------
     78 ; DEFINES
     79 ; Include all pre-processor statements here. Include conditional
     80 ; compile variables also.
     81 ----------------------------------------------------------------------------*/
     82 #define PN_INITIAL_SEED 0x70816958L   /* Pseudo noise generator seed value  */
     83 
     84 /*----------------------------------------------------------------------------
     85 ; LOCAL FUNCTION DEFINITIONS
     86 ; Function Prototype declaration
     87 ----------------------------------------------------------------------------*/
     88 
     89 
     90 /*----------------------------------------------------------------------------
     91 ; LOCAL VARIABLE DEFINITIONS
     92 ; Variable declaration - defined here and used outside this module
     93 ----------------------------------------------------------------------------*/
     94 
     95 /***************************************************
     96  * Scaling factors for the lsp variability operation *
     97  ***************************************************/
     98 static const Word16 lsf_hist_mean_scale[M] =
     99 {
    100     20000,
    101     20000,
    102     20000,
    103     20000,
    104     20000,
    105     18000,
    106     16384,
    107     8192,
    108     0,
    109     0
    110 };
    111 
    112 /*************************************************
    113  * level adjustment for different modes Q11      *
    114  *************************************************/
    115 static const Word16 dtx_log_en_adjust[9] =
    116 {
    117     -1023, /* MR475 */
    118     -878, /* MR515 */
    119     -732, /* MR59  */
    120     -586, /* MR67  */
    121     -440, /* MR74  */
    122     -294, /* MR795 */
    123     -148, /* MR102 */
    124     0, /* MR122 */
    125     0, /* MRDTX */
    126 };
    127 
    128 
    129 /*
    130 ------------------------------------------------------------------------------
    131  FUNCTION NAME: dtx_dec_reset
    132 ------------------------------------------------------------------------------
    133  INPUT AND OUTPUT DEFINITIONS
    134 
    135  Inputs:
    136     st = pointer to a structure of type dtx_decState
    137 
    138  Outputs:
    139     Structure pointed to by st is initialized to a set of initial values.
    140 
    141  Returns:
    142     return_value = 0 if memory was successfully initialized,
    143         otherwise returns -1 (int)
    144 
    145  Global Variables Used:
    146     None.
    147 
    148  Local Variables Needed:
    149     None.
    150 
    151 ------------------------------------------------------------------------------
    152  FUNCTION DESCRIPTION
    153 
    154  Reset of state memory for dtx_dec.
    155 
    156 ------------------------------------------------------------------------------
    157  REQUIREMENTS
    158 
    159  None.
    160 
    161 ------------------------------------------------------------------------------
    162  REFERENCES
    163 
    164  dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
    165 
    166 ------------------------------------------------------------------------------
    167  PSEUDO-CODE
    168 
    169 int dtx_dec_reset (dtx_decState *st)
    170 {
    171    int i;
    172 
    173    if (st == (dtx_decState *) NULL){
    174       fprintf(stderr, "dtx_dec_reset: invalid parameter\n");
    175       return -1;
    176    }
    177 
    178    st->since_last_sid = 0;
    179    st->true_sid_period_inv = (1 << 13);
    180 
    181    st->log_en = 3500;
    182    st->old_log_en = 3500;
    183    // low level noise for better performance in  DTX handover cases
    184 
    185    st->L_pn_seed_rx = PN_INITIAL_SEED;
    186 
    187    // Initialize state->lsp [] and state->lsp_old []
    188    Copy(lsp_init_data, &st->lsp[0], M);
    189    Copy(lsp_init_data, &st->lsp_old[0], M);
    190 
    191    st->lsf_hist_ptr = 0;
    192    st->log_pg_mean = 0;
    193    st->log_en_hist_ptr = 0;
    194 
    195    // initialize decoder lsf history
    196    Copy(mean_lsf, &st->lsf_hist[0], M);
    197 
    198    for (i = 1; i < DTX_HIST_SIZE; i++)
    199    {
    200       Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
    201    }
    202    Set_zero(st->lsf_hist_mean, M*DTX_HIST_SIZE);
    203 
    204    // initialize decoder log frame energy
    205    for (i = 0; i < DTX_HIST_SIZE; i++)
    206    {
    207       st->log_en_hist[i] = st->log_en;
    208    }
    209 
    210    st->log_en_adjust = 0;
    211 
    212    st->dtxHangoverCount = DTX_HANG_CONST;
    213    st->decAnaElapsedCount = 32767;
    214 
    215    st->sid_frame = 0;
    216    st->valid_data = 0;
    217    st->dtxHangoverAdded = 0;
    218 
    219    st->dtxGlobalState = DTX;
    220    st->data_updated = 0;
    221    return 0;
    222 }
    223 
    224 ------------------------------------------------------------------------------
    225  RESOURCES USED [optional]
    226 
    227  When the code is written for a specific target processor the
    228  the resources used should be documented below.
    229 
    230  HEAP MEMORY USED: x bytes
    231 
    232  STACK MEMORY USED: x bytes
    233 
    234  CLOCK CYCLES: (cycle count equation for this function) + (variable
    235                 used to represent cycle count for each subroutine
    236                 called)
    237      where: (cycle count variable) = cycle count for [subroutine
    238                                      name]
    239 
    240 ------------------------------------------------------------------------------
    241  CAUTION [optional]
    242  [State any special notes, constraints or cautions for users of this function]
    243 
    244 ------------------------------------------------------------------------------
    245 */
    246 
    247 Word16 dtx_dec_reset(dtx_decState *st)
    248 {
    249     Word16 i;
    250 
    251     if (st == (dtx_decState *) NULL)
    252     {
    253         /* fprint(stderr, "dtx_dec_reset: invalid parameter\n");  */
    254         return(-1);
    255     }
    256 
    257     st->since_last_sid = 0;
    258     st->true_sid_period_inv = (1 << 13);
    259 
    260     st->log_en = 3500;
    261     st->old_log_en = 3500;
    262     /* low level noise for better performance in  DTX handover cases*/
    263 
    264     st->L_pn_seed_rx = PN_INITIAL_SEED;
    265 
    266     /* Initialize state->lsp [] */
    267     st->lsp[0] = 30000;
    268     st->lsp[1] = 26000;
    269     st->lsp[2] = 21000;
    270     st->lsp[3] = 15000;
    271     st->lsp[4] = 8000;
    272     st->lsp[5] = 0;
    273     st->lsp[6] = -8000;
    274     st->lsp[7] = -15000;
    275     st->lsp[8] = -21000;
    276     st->lsp[9] = -26000;
    277 
    278     /* Initialize state->lsp_old [] */
    279     st->lsp_old[0] = 30000;
    280     st->lsp_old[1] = 26000;
    281     st->lsp_old[2] = 21000;
    282     st->lsp_old[3] = 15000;
    283     st->lsp_old[4] = 8000;
    284     st->lsp_old[5] = 0;
    285     st->lsp_old[6] = -8000;
    286     st->lsp_old[7] = -15000;
    287     st->lsp_old[8] = -21000;
    288     st->lsp_old[9] = -26000;
    289 
    290     st->lsf_hist_ptr = 0;
    291     st->log_pg_mean = 0;
    292     st->log_en_hist_ptr = 0;
    293 
    294     /* initialize decoder lsf history */
    295     st->lsf_hist[0] =  1384;
    296     st->lsf_hist[1] =  2077;
    297     st->lsf_hist[2] =  3420;
    298     st->lsf_hist[3] =  5108;
    299     st->lsf_hist[4] =  6742;
    300     st->lsf_hist[5] =  8122;
    301     st->lsf_hist[6] =  9863;
    302     st->lsf_hist[7] = 11092;
    303     st->lsf_hist[8] = 12714;
    304     st->lsf_hist[9] = 13701;
    305 
    306     for (i = 1; i < DTX_HIST_SIZE; i++)
    307     {
    308         Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
    309     }
    310     memset(st->lsf_hist_mean, 0, sizeof(Word16)*M*DTX_HIST_SIZE);
    311 
    312     /* initialize decoder log frame energy */
    313     for (i = 0; i < DTX_HIST_SIZE; i++)
    314     {
    315         st->log_en_hist[i] = st->log_en;
    316     }
    317 
    318     st->log_en_adjust = 0;
    319 
    320     st->dtxHangoverCount = DTX_HANG_CONST;
    321     st->decAnaElapsedCount = 32767;
    322 
    323     st->sid_frame = 0;
    324     st->valid_data = 0;
    325     st->dtxHangoverAdded = 0;
    326 
    327     st->dtxGlobalState = DTX;
    328     st->data_updated = 0;
    329 
    330     return(0);
    331 }
    332 
    333 /****************************************************************************/
    334 
    335 /*
    336 ------------------------------------------------------------------------------
    337  FUNCTION NAME: dtx_dec
    338 ------------------------------------------------------------------------------
    339  INPUT AND OUTPUT DEFINITIONS
    340 
    341  Inputs:
    342     st = pointer to a structure of type dtx_decState
    343     mem_syn = AMR decoder state
    344     lsfState = decoder lsf states
    345     predState = prediction states
    346     averState = CB gain average states
    347     new_state = new DTX state
    348     mode = AMR mode
    349     parm = Vector of synthesis parameters
    350 
    351  Outputs:
    352     st points to an updated structure of type dtx_decState
    353     mem_syn = AMR decoder state
    354     lsfState = decoder lsf states
    355     predState = prediction states
    356     averState = CB gain average states
    357     synth = synthesised speech
    358     A_t = decoded LP filter in 4 subframes
    359 
    360  Returns:
    361     return_value = 0 (int)
    362 
    363  Global Variables Used:
    364     None.
    365 
    366  Local Variables Needed:
    367     None.
    368 
    369 ------------------------------------------------------------------------------
    370  FUNCTION DESCRIPTION
    371 
    372  Decode comfort noise when in DTX.
    373 
    374 ------------------------------------------------------------------------------
    375  REQUIREMENTS
    376 
    377  None
    378 
    379 ------------------------------------------------------------------------------
    380  REFERENCES
    381 
    382  dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
    383 
    384 ------------------------------------------------------------------------------
    385  PSEUDO-CODE
    386 
    387 int dtx_dec(
    388    dtx_decState *st,                // i/o : State struct
    389    Word16 mem_syn[],                // i/o : AMR decoder state
    390    D_plsfState* lsfState,           // i/o : decoder lsf states
    391    gc_predState* predState,         // i/o : prediction states
    392    Cb_gain_averageState* averState, // i/o : CB gain average states
    393    enum DTXStateType new_state,     // i   : new DTX state
    394    enum Mode mode,                  // i   : AMR mode
    395    Word16 parm[],                   // i   : Vector of synthesis parameters
    396    Word16 synth[],                  // o   : synthesised speech
    397    Word16 A_t[]                     // o   : decoded LP filter in 4 subframes
    398    )
    399 {
    400    Word16 log_en_index;
    401    Word16 i, j;
    402    Word16 int_fac;
    403    Word32 L_log_en_int;
    404    Word16 lsp_int[M];
    405    Word16 log_en_int_e;
    406    Word16 log_en_int_m;
    407    Word16 level;
    408    Word16 acoeff[M + 1];
    409    Word16 refl[M];
    410    Word16 pred_err;
    411    Word16 ex[L_SUBFR];
    412    Word16 ma_pred_init;
    413    Word16 log_pg_e, log_pg_m;
    414    Word16 log_pg;
    415    Flag negative;
    416    Word16 lsf_mean;
    417    Word32 L_lsf_mean;
    418    Word16 lsf_variab_index;
    419    Word16 lsf_variab_factor;
    420    Word16 lsf_int[M];
    421    Word16 lsf_int_variab[M];
    422    Word16 lsp_int_variab[M];
    423    Word16 acoeff_variab[M + 1];
    424 
    425    Word16 lsf[M];
    426    Word32 L_lsf[M];
    427    Word16 ptr;
    428    Word16 tmp_int_length;
    429 
    430 
    431     // This function is called if synthesis state is not SPEECH
    432     // the globally passed  inputs to this function are
    433     // st->sid_frame
    434     // st->valid_data
    435     // st->dtxHangoverAdded
    436     // new_state  (SPEECH, DTX, DTX_MUTE)
    437 
    438    if ((st->dtxHangoverAdded != 0) &&
    439        (st->sid_frame != 0))
    440    {
    441       // sid_first after dtx hangover period
    442       // or sid_upd after dtxhangover
    443 
    444       // set log_en_adjust to correct value
    445       st->log_en_adjust = dtx_log_en_adjust[mode];
    446 
    447       ptr = add(st->lsf_hist_ptr, M);
    448       if (sub(ptr, 80) == 0)
    449       {
    450          ptr = 0;
    451       }
    452       Copy( &st->lsf_hist[st->lsf_hist_ptr],&st->lsf_hist[ptr],M);
    453 
    454       ptr = add(st->log_en_hist_ptr,1);
    455       if (sub(ptr, DTX_HIST_SIZE) == 0)
    456       {
    457          ptr = 0;
    458       }
    459       st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; // Q11
    460 
    461       // compute mean log energy and lsp
    462       // from decoded signal (SID_FIRST)
    463       st->log_en = 0;
    464       for (i = 0; i < M; i++)
    465       {
    466          L_lsf[i] = 0;
    467       }
    468 
    469       // average energy and lsp
    470       for (i = 0; i < DTX_HIST_SIZE; i++)
    471       {
    472          st->log_en = add(st->log_en,
    473                           shr(st->log_en_hist[i],3));
    474          for (j = 0; j < M; j++)
    475          {
    476             L_lsf[j] = L_add(L_lsf[j],
    477                              L_deposit_l(st->lsf_hist[i * M + j]));
    478          }
    479       }
    480 
    481       for (j = 0; j < M; j++)
    482       {
    483          lsf[j] = extract_l(L_shr(L_lsf[j],3)); // divide by 8
    484       }
    485 
    486       Lsf_lsp(lsf, st->lsp, M);
    487 
    488       // make log_en speech coder mode independent
    489       // added again later before synthesis
    490       st->log_en = sub(st->log_en, st->log_en_adjust);
    491 
    492       // compute lsf variability vector
    493       Copy(st->lsf_hist, st->lsf_hist_mean, 80);
    494 
    495       for (i = 0; i < M; i++)
    496       {
    497          L_lsf_mean = 0;
    498          // compute mean lsf
    499          for (j = 0; j < 8; j++)
    500          {
    501             L_lsf_mean = L_add(L_lsf_mean,
    502                                L_deposit_l(st->lsf_hist_mean[i+j*M]));
    503          }
    504 
    505          lsf_mean = extract_l(L_shr(L_lsf_mean, 3));
    506           // subtract mean and limit to within reasonable limits
    507           // moreover the upper lsf's are attenuated
    508          for (j = 0; j < 8; j++)
    509          {
    510             // subtract mean
    511             st->lsf_hist_mean[i+j*M] =
    512                sub(st->lsf_hist_mean[i+j*M], lsf_mean);
    513 
    514             // attenuate deviation from mean, especially for upper lsf's
    515             st->lsf_hist_mean[i+j*M] =
    516                mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i]);
    517 
    518             // limit the deviation
    519             if (st->lsf_hist_mean[i+j*M] < 0)
    520             {
    521                negative = 1;
    522             }
    523             else
    524             {
    525                negative = 0;
    526             }
    527             st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
    528 
    529             // apply soft limit
    530             if (sub(st->lsf_hist_mean[i+j*M], 655) > 0)
    531             {
    532                st->lsf_hist_mean[i+j*M] =
    533                   add(655, shr(sub(st->lsf_hist_mean[i+j*M], 655), 2));
    534             }
    535 
    536             // apply hard limit
    537             if (sub(st->lsf_hist_mean[i+j*M], 1310) > 0)
    538             {
    539                st->lsf_hist_mean[i+j*M] = 1310;
    540             }
    541             if (negative != 0)
    542             {
    543                st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
    544             }
    545 
    546          }
    547       }
    548    }
    549 
    550    if (st->sid_frame != 0 )
    551    {
    552       // Set old SID parameters, always shift
    553       // even if there is no new valid_data
    554       Copy(st->lsp, st->lsp_old, M);
    555       st->old_log_en = st->log_en;
    556 
    557       if (st->valid_data != 0 )  // new data available (no CRC)
    558       {
    559          // Compute interpolation factor, since the division only works
    560          // for values of since_last_sid < 32 we have to limit the
    561          // interpolation to 32 frames
    562          tmp_int_length = st->since_last_sid;
    563          st->since_last_sid = 0;
    564 
    565          if (sub(tmp_int_length, 32) > 0)
    566          {
    567             tmp_int_length = 32;
    568          }
    569          if (sub(tmp_int_length, 2) >= 0)
    570          {
    571             st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
    572          }
    573          else
    574          {
    575             st->true_sid_period_inv = 1 << 14; // 0.5 it Q15
    576          }
    577 
    578          Init_D_plsf_3(lsfState, parm[0]);  // temporay initialization
    579          D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp);
    580          Set_zero(lsfState->past_r_q, M);   // reset for next speech frame
    581 
    582          log_en_index = parm[4];
    583          // Q11 and divide by 4
    584          st->log_en = shl(log_en_index, (11 - 2));
    585 
    586          // Subtract 2.5 in Q11
    587          st->log_en = sub(st->log_en, (2560 * 2));
    588 
    589          // Index 0 is reserved for silence
    590          if (log_en_index == 0)
    591          {
    592             st->log_en = MIN_16;
    593          }
    594 
    595          // no interpolation at startup after coder reset
    596          // or when SID_UPD has been received right after SPEECH
    597          if ((st->data_updated == 0) ||
    598              (sub(st->dtxGlobalState, SPEECH) == 0)
    599              )
    600          {
    601             Copy(st->lsp, st->lsp_old, M);
    602             st->old_log_en = st->log_en;
    603          }
    604       } // endif valid_data
    605 
    606       // initialize gain predictor memory of other modes
    607       ma_pred_init = sub(shr(st->log_en,1), 9000);
    608       if (ma_pred_init > 0)
    609       {
    610          ma_pred_init = 0;
    611       }
    612       if (sub(ma_pred_init, -14436) < 0)
    613       {
    614          ma_pred_init = -14436;
    615       }
    616 
    617       predState->past_qua_en[0] = ma_pred_init;
    618       predState->past_qua_en[1] = ma_pred_init;
    619       predState->past_qua_en[2] = ma_pred_init;
    620       predState->past_qua_en[3] = ma_pred_init;
    621 
    622       // past_qua_en for other modes than MR122
    623       ma_pred_init = mult(5443, ma_pred_init);
    624       // scale down by factor 20*log10(2) in Q15
    625       predState->past_qua_en_MR122[0] = ma_pred_init;
    626       predState->past_qua_en_MR122[1] = ma_pred_init;
    627       predState->past_qua_en_MR122[2] = ma_pred_init;
    628       predState->past_qua_en_MR122[3] = ma_pred_init;
    629    } // endif sid_frame
    630 
    631    // CN generation
    632    // recompute level adjustment factor Q11
    633    // st->log_en_adjust = 0.9*st->log_en_adjust +
    634    //                     0.1*dtx_log_en_adjust[mode]);
    635    st->log_en_adjust = add(mult(st->log_en_adjust, 29491),
    636                            shr(mult(shl(dtx_log_en_adjust[mode],5),3277),5));
    637 
    638    // Interpolate SID info
    639    int_fac = shl(add(1,st->since_last_sid), 10); // Q10
    640    int_fac = mult(int_fac, st->true_sid_period_inv); // Q10 * Q15 -> Q10
    641 
    642    // Maximize to 1.0 in Q10
    643    if (sub(int_fac, 1024) > 0)
    644    {
    645       int_fac = 1024;
    646    }
    647    int_fac = shl(int_fac, 4); // Q10 -> Q14
    648 
    649    L_log_en_int = L_mult(int_fac, st->log_en); // Q14 * Q11->Q26
    650    for(i = 0; i < M; i++)
    651    {
    652       lsp_int[i] = mult(int_fac, st->lsp[i]);// Q14 * Q15 -> Q14
    653    }
    654 
    655    int_fac = sub(16384, int_fac); // 1-k in Q14
    656 
    657    // (Q14 * Q11 -> Q26) + Q26 -> Q26
    658    L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en);
    659    for(i = 0; i < M; i++)
    660    {
    661       // Q14 + (Q14 * Q15 -> Q14) -> Q14
    662       lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i]));
    663       lsp_int[i] = shl(lsp_int[i], 1); // Q14 -> Q15
    664    }
    665 
    666    // compute the amount of lsf variability
    667    lsf_variab_factor = sub(st->log_pg_mean,2457); // -0.6 in Q12
    668    // *0.3 Q12*Q15 -> Q12
    669    lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830));
    670 
    671    // limit to values between 0..1 in Q12
    672    if (sub(lsf_variab_factor, 4096) > 0)
    673    {
    674       lsf_variab_factor = 4096;
    675    }
    676    if (lsf_variab_factor < 0)
    677    {
    678       lsf_variab_factor = 0;
    679    }
    680    lsf_variab_factor = shl(lsf_variab_factor, 3); // -> Q15
    681 
    682    // get index of vector to do variability with
    683    lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
    684 
    685    // convert to lsf
    686    Lsp_lsf(lsp_int, lsf_int, M);
    687 
    688    // apply lsf variability
    689    Copy(lsf_int, lsf_int_variab, M);
    690    for(i = 0; i < M; i++)
    691    {
    692       lsf_int_variab[i] = add(lsf_int_variab[i],
    693                               mult(lsf_variab_factor,
    694                                    st->lsf_hist_mean[i+lsf_variab_index*M]));
    695    }
    696 
    697    // make sure that LSP's are ordered
    698    Reorder_lsf(lsf_int, LSF_GAP, M);
    699    Reorder_lsf(lsf_int_variab, LSF_GAP, M);
    700 
    701    // copy lsf to speech decoders lsf state
    702    Copy(lsf_int, lsfState->past_lsf_q, M);
    703 
    704    // convert to lsp
    705    Lsf_lsp(lsf_int, lsp_int, M);
    706    Lsf_lsp(lsf_int_variab, lsp_int_variab, M);
    707 
    708    // Compute acoeffs Q12 acoeff is used for level
    709    // normalization and postfilter, acoeff_variab is
    710    // used for synthesis filter
    711    // by doing this we make sure that the level
    712    // in high frequenncies does not jump up and down
    713 
    714    Lsp_Az(lsp_int, acoeff);
    715    Lsp_Az(lsp_int_variab, acoeff_variab);
    716 
    717    // For use in postfilter
    718    Copy(acoeff, &A_t[0],           M + 1);
    719    Copy(acoeff, &A_t[M + 1],       M + 1);
    720    Copy(acoeff, &A_t[2 * (M + 1)], M + 1);
    721    Copy(acoeff, &A_t[3 * (M + 1)], M + 1);
    722 
    723    // Compute reflection coefficients Q15
    724    A_Refl(&acoeff[1], refl);
    725 
    726    // Compute prediction error in Q15
    727    pred_err = MAX_16; // 0.99997 in Q15
    728    for (i = 0; i < M; i++)
    729    {
    730       pred_err = mult(pred_err, sub(MAX_16, mult(refl[i], refl[i])));
    731    }
    732 
    733    // compute logarithm of prediction gain
    734    Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m);
    735 
    736    // convert exponent and mantissa to Word16 Q12
    737    log_pg = shl(sub(log_pg_e,15), 12);  // Q12
    738    log_pg = shr(sub(0,add(log_pg, shr(log_pg_m, 15-12))), 1);
    739    st->log_pg_mean = add(mult(29491,st->log_pg_mean),
    740                          mult(3277, log_pg));
    741 
    742    // Compute interpolated log energy
    743    L_log_en_int = L_shr(L_log_en_int, 10); // Q26 -> Q16
    744 
    745    // Add 4 in Q16
    746    L_log_en_int = L_add(L_log_en_int, 4 * 65536L);
    747 
    748    // subtract prediction gain
    749    L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4));
    750 
    751    // adjust level to speech coder mode
    752    L_log_en_int = L_add(L_log_en_int,
    753                         L_shl(L_deposit_l(st->log_en_adjust), 5));
    754 
    755    log_en_int_e = extract_h(L_log_en_int);
    756    log_en_int_m = extract_l(L_shr(L_sub(L_log_en_int,
    757                                         L_deposit_h(log_en_int_e)), 1));
    758    level = extract_l(Pow2(log_en_int_e, log_en_int_m)); // Q4
    759 
    760    for (i = 0; i < 4; i++)
    761    {
    762       // Compute innovation vector
    763       build_CN_code(&st->L_pn_seed_rx, ex);
    764       for (j = 0; j < L_SUBFR; j++)
    765       {
    766          ex[j] = mult(level, ex[j]);
    767       }
    768       // Synthesize
    769       Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
    770                mem_syn, 1);
    771 
    772    } // next i
    773 
    774    // reset codebook averaging variables
    775    averState->hangVar = 20;
    776    averState->hangCount = 0;
    777 
    778    if (sub(new_state, DTX_MUTE) == 0)
    779    {
    780       // mute comfort noise as it has been quite a long time since
    781        * last SID update  was performed
    782 
    783       tmp_int_length = st->since_last_sid;
    784       if (sub(tmp_int_length, 32) > 0)
    785       {
    786          tmp_int_length = 32;
    787       }
    788 
    789       // safety guard against division by zero
    790       if(tmp_int_length <= 0) {
    791          tmp_int_length = 8;
    792       }
    793 
    794       st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
    795 
    796       st->since_last_sid = 0;
    797       Copy(st->lsp, st->lsp_old, M);
    798       st->old_log_en = st->log_en;
    799       // subtract 1/8 in Q11 i.e -6/8 dB
    800       st->log_en = sub(st->log_en, 256);
    801    }
    802 
    803    // reset interpolation length timer
    804    // if data has been updated.
    805    if ((st->sid_frame != 0) &&
    806        ((st->valid_data != 0) ||
    807         ((st->valid_data == 0) &&  (st->dtxHangoverAdded) != 0)))
    808    {
    809       st->since_last_sid =  0;
    810       st->data_updated = 1;
    811    }
    812 
    813    return 0;
    814 }
    815 
    816 
    817 ------------------------------------------------------------------------------
    818  RESOURCES USED [optional]
    819 
    820  When the code is written for a specific target processor the
    821  the resources used should be documented below.
    822 
    823  HEAP MEMORY USED: x bytes
    824 
    825  STACK MEMORY USED: x bytes
    826 
    827  CLOCK CYCLES: (cycle count equation for this function) + (variable
    828                 used to represent cycle count for each subroutine
    829                 called)
    830      where: (cycle count variable) = cycle count for [subroutine
    831                                      name]
    832 
    833 ------------------------------------------------------------------------------
    834  CAUTION [optional]
    835  [State any special notes, constraints or cautions for users of this function]
    836 
    837 ------------------------------------------------------------------------------
    838 */
    839 
    840 void dtx_dec(
    841     dtx_decState *st,                /* i/o : State struct                    */
    842     Word16 mem_syn[],                /* i/o : AMR decoder state               */
    843     D_plsfState* lsfState,           /* i/o : decoder lsf states              */
    844     gc_predState* predState,         /* i/o : prediction states               */
    845     Cb_gain_averageState* averState, /* i/o : CB gain average states          */
    846     enum DTXStateType new_state,     /* i   : new DTX state                   */
    847     enum Mode mode,                  /* i   : AMR mode                        */
    848     Word16 parm[],                   /* i   : Vector of synthesis parameters  */
    849     Word16 synth[],                  /* o   : synthesised speech              */
    850     Word16 A_t[],                    /* o   : decoded LP filter in 4 subframes*/
    851     Flag   *pOverflow
    852 )
    853 {
    854     Word16 log_en_index;
    855     Word16 i;
    856     Word16 j;
    857     Word16 int_fac;
    858     Word32 L_log_en_int;
    859     Word16 lsp_int[M];
    860     Word16 log_en_int_e;
    861     Word16 log_en_int_m;
    862     Word16 level;
    863     Word16 acoeff[M + 1];
    864     Word16 refl[M];
    865     Word16 pred_err;
    866     Word16 ex[L_SUBFR];
    867     Word16 ma_pred_init;
    868     Word16 log_pg_e;
    869     Word16 log_pg_m;
    870     Word16 log_pg;
    871     Flag negative;
    872     Word16 lsf_mean;
    873     Word32 L_lsf_mean;
    874     Word16 lsf_variab_index;
    875     Word16 lsf_variab_factor;
    876     Word16 lsf_int[M];
    877     Word16 lsf_int_variab[M];
    878     Word16 lsp_int_variab[M];
    879     Word16 acoeff_variab[M + 1];
    880 
    881     Word16 lsf[M];
    882     Word32 L_lsf[M];
    883     Word16 ptr;
    884     Word16 tmp_int_length;
    885 
    886     Word32 L_temp;
    887     Word16 temp;
    888 
    889     /*  This function is called if synthesis state is not SPEECH
    890      *  the globally passed  inputs to this function are
    891      * st->sid_frame
    892      * st->valid_data
    893      * st->dtxHangoverAdded
    894      * new_state  (SPEECH, DTX, DTX_MUTE)
    895      */
    896 
    897     if ((st->dtxHangoverAdded != 0) &&
    898             (st->sid_frame != 0))
    899     {
    900         /* sid_first after dtx hangover period */
    901         /* or sid_upd after dtxhangover        */
    902 
    903         /* set log_en_adjust to correct value */
    904         st->log_en_adjust = dtx_log_en_adjust[mode];
    905 
    906         ptr = st->lsf_hist_ptr + M;
    907 
    908         if (ptr == 80)
    909         {
    910             ptr = 0;
    911         }
    912         Copy(&st->lsf_hist[st->lsf_hist_ptr], &st->lsf_hist[ptr], M);
    913 
    914         ptr = st->log_en_hist_ptr + 1;
    915 
    916         if (ptr == DTX_HIST_SIZE)
    917         {
    918             ptr = 0;
    919         }
    920 
    921         st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; /* Q11 */
    922 
    923         /* compute mean log energy and lsp *
    924          * from decoded signal (SID_FIRST) */
    925         st->log_en = 0;
    926         for (i = M - 1; i >= 0; i--)
    927         {
    928             L_lsf[i] = 0;
    929         }
    930 
    931         /* average energy and lsp */
    932         for (i = DTX_HIST_SIZE - 1; i >= 0; i--)
    933         {
    934             if (st->log_en_hist[i] < 0)
    935             {
    936                 temp = ~((~st->log_en_hist[i]) >> 3);
    937             }
    938             else
    939             {
    940                 temp = st->log_en_hist[i] >> 3;
    941             }
    942             st->log_en = add(st->log_en, temp, pOverflow);
    943             for (j = M - 1; j >= 0; j--)
    944             {
    945                 L_lsf[j] = L_add(L_lsf[j],
    946                                  L_deposit_l(st->lsf_hist[i * M + j]), pOverflow);
    947             }
    948         }
    949 
    950         for (j = M - 1; j >= 0; j--)
    951         {
    952             if (L_lsf[j] < 0)
    953             {
    954                 lsf[j] = (Word16)(~((~L_lsf[j]) >> 3));
    955             }
    956             else
    957             {
    958                 lsf[j] = (Word16)(L_lsf[j] >> 3);
    959             }
    960         }
    961 
    962         Lsf_lsp(lsf, st->lsp, M, pOverflow);
    963 
    964         /* make log_en speech coder mode independent */
    965         /* added again later before synthesis        */
    966         st->log_en = sub(st->log_en, st->log_en_adjust, pOverflow);
    967 
    968         /* compute lsf variability vector */
    969         Copy(st->lsf_hist, st->lsf_hist_mean, 80);
    970 
    971         for (i = M - 1; i >= 0; i--)
    972         {
    973             L_lsf_mean = 0;
    974             /* compute mean lsf */
    975             for (j = 8 - 1; j >= 0; j--)
    976             {
    977                 L_lsf_mean = L_add(L_lsf_mean,
    978                                    L_deposit_l(st->lsf_hist_mean[i+j*M]), pOverflow);
    979             }
    980 
    981             if (L_lsf_mean < 0)
    982             {
    983                 lsf_mean = (Word16)(~((~L_lsf_mean) >> 3));
    984             }
    985             else
    986             {
    987                 lsf_mean = (Word16)(L_lsf_mean >> 3);
    988             }
    989             /* subtract mean and limit to within reasonable limits  *
    990             * moreover the upper lsf's are attenuated              */
    991             for (j = 8 - 1; j >= 0; j--)
    992             {
    993                 /* subtract mean */
    994                 st->lsf_hist_mean[i+j*M] =
    995                     sub(st->lsf_hist_mean[i+j*M], lsf_mean, pOverflow);
    996 
    997                 /* attenuate deviation from mean, especially for upper lsf's */
    998                 st->lsf_hist_mean[i+j*M] =
    999                     mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i], pOverflow);
   1000 
   1001                 /* limit the deviation */
   1002                 if (st->lsf_hist_mean[i+j*M] < 0)
   1003                 {
   1004                     negative = 1;
   1005                 }
   1006                 else
   1007                 {
   1008                     negative = 0;
   1009                 }
   1010                 st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
   1011 
   1012                 /* apply soft limit */
   1013                 if (st->lsf_hist_mean[i+j*M] > 655)
   1014                 {
   1015                     st->lsf_hist_mean[i+j*M] = 655 + ((st->lsf_hist_mean[i+j*M]
   1016                                                        - 655) >> 2);
   1017                 }
   1018 
   1019                 /* apply hard limit */
   1020                 if (st->lsf_hist_mean[i+j*M] > 1310)
   1021                 {
   1022                     st->lsf_hist_mean[i+j*M] = 1310;
   1023                 }
   1024 
   1025                 if (negative != 0)
   1026                 {
   1027                     st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
   1028                 }
   1029             }
   1030         }
   1031     }
   1032 
   1033 
   1034     if (st->sid_frame != 0)
   1035     {
   1036         /* Set old SID parameters, always shift */
   1037         /* even if there is no new valid_data   */
   1038         Copy(st->lsp, st->lsp_old, M);
   1039         st->old_log_en = st->log_en;
   1040 
   1041         if (st->valid_data != 0)   /* new data available (no CRC) */
   1042         {
   1043             /* Compute interpolation factor, since the division only works *
   1044              * for values of since_last_sid < 32 we have to limit the      *
   1045              * interpolation to 32 frames                                  */
   1046             tmp_int_length = st->since_last_sid;
   1047             st->since_last_sid = 0;
   1048 
   1049             if (tmp_int_length >= 32)
   1050             {
   1051                 tmp_int_length = 32;
   1052             }
   1053 
   1054             L_temp = ((Word32) tmp_int_length) << 10;
   1055             if (L_temp != (Word32)((Word16) L_temp))
   1056             {
   1057                 *pOverflow = 1;
   1058                 L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
   1059             }
   1060             temp = (Word16) L_temp;
   1061 
   1062             if (tmp_int_length >= 2)
   1063             {
   1064                 st->true_sid_period_inv = div_s(1 << 10, temp);
   1065             }
   1066             else
   1067             {
   1068                 st->true_sid_period_inv = 1 << 14; /* 0.5 it Q15 */
   1069             }
   1070 
   1071             Init_D_plsf_3(lsfState, parm[0]);
   1072             D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp, pOverflow);
   1073             Set_zero(lsfState->past_r_q, M);   /* reset for next speech frame */
   1074 
   1075             log_en_index = parm[4];
   1076             /* Q11 and divide by 4 */
   1077             if ((log_en_index > 63) || (log_en_index < -64))
   1078             {
   1079                 st->log_en = (log_en_index > 0) ? MAX_16 : MIN_16;
   1080             }
   1081             else
   1082             {
   1083                 st->log_en = (log_en_index) << (11 - 2);
   1084             }
   1085 
   1086             /* Subtract 2.5 in Q11 */
   1087             st->log_en = sub(st->log_en, (2560 * 2), pOverflow);
   1088 
   1089             /* Index 0 is reserved for silence */
   1090             if (log_en_index == 0)
   1091             {
   1092                 st->log_en = MIN_16;
   1093             }
   1094 
   1095             /* no interpolation at startup after coder reset        */
   1096             /* or when SID_UPD has been received right after SPEECH */
   1097 
   1098             if ((st->data_updated == 0) ||
   1099                     (st->dtxGlobalState == SPEECH))
   1100             {
   1101                 Copy(st->lsp, st->lsp_old, M);
   1102                 st->old_log_en = st->log_en;
   1103             }
   1104         } /* endif valid_data */
   1105 
   1106         /* initialize gain predictor memory of other modes */
   1107         if (st->log_en < 0)
   1108         {
   1109             temp = ~((~st->log_en) >> 1);
   1110         }
   1111         else
   1112         {
   1113             temp = st->log_en >> 1;
   1114         }
   1115         ma_pred_init = sub(temp, 9000, pOverflow);
   1116 
   1117         if (ma_pred_init > 0)
   1118         {
   1119             ma_pred_init = 0;
   1120         }
   1121         else if (ma_pred_init < -14436)
   1122         {
   1123             ma_pred_init = -14436;
   1124         }
   1125 
   1126         predState->past_qua_en[0] = ma_pred_init;
   1127         predState->past_qua_en[1] = ma_pred_init;
   1128         predState->past_qua_en[2] = ma_pred_init;
   1129         predState->past_qua_en[3] = ma_pred_init;
   1130 
   1131         /* past_qua_en for other modes than MR122 */
   1132         ma_pred_init = mult(5443, ma_pred_init, pOverflow);
   1133         /* scale down by factor 20*log10(2) in Q15 */
   1134         predState->past_qua_en_MR122[0] = ma_pred_init;
   1135         predState->past_qua_en_MR122[1] = ma_pred_init;
   1136         predState->past_qua_en_MR122[2] = ma_pred_init;
   1137         predState->past_qua_en_MR122[3] = ma_pred_init;
   1138     } /* endif sid_frame */
   1139 
   1140     /* CN generation */
   1141     /* recompute level adjustment factor Q11             *
   1142      * st->log_en_adjust = 0.9*st->log_en_adjust +       *
   1143      *                     0.1*dtx_log_en_adjust[mode]); */
   1144     if (dtx_log_en_adjust[mode] > 1023)
   1145     {
   1146         temp = MAX_16;
   1147     }
   1148     else if (dtx_log_en_adjust[mode] < -1024)
   1149     {
   1150         temp = MIN_16;
   1151     }
   1152     else
   1153     {
   1154         temp = mult((Word16)((Word32)dtx_log_en_adjust[mode] << 5), 3277, pOverflow);
   1155     }
   1156 
   1157     if (temp < 0)
   1158     {
   1159         temp = ~((~temp) >> 5);
   1160     }
   1161     else
   1162     {
   1163         temp >>= 5;
   1164     }
   1165     st->log_en_adjust = add(mult(st->log_en_adjust, 29491, pOverflow), temp, pOverflow);
   1166 
   1167     /* Interpolate SID info */
   1168     int_fac = shl(add(1, st->since_last_sid, pOverflow), 10, pOverflow); /* Q10 */
   1169     int_fac = mult(int_fac, st->true_sid_period_inv, pOverflow); /* Q10 * Q15 -> Q10 */
   1170 
   1171     /* Maximize to 1.0 in Q10 */
   1172     if (int_fac > 1024)
   1173     {
   1174         int_fac = 16384;
   1175     }
   1176     else if (int_fac < -2048)
   1177     {
   1178         int_fac = MIN_16;
   1179     }
   1180     else
   1181     {
   1182         int_fac <<= 4;      /* Q10 -> Q14 */
   1183     }
   1184 
   1185     L_log_en_int = L_mult(int_fac, st->log_en, pOverflow); /* Q14 * Q11->Q26 */
   1186     for (i = M - 1; i >= 0; i--)
   1187     {
   1188         lsp_int[i] = mult(int_fac, st->lsp[i], pOverflow);/* Q14 * Q15 -> Q14 */
   1189     }
   1190 
   1191     int_fac = sub(16384, int_fac, pOverflow); /* 1-k in Q14 */
   1192 
   1193     /* (Q14 * Q11 -> Q26) + Q26 -> Q26 */
   1194     L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en, pOverflow);
   1195     for (i = M - 1; i >= 0; i--)
   1196     {
   1197         /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */
   1198         lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i], pOverflow), pOverflow);
   1199 
   1200         L_temp = ((Word32) lsp_int[i]) << 1;    /* Q14 -> Q15 */
   1201         if (L_temp != (Word32)((Word16) L_temp))
   1202         {
   1203             *pOverflow = 1;
   1204             L_temp = (Word32)((lsp_int[i] > 0) ? MAX_16 : MIN_16);
   1205         }
   1206         lsp_int[i] = (Word16) L_temp;
   1207     }
   1208 
   1209     /* compute the amount of lsf variability */
   1210     lsf_variab_factor = sub(st->log_pg_mean, 2457, pOverflow); /* -0.6 in Q12 */
   1211     /* *0.3 Q12*Q15 -> Q12 */
   1212     lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830, pOverflow), pOverflow);
   1213 
   1214     /* limit to values between 0..1 in Q12 */
   1215     if (lsf_variab_factor > 4095)
   1216     {
   1217         lsf_variab_factor = MAX_16;
   1218     }
   1219     else if (lsf_variab_factor < 0)
   1220     {
   1221         lsf_variab_factor = 0;
   1222     }
   1223     else
   1224     {
   1225         lsf_variab_factor <<= 3; /* -> Q15 */
   1226     }
   1227 
   1228     /* get index of vector to do variability with */
   1229     lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
   1230 
   1231     /* convert to lsf */
   1232     Lsp_lsf(lsp_int, lsf_int, M, pOverflow);
   1233 
   1234     /* apply lsf variability */
   1235     Copy(lsf_int, lsf_int_variab, M);
   1236     for (i = M - 1; i >= 0; i--)
   1237     {
   1238         lsf_int_variab[i] = add(lsf_int_variab[i],
   1239                                 mult(lsf_variab_factor,
   1240                                      st->lsf_hist_mean[i+lsf_variab_index*M], pOverflow)
   1241                                 , pOverflow);
   1242     }
   1243 
   1244     /* make sure that LSP's are ordered */
   1245     Reorder_lsf(lsf_int, LSF_GAP, M, pOverflow);
   1246     Reorder_lsf(lsf_int_variab, LSF_GAP, M, pOverflow);
   1247 
   1248     /* copy lsf to speech decoders lsf state */
   1249     Copy(lsf_int, lsfState->past_lsf_q, M);
   1250 
   1251     /* convert to lsp */
   1252     Lsf_lsp(lsf_int, lsp_int, M, pOverflow);
   1253     Lsf_lsp(lsf_int_variab, lsp_int_variab, M, pOverflow);
   1254 
   1255     /* Compute acoeffs Q12 acoeff is used for level    *
   1256      * normalization and postfilter, acoeff_variab is  *
   1257      * used for synthesis filter                       *
   1258      * by doing this we make sure that the level       *
   1259      * in high frequenncies does not jump up and down  */
   1260 
   1261     Lsp_Az(lsp_int, acoeff, pOverflow);
   1262     Lsp_Az(lsp_int_variab, acoeff_variab, pOverflow);
   1263 
   1264     /* For use in postfilter */
   1265     Copy(acoeff, &A_t[0],           M + 1);
   1266     Copy(acoeff, &A_t[M + 1],       M + 1);
   1267     Copy(acoeff, &A_t[2 *(M + 1)], M + 1);
   1268     Copy(acoeff, &A_t[3 *(M + 1)], M + 1);
   1269 
   1270     /* Compute reflection coefficients Q15 */
   1271     A_Refl(&acoeff[1], refl, pOverflow);
   1272 
   1273     /* Compute prediction error in Q15 */
   1274     pred_err = MAX_16; /* 0.99997 in Q15 */
   1275     for (i = 0; i < M; i++)
   1276     {
   1277         L_temp = (((Word32) refl[i]) * refl[i]) >> 15;
   1278         if (L_temp <= 0x00007fffL)
   1279         {
   1280             temp = MAX_16 - (Word16) L_temp;
   1281         }
   1282         else
   1283         {
   1284             *pOverflow = 1;
   1285             temp = 0;
   1286         }
   1287         pred_err = mult(pred_err, temp, pOverflow);
   1288     }
   1289 
   1290     /* compute logarithm of prediction gain */
   1291     Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m, pOverflow);
   1292 
   1293     /* convert exponent and mantissa to Word16 Q12 */
   1294     log_pg = shl(sub(log_pg_e, 15, pOverflow), 12, pOverflow); /* Q12 */
   1295     log_pg = shr(sub(0, add(log_pg, shr(log_pg_m, 15 - 12, pOverflow),
   1296                             pOverflow), pOverflow), 1, pOverflow);
   1297     st->log_pg_mean = add(mult(29491, st->log_pg_mean, pOverflow),
   1298                           mult(3277, log_pg, pOverflow), pOverflow);
   1299 
   1300     /* Compute interpolated log energy */
   1301     L_log_en_int = L_shr(L_log_en_int, 10, pOverflow); /* Q26 -> Q16 */
   1302 
   1303     /* Add 4 in Q16 */
   1304     L_log_en_int = L_add(L_log_en_int, 4 * 65536L, pOverflow);
   1305 
   1306     /* subtract prediction gain */
   1307     L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4, pOverflow), pOverflow);
   1308 
   1309     /* adjust level to speech coder mode */
   1310     L_log_en_int = L_add(L_log_en_int,
   1311                          L_shl(L_deposit_l(st->log_en_adjust), 5, pOverflow), pOverflow);
   1312 
   1313     log_en_int_e = (Word16)(L_log_en_int >> 16);
   1314 
   1315     log_en_int_m = (Word16)(L_shr(L_sub(L_log_en_int,
   1316                                         L_deposit_h(log_en_int_e), pOverflow), 1, pOverflow));
   1317     level = (Word16)(Pow2(log_en_int_e, log_en_int_m, pOverflow));  /* Q4 */
   1318 
   1319     for (i = 0; i < 4; i++)
   1320     {
   1321         /* Compute innovation vector */
   1322         build_CN_code(&st->L_pn_seed_rx, ex, pOverflow);
   1323         for (j = L_SUBFR - 1; j >= 0; j--)
   1324         {
   1325             ex[j] = mult(level, ex[j], pOverflow);
   1326         }
   1327         /* Synthesize */
   1328         Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
   1329                  mem_syn, 1);
   1330 
   1331     } /* next i */
   1332 
   1333     /* reset codebook averaging variables */
   1334     averState->hangVar = 20;
   1335     averState->hangCount = 0;
   1336 
   1337     if (new_state == DTX_MUTE)
   1338     {
   1339         /* mute comfort noise as it has been quite a long time since
   1340          * last SID update  was performed                            */
   1341 
   1342         tmp_int_length = st->since_last_sid;
   1343 
   1344         if (tmp_int_length > 32)
   1345         {
   1346             tmp_int_length = 32;
   1347         }
   1348         else if (tmp_int_length <= 0)
   1349         {
   1350             /* safety guard against division by zero */
   1351             tmp_int_length = 8;
   1352         }
   1353 
   1354         L_temp = ((Word32) tmp_int_length) << 10;
   1355         if (L_temp != (Word32)((Word16) L_temp))
   1356         {
   1357             *pOverflow = 1;
   1358             L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
   1359         }
   1360         temp = (Word16) L_temp;
   1361 
   1362         st->true_sid_period_inv = div_s(1 << 10, temp);
   1363 
   1364         st->since_last_sid = 0;
   1365         Copy(st->lsp, st->lsp_old, M);
   1366         st->old_log_en = st->log_en;
   1367         /* subtract 1/8 in Q11 i.e -6/8 dB */
   1368         st->log_en = sub(st->log_en, 256, pOverflow);
   1369     }
   1370 
   1371     /* reset interpolation length timer
   1372      * if data has been updated.        */
   1373     if ((st->sid_frame != 0) &&
   1374             ((st->valid_data != 0) ||
   1375              ((st->valid_data == 0) && (st->dtxHangoverAdded) != 0)))
   1376     {
   1377         st->since_last_sid =  0;
   1378         st->data_updated = 1;
   1379     }
   1380 
   1381     return;
   1382 }
   1383 
   1384 
   1385 /****************************************************************************/
   1386 
   1387 /*
   1388 ------------------------------------------------------------------------------
   1389  FUNCTION NAME: dtx_dec_activity_update
   1390 ------------------------------------------------------------------------------
   1391  INPUT AND OUTPUT DEFINITIONS
   1392 
   1393  Inputs:
   1394     st = pointer to a structure of type dtx_decState
   1395     lsf =
   1396         frame =
   1397 
   1398  Outputs:
   1399     st points to an updated structure of type dtx_decState
   1400 
   1401  Returns:
   1402     None.
   1403 
   1404  Global Variables Used:
   1405     None.
   1406 
   1407  Local Variables Needed:
   1408     None.
   1409 
   1410 ------------------------------------------------------------------------------
   1411  FUNCTION DESCRIPTION
   1412 
   1413  This function updates the DTX parameters.
   1414 
   1415 ------------------------------------------------------------------------------
   1416  REQUIREMENTS
   1417 
   1418  None
   1419 
   1420 ------------------------------------------------------------------------------
   1421  REFERENCES
   1422 
   1423  dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
   1424 
   1425 ------------------------------------------------------------------------------
   1426  PSEUDO-CODE
   1427 
   1428 void dtx_dec_activity_update(dtx_decState *st,
   1429                              Word16 lsf[],
   1430                              Word16 frame[])
   1431 {
   1432    Word16 i;
   1433 
   1434    Word32 L_frame_en;
   1435    Word16 log_en_e, log_en_m, log_en;
   1436 
   1437    // update lsp history
   1438    st->lsf_hist_ptr = add(st->lsf_hist_ptr,M);
   1439    if (sub(st->lsf_hist_ptr, 80) == 0)
   1440    {
   1441       st->lsf_hist_ptr = 0;
   1442    }
   1443    Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
   1444 
   1445    // compute log energy based on frame energy
   1446    L_frame_en = 0;     // Q0
   1447    for (i=0; i < L_FRAME; i++)
   1448    {
   1449       L_frame_en = L_mac(L_frame_en, frame[i], frame[i]);
   1450    }
   1451    Log2(L_frame_en, &log_en_e, &log_en_m);
   1452 
   1453    // convert exponent and mantissa to Word16 Q10
   1454    log_en = shl(log_en_e, 10);  // Q10
   1455    log_en = add(log_en, shr(log_en_m, 15-10));
   1456 
   1457    // divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193
   1458    log_en = sub(log_en, 7497+1024);
   1459 
   1460    // insert into log energy buffer, no division by two as  *
   1461     * log_en in decoder is Q11
   1462    st->log_en_hist_ptr = add(st->log_en_hist_ptr, 1);
   1463    if (sub(st->log_en_hist_ptr, DTX_HIST_SIZE) == 0)
   1464    {
   1465       st->log_en_hist_ptr = 0;
   1466    }
   1467    st->log_en_hist[st->log_en_hist_ptr] = log_en; // Q11
   1468 }
   1469 
   1470 ------------------------------------------------------------------------------
   1471  RESOURCES USED [optional]
   1472 
   1473  When the code is written for a specific target processor the
   1474  the resources used should be documented below.
   1475 
   1476  HEAP MEMORY USED: x bytes
   1477 
   1478  STACK MEMORY USED: x bytes
   1479 
   1480  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1481                 used to represent cycle count for each subroutine
   1482                 called)
   1483      where: (cycle count variable) = cycle count for [subroutine
   1484                                      name]
   1485 
   1486 ------------------------------------------------------------------------------
   1487  CAUTION [optional]
   1488  [State any special notes, constraints or cautions for users of this function]
   1489 
   1490 ------------------------------------------------------------------------------
   1491 */
   1492 
   1493 void dtx_dec_activity_update(dtx_decState *st,
   1494                              Word16 lsf[],
   1495                              Word16 frame[],
   1496                              Flag   *pOverflow)
   1497 {
   1498     Word16 i;
   1499 
   1500     Word32 L_frame_en;
   1501     Word32 L_temp;
   1502     Word16 log_en_e;
   1503     Word16 log_en_m;
   1504     Word16 log_en;
   1505 
   1506     /* update lsp history */
   1507     st->lsf_hist_ptr += M;
   1508 
   1509     if (st->lsf_hist_ptr == 80)
   1510     {
   1511         st->lsf_hist_ptr = 0;
   1512     }
   1513     Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
   1514 
   1515     /* compute log energy based on frame energy */
   1516     L_frame_en = 0;     /* Q0 */
   1517     for (i = L_FRAME - 1; i >= 0; i--)
   1518     {
   1519         L_temp = ((Word32) frame[i]) * frame[i];
   1520         if (L_temp != (Word32) 0x40000000L)
   1521         {
   1522             L_temp = L_temp << 1;
   1523         }
   1524         else
   1525         {
   1526             L_temp = MAX_32;
   1527         }
   1528         L_frame_en = L_add(L_frame_en, L_temp, pOverflow);
   1529     }
   1530     Log2(L_frame_en, &log_en_e, &log_en_m, pOverflow);
   1531 
   1532     /* convert exponent and mantissa to Word16 Q10 */
   1533     L_temp = ((Word32) log_en_e) << 10;
   1534 
   1535     if (L_temp != (Word32)((Word16) L_temp))
   1536     {
   1537         *pOverflow = 1;
   1538         L_temp = (Word32)((log_en_e > 0) ? MAX_16 : MIN_16);
   1539     }
   1540     log_en_e = (Word16) L_temp;
   1541 
   1542     if (log_en_m < 0)
   1543     {
   1544         log_en_m = ~((~log_en_m) >> 5);
   1545     }
   1546     else
   1547     {
   1548         log_en_m >>= 5;
   1549     }
   1550     log_en = add(log_en_e, log_en_m, pOverflow);
   1551 
   1552     /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */
   1553     log_en = sub(log_en, 7497 + 1024, pOverflow);
   1554 
   1555     /* insert into log energy buffer, no division by two as  *
   1556     * log_en in decoder is Q11                              */
   1557     st->log_en_hist_ptr += 1;
   1558 
   1559     if (st->log_en_hist_ptr == DTX_HIST_SIZE)
   1560     {
   1561         st->log_en_hist_ptr = 0;
   1562     }
   1563     st->log_en_hist[st->log_en_hist_ptr] = log_en; /* Q11 */
   1564 
   1565     return;
   1566 }
   1567 
   1568 /****************************************************************************/
   1569 
   1570 /*
   1571 ------------------------------------------------------------------------------
   1572  FUNCTION NAME: rx_dtx_handler
   1573 ------------------------------------------------------------------------------
   1574  INPUT AND OUTPUT DEFINITIONS
   1575 
   1576  Inputs:
   1577     st = pointer to a structure of type dtx_decState
   1578     frame_type = RX frame type
   1579 
   1580  Returns:
   1581     newState = variable of type DTXStateType
   1582 
   1583  Outputs:
   1584     st points to an updated structure of type dtx_decState
   1585 
   1586  Global Variables Used:
   1587     None.
   1588 
   1589  Local Variables Needed:
   1590     None.
   1591 
   1592 ------------------------------------------------------------------------------
   1593  FUNCTION DESCRIPTION
   1594 
   1595  This function determines the new state of the decoder based on the frame_type
   1596  and sets up the decoder parameters according to newState.
   1597 
   1598  Table of new SPD synthesis states
   1599 
   1600                            |     previous SPD_synthesis_state
   1601      Incoming              |
   1602      frame_type            | SPEECH       | DTX           | DTX_MUTE
   1603      ---------------------------------------------------------------
   1604      RX_SPEECH_GOOD ,      |              |               |
   1605      RX_SPEECH_PR_DEGRADED | SPEECH       | SPEECH        | SPEECH
   1606      ----------------------------------------------------------------
   1607      RX_SPEECH_PR_BAD,     |              |               |
   1608      RX_SPEECH_BAD,        | SPEECH       | DTX           | DTX_MUTE
   1609      ----------------------------------------------------------------
   1610      RX_SID_FIRST,         | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
   1611      ----------------------------------------------------------------
   1612      RX_SID_UPDATE,        | DTX          | DTX           | DTX
   1613      ----------------------------------------------------------------
   1614      RX_SID_BAD,           | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
   1615      ----------------------------------------------------------------
   1616      RX_NO_DATA            | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
   1617                            |(class2 garb.)|               |
   1618      ----------------------------------------------------------------
   1619      RX_ONSET              | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
   1620                            |(class2 garb.)|               |
   1621      ----------------------------------------------------------------
   1622 
   1623 ------------------------------------------------------------------------------
   1624  REQUIREMENTS
   1625 
   1626  None
   1627 
   1628 ------------------------------------------------------------------------------
   1629  REFERENCES
   1630 
   1631  dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
   1632 
   1633 ------------------------------------------------------------------------------
   1634  PSEUDO-CODE
   1635 
   1636 enum DTXStateType rx_dtx_handler(
   1637                       dtx_decState *st,           // i/o : State struct
   1638                       enum RXFrameType frame_type // i   : Frame type
   1639                       )
   1640 {
   1641    enum DTXStateType newState;
   1642    enum DTXStateType encState;
   1643 
   1644    // DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH)
   1645    if ((sub(frame_type, RX_SID_FIRST) == 0)   ||
   1646        (sub(frame_type, RX_SID_UPDATE) == 0)  ||
   1647        (sub(frame_type, RX_SID_BAD) == 0)     ||
   1648        (((sub(st->dtxGlobalState, DTX) == 0) ||
   1649          (sub(st->dtxGlobalState, DTX_MUTE) == 0)) &&
   1650         ((sub(frame_type, RX_NO_DATA) == 0) ||
   1651          (sub(frame_type, RX_SPEECH_BAD) == 0) ||
   1652          (sub(frame_type, RX_ONSET) == 0))))
   1653    {
   1654       newState = DTX;
   1655 
   1656       // stay in mute for these input types
   1657       if ((sub(st->dtxGlobalState, DTX_MUTE) == 0) &&
   1658           ((sub(frame_type, RX_SID_BAD) == 0) ||
   1659            (sub(frame_type, RX_SID_FIRST) ==  0) ||
   1660            (sub(frame_type, RX_ONSET) ==  0) ||
   1661            (sub(frame_type, RX_NO_DATA) == 0)))
   1662       {
   1663          newState = DTX_MUTE;
   1664       }
   1665 
   1666       // evaluate if noise parameters are too old
   1667       // since_last_sid is reset when CN parameters have been updated
   1668       st->since_last_sid = add(st->since_last_sid, 1);
   1669 
   1670       // no update of sid parameters in DTX for a long while
   1671       // Due to the delayed update of  st->since_last_sid counter
   1672       // SID_UPDATE frames need to be handled separately to avoid
   1673       // entering DTX_MUTE for late SID_UPDATE frames
   1674       if((sub(frame_type, RX_SID_UPDATE) != 0) &&
   1675          (sub(st->since_last_sid, DTX_MAX_EMPTY_THRESH) > 0))
   1676       {
   1677          newState = DTX_MUTE;
   1678       }
   1679    }
   1680    else
   1681    {
   1682       newState = SPEECH;
   1683       st->since_last_sid = 0;
   1684    }
   1685 
   1686     // reset the decAnaElapsed Counter when receiving CNI data the first
   1687     // time, to robustify counter missmatch after handover
   1688     // this might delay the bwd CNI analysis in the new decoder slightly.
   1689 
   1690    if ((st->data_updated == 0) &&
   1691        (sub(frame_type, RX_SID_UPDATE) == 0))
   1692    {
   1693       st->decAnaElapsedCount = 0;
   1694    }
   1695 
   1696    // update the SPE-SPD DTX hangover synchronization
   1697    // to know when SPE has added dtx hangover
   1698    st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
   1699    st->dtxHangoverAdded = 0;
   1700 
   1701    if ((sub(frame_type, RX_SID_FIRST) == 0)  ||
   1702        (sub(frame_type, RX_SID_UPDATE) == 0) ||
   1703        (sub(frame_type, RX_SID_BAD) == 0)    ||
   1704        (sub(frame_type, RX_ONSET) == 0)      ||
   1705        (sub(frame_type, RX_NO_DATA) == 0))
   1706    {
   1707       encState = DTX;
   1708 
   1709       // In frame errors simulations RX_NO_DATA may occasionally mean that
   1710       // a speech packet was probably sent by the encoder,
   1711       // the assumed _encoder_ state should be SPEECH in such cases.
   1712       if((sub(frame_type, RX_NO_DATA) == 0) &&
   1713          (sub(newState, SPEECH) == 0))
   1714       {
   1715          encState = SPEECH;
   1716       }
   1717 
   1718       // Note on RX_ONSET operation differing from RX_NO_DATA operation:
   1719       // If a  RX_ONSET is received in the decoder (by "accident")
   1720       // it is still most likely that the encoder  state
   1721       // for the "ONSET frame" was DTX.
   1722 
   1723    }
   1724    else
   1725    {
   1726       encState = SPEECH;
   1727    }
   1728 
   1729    if (sub(encState, SPEECH) == 0)
   1730    {
   1731       st->dtxHangoverCount = DTX_HANG_CONST;
   1732    }
   1733    else
   1734    {
   1735       if (sub(st->decAnaElapsedCount, DTX_ELAPSED_FRAMES_THRESH) > 0)
   1736       {
   1737          st->dtxHangoverAdded = 1;
   1738          st->decAnaElapsedCount = 0;
   1739          st->dtxHangoverCount = 0;
   1740       }
   1741       else if (st->dtxHangoverCount == 0)
   1742       {
   1743          st->decAnaElapsedCount = 0;
   1744       }
   1745       else
   1746       {
   1747          st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
   1748       }
   1749    }
   1750 
   1751    if (sub(newState, SPEECH) != 0)
   1752    {
   1753       // DTX or DTX_MUTE
   1754       // CN data is not in a first SID, first SIDs are marked as SID_BAD
   1755       //  but will do backwards analysis if a hangover period has been added
   1756       // according to the state machine above
   1757 
   1758       st->sid_frame = 0;
   1759       st->valid_data = 0;
   1760 
   1761       if (sub(frame_type, RX_SID_FIRST) == 0)
   1762       {
   1763          st->sid_frame = 1;
   1764       }
   1765       else if (sub(frame_type, RX_SID_UPDATE) == 0)
   1766       {
   1767          st->sid_frame = 1;
   1768          st->valid_data = 1;
   1769       }
   1770       else if (sub(frame_type, RX_SID_BAD) == 0)
   1771       {
   1772          st->sid_frame = 1;
   1773          st->dtxHangoverAdded = 0; // use old data
   1774       }
   1775    }
   1776 
   1777    return newState;
   1778    // newState is used by both SPEECH AND DTX synthesis routines
   1779 }
   1780 
   1781 ------------------------------------------------------------------------------
   1782  RESOURCES USED [optional]
   1783 
   1784  When the code is written for a specific target processor the
   1785  the resources used should be documented below.
   1786 
   1787  HEAP MEMORY USED: x bytes
   1788 
   1789  STACK MEMORY USED: x bytes
   1790 
   1791  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1792                 used to represent cycle count for each subroutine
   1793                 called)
   1794      where: (cycle count variable) = cycle count for [subroutine
   1795                                      name]
   1796 
   1797 ------------------------------------------------------------------------------
   1798  CAUTION [optional]
   1799  [State any special notes, constraints or cautions for users of this function]
   1800 
   1801 ------------------------------------------------------------------------------
   1802 */
   1803 
   1804 enum DTXStateType rx_dtx_handler(
   1805     dtx_decState *st,           /* i/o : State struct     */
   1806     enum RXFrameType frame_type,/* i   : Frame type       */
   1807     Flag *pOverflow)
   1808 {
   1809     enum DTXStateType newState;
   1810     enum DTXStateType encState;
   1811 
   1812 
   1813     /* DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH) */
   1814 
   1815     if ((frame_type == RX_SID_FIRST)   ||
   1816             (frame_type == RX_SID_UPDATE)  ||
   1817             (frame_type == RX_SID_BAD)     ||
   1818             (((st->dtxGlobalState == DTX) || (st->dtxGlobalState == DTX_MUTE)) &&
   1819              ((frame_type == RX_NO_DATA) || (frame_type == RX_SPEECH_BAD) ||
   1820               (frame_type == RX_ONSET))))
   1821     {
   1822         newState = DTX;
   1823 
   1824         /* stay in mute for these input types */
   1825 
   1826         if ((st->dtxGlobalState == DTX_MUTE) &&
   1827                 ((frame_type == RX_SID_BAD) ||
   1828                  (frame_type == RX_SID_FIRST) ||
   1829                  (frame_type == RX_ONSET) ||
   1830                  (frame_type == RX_NO_DATA)))
   1831         {
   1832             newState = DTX_MUTE;
   1833         }
   1834 
   1835         /* evaluate if noise parameters are too old                     */
   1836         /* since_last_sid is reset when CN parameters have been updated */
   1837         st->since_last_sid = add(st->since_last_sid, 1, pOverflow);
   1838 
   1839         /* no update of sid parameters in DTX for a long while      */
   1840         /* Due to the delayed update of  st->since_last_sid counter */
   1841         /* SID_UPDATE frames need to be handled separately to avoid */
   1842         /* entering DTX_MUTE for late SID_UPDATE frames             */
   1843         if ((frame_type != RX_SID_UPDATE) &&
   1844                 (st->since_last_sid > DTX_MAX_EMPTY_THRESH))
   1845         {
   1846             newState = DTX_MUTE;
   1847         }
   1848     }
   1849     else
   1850     {
   1851         newState = SPEECH;
   1852         st->since_last_sid = 0;
   1853     }
   1854 
   1855     /*
   1856     reset the decAnaElapsed Counter when receiving CNI data the first
   1857     time, to robustify counter missmatch after handover
   1858     this might delay the bwd CNI analysis in the new decoder slightly.
   1859     */
   1860 
   1861     if ((st->data_updated == 0) &&
   1862             (frame_type == RX_SID_UPDATE))
   1863     {
   1864         st->decAnaElapsedCount = 0;
   1865     }
   1866 
   1867     /* update the SPE-SPD DTX hangover synchronization */
   1868     /* to know when SPE has added dtx hangover         */
   1869     st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1, pOverflow);
   1870     st->dtxHangoverAdded = 0;
   1871 
   1872     if ((frame_type == RX_SID_FIRST)  ||
   1873             (frame_type == RX_SID_UPDATE) ||
   1874             (frame_type == RX_SID_BAD)    ||
   1875             (frame_type == RX_ONSET) ||
   1876             (frame_type == RX_NO_DATA))
   1877     {
   1878         encState = DTX;
   1879 
   1880         /*
   1881          In frame errors simulations RX_NO_DATA may occasionally mean that
   1882          a speech packet was probably sent by the encoder,
   1883          the assumed _encoder_ state should be SPEECH in such cases.
   1884         */
   1885         if ((frame_type == RX_NO_DATA) &&
   1886                 (newState == SPEECH))
   1887         {
   1888             encState = SPEECH;
   1889         }
   1890 
   1891         /*
   1892          Note on RX_ONSET operation differing from RX_NO_DATA operation:
   1893          If a  RX_ONSET is received in the decoder (by "accident")
   1894          it is still most likely that the encoder  state
   1895          for the "ONSET frame" was DTX.
   1896         */
   1897     }
   1898     else
   1899     {
   1900         encState = SPEECH;
   1901     }
   1902 
   1903 
   1904     if (encState == SPEECH)
   1905     {
   1906         st->dtxHangoverCount = DTX_HANG_CONST;
   1907     }
   1908     else
   1909     {
   1910 
   1911         if (st->decAnaElapsedCount > DTX_ELAPSED_FRAMES_THRESH)
   1912         {
   1913             st->dtxHangoverAdded = 1;
   1914             st->decAnaElapsedCount = 0;
   1915             st->dtxHangoverCount = 0;
   1916         }
   1917         else if (st->dtxHangoverCount == 0)
   1918         {
   1919             st->decAnaElapsedCount = 0;
   1920         }
   1921         else
   1922         {
   1923             st->dtxHangoverCount -= 1;
   1924         }
   1925     }
   1926 
   1927     if (newState != SPEECH)
   1928     {
   1929         /* DTX or DTX_MUTE
   1930          * CN data is not in a first SID, first SIDs are marked as SID_BAD
   1931          *  but will do backwards analysis if a hangover period has been added
   1932          *  according to the state machine above
   1933         */
   1934 
   1935         st->sid_frame = 0;
   1936         st->valid_data = 0;
   1937 
   1938         if (frame_type == RX_SID_FIRST)
   1939         {
   1940             st->sid_frame = 1;
   1941         }
   1942         else if (frame_type == RX_SID_UPDATE)
   1943         {
   1944             st->sid_frame = 1;
   1945             st->valid_data = 1;
   1946         }
   1947         else if (frame_type == RX_SID_BAD)
   1948         {
   1949             st->sid_frame = 1;
   1950             st->dtxHangoverAdded = 0; /* use old data */
   1951         }
   1952     }
   1953 
   1954     /* newState is used by both SPEECH AND DTX synthesis routines */
   1955     return(newState);
   1956 }
   1957