enc_main.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:42k
源码类别:

Symbian

开发平台:

Visual C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include <stdlib.h>
  7. #include "hlxclib/memory.h"
  8. #include <math.h>
  9. #include <float.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include "enc_dtx.h"
  13. #include "enc_acelp.h"
  14. #include "enc_lpc.h"
  15. #include "enc_main.h"
  16. #include "enc_gain.h"
  17. #include "enc_util.h"
  18. #ifdef WIN32
  19. #pragma warning( disable : 4310)
  20. #endif
  21. #include "typedef.h"
  22. #define MAX_16       (Word16)0x7fff
  23. #define MIN_16       (Word16)0x8000
  24. #define Q_MAX        8        /* scaling max for signal                 */
  25. #define PREEMPH_FAC  0.68F    /* preemphasis factor                     */
  26. #define GAMMA1       0.92F    /* Weighting factor (numerator)           */
  27. #define TILT_FAC     0.68F    /* tilt factor (denominator)              */
  28. #define PIT_MIN      34       /* Minimum pitch lag with resolution 1/4  */
  29. #define PIT_FR2      128      /* Minimum pitch lag with resolution 1/2  */
  30. #define PIT_FR1_9b   160      /* Minimum pitch lag with resolution 1    */
  31. #define PIT_FR1_8b   92       /* Minimum pitch lag with resolution 1    */
  32. #define PIT_MAX      231      /* Maximum pitch lag                      */
  33. #define L_INTERPOL   (16+1)   /* Length of filter for interpolation     */
  34. #define L_FRAME16k   320      /* Frame size at 16kHz                    */
  35. #define L_SUBFR      64       /* Subframe size                          */
  36. #define NB_SUBFR     4        /* Number of subframe per frame           */
  37. #define L_FILT       12       /* Delay of up-sampling filter            */
  38. #define L_NEXT       64       /* Overhead in LP analysis                */
  39. #define MODE_7k      0        /* modes                                  */
  40. #define MODE_9k      1
  41. #define MODE_12k     2
  42. #define MODE_14k     3
  43. #define MODE_16k     4
  44. #define MODE_18k     5
  45. #define MODE_20k     6
  46. #define MODE_23k     7
  47. #define MODE_24k     8
  48. #define MRDTX        10
  49. extern const Word16 E_ROM_isp[];
  50. extern const Word16 E_ROM_isf[];
  51. extern const Word16 E_ROM_interpol_frac[];
  52. /*
  53.  * E_MAIN_reset
  54.  *
  55.  * Parameters:
  56.  *    st        I/O: pointer to state structure
  57.  *    reset_all   I: perform full reset
  58.  *
  59.  * Function:
  60.  *    Initialisation of variables for the coder section.
  61.  *
  62.  *
  63.  * Returns:
  64.  *    void
  65.  */
  66. void E_MAIN_reset(void *st, Word16 reset_all)
  67. {
  68.    Word32 i;
  69.    Coder_State *cod_state;
  70.    cod_state = (Coder_State *) st;
  71.    memset(cod_state->mem_exc, 0, (PIT_MAX + L_INTERPOL) * sizeof(Word16));
  72.    memset(cod_state->mem_isf_q, 0, M * sizeof(Word16));
  73.    memset(cod_state->mem_syn, 0, M * sizeof(Float32));
  74.    cod_state->mem_w0 = 0.0F;
  75.    cod_state->mem_tilt_code = 0;
  76.    cod_state->mem_first_frame = 1;
  77.    E_GAIN_clip_init(cod_state->mem_gp_clip);
  78.    cod_state->mem_gc_threshold = 0.0F;
  79.    if (reset_all != 0)
  80.    {
  81.       /* Set static vectors to zero */
  82.       memset(cod_state->mem_speech, 0, (L_TOTAL - L_FRAME) * sizeof(Float32));
  83.       memset(cod_state->mem_wsp, 0, (PIT_MAX / OPL_DECIM) * sizeof(Float32));
  84.       memset(cod_state->mem_decim2, 0, 3 * sizeof(Float32));
  85.       /* routines initialization */
  86.       memset(cod_state->mem_decim, 0, 2 * L_FILT16k * sizeof(Float32));
  87.       memset(cod_state->mem_sig_in, 0, 4 * sizeof(Float32));
  88.       E_ACELP_Gain2_Q_init(cod_state->mem_gain_q);
  89.       memset(cod_state->mem_hf_wsp, 0, 8 * sizeof(Float32));
  90.       /* isp initialization */
  91.       for (i = 0; i < M - 1; i++)
  92.       {
  93.          cod_state->mem_isp[i] =
  94.             (Float32)cos(3.141592654 * (Float32)(i + 1) / (Float32)M);
  95.       }
  96.       cod_state->mem_isp[M - 1] = 0.045F;
  97.       memcpy(cod_state->mem_isp_q, E_ROM_isp, M * sizeof(Word16));
  98.       /* variable initialization */
  99.       cod_state->mem_preemph = 0.0F;
  100.       cod_state->mem_wsp_df = 0.0F;
  101.       cod_state->mem_q = Q_MAX;
  102.       cod_state->mem_subfr_q[3] = Q_MAX;
  103.       cod_state->mem_subfr_q[2] = Q_MAX;
  104.       cod_state->mem_subfr_q[1] = Q_MAX;
  105.       cod_state->mem_subfr_q[0] = Q_MAX;
  106.       cod_state->mem_ada_w = 0.0F;
  107.       cod_state->mem_ol_gain = 0.0F;
  108.       cod_state->mem_ol_wght_flg = 0;
  109.       for (i = 0; i < 5; i++)
  110.       {
  111.          cod_state->mem_ol_lag[i] = 40;
  112.       }
  113.       cod_state->mem_T0_med = 40;
  114.       memset(cod_state->mem_hp_wsp, 0,
  115.          ( ( L_FRAME / 2 ) / OPL_DECIM + ( PIT_MAX / OPL_DECIM ) )
  116.          * sizeof(Float32) );
  117.       memset(cod_state->mem_syn_hf, 0, M * sizeof(Float32));
  118.       memset(cod_state->mem_syn2, 0, M * sizeof(Float32));
  119.       memset(cod_state->mem_hp400, 0, 4 * sizeof(Float32));
  120.       memset(cod_state->mem_sig_out, 0, 4 * sizeof(Float32));
  121.       memset(cod_state->mem_hf, 0, 2 * L_FILT16k * sizeof(Float32));
  122.       memset(cod_state->mem_hf2, 0, 2 * L_FILT16k * sizeof(Float32));
  123.       memset(cod_state->mem_hf3, 0, 2 * L_FILT16k * sizeof(Float32));
  124.       memcpy(cod_state->mem_isf, E_ROM_isf, M * sizeof(Float32));
  125.       cod_state->mem_deemph = 0.0F;
  126.       cod_state->mem_seed = 21845;
  127.       cod_state->mem_gain_alpha = 1.0F;
  128.       cod_state->mem_vad_hist = 0;
  129.       E_DTX_reset(cod_state->dtx_encSt);
  130.       E_DTX_vad_reset(cod_state->vadSt);
  131.    }
  132. }
  133. /*
  134.  * E_MAIN_init
  135.  *
  136.  * Parameters:
  137.  *    spe_state         I/O: pointer to state structure
  138.  *
  139.  * Function:
  140.  *    Initialisation of variables for the coder section.
  141.  *    Memory allocation.
  142.  *
  143.  * Returns:
  144.  *    void
  145.  */
  146. Word16 E_MAIN_init(void **spe_state)
  147. {
  148.    Coder_State *st;
  149.    *spe_state = NULL;
  150.    /* allocate memory */
  151.    if ((st = (Coder_State *) malloc(sizeof(Coder_State))) == NULL)
  152.    {
  153.       return(-1);
  154.    }
  155.    st->vadSt = NULL;
  156.    st->dtx_encSt = NULL;
  157.    E_DTX_init(&(st->dtx_encSt));
  158.    E_DTX_vad_init(&(st->vadSt));
  159.    E_MAIN_reset((void *) st, 1);
  160.    *spe_state = (void*)st;
  161.    return(0);
  162. }
  163. /*
  164.  * E_MAIN_close
  165.  *
  166.  *
  167.  * Parameters:
  168.  *    spe_state   I: pointer to state structure
  169.  *
  170.  * Function:
  171.  *    Free coder memory.
  172.  *
  173.  *
  174.  * Returns:
  175.  *    void
  176.  */
  177. void E_MAIN_close(void **spe_state)
  178. {
  179.    E_DTX_exit(&( ( (Coder_State *)(*spe_state) )->dtx_encSt));
  180.    E_DTX_vad_exit(&( ( (Coder_State *) (*spe_state) )->vadSt));
  181.    free(*spe_state);
  182.    return;
  183. }
  184. /*
  185.  * E_MAIN_parm_store
  186.  *
  187.  * Parameters:
  188.  *    value       I: parameter value
  189.  *    prms        O: output parameters
  190.  *
  191.  * Function:
  192.  *    Store parameter values
  193.  *
  194.  * Returns:
  195.  *    void
  196.  */
  197. static void E_MAIN_parm_store(Word32 value, Word16 **prms)
  198. {
  199.    **prms = (Word16)value;
  200.    (*prms)++;
  201.    return;
  202. }
  203. /*
  204.  * E_MAIN_encode
  205.  *
  206.  * Parameters:
  207.  *    mode        I: used mode
  208.  *    input_sp    I: 320 new speech samples (at 16 kHz)
  209.  *    prms        O: output parameters
  210.  *    spe_state   B: state structure
  211.  *    allow_dtx   I: DTX ON/OFF
  212.  *
  213.  * Function:
  214.  *    Main coder routine.
  215.  *
  216.  * Returns:
  217.  *    void
  218.  */
  219. Word16 E_MAIN_encode(Word16 * mode, Word16 speech16k[], Word16 prms[],
  220.                     void *spe_state, Word16 allow_dtx)
  221. {
  222.    /* Float32 */
  223.    Float32 f_speech16k[L_FRAME16k];    /* Speech vector                          */
  224.    Float32 f_old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL]; /* Excitation vector */
  225.    Float32 f_exc2[L_FRAME];            /* excitation vector                      */
  226.    Float32 error[M + L_SUBFR];         /* error of quantization                  */
  227.    Float32 A[NB_SUBFR * (M + 1)];      /* A(z) unquantized for the 4 subframes   */
  228.    Float32 Aq[NB_SUBFR * (M + 1)];     /* A(z)   quantized for the 4 subframes   */
  229.    Float32 xn[L_SUBFR];                /* Target vector for pitch search         */
  230.    Float32 xn2[L_SUBFR];               /* Target vector for codebook search      */
  231.    Float32 dn[L_SUBFR];                /* Correlation between xn2 and h1         */
  232.    Float32 cn[L_SUBFR];                /* Target vector in residual domain       */
  233.    Float32 h1[L_SUBFR];                /* Impulse response vector                */
  234.    Float32 f_code[L_SUBFR];            /* Fixed codebook excitation              */
  235.    Float32 y1[L_SUBFR];                /* Filtered adaptive excitation           */
  236.    Float32 y2[L_SUBFR];                /* Filtered adaptive excitation           */
  237.    Float32 synth[L_SUBFR];             /* 12.8kHz synthesis vector               */
  238.    Float32 r[M + 1];                   /* Autocorrelations of windowed speech    */
  239.    Float32 Ap[M + 1];                  /* A(z) with spectral expansion           */
  240.    Float32 ispnew[M];                  /* immittance spectral pairs at 4nd sfr   */
  241.    Float32 isf[M];                     /* ISF (frequency domain) at 4nd sfr      */
  242.    Float32 g_coeff[5], g_coeff2[2];    /* Correlations                           */
  243.    Float32 gain_pit;
  244.    Float32 f_tmp, gain1, gain2;
  245.    Float32 stab_fac = 0.0F, fac;
  246.    Float32 *new_speech, *speech;       /* Speech vector                          */
  247.    Float32 *wsp;                       /* Weighted speech vector                 */
  248.    Float32 *f_exc;                     /* Excitation vector                      */
  249.    Float32 *p_A, *p_Aq;                /* ptr to A(z) for the 4 subframes        */
  250.    Float32 *f_pt_tmp;
  251.    /* Word32 */
  252.    Word32 indice[8];                   /* quantization indices                   */
  253.    Word32 vad_flag, clip_gain;
  254.    Word32 T_op, T_op2, T0, T0_frac;
  255.    Word32 T0_min, T0_max;
  256.    Word32 voice_fac, Q_new = 0;
  257.    Word32 L_gain_code, l_tmp;
  258.    Word32 i, i_subfr, pit_flag;
  259.    /* Word16 */
  260.    Word16 exc2[L_FRAME];               /* excitation vector                      */
  261.    Word16 s_Aq[NB_SUBFR * (M + 1)];    /* A(z) quantized for the 4 subframes     */
  262.    Word16 s_code[L_SUBFR];             /* Fixed codebook excitation              */
  263.    Word16 ispnew_q[M];                 /* quantized ISPs at 4nd subframe         */
  264.    Word16 isfq[M];                     /* quantized ISPs                         */
  265.    Word16 select, codec_mode;
  266.    Word16 index;
  267.    Word16 s_gain_pit, gain_code;
  268.    Word16 s_tmp, s_max;
  269.    Word16 corr_gain;
  270.    Word16 *exc;                        /* Excitation vector                      */
  271.    /* Other */
  272.    Coder_State *st;                    /* Coder states                           */
  273.    st = (Coder_State *)spe_state;
  274.    codec_mode = *mode;
  275.    /*
  276.     * Initialize pointers to speech vector.
  277.     *
  278.     *
  279.     *         |-------|-------|-------|-------|-------|-------|
  280.     *          past sp   sf1     sf2     sf3     sf4    L_NEXT
  281.     *         <-------  Total speech buffer (L_TOTAL)   ------>
  282.     *   old_speech
  283.     *         <-------  LPC analysis window (L_WINDOW)  ------>
  284.     *                 <-- present frame (L_FRAME) ---->
  285.     *                 |       <----- new speech (L_FRAME) ---->
  286.     *                 |       |
  287.     *               speech    |
  288.     *                      new_speech
  289.     */
  290.    new_speech = st->mem_speech + L_TOTAL - L_FRAME - L_FILT;     /* New speech     */
  291.    speech     = st->mem_speech + L_TOTAL - L_FRAME - L_NEXT;     /* Present frame  */
  292.    exc = st->mem_exc + PIT_MAX + L_INTERPOL;
  293.    f_exc = f_old_exc + PIT_MAX + L_INTERPOL;
  294.    wsp = st->mem_wsp + (PIT_MAX / OPL_DECIM);
  295.    for(i = 0; i < L_FRAME16k; i++)
  296.    {
  297.       f_speech16k[i] = (Float32)speech16k[i];
  298.    }
  299.    Q_new = -st->mem_q;
  300.    for(i = 0; i < (PIT_MAX + L_INTERPOL); i++)
  301.    {
  302.       f_old_exc[i] = (Float32)(st->mem_exc[i] * pow(2, Q_new));
  303.    }
  304.    /*
  305.     * Down sampling signal from 16kHz to 12.8kHz
  306.     */
  307.    E_UTIL_decim_12k8(f_speech16k, L_FRAME16k, new_speech, st->mem_decim);
  308.    /* decimate with zero-padding to avoid delay of filter */
  309.    memcpy(f_code, st->mem_decim, 2 * L_FILT16k * sizeof(Float32));
  310.    memset(error, 0, L_FILT16k * sizeof(Float32));
  311.    E_UTIL_decim_12k8(error, L_FILT16k, new_speech + L_FRAME, f_code);
  312.    /*
  313.     * Perform 50Hz HP filtering of input signal.
  314.     * Perform fixed preemphasis through 1 - g z^-1
  315.     */
  316.    E_UTIL_hp50_12k8(new_speech, L_FRAME, st->mem_sig_in);
  317.    memcpy(f_code, st->mem_sig_in,  4 * sizeof(Float32) );
  318.    E_UTIL_hp50_12k8(new_speech + L_FRAME, L_FILT, f_code);
  319.    E_UTIL_f_preemph(new_speech, PREEMPH_FAC, L_FRAME, &(st->mem_preemph));
  320.    /* last L_FILT samples for autocorrelation window */
  321.    f_tmp = st->mem_preemph;
  322.    E_UTIL_f_preemph(new_speech + L_FRAME, PREEMPH_FAC, L_FILT, &f_tmp);
  323.    /*
  324.     *  Call VAD
  325.     *  Preemphesis scale down signal in low frequency and keep dynamic in HF.
  326.     *  Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT).
  327.     */
  328.    vad_flag = E_DTX_vad(st->vadSt, new_speech);
  329.    if (vad_flag == 0)
  330.    {
  331.       st->mem_vad_hist = 1;
  332.    }
  333.    else
  334.    {
  335.       st->mem_vad_hist = 0;
  336.    }
  337.    /* DTX processing */
  338.    if (allow_dtx)
  339.    {
  340.       /* Note that mode may change here */
  341.       E_DTX_tx_handler(st->dtx_encSt, vad_flag, mode);
  342.    }
  343.    else
  344.    {
  345.       E_DTX_reset(st->dtx_encSt);
  346.    }
  347.    if(*mode != MRDTX)
  348.    {
  349.       E_MAIN_parm_store(vad_flag, &prms);
  350.    }
  351.    /*
  352.     *  Perform LPC analysis
  353.     *  --------------------
  354.     *   - autocorrelation + lag windowing
  355.     *   - Levinson-durbin algorithm to find a[]
  356.     *   - convert a[] to isp[]
  357.     *   - convert isp[] to isf[] for quantization
  358.     *   - quantize and code the isf[]
  359.     *   - convert isf[] to isp[] for interpolation
  360.     *   - find the interpolated isps and convert to a[] for the 4 subframes
  361.     */
  362.    /* LP analysis centered at 3nd subframe */
  363.    E_UTIL_autocorr(st->mem_speech, r);
  364.    E_LPC_lag_wind(r + 1, M);  /* Lag windowing    */
  365.    E_LPC_lev_dur(A, r, M);
  366.    E_LPC_a_isp_conversion(A, ispnew, st->mem_isp, M);  /* From A(z) to isp */
  367.    /* Find the interpolated isps and convert to a[] for all subframes */
  368.    E_LPC_f_int_isp_find(st->mem_isp, ispnew, A, NB_SUBFR, M);
  369.    /* update isp memory for the next frame */
  370.    memcpy(st->mem_isp, ispnew, M * sizeof(Float32));
  371.    /* Convert isps to frequency domain 0..6400 */
  372.    E_LPC_isp_isf_conversion(ispnew, isf, M);
  373.    /* check resonance for pitch clipping algorithm */
  374.    E_GAIN_clip_isf_test(isf, st->mem_gp_clip);
  375.    /*
  376.     *  Perform PITCH_OL analysis
  377.     *  -------------------------
  378.     * - Find the residual res[] for the whole speech frame
  379.     * - Find the weighted input speech wsp[] for the whole speech frame
  380.     * - Find the 2 open-loop pitch estimate
  381.     * - Set the range for searching closed-loop pitch in 1st subframe
  382.     */
  383.    p_A = A;
  384.    for (i_subfr = 0;  i_subfr < L_FRAME; i_subfr += L_SUBFR)
  385.    {
  386.       E_LPC_a_weight(p_A, Ap, GAMMA1, M);
  387.       E_UTIL_residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
  388.       p_A += (M + 1);
  389.    }
  390.    E_UTIL_deemph(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp_df));
  391.    /* decimation of wsp[] to search pitch in LF and to reduce complexity */
  392.    E_GAIN_lp_decim2(wsp, L_FRAME, st->mem_decim2);
  393.    /* Find open loop pitch lag for whole speech frame */
  394.    if (*mode == MODE_7k)
  395.    {
  396.       /* Find open loop pitch lag for whole speech frame */
  397.       T_op = E_GAIN_open_loop_search(wsp, PIT_MIN / OPL_DECIM,
  398.          PIT_MAX / OPL_DECIM, L_FRAME / OPL_DECIM, st->mem_T0_med,
  399.          &(st->mem_ol_gain), st->mem_hf_wsp, st->mem_hp_wsp,
  400.          st->mem_ol_wght_flg);
  401.    }
  402.    else
  403.    {
  404.       /* Find open loop pitch lag for first 1/2 frame */
  405.       T_op = E_GAIN_open_loop_search(wsp, PIT_MIN / OPL_DECIM,
  406.          PIT_MAX / OPL_DECIM, (L_FRAME / 2) / OPL_DECIM, st->mem_T0_med,
  407.          &(st->mem_ol_gain), st->mem_hf_wsp, st->mem_hp_wsp,
  408.          st->mem_ol_wght_flg);
  409.    }
  410.    if (st->mem_ol_gain > 0.6)
  411.    {
  412.       st->mem_T0_med = E_GAIN_olag_median(T_op, st->mem_ol_lag);
  413.       st->mem_ada_w = 1.0F;
  414.    }
  415.    else
  416.    {
  417.       st->mem_ada_w = st->mem_ada_w * 0.9F;
  418.    }
  419.    if (st->mem_ada_w < 0.8)
  420.    {
  421.       st->mem_ol_wght_flg = 0;
  422.    }
  423.    else
  424.    {
  425.       st->mem_ol_wght_flg = 1;
  426.    }
  427.    E_DTX_pitch_tone_detection(st->vadSt, st->mem_ol_gain);
  428.    T_op *= OPL_DECIM;
  429.    if (*mode != MODE_7k)
  430.    {
  431.       /* Find open loop pitch lag for second 1/2 frame */
  432.       T_op2 = E_GAIN_open_loop_search(wsp + ((L_FRAME / 2) / OPL_DECIM),
  433.          PIT_MIN / OPL_DECIM, PIT_MAX / OPL_DECIM, (L_FRAME / 2) / OPL_DECIM,
  434.          st->mem_T0_med, &st->mem_ol_gain, st->mem_hf_wsp, st->mem_hp_wsp,
  435.          st->mem_ol_wght_flg);
  436.       if (st->mem_ol_gain > 0.6)
  437.       {
  438.           st->mem_T0_med = E_GAIN_olag_median(T_op2, st->mem_ol_lag);
  439.           st->mem_ada_w = 1.0F;
  440.       }
  441.       else
  442.       {
  443.           st->mem_ada_w = st->mem_ada_w * 0.9F;
  444.       }
  445.       if (st->mem_ada_w < 0.8)
  446.       {
  447.          st->mem_ol_wght_flg = 0;
  448.       }
  449.       else
  450.       {
  451.          st->mem_ol_wght_flg = 1;
  452.       }
  453.       E_DTX_pitch_tone_detection(st->vadSt, st->mem_ol_gain);
  454.       T_op2 *= OPL_DECIM;
  455.    }
  456.    else
  457.    {
  458.       T_op2 = T_op;
  459.    }
  460.    /*
  461.     * DTX-CNG
  462.     */
  463.    if(*mode == MRDTX)
  464.    {
  465.       /* Buffer isf's and energy */
  466.       E_UTIL_residu(&A[3 * (M + 1)], speech, f_exc, L_FRAME);
  467.       f_tmp = 0.0;
  468.       for(i = 0; i < L_FRAME; i++)
  469.       {
  470.          f_tmp += f_exc[i] * f_exc[i];
  471.       }
  472.       E_DTX_buffer(st->dtx_encSt, isf, f_tmp, codec_mode);
  473.       /* Quantize and code the isfs */
  474.       E_DTX_exe(st->dtx_encSt, f_exc2, &prms);
  475.       /* reset speech coder memories */
  476.       E_MAIN_reset(st, 0);
  477.       /*
  478.        * Update signal for next frame.
  479.        * -> save past of speech[] and wsp[].
  480.        */
  481.       memcpy(st->mem_speech, &st->mem_speech[L_FRAME],
  482.          (L_TOTAL - L_FRAME) * sizeof(Float32));
  483.       memcpy(st->mem_wsp, &st->mem_wsp[L_FRAME / OPL_DECIM],
  484.          (PIT_MAX / OPL_DECIM) * sizeof(Float32));
  485.       return(0);
  486.    }
  487.    /*
  488.     *   ACELP
  489.     */
  490.    /* Quantize and code the isfs */
  491.    if (*mode <= MODE_7k)
  492.    {
  493.       E_LPC_isf_2s3s_quantise(isf, isfq, st->mem_isf_q, indice, 4);
  494.       E_MAIN_parm_store((Word16)indice[0], &prms);
  495.       E_MAIN_parm_store((Word16)indice[1], &prms);
  496.       E_MAIN_parm_store((Word16)indice[2], &prms);
  497.       E_MAIN_parm_store((Word16)indice[3], &prms);
  498.       E_MAIN_parm_store((Word16)indice[4], &prms);
  499.    }
  500.    else
  501.    {
  502.       E_LPC_isf_2s5s_quantise(isf, isfq, st->mem_isf_q, indice, 4);
  503.       E_MAIN_parm_store((Word16)indice[0], &prms);
  504.       E_MAIN_parm_store((Word16)indice[1], &prms);
  505.       E_MAIN_parm_store((Word16)indice[2], &prms);
  506.       E_MAIN_parm_store((Word16)indice[3], &prms);
  507.       E_MAIN_parm_store((Word16)indice[4], &prms);
  508.       E_MAIN_parm_store((Word16)indice[5], &prms);
  509.       E_MAIN_parm_store((Word16)indice[6], &prms);
  510.    }
  511.    /* Convert isfs to the cosine domain */
  512.    E_LPC_isf_isp_conversion(isfq, ispnew_q, M);
  513.    if (*mode == MODE_24k)
  514.    {
  515.       /* Check stability on isf : distance between old isf and current isf */
  516.       f_tmp = 0.0F;
  517.       f_pt_tmp = st->mem_isf;
  518.       for (i=0; i < M - 1; i++)
  519.       {
  520.          f_tmp += (isf[i] - f_pt_tmp[i]) * (isf[i] - f_pt_tmp[i]);
  521.       }
  522.       stab_fac = (Float32)(1.25F - (f_tmp / 400000.0F));
  523.       if (stab_fac > 1.0F)
  524.       {
  525.          stab_fac = 1.0F;
  526.       }
  527.       if (stab_fac < 0.0F)
  528.       {
  529.          stab_fac = 0.0F;
  530.       }
  531.       memcpy(f_pt_tmp, isf, M * sizeof(Float32));
  532.    }
  533.    if (st->mem_first_frame == 1)
  534.    {
  535.       st->mem_first_frame = 0;
  536.       memcpy(st->mem_isp_q, ispnew_q, M * sizeof(Word16));
  537.    }
  538.    /* Find the interpolated isps and convert to a[] for all subframes */
  539.    E_LPC_int_isp_find(st->mem_isp_q, ispnew_q, E_ROM_interpol_frac, s_Aq);
  540.    for (i = 0; i < (NB_SUBFR * (M + 1)); i++)
  541.    {
  542.       Aq[i] = s_Aq[i] * 0.000244140625F; /* 1/4096 */
  543.    }
  544.    /* update isp memory for the next frame */
  545.    memcpy(st->mem_isp_q, ispnew_q, M * sizeof(Word16));
  546.    /*
  547.     * Find the best interpolation for quantized ISPs
  548.     */
  549.    p_Aq = Aq;
  550.    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
  551.    {
  552.       E_UTIL_residu(p_Aq, &speech[i_subfr], &f_exc[i_subfr], L_SUBFR);
  553.       p_Aq += (M + 1);
  554.    }
  555.    /* Buffer isf's and energy for dtx on non-speech frame */
  556.    if(vad_flag == 0)
  557.    {
  558.       f_tmp = 0.0F;
  559.       for(i = 0; i < L_FRAME; i++)
  560.       {
  561.          f_tmp += f_exc[i] * f_exc[i];
  562.       }
  563.       E_DTX_buffer(st->dtx_encSt, isf, f_tmp, codec_mode);
  564.    }
  565.    /* range for closed loop pitch search in 1st subframe */
  566.    T0_min = T_op - 8;
  567.    if (T0_min < PIT_MIN)
  568.    {
  569.       T0_min = PIT_MIN;
  570.    }
  571.    T0_max = T0_min + 15;
  572.    if (T0_max > PIT_MAX)
  573.    {
  574.       T0_max = PIT_MAX;
  575.       T0_min = T0_max - 15;
  576.    }
  577.    /*
  578.     *          Loop for every subframe in the analysis frame
  579.     *          ---------------------------------------------
  580.     *  To find the pitch and innovation parameters. The subframe size is
  581.     *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.
  582.     *     - compute the target signal for pitch search
  583.     *     - compute impulse response of weighted synthesis filter (h1[])
  584.     *     - find the closed-loop pitch parameters
  585.     *     - encode the pitch dealy
  586.     *     - find 2 lt prediction (with / without LP filter for lt pred)
  587.     *     - find 2 pitch gains and choose the best lt prediction.
  588.     *     - find target vector for codebook search
  589.     *     - update the impulse response h1[] for codebook search
  590.     *     - correlation between target vector and impulse response
  591.     *     - codebook search and encoding
  592.     *     - VQ of pitch and codebook gains
  593.     *     - find voicing factor and tilt of code for next subframe.
  594.     *     - update states of weighting filter
  595.     *     - find excitation and synthesis speech
  596.     */
  597.    p_A = A;
  598.    p_Aq = Aq;
  599.    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
  600.    {
  601.       pit_flag = i_subfr;
  602.       if ((i_subfr == (2 * L_SUBFR)) & (*mode > MODE_7k))
  603.       {
  604.          pit_flag = 0;
  605.          /* range for closed loop pitch search in 3rd subframe */
  606.          T0_min = T_op2 - 8;
  607.          if (T0_min < PIT_MIN)
  608.          {
  609.             T0_min = PIT_MIN;
  610.          }
  611.          T0_max = T0_min + 15;
  612.          if (T0_max > PIT_MAX)
  613.          {
  614.             T0_max = PIT_MAX;
  615.             T0_min = T0_max - 15;
  616.          }
  617.       }
  618.       /*
  619.        *
  620.        *        Find the target vector for pitch search:
  621.        *        ---------------------------------------
  622.        *
  623.        *             |------|  res[n]
  624.        * speech[n]---| A(z) |--------
  625.        *             |------|       |   |--------| error[n]  |------|
  626.        *                   zero -- (-)--| 1/A(z) |-----------| W(z) |-- target
  627.        *                   exc          |--------|           |------|
  628.        *
  629.        * Instead of subtracting the zero-input response of filters from
  630.        * the weighted input speech, the above configuration is used to
  631.        * compute the target vector.
  632.        *
  633.        */
  634.       for (i = 0; i < M; i++)
  635.       {
  636.          error[i] = (Float32)(speech[i + i_subfr - 16] - st->mem_syn[i]);
  637.       }
  638.       E_UTIL_residu(p_Aq, &speech[i_subfr], &f_exc[i_subfr], L_SUBFR);
  639.       E_UTIL_synthesis(p_Aq, &f_exc[i_subfr], error + M, L_SUBFR, error, 0);
  640.       E_LPC_a_weight(p_A, Ap, GAMMA1, M);
  641.       E_UTIL_residu(Ap, error + M, xn, L_SUBFR);
  642.       E_UTIL_deemph(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
  643.       /*
  644.        * Find target in residual domain (cn[]) for innovation search.
  645.        */
  646.       /* first half: xn[] --> cn[] */
  647.       memset(f_code, 0, M * sizeof(Float32));
  648.       memcpy(f_code + M, xn, (L_SUBFR / 2) * sizeof(Float32));
  649.       f_tmp = 0.0F;
  650.       E_UTIL_f_preemph(f_code + M, TILT_FAC, L_SUBFR / 2, &f_tmp);
  651.       E_LPC_a_weight(p_A, Ap, GAMMA1, M);
  652.       E_UTIL_synthesis(Ap, f_code + M, f_code + M, L_SUBFR / 2, f_code, 0);
  653.       E_UTIL_residu(p_Aq, f_code + M, cn, L_SUBFR / 2);
  654.       /* second half: res[] --> cn[] (approximated and faster) */
  655.       for(i = (L_SUBFR / 2); i < L_SUBFR; i++)
  656.       {
  657.          cn[i] = f_exc[i_subfr + i];
  658.       }
  659.       /*
  660.        * Compute impulse response, h1[], of weighted synthesis filter
  661.        */
  662.       E_LPC_a_weight(p_A, Ap, GAMMA1, M);
  663.       memset(h1, 0, L_SUBFR * sizeof(Float32));
  664.       memcpy(h1, Ap, (M + 1) * sizeof(Float32));
  665.       E_UTIL_synthesis(p_Aq, h1, h1, L_SUBFR, h1 + (M + 1), 0);
  666.       f_tmp = 0.0;
  667.       E_UTIL_deemph(h1, TILT_FAC, L_SUBFR, &f_tmp);
  668.       /*
  669.        * Closed-loop fractional pitch search
  670.        */
  671.       /* find closed loop fractional pitch  lag */
  672.       if (*mode <= MODE_9k)
  673.       {
  674.          T0 = E_GAIN_closed_loop_search(&f_exc[i_subfr], xn, h1,
  675.             T0_min, T0_max, &T0_frac,
  676.             pit_flag, PIT_MIN, PIT_FR1_8b);
  677.          /* encode pitch lag */
  678.          if (pit_flag == 0)   /* if 1st/3rd subframe */
  679.          {
  680.             /*
  681.              * The pitch range for the 1st/3rd subframe is encoded with
  682.              * 8 bits and is divided as follows:
  683.              *   PIT_MIN to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)
  684.              *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)
  685.              */
  686.             if (T0 < PIT_FR1_8b)
  687.             {
  688.                index = (Word16)(T0 * 2 + (T0_frac >> 1) - (PIT_MIN * 2));
  689.             }
  690.             else
  691.             {
  692.                index = (Word16)(T0 - PIT_FR1_8b + ((PIT_FR1_8b - PIT_MIN) * 2));
  693.             }
  694.             E_MAIN_parm_store(index, &prms);
  695.             /* find T0_min and T0_max for subframe 2 and 4 */
  696.             T0_min = T0 - 8;
  697.             if (T0_min < PIT_MIN)
  698.             {
  699.                T0_min = PIT_MIN;
  700.             }
  701.             T0_max = T0_min + 15;
  702.             if (T0_max > PIT_MAX)
  703.             {
  704.                T0_max = PIT_MAX;
  705.                T0_min = T0_max - 15;
  706.             }
  707.          }
  708.          else  /* if subframe 2 or 4 */
  709.          {
  710.             /*
  711.              * The pitch range for subframe 2 or 4 is encoded with 6 bits:
  712.              *   T0_min  to T0_max     resolution 1/2 (frac = 0 or 2)
  713.              */
  714.             i = T0 - T0_min;
  715.             index = (Word16)(i * 2 + (T0_frac >> 1));
  716.             E_MAIN_parm_store(index, &prms);
  717.          }
  718.       }
  719.       else
  720.       {
  721.          T0 = E_GAIN_closed_loop_search(&f_exc[i_subfr], xn, h1,
  722.             T0_min, T0_max, &T0_frac,
  723.             pit_flag, PIT_FR2, PIT_FR1_9b);
  724.          /* encode pitch lag */
  725.          if (pit_flag == 0)   /* if 1st/3rd subframe */
  726.          {
  727.             /*
  728.              * The pitch range for the 1st/3rd subframe is encoded with
  729.              * 9 bits and is divided as follows:
  730.              *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)
  731.              *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)
  732.              *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)
  733.              */
  734.             if (T0 < PIT_FR2)
  735.             {
  736.                index = (Word16)(T0 * 4 + T0_frac - (PIT_MIN * 4));
  737.             }
  738.             else if (T0 < PIT_FR1_9b)
  739.             {
  740.                index = (Word16)(T0 * 2 + (T0_frac >> 1) - (PIT_FR2 * 2) + ((PIT_FR2 - PIT_MIN) * 4));
  741.             }
  742.             else
  743.             {
  744.                index = (Word16)(T0 - PIT_FR1_9b + ((PIT_FR2 - PIT_MIN) * 4) + ((PIT_FR1_9b - PIT_FR2) * 2));
  745.             }
  746.             E_MAIN_parm_store(index, &prms);
  747.             /* find T0_min and T0_max for subframe 2 and 4 */
  748.             T0_min = T0 - 8;
  749.             if (T0_min < PIT_MIN)
  750.             {
  751.                T0_min = PIT_MIN;
  752.             }
  753.             T0_max = T0_min + 15;
  754.             if (T0_max > PIT_MAX)
  755.             {
  756.                T0_max = PIT_MAX;
  757.                T0_min = T0_max - 15;
  758.             }
  759.          }
  760.          else      /* if subframe 2 or 4 */
  761.          {
  762.             /*
  763.              * The pitch range for subframe 2 or 4 is encoded with 6 bits:
  764.              *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)
  765.              */
  766.             i = T0 - T0_min;
  767.             index = (Word16)(i * 4 + T0_frac);
  768.             E_MAIN_parm_store(index, &prms);
  769.          }
  770.       }
  771.       /*
  772.        * Gain clipping test to avoid unstable synthesis on frame erasure
  773.        */
  774.       clip_gain = E_GAIN_clip_test(st->mem_gp_clip);
  775.       /*
  776.        * - find unity gain pitch excitation (adaptive codebook entry)
  777.        *   with fractional interpolation.
  778.        * - find filtered pitch exc. y1[]=exc[] convolved with h1[])
  779.        * - compute pitch gain1
  780.        */
  781.       /* find pitch exitation */
  782.       E_GAIN_adaptive_codebook_excitation(&exc[i_subfr], (Word16)T0, T0_frac, L_SUBFR + 1);
  783.       if(*mode > MODE_9k)
  784.       {
  785.          E_UTIL_convolve(&exc[i_subfr], st->mem_q, h1, y1);
  786.          gain1 = E_ACELP_xy1_corr(xn, y1, g_coeff);
  787.          /* clip gain if necessary to avoid problem at decoder */
  788.         if (clip_gain && (gain1 > 0.95))
  789.         {
  790.            gain1 = 0.95f;
  791.         }
  792.          /* find energy of new target xn2[] */
  793.          E_ACELP_codebook_target_update(xn, dn, y1, gain1);
  794.       }
  795.       else
  796.       {
  797.          gain1 = 0.0F;
  798.       }
  799.       /*
  800.        * - find pitch excitation filtered by 1st order LP filter.
  801.        * - find filtered pitch exc. y2[]=exc[] convolved with h1[])
  802.        * - compute pitch gain2
  803.        */
  804.       /* find pitch excitation with lp filter */
  805.       for (i = 0; i < L_SUBFR; i++)
  806.       {
  807.          l_tmp = 5898 * exc[i - 1 + i_subfr];
  808.          l_tmp += 20972 * exc[i + i_subfr];
  809.          l_tmp += 5898 * exc[i + 1 + i_subfr];
  810.          s_code[i] = (Word16)((l_tmp + 0x4000) >> 15);
  811.       }
  812.       E_UTIL_convolve(s_code, st->mem_q, h1, y2);
  813.       gain2 = E_ACELP_xy1_corr(xn, y2, g_coeff2);
  814.       /* clip gain if necessary to avoid problem at decoder */
  815.       if (clip_gain && (gain2 > 0.95))
  816.       {
  817.          gain2 = 0.95F;
  818.       }
  819.       /* find energy of new target xn2[] */
  820.       E_ACELP_codebook_target_update(xn, xn2, y2, gain2);
  821.       /*
  822.        * use the best prediction (minimise quadratic error).
  823.        */
  824.       select = 0;
  825.       if (*mode > MODE_9k)
  826.       {
  827.          f_tmp = 0.0;
  828.          for (i = 0; i < L_SUBFR; i++)
  829.          {
  830.             f_tmp += dn[i] * dn[i];
  831.             f_tmp -= xn2[i] * xn2[i];
  832.          }
  833.          if (f_tmp < 0.1)
  834.          {
  835.             select = 1;
  836.          }
  837.          E_MAIN_parm_store(select, &prms);
  838.       }
  839.       if (select == 0)
  840.       {
  841.          /* use the lp filter for pitch excitation prediction */
  842.          memcpy(&exc[i_subfr], s_code, L_SUBFR * sizeof(Word16));
  843.          memcpy(y1, y2, L_SUBFR * sizeof(Float32));
  844.          gain_pit = gain2;
  845.          g_coeff[0] = g_coeff2[0];
  846.          g_coeff[1] = g_coeff2[1];
  847.       }
  848.       else
  849.       {
  850.          /* no filter used for pitch excitation prediction */
  851.          gain_pit = gain1;
  852.          memcpy(xn2, dn, L_SUBFR * sizeof(Float32));        /* target vector for codebook search */
  853.       }
  854.       /*
  855.        * - update target vector for codebook search
  856.        * - scaling of cn[] to limit dynamic at 12 bits
  857.        */
  858.       for (i = 0; i < L_SUBFR; i ++)
  859.       {
  860.          cn[i] = (Float32)(cn[i] - gain_pit * exc[i_subfr + i] * pow(2, Q_new));
  861.       }
  862.       /*
  863.        * - include fixed-gain pitch contribution into impulse resp. h1[]
  864.        */
  865.       f_tmp = 0.0F;
  866.       E_UTIL_f_preemph(h1, (Float32)(st->mem_tilt_code / 32768.0), L_SUBFR, &f_tmp);
  867.       if (T0_frac > 2)
  868.       {
  869.          T0++;
  870.       }
  871.       E_GAIN_f_pitch_sharpening(h1, T0);
  872.       /*
  873.        * - Correlation between target xn2[] and impulse response h1[]
  874.        * - Innovative codebook search
  875.        */
  876.       E_ACELP_xh_corr(xn2, dn, h1);
  877.       switch(*mode)
  878.       {
  879.       case MODE_7k:
  880.          E_ACELP_2t(dn, cn, h1, s_code, y2, indice);
  881.          E_MAIN_parm_store((Word16)indice[0], &prms);
  882.          break;
  883.       case MODE_9k:
  884.          E_ACELP_4t(dn, cn, h1, s_code, y2, 20, *mode, indice);
  885.          E_MAIN_parm_store((Word16)indice[0], &prms);
  886.          E_MAIN_parm_store((Word16)indice[1], &prms);
  887.          E_MAIN_parm_store((Word16)indice[2], &prms);
  888.          E_MAIN_parm_store((Word16)indice[3], &prms);
  889.          break;
  890.       case MODE_12k:
  891.          E_ACELP_4t(dn, cn, h1, s_code, y2, 36, *mode, indice);
  892.          E_MAIN_parm_store((Word16)indice[0], &prms);
  893.          E_MAIN_parm_store((Word16)indice[1], &prms);
  894.          E_MAIN_parm_store((Word16)indice[2], &prms);
  895.          E_MAIN_parm_store((Word16)indice[3], &prms);
  896.          break;
  897.       case MODE_14k:
  898.          E_ACELP_4t(dn, cn, h1, s_code, y2, 44, *mode, indice);
  899.          E_MAIN_parm_store((Word16)indice[0], &prms);
  900.          E_MAIN_parm_store((Word16)indice[1], &prms);
  901.          E_MAIN_parm_store((Word16)indice[2], &prms);
  902.          E_MAIN_parm_store((Word16)indice[3], &prms);
  903.          break;
  904.       case MODE_16k:
  905.          E_ACELP_4t(dn, cn, h1, s_code, y2, 52, *mode, indice);
  906.          E_MAIN_parm_store((Word16)indice[0], &prms);
  907.          E_MAIN_parm_store((Word16)indice[1], &prms);
  908.          E_MAIN_parm_store((Word16)indice[2], &prms);
  909.          E_MAIN_parm_store((Word16)indice[3], &prms);
  910.          break;
  911.       case MODE_18k:
  912.          E_ACELP_4t(dn, cn, h1, s_code, y2, 64, *mode, indice);
  913.          E_MAIN_parm_store((Word16)indice[0], &prms);
  914.          E_MAIN_parm_store((Word16)indice[1], &prms);
  915.          E_MAIN_parm_store((Word16)indice[2], &prms);
  916.          E_MAIN_parm_store((Word16)indice[3], &prms);
  917.          E_MAIN_parm_store((Word16)indice[4], &prms);
  918.          E_MAIN_parm_store((Word16)indice[5], &prms);
  919.          E_MAIN_parm_store((Word16)indice[6], &prms);
  920.          E_MAIN_parm_store((Word16)indice[7], &prms);
  921.          break;
  922.       case MODE_20k:
  923.          E_ACELP_4t(dn, cn, h1, s_code, y2, 72, *mode, indice);
  924.          E_MAIN_parm_store((Word16)indice[0], &prms);
  925.          E_MAIN_parm_store((Word16)indice[1], &prms);
  926.          E_MAIN_parm_store((Word16)indice[2], &prms);
  927.          E_MAIN_parm_store((Word16)indice[3], &prms);
  928.          E_MAIN_parm_store((Word16)indice[4], &prms);
  929.          E_MAIN_parm_store((Word16)indice[5], &prms);
  930.          E_MAIN_parm_store((Word16)indice[6], &prms);
  931.          E_MAIN_parm_store((Word16)indice[7], &prms);
  932.          break;
  933.       case MODE_23k:
  934.       case MODE_24k:
  935.          E_ACELP_4t(dn, cn, h1, s_code, y2, 88, *mode, indice);
  936.          E_MAIN_parm_store((Word16)indice[0], &prms);
  937.          E_MAIN_parm_store((Word16)indice[1], &prms);
  938.          E_MAIN_parm_store((Word16)indice[2], &prms);
  939.          E_MAIN_parm_store((Word16)indice[3], &prms);
  940.          E_MAIN_parm_store((Word16)indice[4], &prms);
  941.          E_MAIN_parm_store((Word16)indice[5], &prms);
  942.          E_MAIN_parm_store((Word16)indice[6], &prms);
  943.          E_MAIN_parm_store((Word16)indice[7], &prms);
  944.          break;
  945.       default:
  946.          return -1;
  947.       }
  948.       /*
  949.        * - Add the fixed-gain pitch contribution to code[].
  950.        */
  951.       s_tmp = 0;
  952.       E_UTIL_preemph(s_code, st->mem_tilt_code, L_SUBFR, &s_tmp);
  953.       E_GAIN_pitch_sharpening(s_code, (Word16)T0);
  954.       E_ACELP_xy2_corr(xn, y1, y2, g_coeff);
  955.       /*
  956.        *  - Compute the fixed codebook gain
  957.        *  - quantize fixed codebook gain
  958.        */
  959.       if (*mode <= MODE_9k)
  960.       {
  961.           index = (Word16)E_ACELP_gains_quantise(s_code, 6, gain_pit,
  962.              &s_gain_pit, &L_gain_code, g_coeff, clip_gain, st->mem_gain_q);
  963.          E_MAIN_parm_store(index, &prms);
  964.       }
  965.       else
  966.       {
  967.          index = (Word16)E_ACELP_gains_quantise(s_code, 7, gain_pit,
  968.             &s_gain_pit, &L_gain_code, g_coeff, clip_gain, st->mem_gain_q);
  969.          E_MAIN_parm_store(index, &prms);
  970.       }
  971.       /* find best scaling to perform on excitation (Q_new) */
  972.       s_tmp = st->mem_subfr_q[0];
  973.       for (i = 1; i < 4; i++)
  974.       {
  975.          if (st->mem_subfr_q[i] < s_tmp)
  976.          {
  977.             s_tmp = st->mem_subfr_q[i];
  978.          }
  979.       }
  980.       /* limit scaling (Q_new) to Q_MAX */
  981.       if (s_tmp > Q_MAX)
  982.       {
  983.          s_tmp = Q_MAX;
  984.       }
  985.       Q_new = 0;
  986.       l_tmp = L_gain_code;                 /* L_gain_code in Q16 */
  987.       while ((l_tmp < 0x08000000L) && (Q_new < s_tmp))
  988.       {
  989.          l_tmp = (l_tmp << 1);
  990.          Q_new = Q_new + 1;
  991.       }
  992.       if (l_tmp < 0x7FFF7FFF)
  993.       {
  994.          /* scaled gain_code with Qnew */
  995.          gain_code = (Word16)((l_tmp + 0x8000) >> 16);
  996.       }
  997.       else
  998.       {
  999.          gain_code = 32767;
  1000.       }
  1001.       if (Q_new > st->mem_q)
  1002.       {
  1003.          E_UTIL_signal_up_scale(exc + i_subfr - (PIT_MAX + L_INTERPOL),
  1004.             (Word16)(Q_new - st->mem_q));
  1005.       }
  1006.       else
  1007.       {
  1008.          E_UTIL_signal_down_scale(exc + i_subfr - (PIT_MAX + L_INTERPOL),
  1009.             PIT_MAX + L_INTERPOL + L_SUBFR, (Word16)(st->mem_q - Q_new));
  1010.       }
  1011.       st->mem_q = (Word16)Q_new;
  1012.       /* test quantized gain of pitch for pitch clipping algorithm */
  1013.       E_GAIN_clip_pit_test((Float32)(s_gain_pit * pow(2, -14)),
  1014.          st->mem_gp_clip);
  1015.       /*
  1016.        * Update parameters for the next subframe.
  1017.        * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)
  1018.        */
  1019.       /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
  1020.       memcpy(exc2, &exc[i_subfr], L_SUBFR * sizeof(Word16));
  1021.       E_UTIL_signal_down_scale(exc2, L_SUBFR, 3);
  1022.       voice_fac = E_GAIN_voice_factor(exc2, -3, s_gain_pit, s_code, gain_code);
  1023.       /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
  1024.       st->mem_tilt_code = (Word16)((voice_fac >> 2) + 8192);
  1025.       /*
  1026.        * - Update filter's memory "mem_w0" for finding the
  1027.        *   target vector in the next subframe.
  1028.        * - Find the total excitation
  1029.        * - Find synthesis speech to update mem_syn[].
  1030.        */
  1031.       memcpy(exc2, &exc[i_subfr], L_SUBFR * sizeof(Word16));
  1032.       st->mem_w0 = (Float32)((xn[L_SUBFR - 1] -
  1033.          ((s_gain_pit / 16384.0F) * y1[L_SUBFR - 1])) -
  1034.          (gain_code * pow(2, -st->mem_q) * y2[L_SUBFR - 1]));
  1035.       if (*mode == MODE_24k)
  1036.       {
  1037.          Q_new = -st->mem_q;
  1038.          for (i = 0; i < L_SUBFR; i++)
  1039.          {
  1040.             f_exc2[i_subfr + i] = (Float32)(exc[i_subfr + i] * pow(2, Q_new) * (s_gain_pit / 16384.0F));
  1041.          }
  1042.       }
  1043.       s_max = 1;
  1044.       for (i = 0; i < L_SUBFR; i++)
  1045.       {
  1046.          /* code in Q9, gain_pit in Q14 */
  1047.          l_tmp = gain_code * s_code[i];
  1048.          l_tmp = l_tmp << 5;
  1049.          l_tmp += exc[i + i_subfr] * s_gain_pit; /* gain_pit Q14 */
  1050.          l_tmp = (l_tmp + 0x2000) >> 14;
  1051.          if ((l_tmp > MIN_16) & (l_tmp < 32768))
  1052.          {
  1053.             exc[i + i_subfr] = (Word16)l_tmp;
  1054.             s_tmp = (Word16)abs(l_tmp);
  1055.             if (s_tmp > s_max)
  1056.             {
  1057.                s_max = s_tmp;
  1058.             }
  1059.          }
  1060.          else if (l_tmp > MAX_16)
  1061.          {
  1062.             exc[i + i_subfr] = MAX_16;
  1063.             s_max = MAX_16;
  1064.          }
  1065.          else
  1066.          {
  1067.             exc[i + i_subfr] = MIN_16;
  1068.             s_max = MAX_16;
  1069.          }
  1070.       }
  1071.       /* tmp = scaling possible according to max value of excitation */
  1072.       s_tmp = (Word16)((E_UTIL_norm_s(s_max) + st->mem_q) - 1);
  1073.       st->mem_subfr_q[3] = st->mem_subfr_q[2];
  1074.       st->mem_subfr_q[2] = st->mem_subfr_q[1];
  1075.       st->mem_subfr_q[1] = st->mem_subfr_q[0];
  1076.       st->mem_subfr_q[0] = s_tmp;
  1077.       Q_new = -st->mem_q;
  1078.       for (i = 0; i < L_SUBFR; i++)
  1079.       {
  1080.          f_exc[i + i_subfr] = (Float32)(exc[i + i_subfr] * pow(2, Q_new));
  1081.       }
  1082.       E_UTIL_synthesis(p_Aq, &f_exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
  1083.       if(*mode >= MODE_24k)
  1084.       {
  1085.          /*
  1086.           * noise enhancer
  1087.           * --------------
  1088.           * - Enhance excitation on noise. (modify gain of code)
  1089.           *   If signal is noisy and LPC filter is stable, move gain
  1090.           *   of code 1.5 dB toward gain of code threshold.
  1091.           *   This decrease by 3 dB noise energy variation.
  1092.           */
  1093.          /* 1=unvoiced, 0=voiced */
  1094.          f_tmp = (Float32)(0.5 * (1.0 - (voice_fac / 32768.0)));
  1095.          fac = stab_fac * f_tmp;
  1096.          f_tmp = (Float32)(gain_code * pow(2, -st->mem_q));
  1097.          if(f_tmp < st->mem_gc_threshold)
  1098.          {
  1099.             f_tmp = (Float32)(f_tmp * 1.19);
  1100.             if(f_tmp > st->mem_gc_threshold)
  1101.             {
  1102.                f_tmp = st->mem_gc_threshold;
  1103.             }
  1104.          }
  1105.          else
  1106.          {
  1107.             f_tmp = (Float32)(f_tmp / 1.19);
  1108.             if(f_tmp < st->mem_gc_threshold)
  1109.             {
  1110.                f_tmp = st->mem_gc_threshold;
  1111.             }
  1112.          }
  1113.          st->mem_gc_threshold = f_tmp;
  1114.          f_tmp = (Float32)(((fac * f_tmp) + ((1.0 - fac) *
  1115.             (gain_code * pow(2, -st->mem_q)))) * 0.001953125F);
  1116.          for(i = 0; i < L_SUBFR; i++)
  1117.          {
  1118.             f_code[i] = (Float32)(s_code[i] * f_tmp);
  1119.          }
  1120.          /*
  1121.           * pitch enhancer
  1122.           * --------------
  1123.           * - Enhance excitation on voice. (HP filtering of code)
  1124.           *   On voiced signal, filtering of code by a smooth fir HP
  1125.           *   filter to decrease energy of code in low frequency.
  1126.           */
  1127.          /* 0.25=voiced, 0=unvoiced */
  1128.          f_tmp = (Float32)(0.125F * (1.0F + (voice_fac / 32768.0)));
  1129.          f_exc2[i_subfr] += f_code[0] - (f_tmp * f_code[1]);
  1130.          for(i = 1; i < L_SUBFR - 1; i++)
  1131.          {
  1132.             f_exc2[i + i_subfr] +=
  1133.                f_code[i] - (f_tmp * f_code[i - 1]) - (f_tmp * f_code[i + 1]);
  1134.          }
  1135.          f_exc2[i_subfr + L_SUBFR - 1] +=
  1136.             f_code[L_SUBFR - 1] - (f_tmp * f_code[L_SUBFR - 2]);
  1137.          corr_gain = (Word16)E_UTIL_enc_synthesis(p_Aq, &f_exc2[i_subfr],
  1138.             &f_speech16k[i_subfr * 5 /4], st);
  1139.          E_MAIN_parm_store(corr_gain, &prms);
  1140.       }
  1141.       p_A += (M + 1);
  1142.       p_Aq += (M + 1);
  1143.   }   /* end of subframe loop */
  1144.    /*
  1145.     * Update signal for next frame.
  1146.     * -> save past of speech[], wsp[] and exc[].
  1147.     */
  1148.    memmove(st->mem_speech, &st->mem_speech[L_FRAME], (L_TOTAL - L_FRAME) * sizeof(Float32));
  1149.    memmove(st->mem_wsp, &st->mem_wsp[L_FRAME / OPL_DECIM], (PIT_MAX / OPL_DECIM) * sizeof(Float32));
  1150.    memmove(st->mem_exc, &st->mem_exc[L_FRAME], (PIT_MAX + L_INTERPOL) * sizeof(Word16));
  1151.    return 0;
  1152. }