dec_main.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:27k
源码类别:

Symbian

开发平台:

C/C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include "hlxclib/stdlib.h"
  7. #include "hlxclib/math.h"
  8. #include "hlxclib/memory.h"
  9. #include "hlxclib/string.h"
  10. #include "typedef.h"
  11. #include "dec_main.h"
  12. #include "dec_dtx.h"
  13. #include "dec_acelp.h"
  14. #include "dec_gain.h"
  15. #include "dec_lpc.h"
  16. #include "dec_util.h"
  17. #define MAX_16 (Word16)0x7fff
  18. #define MIN_16 (Word16)0x8000
  19. #define L_FRAME            256   /* Frame size                             */
  20. #define NB_SUBFR           4     /* Number of subframe per frame           */
  21. #define L_SUBFR            64    /* Subframe size                          */
  22. #define MODE_7k            0     /* modes                                  */
  23. #define MODE_9k            1
  24. #define MODE_12k           2
  25. #define MODE_14k           3
  26. #define MODE_16k           4
  27. #define MODE_18k           5
  28. #define MODE_20k           6
  29. #define MODE_23k           7
  30. #define MODE_24k           8
  31. #define RX_SPEECH_PROBABLY_DEGRADED 1  /* rx types                         */
  32. #define RX_SPEECH_LOST     2
  33. #define RX_SPEECH_BAD      3
  34. #define RX_NO_DATA         7
  35. #define Q_MAX              8     /* scaling max for signal                 */
  36. #define PIT_SHARP          27853 /* pitch sharpening factor = 0.85 Q15     */
  37. #define PIT_MIN            34    /* Minimum pitch lag with resolution 1/4  */
  38. #define PIT_FR2            128   /* Minimum pitch lag with resolution 1/2  */
  39. #define PIT_FR1_9b         160   /* Minimum pitch lag with resolution 1    */
  40. #define PIT_FR1_8b         92    /* Minimum pitch lag with resolution 1    */
  41. extern const Word16 D_ROM_isp[];
  42. extern const Word16 D_ROM_isf[];
  43. extern const Word16 D_ROM_interpol_frac[];
  44. #ifdef WIN32
  45. #pragma warning( disable : 4310)
  46. #endif
  47. /*
  48.  * Decoder_reset
  49.  *
  50.  * Parameters:
  51.  *    st        I/O: pointer to state structure
  52.  *    reset_all   I: perform full reset
  53.  *
  54.  * Function:
  55.  *    Initialisation of variables for the decoder section.
  56.  *
  57.  *
  58.  * Returns:
  59.  *    void
  60.  */
  61. void D_MAIN_reset(void *st, Word16 reset_all)
  62. {
  63.    Word32 i;
  64.    Decoder_State *dec_state;
  65.    dec_state = (Decoder_State*)st;
  66.    memset(dec_state->mem_exc, 0, (PIT_MAX + L_INTERPOL) * sizeof(Word16));
  67.    memset(dec_state->mem_isf_q, 0, M * sizeof(Word16));
  68.    dec_state->mem_T0_frac = 0;   /* old pitch value = 64.0 */
  69.    dec_state->mem_T0 = 64;
  70.    dec_state->mem_first_frame = 1;
  71.    dec_state->mem_gc_thres = 0;
  72.    dec_state->mem_tilt_code = 0;
  73.    memset(dec_state->mem_ph_disp, 0, 8 * sizeof(Word16));
  74.    /* scaling memories for excitation */
  75.    dec_state->mem_q = Q_MAX;
  76.    dec_state->mem_subfr_q[3] = Q_MAX;
  77.    dec_state->mem_subfr_q[2] = Q_MAX;
  78.    dec_state->mem_subfr_q[1] = Q_MAX;
  79.    dec_state->mem_subfr_q[0] = Q_MAX;
  80.    if(reset_all != 0)
  81.    {
  82.       /* routines initialization */
  83.       D_GAIN_init(dec_state->mem_gain);
  84.       memset(dec_state->mem_oversamp, 0, (2 * 12) * sizeof(Word16));
  85.       memset(dec_state->mem_sig_out, 0, 6 * sizeof(Word16));
  86.       memset(dec_state->mem_hf, 0, (31 - 1) * sizeof(Word16));
  87.       memset(dec_state->mem_hf3, 0, (31 - 1) * sizeof(Word16));
  88.       memset(dec_state->mem_hp400, 0, 6 * sizeof(Word16));
  89.       D_GAIN_lag_concealment_init(dec_state->mem_lag);
  90.       /* isp initialization */
  91.       memcpy(dec_state->mem_isp, D_ROM_isp, M * sizeof(Word16));
  92.       memcpy(dec_state->mem_isf, D_ROM_isf, M * sizeof(Word16));
  93.       for(i = 0; i < L_MEANBUF; i++)
  94.       {
  95.          memcpy(&dec_state->mem_isf_buf[i * M], D_ROM_isf, M * sizeof(Word16));
  96.       }
  97.       /* variable initialization */
  98.       dec_state->mem_deemph = 0;
  99.       dec_state->mem_seed = 21845;   /* init random with 21845 */
  100.       dec_state->mem_seed2 = 21845;
  101.       dec_state->mem_seed3 = 21845;
  102.       dec_state->mem_state = 0;
  103.       dec_state->mem_bfi = 0;
  104.       /* Static vectors to zero */
  105.       memset(dec_state->mem_syn_hf, 0, M16k * sizeof(Word16));
  106.       memset(dec_state->mem_syn_hi, 0, M * sizeof(Word16));
  107.       memset(dec_state->mem_syn_lo, 0, M * sizeof(Word16));
  108.       D_DTX_reset(dec_state->dtx_decSt, D_ROM_isf);
  109.       dec_state->mem_vad_hist = 0;
  110.    }
  111.    return;
  112. }
  113. /*
  114.  * Decoder_init
  115.  *
  116.  * Parameters:
  117.  *    spd_state         O: pointer to state structure
  118.  *
  119.  * Function:
  120.  *    Initialization of variables for the decoder section.
  121.  *    Memory allocation.
  122.  *
  123.  * Returns:
  124.  *    return zero if succesful
  125.  */
  126. Word32 D_MAIN_init(void **spd_state)
  127. {
  128.    /* Decoder states */
  129.    Decoder_State *st;
  130.    *spd_state = NULL;
  131.    /*
  132.     * Memory allocation for coder state.
  133.     */
  134.    if((st = (Decoder_State*)malloc(sizeof(Decoder_State))) == NULL)
  135.    {
  136.       return(-1);
  137.    }
  138.    st->dtx_decSt = NULL;
  139.    D_DTX_init(&st->dtx_decSt, D_ROM_isf);
  140.    D_MAIN_reset((void *)st, 1);
  141.    *spd_state = (void *)st;
  142.    return(0);
  143. }
  144. /*
  145.  * Decoder_close
  146.  *
  147.  * Parameters:
  148.  *    spd_state   I: pointer to state structure
  149.  *
  150.  * Function:
  151.  *    Free coder memory.
  152.  *
  153.  * Returns:
  154.  *    void
  155.  */
  156. void D_MAIN_close(void **spd_state)
  157. {
  158.    D_DTX_exit(&(((Decoder_State *)(*spd_state))->dtx_decSt));
  159.    free(*spd_state);
  160.    return;
  161. }
  162. /*
  163.  * Decoder_exe
  164.  *
  165.  * Parameters:
  166.  *    mode           I: used mode
  167.  *    prms           I: parameter vector
  168.  *    synth_out      O: synthesis speech
  169.  *    spe_state      B: state structure
  170.  *    frame_type     I: received frame type
  171.  *
  172.  * Function:
  173.  *    Main decoder routine.
  174.  *
  175.  * Returns:
  176.  *    0 if successful
  177.  */
  178. Word32 D_MAIN_decode(Word16 mode, Word16 prms[], Word16 synth16k[],
  179.                      void *spd_state, UWord8 frame_type)
  180. {
  181.    Word32 code2[L_SUBFR];           /* algebraic codevector                */
  182.    Word32 L_tmp, L_tmp2, L_gain_code, L_stab_fac;
  183.    Word32 i, j, i_subfr, pit_flag;
  184.    Word32 T0, T0_frac, T0_max, select, T0_min = 0;
  185.    Word16 exc2[L_FRAME];            /* excitation vector                   */
  186.    Word16 Aq[NB_SUBFR * (M + 1)];   /* A(z) quantized for the 4 subframes  */
  187.    Word16 code[L_SUBFR];            /* algebraic codevector                */
  188.    Word16 excp[L_SUBFR];            /* excitation vector                   */
  189.    Word16 HfIsf[M16k];
  190.    Word16 ispnew[M];                /* immittance spectral pairs at 4nd sfr*/
  191.    Word16 isf[M];                   /* ISF (frequency domain) at 4nd sfr   */
  192.    Word16 isf_tmp[M];               /* ISF tmp                             */
  193.    Word16 ind[8];                   /* quantization indices                */
  194.    Word16 index, fac, voice_fac, max, Q_new = 0;
  195.    Word16 gain_pit, gain_code, gain_code_lo, tmp;
  196.    Word16 corr_gain = 0;
  197.    UWord16 pit_sharp = 0;
  198.    Word16 *exc;                     /* Excitation vector                   */
  199.    Word16 *p_Aq;                    /* ptr to A(z) for the 4 subframes     */
  200.    Word16 *p_isf;                   /* prt to isf                          */
  201.    Decoder_State *st;   /* Decoder states */
  202.    UWord8 newDTXState, bfi, unusable_frame;
  203.    UWord8 vad_flag;
  204.    st = (Decoder_State*)spd_state;
  205.    /* find the new  DTX state  SPEECH OR DTX */
  206.    newDTXState = D_DTX_rx_handler(st->dtx_decSt, frame_type);
  207.    if(newDTXState != SPEECH)
  208.    {
  209.       D_DTX_exe(st->dtx_decSt, exc2, newDTXState, isf, &prms);
  210.    }
  211.    /* SPEECH action state machine  */
  212.    if((frame_type == RX_SPEECH_BAD) | (frame_type == RX_NO_DATA) |
  213.       (frame_type == RX_SPEECH_PROBABLY_DEGRADED))
  214.    {
  215.       /* bfi for all index, bits are not usable */
  216.       bfi = 1;
  217.       unusable_frame = 0;
  218.    }
  219.    else if(frame_type == RX_SPEECH_LOST)
  220.    {
  221.       /* bfi only for lsf, gains and pitch period */
  222.       bfi = 1;
  223.       unusable_frame = 1;
  224.    }
  225.    else
  226.    {
  227.       bfi = 0;
  228.       unusable_frame = 0;
  229.    }
  230.    if(bfi != 0)
  231.    {
  232.       st->mem_state = (UWord8)(st->mem_state + 1);
  233.       if(st->mem_state > 6)
  234.       {
  235.          st->mem_state = 6;
  236.       }
  237.    }
  238.    else
  239.    {
  240.       st->mem_state = (UWord8)(st->mem_state >> 1);
  241.    }
  242.    /*
  243.     * If this frame is the first speech frame after CNI period,
  244.     * set the BFH state machine to an appropriate state depending
  245.     * on whether there was DTX muting before start of speech or not
  246.     * If there was DTX muting, the first speech frame is muted.
  247.     * If there was no DTX muting, the first speech frame is not
  248.     * muted. The BFH state machine starts from state 5, however, to
  249.     * keep the audible noise resulting from a SID frame which is
  250.     * erroneously interpreted as a good speech frame as small as
  251.     * possible (the decoder output in this case is quickly muted)
  252.     */
  253.    if(st->dtx_decSt->mem_dtx_global_state == DTX)
  254.    {
  255.       st->mem_state = 5;
  256.       st->mem_bfi = 0;
  257.    }
  258.    else if(st->dtx_decSt->mem_dtx_global_state == D_DTX_MUTE)
  259.    {
  260.       st->mem_state = 5;
  261.       st->mem_bfi = 1;
  262.    }
  263.    if(newDTXState == SPEECH)
  264.    {
  265.       vad_flag = (UWord8)(*prms++);
  266.       if(bfi == 0)
  267.       {
  268.          if(vad_flag == 0)
  269.          {
  270.             st->mem_vad_hist = (Word16)(st->mem_vad_hist + 1);
  271.             if(st->mem_vad_hist > 32767)
  272.             {
  273.                st->mem_vad_hist = 32767;
  274.             }
  275.          }
  276.          else
  277.          {
  278.             st->mem_vad_hist = 0;
  279.          }
  280.       }
  281.    }
  282.    /*
  283.     * DTX-CNG
  284.     */
  285.    if(newDTXState != SPEECH) /* CNG mode */
  286.    {
  287.       /*
  288.        * increase slightly energy of noise below 200 Hz
  289.        * Convert ISFs to the cosine domain
  290.        */
  291.       D_LPC_isf_isp_conversion(isf, ispnew, M);
  292.       D_LPC_isp_a_conversion(ispnew, Aq, M);
  293.       memcpy(isf_tmp, st->mem_isf, M * sizeof(Word16));
  294.       for(i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
  295.       {
  296.          j = (i_subfr >> 6);
  297.          for(i = 0; i < M; i++)
  298.          {
  299.             L_tmp = (isf_tmp[i] * (32767 - D_ROM_interpol_frac[j])) << 1;
  300.             L_tmp = L_tmp + ((isf[i] * D_ROM_interpol_frac[j]) << 1);
  301.             HfIsf[i] = (Word16)((L_tmp + 0x8000) >> 16);
  302.          }
  303.          D_UTIL_dec_synthesis(Aq, &exc2[i_subfr], 0, &synth16k[i_subfr * 5 /4],
  304.             (Word16) 1, HfIsf, mode, newDTXState, bfi, st);
  305.       }
  306.       /* reset speech coder memories */
  307.       D_MAIN_reset(st, 0);
  308.       memcpy(st->mem_isf, isf, M * sizeof(Word16));
  309.       st->mem_bfi = bfi;
  310.       st->dtx_decSt->mem_dtx_global_state = (UWord8)newDTXState;
  311.       return(0);
  312.    }
  313.    /*
  314.     * ACELP
  315.     */
  316.    exc = st->mem_exc + PIT_MAX + L_INTERPOL;
  317.    /* Decode the ISFs */
  318.    if(mode <= MODE_7k)
  319.    {
  320.       ind[0] = *prms++;
  321.       ind[1] = *prms++;
  322.       ind[2] = *prms++;
  323.       ind[3] = *prms++;
  324.       ind[4] = *prms++;
  325.       D_LPC_isf_2s3s_decode(ind, isf, st->mem_isf_q, st->mem_isf,
  326.          st->mem_isf_buf, bfi);
  327.    }
  328.    else
  329.    {
  330.       ind[0] = *prms++;
  331.       ind[1] = *prms++;
  332.       ind[2] = *prms++;
  333.       ind[3] = *prms++;
  334.       ind[4] = *prms++;
  335.       ind[5] = *prms++;
  336.       ind[6] = *prms++;
  337.       D_LPC_isf_2s5s_decode(ind, isf, st->mem_isf_q, st->mem_isf,
  338.          st->mem_isf_buf, bfi);
  339.    }
  340.    /* Convert ISFs to the cosine domain */
  341.    D_LPC_isf_isp_conversion(isf, ispnew, M);
  342.    if(st->mem_first_frame != 0)
  343.    {
  344.       st->mem_first_frame = 0;
  345.       memcpy(st->mem_isp, ispnew, M * sizeof(Word16));
  346.    }
  347.    /* Find the interpolated ISPs and convert to a[] for all subframes */
  348.    D_LPC_int_isp_find(st->mem_isp, ispnew, D_ROM_interpol_frac, Aq);
  349.    /* update isp memory for the next frame */
  350.    memcpy(st->mem_isp, ispnew, M * sizeof(Word16));
  351.    /* Check stability on isf : distance between old isf and current isf */
  352.    L_tmp = 0;
  353.    p_isf = st->mem_isf;
  354.    for(i = 0; i < M - 1; i++)
  355.    {
  356.       tmp = (Word16)((isf[i] - p_isf[i]));
  357.       L_tmp = L_tmp + (tmp * tmp);
  358.    }
  359.    if(L_tmp < 3276928)
  360.    {
  361.       L_tmp = L_tmp >> 7;
  362.       L_tmp = (L_tmp * 26214) >> 15;   /* tmp = L_tmp*0.8/256        */
  363.       L_tmp = 20480 - L_tmp;           /* 1.25 - tmp                 */
  364.       L_stab_fac = L_tmp << 1;         /* Q14 -> Q15 with saturation */
  365.       if(L_stab_fac > 0x7FFF)
  366.       {
  367.          L_stab_fac = 0x7FFF;
  368.       }
  369.    }
  370.    else
  371.    {
  372.       L_stab_fac = 0x0;
  373.    }
  374.    memcpy(isf_tmp, st->mem_isf, M * sizeof(Word16));
  375.    memcpy(st->mem_isf, isf, M * sizeof(Word16));
  376.    /*
  377.     * Loop for every subframe in the analysis frame
  378.     *
  379.     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR
  380.     * times
  381.     *   - decode the pitch delay and filter mode
  382.     *   - decode algebraic code
  383.     *   - decode pitch and codebook gains
  384.     *   - find voicing factor and tilt of code for next subframe
  385.     *   - find the excitation and compute synthesis speech
  386.     */
  387.    p_Aq = Aq;   /* pointer to interpolated LPC parameters */
  388.    for(i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
  389.    {
  390.       pit_flag = i_subfr;
  391.       if((i_subfr == (2 * L_SUBFR)) & (mode > MODE_7k))
  392.       {
  393.          pit_flag = 0;
  394.       }
  395.       /*
  396.        * - Decode pitch lag
  397.        * Lag indeces received also in case of BFI,
  398.        * so that the parameter pointer stays in sync.
  399.        */
  400.       if(pit_flag == 0)
  401.       {
  402.          if(mode <= MODE_9k)
  403.          {
  404.             index = *prms++;
  405.             if(index < ((PIT_FR1_8b - PIT_MIN) * 2))
  406.             {
  407.                T0 = (PIT_MIN + (index >> 1));
  408.                T0_frac = (index - ((T0 - PIT_MIN) << 1));
  409.                T0_frac = (T0_frac << 1);
  410.             }
  411.             else
  412.             {
  413.                T0 = index + (PIT_FR1_8b - ((PIT_FR1_8b - PIT_MIN) * 2));
  414.                T0_frac = 0;
  415.             }
  416.          }
  417.          else
  418.          {
  419.             index = *prms++;
  420.             if(index < ((PIT_FR2 - PIT_MIN) * 4))
  421.             {
  422.                T0 = PIT_MIN + (index >> 2);
  423.                T0_frac = index - ((T0 - PIT_MIN) << 2);
  424.             }
  425.             else if(index <
  426.                ((((PIT_FR2 - PIT_MIN) * 4) + ((PIT_FR1_9b - PIT_FR2) * 2))))
  427.             {
  428.                index = (Word16)((index - ((PIT_FR2 - PIT_MIN) * 4)));
  429.                T0 = PIT_FR2 + (index >> 1);
  430.                T0_frac = index - ((T0 - PIT_FR2) << 1);
  431.                T0_frac = T0_frac << 1;
  432.             }
  433.             else
  434.             {
  435.                T0 = index + (PIT_FR1_9b - ((PIT_FR2 - PIT_MIN) * 4) -
  436.                   ((PIT_FR1_9b - PIT_FR2) * 2));
  437.                T0_frac = 0;
  438.             }
  439.          }
  440.          /* find T0_min and T0_max for subframe 2 and 4 */
  441.          T0_min = T0 - 8;
  442.          if(T0_min < PIT_MIN)
  443.          {
  444.             T0_min = PIT_MIN;
  445.          }
  446.          T0_max = T0_min + 15;
  447.          if(T0_max > PIT_MAX)
  448.          {
  449.             T0_max = PIT_MAX;
  450.             T0_min = T0_max - 15;
  451.          }
  452.       }
  453.       else
  454.       {   /* if subframe 2 or 4 */
  455.          if(mode <= MODE_9k)
  456.          {
  457.             index = *prms++;
  458.             T0 = T0_min + (index >> 1);
  459.             T0_frac = index - ((T0 - T0_min) << 1);
  460.             T0_frac = T0_frac << 1;
  461.          }
  462.          else
  463.          {
  464.             index = *prms++;
  465.             T0 = T0_min + (index >> 2);
  466.             T0_frac = index - ((T0 - T0_min) << 2);
  467.          }
  468.       }
  469.       /* check BFI after pitch lag decoding */
  470.       if(bfi != 0) /* if frame erasure */
  471.       {
  472.          D_GAIN_lag_concealment(&(st->mem_gain[17]), st->mem_lag, &T0,
  473.             &(st->mem_T0), &(st->mem_seed3), unusable_frame);
  474.          T0_frac = 0;
  475.       }
  476.       /*
  477.        * Find the pitch gain, the interpolation filter
  478.        * and the adaptive codebook vector.
  479.        */
  480.       D_GAIN_adaptive_codebook_excitation(&exc[i_subfr], T0, T0_frac);
  481.       if(unusable_frame)
  482.       {
  483.          select = 1;
  484.       }
  485.       else
  486.       {
  487.          if(mode <= MODE_9k)
  488.          {
  489.             select = 0;
  490.          }
  491.          else
  492.          {
  493.             select = *prms++;
  494.          }
  495.       }
  496.       if(select == 0)
  497.       {
  498.          /* find pitch excitation with lp filter */
  499.          for(i = 0; i < L_SUBFR; i++)
  500.          {
  501.             L_tmp = 2949 * exc[i - 1 + i_subfr];
  502.             L_tmp = L_tmp + (10486 * exc[i + i_subfr]);
  503.             L_tmp = L_tmp + (2949 * exc[i + 1 + i_subfr]);
  504.             code[i] = (Word16)((L_tmp + 0x2000) >> 14);
  505.          }
  506.          memcpy(&exc[i_subfr], code, L_SUBFR * sizeof(Word16));
  507.       }
  508.       /*
  509.        * Decode innovative codebook.
  510.        * Add the fixed-gain pitch contribution to code[].
  511.        */
  512.       if(unusable_frame != 0)
  513.       {
  514.          /* the innovative code doesn't need to be scaled (see Q_gain2) */
  515.          for(i = 0; i < L_SUBFR; i++)
  516.          {
  517.             code[i] = (Word16)(D_UTIL_random(&(st->mem_seed)) >> 3);
  518.          }
  519.       }
  520.       else if(mode <= MODE_7k)
  521.       {
  522.          ind[0] = *prms++;
  523.          D_ACELP_decode_2t(ind[0], code);
  524.       }
  525.       else if(mode <= MODE_9k)
  526.       {
  527.          memcpy(ind, prms, 4 * sizeof(Word16));
  528.          prms += 4;
  529.          D_ACELP_decode_4t(ind, 20, code);
  530.       }
  531.       else if(mode <= MODE_12k)
  532.       {
  533.          memcpy(ind, prms, 4 * sizeof(Word16));
  534.          prms += 4;
  535.          D_ACELP_decode_4t(ind, 36, code);
  536.       }
  537.       else if(mode <= MODE_14k)
  538.       {
  539.          memcpy(ind, prms, 4 * sizeof(Word16));
  540.          prms += 4;
  541.          D_ACELP_decode_4t(ind, 44, code);
  542.       }
  543.       else if(mode <= MODE_16k)
  544.       {
  545.          memcpy(ind, prms, 4 * sizeof(Word16));
  546.          prms += 4;
  547.          D_ACELP_decode_4t(ind, 52, code);
  548.       }
  549.       else if(mode <= MODE_18k)
  550.       {
  551.          memcpy(ind, prms, 8 * sizeof(Word16));
  552.          prms += 8;
  553.          D_ACELP_decode_4t(ind, 64, code);
  554.       }
  555.       else if(mode <= MODE_20k)
  556.       {
  557.          memcpy(ind, prms, 8 * sizeof(Word16));
  558.          prms += 8;
  559.          D_ACELP_decode_4t(ind, 72, code);
  560.       }
  561.       else
  562.       {
  563.          memcpy(ind, prms, 8 * sizeof(Word16));
  564.          prms += 8;
  565.          D_ACELP_decode_4t(ind, 88, code);
  566.       }
  567.       tmp = 0;
  568.       D_UTIL_preemph(code, st->mem_tilt_code, L_SUBFR, &tmp);
  569.       L_tmp = T0;
  570.       if(T0_frac > 2)
  571.       {
  572.          L_tmp = L_tmp + 1;
  573.       }
  574.       D_GAIN_pitch_sharpening(code, L_tmp, PIT_SHARP);
  575.       /*
  576.        * Decode codebooks gains.
  577.        */
  578.       index = *prms++;   /* codebook gain index */
  579.       if(mode <= MODE_9k)
  580.       {
  581.          D_GAIN_decode(index, 6, code, &gain_pit, &L_gain_code, bfi,
  582.             st->mem_bfi, st->mem_state, unusable_frame, st->mem_vad_hist,
  583.             st->mem_gain);
  584.       }
  585.       else
  586.       {
  587.          D_GAIN_decode(index, 7, code, &gain_pit, &L_gain_code, bfi,
  588.             st->mem_bfi, st->mem_state, unusable_frame, st->mem_vad_hist,
  589.             st->mem_gain);
  590.       }
  591.       /* find best scaling to perform on excitation (Q_new) */
  592.       tmp = st->mem_subfr_q[0];
  593.       for(i = 1; i < 4; i++)
  594.       {
  595.          if(st->mem_subfr_q[i] < tmp)
  596.          {
  597.             tmp = st->mem_subfr_q[i];
  598.          }
  599.       }
  600.       /* limit scaling (Q_new) to Q_MAX */
  601.       if(tmp > Q_MAX)
  602.       {
  603.          tmp = Q_MAX;
  604.       }
  605.       Q_new = 0;
  606.       L_tmp = L_gain_code;   /* L_gain_code in Q16 */
  607.       while((L_tmp < 0x08000000L) && (Q_new < tmp))
  608.       {
  609.          L_tmp = (L_tmp << 1);
  610.          Q_new = (Word16)((Q_new + 1));
  611.       }
  612.       if(L_tmp < 0x7FFF7FFF)
  613.       {
  614.          gain_code = (Word16)((L_tmp + 0x8000) >> 16);
  615.          /* scaled gain_code with Qnew */
  616.       }
  617.       else
  618.       {
  619.          gain_code = 32767;
  620.       }
  621.       if(Q_new > st->mem_q)
  622.       {
  623.          D_UTIL_signal_up_scale(exc + i_subfr - (PIT_MAX + L_INTERPOL),
  624.             PIT_MAX + L_INTERPOL + L_SUBFR, (Word16)(Q_new - st->mem_q));
  625.       }
  626.       else
  627.       {
  628.          D_UTIL_signal_down_scale(exc + i_subfr - (PIT_MAX + L_INTERPOL),
  629.             PIT_MAX + L_INTERPOL + L_SUBFR, (Word16)(st->mem_q - Q_new));
  630.       }
  631.       st->mem_q = Q_new;
  632.       /*
  633.        * Update parameters for the next subframe.
  634.        * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)
  635.        */
  636.       if(bfi == 0)
  637.       {
  638.          /* LTP-Lag history update */
  639.          for(i = 4; i > 0; i--)
  640.          {
  641.             st->mem_lag[i] = st->mem_lag[i - 1];
  642.          }
  643.          st->mem_lag[0] = (Word16)T0;
  644.          st->mem_T0 = (Word16)T0;
  645.          st->mem_T0_frac = 0;   /* Remove fraction in case of BFI */
  646.       }
  647.       /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
  648.       memcpy(exc2, &exc[i_subfr], L_SUBFR * sizeof(Word16));
  649.       D_UTIL_signal_down_scale(exc2, L_SUBFR, 3);
  650.       /* post processing of excitation elements */
  651.       if(mode <= MODE_9k)
  652.       {
  653.          pit_sharp = (Word16)(gain_pit << 1);
  654.          if(pit_sharp > 16384)
  655.          {
  656.             if(pit_sharp > 32767)
  657.             {
  658.                pit_sharp = 32767;
  659.             }
  660.             for(i = 0; i < L_SUBFR; i++)
  661.             {
  662.                L_tmp = (exc2[i] * pit_sharp) >> 15;
  663.                L_tmp = L_tmp * gain_pit;
  664.                excp[i] = (Word16)((L_tmp + 0x8000) >> 16);
  665.             }
  666.          }
  667.       }
  668.       voice_fac = D_GAIN_find_voice_factor(exc2, -3, gain_pit, code, gain_code,
  669.          L_SUBFR);
  670.       /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
  671.       st->mem_tilt_code = (Word16)((voice_fac >> 2) + 8192);
  672.       /*
  673.        * Find the total excitation.
  674.        * Find synthesis speech corresponding to exc[].
  675.        * Find maximum value of excitation for next scaling
  676.        */
  677.       memcpy(exc2, &exc[i_subfr], L_SUBFR * sizeof(Word16));
  678.       max = 1;
  679.       for(i = 0; i < L_SUBFR; i++)
  680.       {
  681.          L_tmp = (code[i] * gain_code) << 5;
  682.          L_tmp = L_tmp + (exc[i + i_subfr] * gain_pit);
  683.          L_tmp = (L_tmp + 0x2000) >> 14;
  684.          if((L_tmp > MIN_16) & (L_tmp < 32768))
  685.          {
  686.             exc[i + i_subfr] = (Word16)L_tmp;
  687.             tmp = (Word16)(abs(L_tmp));
  688.             if(tmp > max)
  689.             {
  690.                max = tmp;
  691.             }
  692.          }
  693.          else if(L_tmp > MAX_16)
  694.          {
  695.             exc[i + i_subfr] = MAX_16;
  696.             max = MAX_16;
  697.          }
  698.          else
  699.          {
  700.             exc[i + i_subfr] = MIN_16;
  701.             max = MAX_16;
  702.          }
  703.       }
  704.       /* tmp = scaling possible according to max value of excitation */
  705.       tmp = (Word16)((D_UTIL_norm_s(max) + Q_new) - 1);
  706.       st->mem_subfr_q[3] = st->mem_subfr_q[2];
  707.       st->mem_subfr_q[2] = st->mem_subfr_q[1];
  708.       st->mem_subfr_q[1] = st->mem_subfr_q[0];
  709.       st->mem_subfr_q[0] = tmp;
  710.       /*
  711.        * phase dispersion to enhance noise in low bit rate
  712.        */
  713.       /* L_gain_code in Q16 */
  714.       D_UTIL_l_extract(L_gain_code, &gain_code, &gain_code_lo);
  715.       if(mode <= MODE_7k)
  716.       {
  717.          j = 0;   /* high dispersion for rate <= 7.5 kbit/s */
  718.       }
  719.       else if(mode <= MODE_9k)
  720.       {
  721.          j = 1;   /* low dispersion for rate <= 9.6 kbit/s */
  722.       }
  723.       else
  724.       {
  725.          j = 2;   /* no dispersion for rate > 9.6 kbit/s */
  726.       }
  727.       D_ACELP_phase_dispersion(gain_code, gain_pit, code, (Word16)j,
  728.          st->mem_ph_disp);
  729.       /*
  730.        * noise enhancer
  731.        * - Enhance excitation on noise. (modify gain of code)
  732.        *   If signal is noisy and LPC filter is stable, move gain
  733.        *   of code 1.5 dB toward gain of code threshold.
  734.        *   This decrease by 3 dB noise energy variation.
  735.        */
  736.       L_tmp = 16384 - (voice_fac >> 1);   /* 1=unvoiced, 0=voiced */
  737.       fac = (Word16)((L_stab_fac * L_tmp) >> 15);
  738.       L_tmp = L_gain_code;
  739.       if(L_tmp < st->mem_gc_thres)
  740.       {
  741.          L_tmp = (L_tmp + D_UTIL_mpy_32_16(gain_code, gain_code_lo, 6226));
  742.          if(L_tmp > st->mem_gc_thres)
  743.          {
  744.             L_tmp = st->mem_gc_thres;
  745.          }
  746.       }
  747.       else
  748.       {
  749.          L_tmp = D_UTIL_mpy_32_16(gain_code, gain_code_lo, 27536);
  750.          if(L_tmp < st->mem_gc_thres)
  751.          {
  752.             L_tmp = st->mem_gc_thres;
  753.          }
  754.       }
  755.       st->mem_gc_thres = L_tmp;
  756.       L_gain_code =
  757.          D_UTIL_mpy_32_16(gain_code, gain_code_lo, (Word16)(32767 - fac));
  758.       D_UTIL_l_extract(L_tmp, &gain_code, &gain_code_lo);
  759.       L_gain_code =
  760.          L_gain_code + D_UTIL_mpy_32_16(gain_code, gain_code_lo, fac);
  761.       /*
  762.        * pitch enhancer
  763.        * - Enhance excitation on voice. (HP filtering of code)
  764.        *   On voiced signal, filtering of code by a smooth fir HP
  765.        *   filter to decrease energy of code in low frequency.
  766.        */
  767.       L_tmp2 = (voice_fac >> 3) + 4096;   /* 0.25=voiced, 0=unvoiced */
  768.       L_tmp = (code[0] << 15) - (code[1] * L_tmp2);
  769.       code2[0] = (L_tmp + 0x4000) >> 15;
  770.       for(i = 1; i < L_SUBFR - 1; i++)
  771.       {
  772.          L_tmp = code[i] << 15;
  773.          L_tmp = L_tmp - (code[i + 1] * L_tmp2);
  774.          L_tmp = L_tmp - (code[i - 1] * L_tmp2);
  775.          code2[i] = (L_tmp + 0x4000) >> 15;
  776.       }
  777.       L_tmp = code[L_SUBFR - 1] << 15;
  778.       L_tmp = L_tmp - (code[L_SUBFR - 2] * L_tmp2);
  779.       code2[L_SUBFR - 1] = (L_tmp + 0x4000) >> 15;
  780.       /* build excitation */
  781.       gain_code = (Word16)(((L_gain_code << Q_new) + 0x8000) >> 16);
  782.       for(i = 0; i < L_SUBFR; i++)
  783.       {
  784.          L_tmp = (code2[i] * gain_code) << 5;
  785.          L_tmp = L_tmp + (exc2[i] * gain_pit);
  786.          L_tmp = (L_tmp + 0x2000) >> 14;
  787.          exc2[i] = D_UTIL_saturate(L_tmp);
  788.       }
  789.       if(mode <= MODE_9k)
  790.       {
  791.          if(pit_sharp > 16384)
  792.          {
  793.             for(i = 0; i < L_SUBFR; i++)
  794.             {
  795.                L_tmp = (excp[i] + exc2[i]);
  796.                excp[i] = D_UTIL_saturate(L_tmp);
  797.             }
  798.             D_GAIN_adaptive_control(exc2, excp, L_SUBFR);
  799.             memcpy(exc2, excp, L_SUBFR * sizeof(Word16));
  800.          }
  801.       }
  802.       if(mode <= MODE_7k)
  803.       {
  804.          j = (i_subfr >> 6);
  805.          for(i = 0; i < M; i++)
  806.          {
  807.             L_tmp = isf_tmp[i] * (32767 - D_ROM_interpol_frac[j]);
  808.             L_tmp = L_tmp + (isf[i] * D_ROM_interpol_frac[j]);
  809.             HfIsf[i] = (Word16)((L_tmp + 0x4000) >> 15);
  810.          }
  811.       }
  812.       else
  813.       {
  814.          memset(st->mem_syn_hf, 0, (M16k - M) * sizeof(Word16));
  815.       }
  816.       if(mode >= MODE_24k)
  817.       {
  818.          corr_gain = *prms++;
  819.          D_UTIL_dec_synthesis(p_Aq, exc2, Q_new, &synth16k[i_subfr * 5 / 4],
  820.             corr_gain, HfIsf, mode, newDTXState, bfi, st);
  821.       }
  822.       else
  823.       {
  824.          D_UTIL_dec_synthesis(p_Aq, exc2, Q_new, &synth16k[i_subfr * 5 / 4], 0,
  825.             HfIsf, mode, newDTXState, bfi, st);
  826.       }
  827.       p_Aq += (M + 1);   /* interpolated LPC parameters for next subframe */
  828.    }
  829.    /*
  830.     * Update signal for next frame
  831.     * -> save past of exc[]
  832.     * -> save pitch parameters.
  833.     */
  834.    memmove(st->mem_exc, &st->mem_exc[L_FRAME], (PIT_MAX + L_INTERPOL) * sizeof(Word16));
  835.    D_UTIL_signal_down_scale(exc, L_FRAME, Q_new);
  836.    D_DTX_activity_update(st->dtx_decSt, isf, exc);
  837.    st->dtx_decSt->mem_dtx_global_state = (UWord8)newDTXState;
  838.    st->mem_bfi = bfi;
  839.    return(0);
  840. }