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

Symbian

开发平台:

Visual C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include <math.h>
  7. #include "hlxclib/memory.h"
  8. #include <float.h>
  9. #include "typedef.h"
  10. #include "enc_util.h"
  11. #define L_SUBFR         64
  12. #define NB_PULSE_MAX    24
  13. #define NPMAXPT ((NB_PULSE_MAX + 4 - 1) / 4)
  14. #define NB_QUA_GAIN7B   128   /* Number of quantization level */
  15. #define MODE_23k        7
  16. extern const UWord8 E_ROM_tipos[];
  17. extern const Float32 E_ROM_qua_gain6b[];
  18. extern const Float32 E_ROM_qua_gain7b[];
  19. /*
  20.  * E_ACELP_Gain2_Q_init
  21.  *
  22.  * Parameters:
  23.  *    mem           O: static memory
  24.  *
  25.  * Function:
  26.  *    Initializes state memory
  27.  *
  28.  * Returns:
  29.  *    void
  30.  */
  31. void E_ACELP_Gain2_Q_init(Word16 *mem)
  32. {
  33.    Word32 i;
  34.    /* 2nd order quantizer energy predictor */
  35.    for (i = 0; i < 4; i++)
  36.    {
  37.       mem[i] = -14336;   /* past_qua_en[i] */
  38.    }
  39.    return;
  40. }
  41. /*
  42.  * E_ACELP_xy1_corr
  43.  *
  44.  * Parameters:
  45.  *    xn          I: target signal
  46.  *    y1          I: filtered adaptive codebook excitation
  47.  *    g_coeff     O: correlations <y1,y1>  and -2<xn,y1>
  48.  *
  49.  * Function:
  50.  *    Find the correlations between the target xn[] and the filtered adaptive
  51.  *    codebook excitation y1[]. ( <y1,y1>  and -2<xn,y1> )
  52.  *    Subframe size = L_SUBFR
  53.  *
  54.  * Returns:
  55.  *    pitch gain  (0 ... 1.2F) (Q14)
  56.  */
  57. Float32 E_ACELP_xy1_corr(Float32 xn[], Float32 y1[], Float32 g_corr[])
  58. {
  59.    Float32 gain;
  60.    Float32 t0, t1;
  61.    Word32 i;
  62.    t0 = xn[0] * y1[0];
  63.    t1 = y1[0] * y1[0];
  64.    for (i = 1; i < L_SUBFR; i += 7)
  65.    {
  66.       t0 += xn[i] * y1[i];
  67.       t1 += y1[i] * y1[i];
  68.       t0 += xn[i + 1] * y1[i + 1];
  69.       t1 += y1[i + 1] * y1[i + 1];
  70.       t0 += xn[i + 2] * y1[i + 2];
  71.       t1 += y1[i + 2] * y1[i + 2];
  72.       t0 += xn[i + 3] * y1[i + 3];
  73.       t1 += y1[i + 3] * y1[i + 3];
  74.       t0 += xn[i + 4] * y1[i + 4];
  75.       t1 += y1[i + 4] * y1[i + 4];
  76.       t0 += xn[i + 5] * y1[i + 5];
  77.       t1 += y1[i + 5] * y1[i + 5];
  78.       t0 += xn[i + 6] * y1[i + 6];
  79.       t1 += y1[i + 6] * y1[i + 6];
  80.    }
  81.    g_corr[0] = t1;
  82.    g_corr[1] = -2.0F * t0 + 0.01F;
  83.    /* find pitch gain and bound it by [0,1.2F] */
  84.    if (t1)
  85.    {
  86.       gain = t0 / t1;
  87.    }
  88.    else
  89.    {
  90.       gain = 1.0F;
  91.    }
  92.    if (gain < 0.0)
  93.    {
  94.       gain = 0.0;
  95.    }
  96.    else if (gain > 1.2F)
  97.    {
  98.       gain = 1.2F;
  99.    }
  100.    return gain;
  101. }
  102. /*
  103.  * E_ACELP_xy2_corr
  104.  *
  105.  * Parameters:
  106.  *    xn          I: target signal
  107.  *    y1          I: filtered adaptive codebook excitation
  108.  *    y2          I: filtered fixed codebook excitation
  109.  *    g_corr      O: correlations <y2,y2>, -2<xn,y2>, 2<y1,y2>
  110.  *    L_subfr     I: subframe size
  111.  *
  112.  * Function:
  113.  *    Find the correlations between the target xn[], the filtered adaptive
  114.  *    codebook exc. y1[], and the filtered fixed codebook innovation y2[].
  115.  *    ( <y2,y2> , -2<xn,y2> and 2<y1,y2> )
  116.  *    Subrame size = L_SUBFR
  117.  *
  118.  * Returns:
  119.  *    pitch gain  (0 ... 1.2F)
  120.  */
  121. void E_ACELP_xy2_corr(Float32 xn[], Float32 y1[], Float32 y2[],
  122.                       Float32 g_corr[])
  123. {
  124.    Float32 temp1, temp2, temp3;
  125.    Word32 i;
  126.    temp1 = 0.01F + y2[0] * y2[0];
  127.    temp2 = 0.01F + xn[0] * y2[0];
  128.    temp3 = 0.01F + y1[0] * y2[0];
  129.    temp1 += y2[1] * y2[1];
  130.    temp2 += xn[1] * y2[1];
  131.    temp3 += y1[1] * y2[1];
  132.    temp1 += y2[2] * y2[2];
  133.    temp2 += xn[2] * y2[2];
  134.    temp3 += y1[2] * y2[2];
  135.    temp1 += y2[3] * y2[3];
  136.    temp2 += xn[3] * y2[3];
  137.    temp3 += y1[3] * y2[3];
  138.    for (i = 4; i < L_SUBFR; i += 6)
  139.    {
  140.       temp1 += y2[i] * y2[i];
  141.       temp2 += xn[i] * y2[i];
  142.       temp3 += y1[i] * y2[i];
  143.       temp1 += y2[i + 1] * y2[i + 1];
  144.       temp2 += xn[i + 1] * y2[i + 1];
  145.       temp3 += y1[i + 1] * y2[i + 1];
  146.       temp1 += y2[i + 2] * y2[i + 2];
  147.       temp2 += xn[i + 2] * y2[i + 2];
  148.       temp3 += y1[i + 2] * y2[i + 2];
  149.       temp1 += y2[i + 3] * y2[i + 3];
  150.       temp2 += xn[i + 3] * y2[i + 3];
  151.       temp3 += y1[i + 3] * y2[i + 3];
  152.       temp1 += y2[i + 4] * y2[i + 4];
  153.       temp2 += xn[i + 4] * y2[i + 4];
  154.       temp3 += y1[i + 4] * y2[i + 4];
  155.       temp1 += y2[i + 5] * y2[i + 5];
  156.       temp2 += xn[i + 5] * y2[i + 5];
  157.       temp3 += y1[i + 5] * y2[i + 5];
  158.    }
  159.    g_corr[2] = temp1;
  160.    g_corr[3] = -2.0F * temp2;
  161.    g_corr[4] = 2.0F * temp3;
  162.    return;
  163. }
  164. /*
  165.  * E_ACELP_xh_corr
  166.  *
  167.  * Parameters:
  168.  *    h           I: impulse response (of weighted synthesis filter) (Q12)
  169.  *    x           I: target signal (Q0)
  170.  *    y           O: correlation between x[] and h[]
  171.  *
  172.  * Function:
  173.  *    Compute the correlation between the target signal and the impulse
  174.  *    response of the weighted synthesis filter.
  175.  *
  176.  *           y[i]=sum(j=i,l-1) x[j]*h[j-i], i=0,l-1
  177.  *
  178.  *    Vector size is L_SUBFR
  179.  *
  180.  * Returns:
  181.  *    void
  182.  */
  183. void E_ACELP_xh_corr(Float32 *x, Float32 *y, Float32 *h)
  184. {
  185.    Word32 i, j;
  186.    Float32 s;
  187.    for (i = 0; i < L_SUBFR; i++)
  188.    {
  189.       s = 0.0F;
  190.       for (j = i; j < L_SUBFR ; j++)
  191.       {
  192.          s += x[j] * h[j - i];
  193.       }
  194.       y[i] = s;
  195.    }
  196.    return;
  197. }
  198. /*
  199.  * E_ACELP_codebook_target_update
  200.  *
  201.  * Parameters:
  202.  *    x           I: old target (for pitch search) (Q0)
  203.  *    x2          O: new target (for codebook search) (Q0)
  204.  *    y           I: filtered adaptive codebook vector (Q0)
  205.  *    gain        I: adaptive codebook gain (Q14)
  206.  *
  207.  * Function:
  208.  *    Update the target vector for codebook search.
  209.  *    Subframe size = L_SUBFR
  210.  * Returns:
  211.  *    void
  212.  */
  213. void E_ACELP_codebook_target_update(Float32 *x, Float32 *x2, Float32 *y,
  214.                                     Float32 gain)
  215. {
  216.    Word32 i;
  217.    for (i = 0; i < L_SUBFR; i ++)
  218.    {
  219.       x2[i] = x[i] - gain * y[i];
  220.    }
  221. }
  222. /*
  223.  * E_ACELP_h_vec_corr?
  224.  *
  225.  * Parameters:
  226.  *    h              I: scaled impulse response
  227.  *    vec            I: vector to correlate with h[]
  228.  *    track          I: track to use
  229.  *    sign           I: sign vector
  230.  *    rrixix         I: correlation of h[x] with h[x]
  231.  *    cor            O: result of correlation (16 elements)
  232.  *
  233.  * Function:
  234.  *    Calculate the correlations of h[] with vec[] for the specified track
  235.  *
  236.  * Returns:
  237.  *    void
  238.  */
  239. static void E_ACELP_h_vec_corr1(Float32 h[], Float32 vec[], UWord8 track,
  240.                                 Float32 sign[], Float32 (*rrixix)[16],
  241.                                 Float32 cor[], Word32 dn2_pos[],
  242.                                 Word32 nb_pulse)
  243. {
  244.    Word32 i, j, dn;
  245.    Word32 *dn2;
  246.    Float32 *p0;
  247.    Float32 s;
  248.    dn2 = &dn2_pos[track * 8];
  249.    p0 = rrixix[track];
  250.    for (i = 0; i < nb_pulse; i++)
  251.    {
  252.       dn = dn2[i];
  253.       s = 0.0F;
  254.       for (j = 0; j < (L_SUBFR - dn); j++)
  255.       {
  256.          s += h[j] * vec[dn + j];
  257.       }
  258.       cor[dn >> 2] = sign[dn] * s + p0[dn >> 2];
  259.    }
  260.    return;
  261. }
  262. static void E_ACELP_h_vec_corr2(Float32 h[], Float32 vec[], UWord8 track,
  263.                                 Float32 sign[], Float32 (*rrixix)[16],
  264.                                 Float32 cor[])
  265. {
  266.    Word32 i, j;
  267.    Float32 *p0;
  268.    Float32 s;
  269.    p0 = rrixix[track];
  270.    for (i = 0; i < 16; i++)
  271.    {
  272.       s = 0.0F;
  273.       for (j = 0; j < L_SUBFR - track; j++)
  274.       {
  275.          s += h[j] * vec[track + j];
  276.       }
  277.       cor[i] = s * sign[track] + p0[i];
  278.       track += 4;
  279.    }
  280.    return;
  281. }
  282. /*
  283.  * E_ACELP_2pulse_search
  284.  *
  285.  * Parameters:
  286.  *    nb_pos_ix      I: nb of pos for pulse 1 (1..8)
  287.  *    track_x        I: track of pulse 1
  288.  *    track_y        I: track of pulse 2
  289.  *    ps           I/O: correlation of all fixed pulses
  290.  *    alp          I/O: energy of all fixed pulses
  291.  *    ix             O: position of pulse 1
  292.  *    iy             O: position of pulse 2
  293.  *    dn             I: corr. between target and h[]
  294.  *    dn2            I: vector of selected positions
  295.  *    cor_x          I: corr. of pulse 1 with fixed pulses
  296.  *    cor_y          I: corr. of pulse 2 with fixed pulses
  297.  *    rrixiy         I: corr. of pulse 1 with pulse 2
  298.  *
  299.  * Function:
  300.  *    Find the best positions of 2 pulses in a subframe
  301.  *
  302.  * Returns:
  303.  *    void
  304.  */
  305. static void E_ACELP_2pulse_search(Word32 nb_pos_ix, UWord8 track_x,
  306.                                   UWord8 track_y, Float32 *ps, Float32 *alp,
  307.                                   Word32 *ix, Word32 *iy, Float32 dn[],
  308.                                   Word32 *dn2, Float32 cor_x[],
  309.                                   Float32 cor_y[], Float32 (*rrixiy)[256])
  310. {
  311.    Word32 x, x2, y, x_save = 0, y_save = 0, i, *pos_x;
  312.    Float32 ps0, alp0;
  313.    Float32 ps1, ps2, sq, sqk;
  314.    Float32 alp1, alp2, alpk;
  315.    Float32 *p1, *p2;
  316.    Float32 s;
  317.    /* eight dn2 max positions per track */
  318.    pos_x = &dn2[track_x << 3];
  319.    /* save these to limit memory searches */
  320.    ps0 = *ps;
  321.    alp0 = *alp;
  322.    sqk = -1.0F;
  323.    alpk = 1.0F;
  324.    /* loop track 1 */
  325.    for (i = 0; i < nb_pos_ix; i++)
  326.    {
  327.       x = pos_x[i];
  328.       x2 = x >> 2;
  329.       /* dn[x] has only nb_pos_ix positions saved */
  330.       ps1 = ps0 + dn[x];
  331.       alp1 = alp0 + cor_x[x2];
  332.       p1 = cor_y;
  333.       p2 = &rrixiy[track_x][x2 << 4];
  334.       for (y = track_y; y < L_SUBFR; y += 4)
  335.       {
  336.          ps2 = ps1 + dn[y];
  337.          alp2 = alp1 + (*p1++) + (*p2++);
  338.          sq = ps2 * ps2;
  339.          s = (alpk * sq) - (sqk * alp2);
  340.          if (s > 0.0F)
  341.          {
  342.             sqk = sq;
  343.             alpk = alp2;
  344.             y_save = y;
  345.             x_save = x;
  346.          }
  347.       }
  348.    }
  349.    *ps = ps0 + dn[x_save] + dn[y_save];
  350.    *alp = alpk;
  351.    *ix = x_save;
  352.    *iy = y_save;
  353.    return;
  354. }
  355. /*
  356.  * E_ACELP_quant_1p_N1
  357.  *
  358.  * Parameters:
  359.  *    pos      I: position of the pulse
  360.  *    N        I: number of bits for position
  361.  *
  362.  * Function:
  363.  *    Quantization of 1 pulse with N+1 bits
  364.  *
  365.  * Returns:
  366.  *    return N+1 bits
  367.  */
  368. static Word32 E_ACELP_quant_1p_N1(Word32 pos, Word32 N)
  369. {
  370.    Word32 mask;
  371.    Word32 index;
  372.    mask = ((1<<N)-1);
  373.    /*
  374.     * Quantization of 1 pulse with N+1 bits:
  375.     */
  376.    index = (pos & mask);
  377.    if ((pos & 16) != 0)
  378.    {
  379.       index += 1 << N;
  380.    }
  381.    return(index);
  382. }
  383. /*
  384.  * E_ACELP_quant_2p_2N1
  385.  *
  386.  * Parameters:
  387.  *    pos1     I: position of the pulse 1
  388.  *    pos2     I: position of the pulse 2
  389.  *    N        I: number of bits for position
  390.  *
  391.  * Function:
  392.  *    Quantization of 2 pulses with 2*N+1 bits
  393.  *
  394.  * Returns:
  395.  *    (2*N)+1 bits
  396.  */
  397. static Word32 E_ACELP_quant_2p_2N1(Word32 pos1, Word32 pos2, Word32 N)
  398. {
  399.    Word32 mask;
  400.    Word32 index;
  401.    mask = ((1 << N) - 1);
  402.    /*
  403.     * Quantization of 2 pulses with 2*N+1 bits:
  404.     */
  405.    if (((pos2 ^ pos1) & 16) == 0)
  406.    {
  407.       /* sign of 1st pulse == sign of 2th pulse */
  408.       if ((pos1 - pos2) <= 0)
  409.       {
  410.          index = ((pos1 & mask) << N) + (pos2 & mask);
  411.       }
  412.       else
  413.       {
  414.          index = ((pos2 & mask) << N) + (pos1 & mask);
  415.       }
  416.       if ((pos1 & 16) != 0)
  417.       {
  418.          index += 1 << (2 * N);
  419.       }
  420.    }
  421.    else
  422.    {
  423.       /* sign of 1st pulse != sign of 2th pulse */
  424.       if (((pos1 & mask) - (pos2 & mask)) <= 0)
  425.       {
  426.          index = ((pos2 & mask) << N) + (pos1 & mask);
  427.          if ((pos2 & 16) != 0)
  428.          {
  429.             index += 1 << (2 * N);
  430.          }
  431.       }
  432.       else
  433.       {
  434.          index = ((pos1 & mask) << N) + (pos2 & mask);
  435.          if ((pos1 & 16) != 0)
  436.          {
  437.             index += 1 << (2 * N);
  438.          }
  439.       }
  440.    }
  441.    return(index);
  442. }
  443. /*
  444.  * E_ACELP_quant_3p_3N1
  445.  *
  446.  * Parameters:
  447.  *    pos1     I: position of the pulse 1
  448.  *    pos2     I: position of the pulse 2
  449.  *    pos3     I: position of the pulse 3
  450.  *    N        I: number of bits for position
  451.  *
  452.  * Function:
  453.  *    Quantization of 3 pulses with 3*N+1 bits
  454.  *
  455.  * Returns:
  456.  *    (3*N)+1 bits
  457.  */
  458. static Word32 E_ACELP_quant_3p_3N1(Word32 pos1, Word32 pos2, Word32 pos3,
  459.                                    Word32 N)
  460. {
  461.    Word32 nb_pos;
  462.    Word32 index;
  463.    nb_pos = (1 << (N - 1));
  464.    /*
  465.     * Quantization of 3 pulses with 3*N+1 bits:
  466.     */
  467.    if (((pos1 ^ pos2) & nb_pos) == 0)
  468.    {
  469.       index = E_ACELP_quant_2p_2N1(pos1, pos2, (N - 1));
  470.       index += (pos1 & nb_pos) << N;
  471.       index += E_ACELP_quant_1p_N1(pos3, N) << (2 * N);
  472.    }
  473.    else if (((pos1 ^ pos3) & nb_pos) == 0)
  474.    {
  475.       index = E_ACELP_quant_2p_2N1(pos1, pos3, (N - 1));
  476.       index += (pos1 & nb_pos) << N;
  477.       index += E_ACELP_quant_1p_N1(pos2, N) << (2 * N);
  478.    }
  479.    else
  480.    {
  481.       index = E_ACELP_quant_2p_2N1(pos2, pos3, (N - 1));
  482.       index += (pos2 & nb_pos) << N;
  483.       index += E_ACELP_quant_1p_N1(pos1, N) << (2 * N);
  484.    }
  485.    return(index);
  486. }
  487. /*
  488.  * E_ACELP_quant_4p_4N1
  489.  *
  490.  * Parameters:
  491.  *    pos1     I: position of the pulse 1
  492.  *    pos2     I: position of the pulse 2
  493.  *    pos3     I: position of the pulse 3
  494.  *    pos4     I: position of the pulse 4
  495.  *    N        I: number of bits for position
  496.  *
  497.  * Function:
  498.  *    Quantization of 4 pulses with 4*N+1 bits
  499.  *
  500.  * Returns:
  501.  *    (4*N)+1 bits
  502.  */
  503. static Word32 E_ACELP_quant_4p_4N1(Word32 pos1, Word32 pos2, Word32 pos3,
  504.                                    Word32 pos4, Word32 N)
  505. {
  506.    Word32 nb_pos;
  507.    Word32 index;
  508.    nb_pos = (1 << (N - 1));
  509.    /*
  510.     * Quantization of 4 pulses with 4*N+1 bits:
  511.     */
  512.    if (((pos1 ^ pos2) & nb_pos) == 0)
  513.    {
  514.       index = E_ACELP_quant_2p_2N1(pos1, pos2, (N - 1));
  515.       index += (pos1 & nb_pos) << N;
  516.       index += E_ACELP_quant_2p_2N1(pos3, pos4, N) << (2 * N);
  517.    }
  518.    else if (((pos1 ^ pos3) & nb_pos) == 0)
  519.    {
  520.       index = E_ACELP_quant_2p_2N1(pos1, pos3, (N - 1));
  521.       index += (pos1 & nb_pos) << N;
  522.       index += E_ACELP_quant_2p_2N1(pos2, pos4, N) << (2 * N);
  523.    }
  524.    else
  525.    {
  526.       index = E_ACELP_quant_2p_2N1(pos2, pos3, (N - 1));
  527.       index += (pos2 & nb_pos) << N;
  528.       index += E_ACELP_quant_2p_2N1(pos1, pos4, N) << (2 * N);
  529.    }
  530.    return(index);
  531. }
  532. /*
  533.  * E_ACELP_quant_4p_4N
  534.  *
  535.  * Parameters:
  536.  *    pos      I: position of the pulse 1..4
  537.  *    N        I: number of bits for position
  538.  *
  539.  * Function:
  540.  *    Quantization of 4 pulses with 4*N bits
  541.  *
  542.  * Returns:
  543.  *    4*N bits
  544.  */
  545. static Word32 E_ACELP_quant_4p_4N(Word32 pos[], Word32 N)
  546. {
  547.    Word32 i, j, k, nb_pos, n_1;
  548.    Word32 posA[4], posB[4];
  549.    Word32 index=0;
  550.    n_1 = N - 1;
  551.    nb_pos = (1 << n_1);
  552.    i = 0;
  553.    j = 0;
  554.    for (k = 0; k < 4; k++)
  555.    {
  556.       if ((pos[k] & nb_pos) == 0)
  557.       {
  558.          posA[i++] = pos[k];
  559.       }
  560.       else
  561.       {
  562.          posB[j++] = pos[k];
  563.       }
  564.    }
  565.    switch (i)
  566.    {
  567.    case 0:
  568.       index = 1 << ((4 * N) - 3);
  569.       index += E_ACELP_quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1);
  570.       break;
  571.    case 1:
  572.       index = E_ACELP_quant_1p_N1(posA[0], n_1) << (( 3 * n_1) + 1);
  573.       index += E_ACELP_quant_3p_3N1(posB[0], posB[1], posB[2], n_1);
  574.       break;
  575.    case 2:
  576.       index = E_ACELP_quant_2p_2N1(posA[0], posA[1], n_1) << (( 2 * n_1) + 1);
  577.       index += E_ACELP_quant_2p_2N1(posB[0], posB[1], n_1);
  578.       break;
  579.    case 3:
  580.       index = E_ACELP_quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N;
  581.       index += E_ACELP_quant_1p_N1(posB[0], n_1);
  582.       break;
  583.    case 4:
  584.       index = E_ACELP_quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
  585.       break;
  586.    }
  587.    index += (i & 3) << ((4 * N) - 2);
  588.    return(index);
  589. }
  590. /*
  591.  * E_ACELP_quant_5p_5N
  592.  *
  593.  * Parameters:
  594.  *    pos      I: position of the pulse 1..5
  595.  *    N        I: number of bits for position
  596.  *
  597.  * Function:
  598.  *    Quantization of 5 pulses with 5*N bits
  599.  *
  600.  * Returns:
  601.  *    5*N bits
  602.  */
  603. static Word32 E_ACELP_quant_5p_5N(Word32 pos[], Word32 N)
  604. {
  605.    Word32 i,j,k,nb_pos,n_1;
  606.    Word32 posA[5], posB[5];
  607.    Word32 index=0;
  608.    n_1 = N-1;
  609.    nb_pos = (1 << n_1);
  610.    i = 0;
  611.    j = 0;
  612.    for (k = 0; k < 5; k++)
  613.    {
  614.       if ((pos[k] & nb_pos) == 0)
  615.       {
  616.          posA[i++] = pos[k];
  617.       }
  618.       else
  619.       {
  620.          posB[j++] = pos[k];
  621.       }
  622.    }
  623.    switch (i)
  624.    {
  625.    case 0:
  626.       index = 1 << ((5 * N) - 1);
  627.       index +=
  628.          E_ACELP_quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2 * N) + 1);
  629.       index += E_ACELP_quant_2p_2N1(posB[3], posB[4], N);
  630.       break;
  631.    case 1:
  632.       index = 1 << ((5 * N) - 1);
  633.       index +=
  634.          E_ACELP_quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2 * N) + 1);
  635.       index += E_ACELP_quant_2p_2N1(posB[3], posA[0], N);
  636.       break;
  637.    case 2:
  638.       index = 1 << ((5 * N) - 1);
  639.       index +=
  640.          E_ACELP_quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2 * N) + 1);
  641.       index += E_ACELP_quant_2p_2N1(posA[0], posA[1], N);
  642.       break;
  643.    case 3:
  644.       index =
  645.          E_ACELP_quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2 * N) + 1);
  646.       index += E_ACELP_quant_2p_2N1(posB[0], posB[1], N);
  647.       break;
  648.    case 4:
  649.       index =
  650.          E_ACELP_quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2 * N) + 1);
  651.       index += E_ACELP_quant_2p_2N1(posA[3], posB[0], N);
  652.       break;
  653.    case 5:
  654.       index =
  655.          E_ACELP_quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2 * N) + 1);
  656.       index += E_ACELP_quant_2p_2N1(posA[3], posA[4], N);
  657.       break;
  658.    }
  659.    return(index);
  660. }
  661. /*
  662. * E_ACELP_quant_6p_6N_2
  663. *
  664. * Parameters:
  665. *    pos      I: position of the pulse 1..6
  666. *    N        I: number of bits for position
  667. *
  668. * Function:
  669. *    Quantization of 6 pulses with 6*N-2 bits
  670. *
  671. * Returns:
  672. *    (6*N)-2 bits
  673. */
  674. static Word32 E_ACELP_quant_6p_6N_2(Word32 pos[], Word32 N)
  675. {
  676.    Word32 i, j, k, nb_pos, n_1;
  677.    Word32 posA[6], posB[6];
  678.    Word32 index=0;
  679.    n_1 = N - 1;
  680.    nb_pos = 1 << n_1;
  681.    i = 0;
  682.    j = 0;
  683.    for (k = 0; k < 6; k++)
  684.    {
  685.       if ((pos[k] & nb_pos) == 0)
  686.       {
  687.          posA[i++] = pos[k];
  688.       }
  689.       else
  690.       {
  691.          posB[j++] = pos[k];
  692.       }
  693.    }
  694.    switch (i)
  695.    {
  696.    case 0:
  697.       index = 1 << ((6 * N) - 5);
  698.       index += E_ACELP_quant_5p_5N(posB, n_1) << N;
  699.       index += E_ACELP_quant_1p_N1(posB[5], n_1);
  700.       break;
  701.    case 1:
  702.       index = 1 << ((6 * N) - 5);
  703.       index += E_ACELP_quant_5p_5N(posB, n_1) << N;
  704.       index += E_ACELP_quant_1p_N1(posA[0], n_1);
  705.       break;
  706.    case 2:
  707.       index = 1 << ((6 * N) - 5);
  708.       index += E_ACELP_quant_4p_4N(posB, n_1) << ((2 * n_1) + 1);
  709.       index += E_ACELP_quant_2p_2N1(posA[0], posA[1], n_1);
  710.       break;
  711.    case 3:
  712.       index = E_ACELP_quant_3p_3N1(posA[0], posA[1], posA[2], n_1)
  713.          << ((3 * n_1) + 1);
  714.       index += E_ACELP_quant_3p_3N1(posB[0], posB[1], posB[2], n_1);
  715.       break;
  716.    case 4:
  717.       i = 2;
  718.       index = E_ACELP_quant_4p_4N(posA, n_1) << ((2 * n_1) + 1);
  719.       index += E_ACELP_quant_2p_2N1(posB[0], posB[1], n_1);
  720.       break;
  721.    case 5:
  722.       i = 1;
  723.       index = E_ACELP_quant_5p_5N(posA, n_1) << N;
  724.       index += E_ACELP_quant_1p_N1(posB[0], n_1);
  725.       break;
  726.    case 6:
  727.       i = 0;
  728.       index = E_ACELP_quant_5p_5N(posA, n_1) << N;
  729.       index += E_ACELP_quant_1p_N1(posA[5], n_1);
  730.       break;
  731.    }
  732.    index += (i & 3) << ((6 * N) - 4);
  733.    return(index);
  734. }
  735. /*
  736.  * E_ACELP_2t
  737.  *
  738.  * Parameters:
  739.  *    dn          I: corr. between target and h[].
  740.  *    cn          I: residual after Word32 term prediction
  741.  *    H           I: impulse response of weighted synthesis filter (Q12)
  742.  *    code        O: algebraic (fixed) codebook excitation (Q9)
  743.  *    y           O: filtered fixed codebook excitation (Q9)
  744.  *    index       O: index (12): 5 + 1 + 5 + 1 = 11 bits.
  745.  *
  746.  * Function:
  747.  *    12 bits algebraic codebook.
  748.  *    2 tracks x 32 positions per track = 64 samples.
  749.  *
  750.  *    12 bits --> 2 pulses in a frame of 64 samples.
  751.  *
  752.  *    All pulses can have two (2) possible amplitudes: +1 or -1.
  753.  *    Each pulse can have 32 possible positions.
  754.  *
  755.  * Returns:
  756.  *    void
  757.  */
  758. void E_ACELP_2t(Float32 dn[], Float32 cn[], Float32 H[],
  759.                 Word16 code[], Float32 y[], Word32 *index)
  760. {
  761.    Word32 i, j, k, i0, i1, ix, iy, pos = 0, pos2;
  762.    Float32 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
  763.    Float32 s, cor, alp, val;
  764.    Float32 *p0, *p1, *p2, *psign;
  765.    Float32 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
  766.    static Float32 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
  767.    static Float32 h_buf[4 * L_SUBFR];
  768.    static Float32 rrixix[2][32];
  769.    static Float32 rrixiy[1024];
  770.    /*
  771.     * Find sign for each pulse position.
  772.     */
  773.    alp = 2.0;
  774.    /* calculate energy for normalization of cn[] and dn[] */
  775.    val = 1.0;
  776.    cor = 1.0;
  777.    for(i = 0; i < L_SUBFR; i++)
  778.    {
  779.       val += cn[i] * cn[i];
  780.    }
  781.    for(i = 0; i < L_SUBFR; i++)
  782.    {
  783.       cor += dn[i] * dn[i];
  784.    }
  785.    s = (Float32)sqrt(cor / val);
  786.    for(i = 0; i < 2; i++)
  787.    {
  788.       for(j = i; j < L_SUBFR; j += 2)
  789.       {
  790.          val = dn[j];
  791.          cor = (s * cn[j]) + (alp * val);
  792.          if(cor >= 0.0)
  793.          {
  794.             sign[j] = 1.0;
  795.             vec[j] = -1.0;
  796.          }
  797.          else
  798.          {
  799.             sign[j] = -1.0;
  800.             vec[j] = 1.0;
  801.             val = -val;
  802.             cor = -cor;
  803.          }
  804.          dn[j] = val;   /* modify dn[] according to the fixed sign */
  805.          dn2[j] = cor;
  806.       }
  807.    }
  808.    /*
  809.     * Select 16 position per track according to dn2[].
  810.     */
  811.    for(i = 0; i < 2; i++)
  812.    {
  813.       for(k = 0; k < 16; k++)
  814.       {
  815.          ps = -1;
  816.          for(j = i; j < L_SUBFR; j += 2)
  817.          {
  818.             if(dn2[j] > ps)
  819.             {
  820.                ps = dn2[j];
  821.                pos = j;
  822.             }
  823.          }
  824.          dn2[pos] = (Float32)k - 16;   /* dn2 < 0 when position is selected */
  825.       }
  826.    }
  827.    /*
  828.     * Compute h_inv[i].
  829.     */
  830.    h = h_buf;
  831.    h_inv = h_buf + (2 * L_SUBFR);
  832.    for(i = 0; i < L_SUBFR; i++)
  833.    {
  834.       *h++ = 0.0F;
  835.       *h_inv++ = 0.0F;
  836.    }
  837.    for(i = 0; i < L_SUBFR; i++)
  838.    {
  839.       h[i] = H[i];
  840.       h_inv[i] = -h[i];
  841.    }
  842.    /*
  843.     * Compute rrixix[][] needed for the codebook search.
  844.     */
  845.    /* Init pointers to last position of rrixix[] */
  846.    p0 = &rrixix[0][32 - 1];
  847.    p1 = &rrixix[1][32 - 1];
  848.    ptr_h1 = h;
  849.    cor = 0.0F;
  850.    for(i = 0; i < 32; i++)
  851.    {
  852.       cor += (*ptr_h1) * (*ptr_h1);
  853.       ptr_h1++;
  854.       *p1-- = cor * 0.5F;
  855.       cor += (*ptr_h1) * (*ptr_h1);
  856.       ptr_h1++;
  857.       *p0-- = cor * 0.5F;
  858.    }
  859.    /*
  860.     * Compute rrixiy[][] needed for the codebook search.
  861.     */
  862.    pos = 1024 - 1;
  863.    pos2 = 1024 - 2;
  864.    ptr_hf = h + 1;
  865.    for(k = 0; k < 32; k++)
  866.    {
  867.       p1 = &rrixiy[pos];
  868.       p0 = &rrixiy[pos2];
  869.       cor = 0.0;
  870.       ptr_h1 = h;
  871.       ptr_h2 = ptr_hf;
  872.       for(i = k + 1; i < 32; i++)
  873.       {
  874.          cor += (*ptr_h1) * (*ptr_h2);
  875.          ptr_h1++;
  876.          ptr_h2++;
  877.          *p1 = cor;
  878.          cor += (*ptr_h1) * (*ptr_h2);
  879.          ptr_h1++;
  880.          ptr_h2++;
  881.          *p0 = cor;
  882.          p1 -= (32 + 1);
  883.          p0 -= (32 + 1);
  884.       }
  885.       cor += (*ptr_h1) * (*ptr_h2);
  886.       ptr_h1++;
  887.       ptr_h2++;
  888.       *p1 = cor;
  889.       pos -= 32;
  890.       pos2--;
  891.       ptr_hf += 2;
  892.    }
  893.    /*
  894.     * Modification of rrixiy[][] to take signs into account.
  895.     */
  896.    p0 = rrixiy;
  897.    for(i = 0; i < L_SUBFR; i += 2)
  898.    {
  899.       psign = sign;
  900.       if(psign[i] < 0.0)
  901.       {
  902.          psign = vec;
  903.       }
  904.       for(j = 1; j < L_SUBFR; j += 2)
  905.       {
  906.          *p0++ = *p0 * psign[j];
  907.       }
  908.    }
  909.    /*
  910.     * search 2 pulses:
  911.     * ---------------
  912.     * 32 pos x 32 pos = 1024 tests (all combinations are tested)
  913.     */
  914.    p0 = rrixix[0];
  915.    p1 = rrixix[1];
  916.    p2 = rrixiy;
  917.    psk = -1.0;
  918.    alpk = 1.0;
  919.    ix = 0;
  920.    iy = 1;
  921.    for(i0 = 0; i0 < L_SUBFR; i0 += 2)
  922.    {
  923.       ps1 = dn[i0];
  924.       alp1 = (*p0++);
  925.       pos = -1;
  926.       for(i1 = 1; i1 < L_SUBFR; i1 += 2)
  927.       {
  928.          ps2 = ps1 + dn[i1];
  929.          alp2 = alp1 + (*p1++) + (*p2++);
  930.          sq = ps2 * ps2;
  931.          s = (alpk * sq) - (psk * alp2);
  932.          if(s > 0.0)
  933.          {
  934.             psk = sq;
  935.             alpk = alp2;
  936.             pos = i1;
  937.          }
  938.       }
  939.       p1 -= 32;
  940.       if(pos >= 0)
  941.       {
  942.          ix = i0;
  943.          iy = pos;
  944.       }
  945.    }
  946.    /*
  947.     * Build the codeword, the filtered codeword and index of codevector.
  948.     */
  949.    memset(code, 0, L_SUBFR * sizeof(Word16));
  950.    i0 = ix / 2;   /* pos of pulse 1 (0..31) */
  951.    i1 = iy / 2;   /* pos of pulse 2 (0..31) */
  952.    if(sign[ix] > 0.0)
  953.    {
  954.       code[ix] = 512;
  955.       p0 = h - ix;
  956.    }
  957.    else
  958.    {
  959.       code[ix] = -512;
  960.       i0 += 32;
  961.       p0 = h_inv - ix;
  962.    }
  963.    if(sign[iy] > 0.0)
  964.    {
  965.       code[iy] = 512;
  966.       p1 = h - iy;
  967.    }
  968.    else
  969.    {
  970.       code[iy] = -512;
  971.       i1 += 32;
  972.       p1 = h_inv - iy;
  973.    }
  974.    *index = (i0 << 6) + i1;
  975.    for(i = 0; i < L_SUBFR; i++)
  976.    {
  977.       y[i] = (*p0++) + (*p1++);
  978.    }
  979.    return;
  980. }
  981. /*
  982.  * E_ACELP_4t
  983.  *
  984.  * Parameters:
  985.  *    dn          I: corr. between target and h[].
  986.  *    cn          I: residual after Word32 term prediction
  987.  *    H           I: impulse response of weighted synthesis filter (Q12)
  988.  *    code        O: algebraic (fixed) codebook excitation (Q9)
  989.  *    y           O: filtered fixed codebook excitation (Q9)
  990.  *    nbbits      I: 20, 36, 44, 52, 64, 72 or 88 bits
  991.  *    mode        I: speech mode
  992.  *    _index      O: index
  993.  *
  994.  * Function:
  995.  *    20, 36, 44, 52, 64, 72, 88 bits algebraic codebook.
  996.  *    4 tracks x 16 positions per track = 64 samples.
  997.  *
  998.  *    20 bits 5 + 5 + 5 + 5 --> 4 pulses in a frame of 64 samples.
  999.  *    36 bits 9 + 9 + 9 + 9 --> 8 pulses in a frame of 64 samples.
  1000.  *    44 bits 13 + 9 + 13 + 9 --> 10 pulses in a frame of 64 samples.
  1001.  *    52 bits 13 + 13 + 13 + 13 --> 12 pulses in a frame of 64 samples.
  1002.  *    64 bits 2 + 2 + 2 + 2 + 14 + 14 + 14 + 14 -->
  1003.  *                                  16 pulses in a frame of 64 samples.
  1004.  *    72 bits 10 + 2 + 10 + 2 + 10 + 14 + 10 + 14 -->
  1005.  *                                  18 pulses in a frame of 64 samples.
  1006.  *    88 bits 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 -->
  1007.  *                                  24 pulses in a frame of 64 samples.
  1008.  *
  1009.  *    All pulses can have two (2) possible amplitudes: +1 or -1.
  1010.  *    Each pulse can sixteen (16) possible positions.
  1011.  *
  1012.  * Returns:
  1013.  *    void
  1014.  */
  1015. void E_ACELP_4t(Float32 dn[], Float32 cn[], Float32 H[], Word16 code[],
  1016.                 Float32 y[], Word32 nbbits, Word16 mode, Word32 _index[])
  1017. {
  1018.    Float32 sign[L_SUBFR], vec[L_SUBFR];
  1019.    Float32 cor_x[16], cor_y[16], h_buf[4 * L_SUBFR];
  1020.    Float32 rrixix[4][16];
  1021.    Float32 rrixiy[4][256];
  1022.    Float32 dn2[L_SUBFR];
  1023.    Word32 ind[NPMAXPT*4];
  1024.    Word32 codvec[NB_PULSE_MAX];
  1025.    Word32 nbpos[10];
  1026.    Word32 pos_max[4];
  1027.    Word32 dn2_pos[8 * 4];
  1028.    UWord8 ipos[NB_PULSE_MAX];
  1029.    Word32 i, j, k, st, pos = 0, index, track, nb_pulse = 0, nbiter = 4;
  1030.    Word32 L_index;
  1031.    Float32 psk, ps, alpk, alp = 0.0F;
  1032.    Float32 val;
  1033.    Float32 s, cor;
  1034.    Float32 *p0, *p1, *p2, *p3, *psign;
  1035.    Float32 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
  1036.    switch (nbbits)
  1037.    {
  1038.    case 20:          /* 20 bits, 4 pulses, 4 tracks   */
  1039.       nbiter = 4;    /* 4x16x16=1024 loop             */
  1040.       alp = 2.0;
  1041.       nb_pulse = 4;
  1042.       nbpos[0] = 4;
  1043.       nbpos[1] = 8;
  1044.       break;
  1045.    case 36:          /* 36 bits, 8 pulses, 4 tracks   */
  1046.       nbiter = 4;    /* 4x20x16=1280 loop             */
  1047.       alp = 1.0;     /* coeff for sign setting        */
  1048.       nb_pulse = 8;
  1049.       nbpos[0] = 4;
  1050.       nbpos[1] = 8;
  1051.       nbpos[2] = 8;
  1052.       break;
  1053.    case 44:          /* 44 bits, 10 pulses, 4 tracks  */
  1054.       nbiter = 4;    /* 4x26x16=1664 loop             */
  1055.       alp = 1.0;
  1056.       nb_pulse = 10;
  1057.       nbpos[0] = 4;
  1058.       nbpos[1] = 6;
  1059.       nbpos[2] = 8;
  1060.       nbpos[3] = 8;
  1061.       break;
  1062.    case 52:          /* 52 bits, 12 pulses, 4 tracks  */
  1063.       nbiter = 4;    /* 4x26x16=1664 loop             */
  1064.       alp = 1.0;
  1065.       nb_pulse = 12;
  1066.       nbpos[0] = 4;
  1067.       nbpos[1] = 6;
  1068.       nbpos[2] = 8;
  1069.       nbpos[3] = 8;
  1070.       break;
  1071.    case 64:          /* 64 bits, 16 pulses, 4 tracks  */
  1072.       nbiter = 3;    /* 3x36x16=1728 loop             */
  1073.       alp = 0.8F;
  1074.       nb_pulse = 16;
  1075.       nbpos[0] = 4;
  1076.       nbpos[1] = 4;
  1077.       nbpos[2] = 6;
  1078.       nbpos[3] = 6;
  1079.       nbpos[4] = 8;
  1080.       nbpos[5] = 8;
  1081.       break;
  1082.    case 72:          /* 72 bits, 18 pulses, 4 tracks  */
  1083.       nbiter = 3;    /* 3x35x16=1680 loop             */
  1084.       alp = 0.75F;
  1085.       nb_pulse = 18;
  1086.       nbpos[0] = 2;
  1087.       nbpos[1] = 3;
  1088.       nbpos[2] = 4;
  1089.       nbpos[3] = 5;
  1090.       nbpos[4] = 6;
  1091.       nbpos[5] = 7;
  1092.       nbpos[6] = 8;
  1093.       break;
  1094.    case 88:          /* 88 bits, 24 pulses, 4 tracks  */
  1095.       if (mode > MODE_23k)
  1096.       {
  1097.          nbiter = 1;
  1098.       }
  1099.       else
  1100.       {
  1101.          nbiter = 2; /* 2x53x16=1696 loop             */
  1102.       }
  1103.       alp = 0.5;
  1104.       nb_pulse = 24;
  1105.       nbpos[0] = 2;
  1106.       nbpos[1] = 2;
  1107.       nbpos[2] = 3;
  1108.       nbpos[3] = 4;
  1109.       nbpos[4] = 5;
  1110.       nbpos[5] = 6;
  1111.       nbpos[6] = 7;
  1112.       nbpos[7] = 8;
  1113.       nbpos[8] = 8;
  1114.       nbpos[9] = 8;
  1115.       break;
  1116.    }
  1117.    /*
  1118.     * Find sign for each pulse position.
  1119.     */
  1120.    /* calculate energy for normalization of cn[] and dn[] */
  1121.    val = (cn[0] * cn[0]) + 1.0F;
  1122.    cor = (dn[0] * dn[0]) + 1.0F;
  1123.    for (i = 1; i < L_SUBFR; i += 7)
  1124.    {
  1125.       val += (cn[i] * cn[i]);
  1126.       cor += (dn[i] * dn[i]);
  1127.       val += (cn[i + 1] * cn[i + 1]);
  1128.       cor += (dn[i + 1] * dn[i + 1]);
  1129.       val += (cn[i + 2] * cn[i + 2]);
  1130.       cor += (dn[i + 2] * dn[i + 2]);
  1131.       val += (cn[i + 3] * cn[i + 3]);
  1132.       cor += (dn[i + 3] * dn[i + 3]);
  1133.       val += (cn[i + 4] * cn[i + 4]);
  1134.       cor += (dn[i + 4] * dn[i + 4]);
  1135.       val += (cn[i + 5] * cn[i + 5]);
  1136.       cor += (dn[i + 5] * dn[i + 5]);
  1137.       val += (cn[i + 6] * cn[i + 6]);
  1138.       cor += (dn[i + 6] * dn[i + 6]);
  1139.    }
  1140.    s = (Float32)sqrt(cor / val);
  1141.    for (j = 0; j < L_SUBFR; j++)
  1142.    {
  1143.       cor = (s * cn[j]) + (alp * dn[j]);
  1144.       if (cor >= 0.0F)
  1145.       {
  1146.          sign[j] = 1.0F;
  1147.          vec[j] = -1.0F;
  1148.          dn2[j] = cor;     /* dn2[] = mix of dn[] and cn[]   */
  1149.       }
  1150.       else
  1151.       {
  1152.          sign[j] = -1.0F;
  1153.          vec[j] = 1.0F;
  1154.          dn[j] = -dn[j];   /* modify dn[] according to the fixed sign */
  1155.          dn2[j] = -cor;    /* dn2[] = mix of dn[] and cn[]            */
  1156.       }
  1157.    }
  1158.    /*
  1159.     * Select 8 position per track according to dn2[].
  1160.     */
  1161.    for (i = 0; i < 4; i++)
  1162.    {
  1163.       for (k = 0; k < 8; k++)
  1164.       {
  1165.          ps = -1;
  1166.          for (j = i; j < L_SUBFR; j += 4)
  1167.          {
  1168.             if (dn2[j] > ps)
  1169.             {
  1170.                ps = dn2[j];
  1171.                pos = j;
  1172.             }
  1173.          }
  1174.          dn2[pos] = (Float32)k - 8;    /* dn2 < 0 when position is selected */
  1175.          dn2_pos[i * 8 + k] = pos;
  1176.       }
  1177.       pos_max[i] = dn2_pos[i * 8];
  1178.    }
  1179.    /*
  1180.     * Compute h_inv[i].
  1181.     */
  1182.    memset(h_buf, 0, L_SUBFR * sizeof(Float32));
  1183.    memset(h_buf + (2 * L_SUBFR), 0, L_SUBFR * sizeof(Float32));
  1184.    h = h_buf + L_SUBFR;
  1185.    h_inv = h_buf + (3 * L_SUBFR);
  1186.    memcpy(h, H, L_SUBFR * sizeof(Float32));
  1187.    h_inv[0] = -h[0];
  1188.    h_inv[1] = -h[1];
  1189.    h_inv[2] = -h[2];
  1190.    h_inv[3] = -h[3];
  1191.    for(i = 4; i < L_SUBFR; i += 6)
  1192.    {
  1193.       h_inv[i] = -h[i];
  1194.       h_inv[i + 1] = -h[i + 1];
  1195.       h_inv[i + 2] = -h[i + 2];
  1196.       h_inv[i + 3] = -h[i + 3];
  1197.       h_inv[i + 4] = -h[i + 4];
  1198.       h_inv[i + 5] = -h[i + 5];
  1199.    }
  1200.    /*
  1201.     * Compute rrixix[][] needed for the codebook search.
  1202.     */
  1203.    /* storage order --> i3i3, i2i2, i1i1, i0i0 */
  1204.    /* Init pointers to last position of rrixix[] */
  1205.    p0 = &rrixix[0][16 - 1];
  1206.    p1 = &rrixix[1][16 - 1];
  1207.    p2 = &rrixix[2][16 - 1];
  1208.    p3 = &rrixix[3][16 - 1];
  1209.    ptr_h1 = h;
  1210.    cor    = 0.0F;
  1211.    for(i = 0; i < 16; i++)
  1212.    {
  1213.       cor += (*ptr_h1) * (*ptr_h1);
  1214.       ptr_h1++;
  1215.       *p3-- = cor * 0.5F;
  1216.       cor += (*ptr_h1) * (*ptr_h1);
  1217.       ptr_h1++;
  1218.       *p2-- = cor * 0.5F;
  1219.       cor += (*ptr_h1) * (*ptr_h1);
  1220.       ptr_h1++;
  1221.       *p1-- = cor * 0.5F;
  1222.       cor += (*ptr_h1) * (*ptr_h1);
  1223.       ptr_h1++;
  1224.       *p0-- = cor * 0.5F;
  1225.    }
  1226.    /*
  1227.     * Compute rrixiy[][] needed for the codebook search.
  1228.     */
  1229.    /* storage order --> i2i3, i1i2, i0i1, i3i0 */
  1230.    pos = 256 - 1;
  1231.    ptr_hf = h + 1;
  1232.    for(k = 0; k < 16; k++)
  1233.    {
  1234.       p3 = &rrixiy[2][pos];
  1235.       p2 = &rrixiy[1][pos];
  1236.       p1 = &rrixiy[0][pos];
  1237.       p0 = &rrixiy[3][pos - 16];
  1238.       cor = 0.0F;
  1239.       ptr_h1 = h;
  1240.       ptr_h2 = ptr_hf;
  1241.       for(i = k + 1; i < 16; i++)
  1242.       {
  1243.          cor += (*ptr_h1) * (*ptr_h2);
  1244.          ptr_h1++;
  1245.          ptr_h2++;
  1246.          *p3 = cor;
  1247.          cor += (*ptr_h1) * (*ptr_h2);
  1248.          ptr_h1++;
  1249.          ptr_h2++;
  1250.          *p2 = cor;
  1251.          cor += (*ptr_h1) * (*ptr_h2);
  1252.          ptr_h1++;
  1253.          ptr_h2++;
  1254.          *p1 = cor;
  1255.          cor += (*ptr_h1) * (*ptr_h2);
  1256.          ptr_h1++;
  1257.          ptr_h2++;
  1258.          *p0 = cor;
  1259.          p3 -= (16 + 1);
  1260.          p2 -= (16 + 1);
  1261.          p1 -= (16 + 1);
  1262.          p0 -= (16 + 1);
  1263.       }
  1264.       cor += (*ptr_h1) * (*ptr_h2);
  1265.       ptr_h1++;
  1266.       ptr_h2++;
  1267.       *p3 = cor;
  1268.       cor += (*ptr_h1) * (*ptr_h2);
  1269.       ptr_h1++;
  1270.       ptr_h2++;
  1271.       *p2 = cor;
  1272.       cor += (*ptr_h1) * (*ptr_h2);
  1273.       ptr_h1++;
  1274.       ptr_h2++;
  1275.       *p1 = cor;
  1276.       pos -= 16;
  1277.       ptr_hf += 4;
  1278.    }
  1279.    /* storage order --> i3i0, i2i3, i1i2, i0i1 */
  1280.    pos = 256 - 1;
  1281.    ptr_hf = h + 3;
  1282.    for(k = 0; k < 16; k++)
  1283.    {
  1284.       p3 = &rrixiy[3][pos];
  1285.       p2 = &rrixiy[2][pos - 1];
  1286.       p1 = &rrixiy[1][pos - 1];
  1287.       p0 = &rrixiy[0][pos - 1];
  1288.       cor = 0.0F;
  1289.       ptr_h1 = h;
  1290.       ptr_h2 = ptr_hf;
  1291.       for(i= k + 1; i < 16; i++ )
  1292.       {
  1293.          cor += (*ptr_h1) * (*ptr_h2);
  1294.          ptr_h1++;
  1295.          ptr_h2++;
  1296.          *p3 = cor;
  1297.          cor += (*ptr_h1) * (*ptr_h2);
  1298.          ptr_h1++;
  1299.          ptr_h2++;
  1300.          *p2 = cor;
  1301.          cor += (*ptr_h1) * (*ptr_h2);
  1302.          ptr_h1++;
  1303.          ptr_h2++;
  1304.          *p1 = cor;
  1305.          cor += (*ptr_h1) * (*ptr_h2);
  1306.          ptr_h1++;
  1307.          ptr_h2++;
  1308.          *p0 = cor;
  1309.          p3 -= (16 + 1);
  1310.          p2 -= (16 + 1);
  1311.          p1 -= (16 + 1);
  1312.          p0 -= (16 + 1);
  1313.       }
  1314.       cor += (*ptr_h1) * (*ptr_h2);
  1315.       ptr_h1++;
  1316.       ptr_h2++;
  1317.       *p3 = cor;
  1318.       pos--;
  1319.       ptr_hf += 4;
  1320.    }
  1321.    /*
  1322.     * Modification of rrixiy[][] to take signs into account.
  1323.     */
  1324.    p0 = &rrixiy[0][0];
  1325.    for (k = 0; k < 4; k++)
  1326.    {
  1327.       for(i = k; i < L_SUBFR; i += 4)
  1328.       {
  1329.          psign = sign;
  1330.          if (psign[i] < 0.0F)
  1331.          {
  1332.             psign = vec;
  1333.          }
  1334.          j = (k + 1) % 4;
  1335.          *p0++ = *p0 * psign[j];
  1336.          *p0++ = *p0 * psign[j + 4];
  1337.          *p0++ = *p0 * psign[j + 8];
  1338.          *p0++ = *p0 * psign[j + 12];
  1339.          *p0++ = *p0 * psign[j + 16];
  1340.          *p0++ = *p0 * psign[j + 20];
  1341.          *p0++ = *p0 * psign[j + 24];
  1342.          *p0++ = *p0 * psign[j + 28];
  1343.          *p0++ = *p0 * psign[j + 32];
  1344.          *p0++ = *p0 * psign[j + 36];
  1345.          *p0++ = *p0 * psign[j + 40];
  1346.          *p0++ = *p0 * psign[j + 44];
  1347.          *p0++ = *p0 * psign[j + 48];
  1348.          *p0++ = *p0 * psign[j + 52];
  1349.          *p0++ = *p0 * psign[j + 56];
  1350.          *p0++ = *p0 * psign[j + 60];
  1351.       }
  1352.    }
  1353.    /*
  1354.     * Deep first search:
  1355.     * ------------------
  1356.     * 20 bits (4p):  4 iter x ((4x16)+(8x16))              = 768 tests
  1357.     * 36 bits (8p):  4 iter x ((1x1)+(4x16)+(8x16)+(8x16)) = 1280 tests
  1358.     * 52 bits (12p): 3 iter x ((1x1)+(1x1)+(4x16)+(6x16)
  1359.     *                                      +(8x16)+(8x16)) = 1248 tests
  1360.     * 64 bits (16p): 2 iter x ((1x1)+(1x1)+(4x16)+(6x16)
  1361.     *                        +(6x16)+(8x16)+(8x16)+(8x16)) = 1280 tests
  1362.     */
  1363.    psk = -1.0;
  1364.    alpk = 1.0;
  1365.    for (k = 0; k < nbiter; k++)
  1366.    {
  1367.       for (i = 0; i < nb_pulse - (nb_pulse % 3); i += 3)
  1368.       {
  1369.          ipos[i] = E_ROM_tipos[(k * 4) + i];
  1370.          ipos[i + 1] = E_ROM_tipos[(k * 4) + i + 1];
  1371.          ipos[i + 2] = E_ROM_tipos[(k * 4) + i + 2];
  1372.       }
  1373.       for (; i < nb_pulse; i ++)
  1374.       {
  1375.          ipos[i] = E_ROM_tipos[(k * 4) + i];
  1376.       }
  1377.       if (nbbits == 20)
  1378.       {
  1379.          pos = 0;
  1380.          ps = 0.0F;
  1381.          alp = 0.0F;
  1382.          memset(vec, 0, L_SUBFR * sizeof(Float32));
  1383.       }
  1384.       else if ((nbbits == 36) | (nbbits == 44))
  1385.       {
  1386.          /* first stage: fix 2 pulses */
  1387.          pos = 2;
  1388.          ind[0] = pos_max[ipos[0]];
  1389.          ind[1] = pos_max[ipos[1]];
  1390.          ps = dn[ind[0]] + dn[ind[1]];
  1391.          alp = rrixix[ipos[0]][ind[0] >> 2] + rrixix[ipos[1]][ind[1] >> 2] +
  1392.             rrixiy[ipos[0]][((ind[0] >> 2) << 4) + (ind[1] >> 2)];
  1393.          if (sign[ind[0]] < 0.0)
  1394.          {
  1395.             p0 = h_inv - ind[0];
  1396.          }
  1397.          else
  1398.          {
  1399.             p0 = h - ind[0];
  1400.          }
  1401.          if (sign[ind[1]] < 0.0)
  1402.          {
  1403.             p1 = h_inv - ind[1];
  1404.          }
  1405.          else
  1406.          {
  1407.             p1 = h - ind[1];
  1408.          }
  1409.          vec[0] = p0[0] + p1[0];
  1410.          vec[1] = p0[1] + p1[1];
  1411.          vec[2] = p0[2] + p1[2];
  1412.          vec[3] = p0[3] + p1[3];
  1413.          for (i = 4; i < L_SUBFR; i += 6)
  1414.          {
  1415.             vec[i] = p0[i] + p1[i];
  1416.             vec[i + 1] = p0[i + 1] + p1[i + 1];
  1417.             vec[i + 2] = p0[i + 2] + p1[i + 2];
  1418.             vec[i + 3] = p0[i + 3] + p1[i + 3];
  1419.             vec[i + 4] = p0[i + 4] + p1[i + 4];
  1420.             vec[i + 5] = p0[i + 5] + p1[i + 5];
  1421.          }
  1422.          if (nbbits == 44)
  1423.          {
  1424.             ipos[8] = 0;
  1425.             ipos[9] = 1;
  1426.          }
  1427.       }
  1428.       else
  1429.       {
  1430.          /* first stage: fix 4 pulses */
  1431.          pos = 4;
  1432.          ind[0] = pos_max[ipos[0]];
  1433.          ind[1] = pos_max[ipos[1]];
  1434.          ind[2] = pos_max[ipos[2]];
  1435.          ind[3] = pos_max[ipos[3]];
  1436.          ps = dn[ind[0]] + dn[ind[1]] + dn[ind[2]] + dn[ind[3]];
  1437.          p0 = h - ind[0];
  1438.          if (sign[ind[0]] < 0.0)
  1439.          {
  1440.             p0 = h_inv - ind[0];
  1441.          }
  1442.          p1 = h - ind[1];
  1443.          if (sign[ind[1]] < 0.0)
  1444.          {
  1445.             p1 = h_inv - ind[1];
  1446.          }
  1447.          p2 = h - ind[2];
  1448.          if (sign[ind[2]] < 0.0)
  1449.          {
  1450.             p2 = h_inv - ind[2];
  1451.          }
  1452.          p3 = h - ind[3];
  1453.          if (sign[ind[3]] < 0.0)
  1454.          {
  1455.             p3 = h_inv - ind[3];
  1456.          }
  1457.          vec[0] = p0[0] + p1[0] + p2[0] + p3[0];
  1458.          for (i = 1; i < L_SUBFR; i += 3)
  1459.          {
  1460.             vec[i] = p0[i] + p1[i] + p2[i] + p3[i];
  1461.             vec[i + 1] = p0[i + 1] + p1[i + 1] + p2[i + 1] + p3[i + 1];
  1462.             vec[i + 2] = p0[i + 2] + p1[i + 2] + p2[i + 2] + p3[i + 2];
  1463.          }
  1464.          alp = 0.0F;
  1465.          alp += vec[0] * vec[0] + vec[1] * vec[1];
  1466.          alp += vec[2] * vec[2] + vec[3] * vec[3];
  1467.          for (i = 4; i < L_SUBFR; i += 6)
  1468.          {
  1469.             alp += vec[i] * vec[i];
  1470.             alp += vec[i + 1] * vec[i + 1];
  1471.             alp += vec[i + 2] * vec[i + 2];
  1472.             alp += vec[i + 3] * vec[i + 3];
  1473.             alp += vec[i + 4] * vec[i + 4];
  1474.             alp += vec[i + 5] * vec[i + 5];
  1475.          }
  1476.          alp *= 0.5F;
  1477.          if (nbbits == 72)
  1478.          {
  1479.             ipos[16] = 0;
  1480.             ipos[17] = 1;
  1481.          }
  1482.       }
  1483.       /* other stages of 2 pulses */
  1484.       for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
  1485.       {
  1486.          /*
  1487.           * Calculate correlation of all possible positions
  1488.           * of the next 2 pulses with previous fixed pulses.
  1489.           * Each pulse can have 16 possible positions.
  1490.           */
  1491.          E_ACELP_h_vec_corr1(h, vec, ipos[j], sign, rrixix, cor_x, dn2_pos,
  1492.             nbpos[st]);
  1493.          E_ACELP_h_vec_corr2(h, vec, ipos[j + 1], sign, rrixix, cor_y);
  1494.          /*
  1495.           * Find best positions of 2 pulses.
  1496.           */
  1497.          E_ACELP_2pulse_search(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
  1498.             &ind[j], &ind[j+1], dn, dn2_pos, cor_x, cor_y, rrixiy);
  1499.          if (j < (nb_pulse - 2))
  1500.          {
  1501.             p0 = h - ind[j];
  1502.             if (sign[ind[j]] < 0.0)
  1503.             {
  1504.                p0 = h_inv - ind[j];
  1505.             }
  1506.             p1 = h - ind[j + 1];
  1507.             if (sign[ind[j + 1]] < 0.0)
  1508.             {
  1509.                p1 = h_inv - ind[j + 1];
  1510.             }
  1511.             vec[0] += p0[0] + p1[0];
  1512.             vec[1] += p0[1] + p1[1];
  1513.             vec[2] += p0[2] + p1[2];
  1514.             vec[3] += p0[3] + p1[3];
  1515.             for (i = 4; i < L_SUBFR; i += 6)
  1516.             {
  1517.                vec[i] += p0[i] + p1[i];
  1518.                vec[i + 1] += p0[i + 1] + p1[i + 1];
  1519.                vec[i + 2] += p0[i + 2] + p1[i + 2];
  1520.                vec[i + 3] += p0[i + 3] + p1[i + 3];
  1521.                vec[i + 4] += p0[i + 4] + p1[i + 4];
  1522.                vec[i + 5] += p0[i + 5] + p1[i + 5];
  1523.             }
  1524.          }
  1525.       }
  1526.       /* memorise the best codevector */
  1527.       ps = ps * ps;
  1528.       s = (alpk * ps) - (psk * alp);
  1529.       if (s > 0.0F)
  1530.       {
  1531.          psk = ps;
  1532.          alpk = alp;
  1533.          memcpy(codvec, ind, nb_pulse * sizeof(Word32));
  1534.       }
  1535.   }
  1536.   /*
  1537.    * Build the codeword, the filtered codeword and index of codevector.
  1538.    */
  1539.   memset(code, 0,  L_SUBFR * sizeof(Word16));
  1540.   memset(y, 0,  L_SUBFR * sizeof(Float32));
  1541.   memset(ind, 0xffffffff, NPMAXPT * 4 * sizeof(Word32));
  1542.   for (k = 0; k < nb_pulse; k++)
  1543.   {
  1544.      i = codvec[k];  /* read pulse position  */
  1545.      val = sign[i];  /* read sign            */
  1546.      index = i / 4;  /* pos of pulse (0..15) */
  1547.      track = i % 4;
  1548.      if (val > 0)
  1549.      {
  1550.         code[i] += 512;
  1551.         codvec[k] += (2 * L_SUBFR);
  1552.      }
  1553.      else
  1554.      {
  1555.         code[i] -= 512;
  1556.         index += 16;
  1557.      }
  1558.      i = track * NPMAXPT;
  1559.      while (ind[i] >= 0)
  1560.      {
  1561.         i++;
  1562.      }
  1563.      ind[i] = index;
  1564.      p0 = h_inv - codvec[k];
  1565.      y[0] += p0[0];
  1566.      for(i = 1; i < L_SUBFR; i += 3)
  1567.      {
  1568.         y[i] += p0[i];
  1569.         y[i + 1] += p0[i + 1];
  1570.         y[i + 2] += p0[i + 2];
  1571.      }
  1572.   }
  1573.   if (nbbits == 20)
  1574.   {
  1575.      for (track = 0; track < 4; track++)
  1576.      {
  1577.         k = track * NPMAXPT;
  1578.         _index[track] = E_ACELP_quant_1p_N1(ind[k], 4);
  1579.      }
  1580.   }
  1581.   else if (nbbits == 36)
  1582.   {
  1583.      for (track = 0; track < 4; track++)
  1584.      {
  1585.         k = track * NPMAXPT;
  1586.         _index[track] = E_ACELP_quant_2p_2N1(ind[k], ind[k + 1], 4);
  1587.      }
  1588.   }
  1589.   else if (nbbits == 44)
  1590.   {
  1591.      for (track = 0; track < (4 - 2); track++)
  1592.      {
  1593.         k = track * NPMAXPT;
  1594.         _index[track] =
  1595.            E_ACELP_quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4);
  1596.      }
  1597.      for (track = 2; track < 4; track++)
  1598.      {
  1599.         k = track * NPMAXPT;
  1600.         _index[track] = E_ACELP_quant_2p_2N1(ind[k], ind[k + 1], 4);
  1601.      }
  1602.   }
  1603.   else if (nbbits == 52)
  1604.   {
  1605.      for (track = 0; track < 4; track++)
  1606.      {
  1607.         k = track*NPMAXPT;
  1608.         _index[track] =
  1609.            E_ACELP_quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4);
  1610.      }
  1611.   }
  1612.   else if (nbbits == 64)
  1613.   {
  1614.      for (track = 0; track < 4; track++)
  1615.      {
  1616.         k = track * NPMAXPT;
  1617.         L_index = E_ACELP_quant_4p_4N(&ind[k], 4);
  1618.         _index[track] = ((L_index >> 14) & 3);
  1619.         _index[track + 4] = (L_index & 0x3FFF);
  1620.      }
  1621.   }
  1622.   else if (nbbits == 72)
  1623.   {
  1624.      for (track=0; track< (4 - 2); track++)
  1625.      {
  1626.         k = track * NPMAXPT;
  1627.         L_index = E_ACELP_quant_5p_5N(&ind[k], 4);
  1628.         _index[track] = ((L_index >> 10) & 0x03FF);
  1629.         _index[track + 4] = (L_index & 0x03FF);
  1630.      }
  1631.      for (track = 2; track < 4; track++)
  1632.      {
  1633.         k = track * NPMAXPT;
  1634.         L_index = E_ACELP_quant_4p_4N(&ind[k], 4);
  1635.         _index[track] = ((L_index >> 14) & 3);
  1636.         _index[track + 4] = (L_index & 0x3FFF);
  1637.      }
  1638.   }
  1639.   else if (nbbits == 88)
  1640.   {
  1641.      for (track = 0; track < 4; track++)
  1642.      {
  1643.         k = track * NPMAXPT;
  1644.         L_index = E_ACELP_quant_6p_6N_2(&ind[k], 4);
  1645.         _index[track] = ((L_index >> 11) & 0x07FF);
  1646.         _index[track + 4] = (L_index & 0x07FF);
  1647.      }
  1648.   }
  1649.   return;
  1650. }
  1651. /*
  1652.  * E_ACELP_gains_quantise
  1653.  *
  1654.  * Parameters:
  1655.  *    code        I: Innovative code vector
  1656.  *    nbits       I: number of bits (6 or 7)
  1657.  *    gain_pit  I/O: Pitch gain / Quantized pitch gain
  1658.  *    gain_code   O: Quantized codebook gain
  1659.  *    coeff       O: correlations
  1660.  *                   <y1,y1>, -2<xn,y1>, <y2,y2>, -2<xn,y2>, 2<y1,y2>
  1661.  *    gp_clip     I: gain pitch clipping flag (1 = clipping)
  1662.  *    mem       I/O: static memory
  1663.  *
  1664.  * Function:
  1665.  *    Quantization of pitch and codebook gains.
  1666.  *    MA prediction is performed on the innovation energy
  1667.  *    (in dB with mean removed).
  1668.  *    An initial predicted gain, g_0, is first determined and the correction
  1669.  *    factor alpha = gain / g_0 is quantized.
  1670.  *    The pitch gain and the correction factor are vector quantized and the
  1671.  *    mean-squared weighted error criterion is used in the quantizer search.
  1672.  *    Subrame size is L_SUBFR
  1673.  *
  1674.  * Returns:
  1675.  *    index of quantizer
  1676.  */
  1677. Word32 E_ACELP_gains_quantise(Word16 code[], Word32 nbits, Float32 f_gain_pit,
  1678.                               Word16 *gain_pit, Word32 *gain_code,
  1679.                               Float32 *coeff, Word32 gp_clip,
  1680.                               Word16 *past_qua_en)
  1681. {
  1682.    Word32 i, j, indice = 0, min_ind, size, L_tmp, gcode_inov, L_gcode0;
  1683.    Word32 exp;
  1684.    Float32 gcode0;
  1685.    Float32 dist, dist_min, g_pitch, g_code, ener_code, pred_code;
  1686.    Float32 coef0, coef1, coef2, coef3, coef4;
  1687.    const Float32 *t_qua_gain, *p;
  1688.    Word16 s_exp, s_gcode0, exp_gcode0, frac;
  1689.    /*
  1690.     * Find the initial quantization pitch index
  1691.     * Set gains search range
  1692.     */
  1693.    if (nbits == 6)
  1694.    {
  1695.       t_qua_gain = E_ROM_qua_gain6b;
  1696.       min_ind = 0;
  1697.       size = 64;
  1698.       if (gp_clip == 1)
  1699.       {
  1700.          size -= 16; /* limit gain pitch to 1.0 */
  1701.       }
  1702.    }
  1703.    else
  1704.    {
  1705.       t_qua_gain = E_ROM_qua_gain7b;
  1706.       p = E_ROM_qua_gain7b + 64; /* pt at 1/4th of table */
  1707.       j = NB_QUA_GAIN7B - 64;
  1708.       if (gp_clip == 1)
  1709.       {
  1710.          j -= 27; /* limit gain pitch to 1.0 */
  1711.       }
  1712.       min_ind = 0;
  1713.       g_pitch = f_gain_pit;
  1714.       for (i = 0; i < j; i++, p += 2)
  1715.       {
  1716.          if (g_pitch > *p)
  1717.          {
  1718.             min_ind++;
  1719.          }
  1720.       }
  1721.       size = 64;
  1722.    }
  1723.    /* innovation energy */
  1724.    L_tmp = E_UTIL_dot_product12(code, code, L_SUBFR, &exp);
  1725.    ener_code = (Float32)(L_tmp * pow(2, (exp - 31) - 18));
  1726.    ener_code = (Float32)(10.0F * log10(ener_code * 0.015625F));
  1727.    /* exp: -18 (code in Q9), -6 (/L_subfr) */
  1728.    s_exp = (Word16)(exp - (18 + 6));
  1729.    E_UTIL_normalised_inverse_sqrt(&L_tmp, &s_exp);
  1730.    if (s_exp > 3)
  1731.    {
  1732.       L_tmp <<= (s_exp - 3);
  1733.    }
  1734.    else
  1735.    {
  1736.       L_tmp >>= (3 - s_exp);
  1737.    }
  1738.    gcode_inov = (Word16)(L_tmp >> 16);  /* g_code_inov in Q12 */
  1739.    /*
  1740.     * Compute gcode0.
  1741.     *  = Sum(i=0,1) pred[i] * past_qua_en[i] + mean_ener - ener_code
  1742.     */
  1743.    /* MEAN_ENER in Q24 = 0x1e000000 */
  1744.    /* MA prediction coeff = {0.5, 0.4, 0.3, 0.2} in Q13 */
  1745.    L_tmp = 0xF000000 + 4096 * past_qua_en[0]; /* Q13 * Q10 -> Q24 */
  1746.    L_tmp = L_tmp + 3277 * past_qua_en[1];     /* Q13 * Q10 -> Q24 */
  1747.    L_tmp = L_tmp + 2458 * past_qua_en[2];     /* Q13 * Q10 -> Q24 */
  1748.    L_tmp = L_tmp + 1638 * past_qua_en[3];     /* Q13 * Q10 -> Q24 */
  1749.    L_gcode0 = L_tmp >> 15;             /* From Q24 to Q8  */
  1750.    pred_code = (Float32)(L_gcode0 * pow(2, -8));
  1751.    /*
  1752.     * gcode0 = pow(10.0, gcode0/20)
  1753.     *        = pow(2, 3.321928*gcode0/20)
  1754.     *        = pow(2, 0.166096*gcode0)
  1755.     */
  1756.    L_tmp = (L_gcode0 * 5443) >> 7; /* *0.166096 in Q15 -> Q24, From Q24 to Q16 */
  1757.    E_UTIL_l_extract(L_tmp, &exp_gcode0, &frac); /* Extract exponant of gcode0  */
  1758.    s_gcode0 = (Word16)(E_UTIL_pow2(14, frac));  /* Put 14 as exponant so that  */
  1759.    /*
  1760.     * output of Pow2() will be:
  1761.     * 16384 < Pow2() <= 32767
  1762.     */
  1763.    exp_gcode0 = (Word16)(exp_gcode0 - 14);
  1764.    /* Search for best quantizer */
  1765.    gcode0 = pred_code - ener_code;
  1766.    gcode0 = (Float32)pow(10.0, gcode0 * 0.05F);   /* predicted gain */
  1767.    dist_min = FLT_MAX;
  1768.    p = t_qua_gain + min_ind * 2;
  1769.    coef0 = coeff[0];
  1770.    coef1 = coeff[1];
  1771.    coef2 = coeff[2];
  1772.    coef3 = coeff[3];
  1773.    coef4 = coeff[4];
  1774.    for (i = 0; i < size; i++)
  1775.    {
  1776.       g_pitch = *p++;                  /* pitch gain */
  1777.       g_code = gcode0 * *p++;         /* codebook gain */
  1778.       dist = g_pitch * g_pitch * coef0
  1779.          + g_pitch * coef1
  1780.          + g_code * g_code * coef2
  1781.          + g_code * coef3
  1782.          + g_pitch * g_code * coef4;
  1783.       if (dist < dist_min)
  1784.       {
  1785.          dist_min = dist;
  1786.          indice = i;
  1787.       }
  1788.    }
  1789.    indice += min_ind;
  1790.    *gain_pit  = (Word16)floor(t_qua_gain[indice * 2] * (1 << 14) + 0.5F);
  1791.    L_tmp = (Word32)floor(t_qua_gain[indice * 2 + 1] * (1 << 11) + 0.5F);
  1792.    L_tmp = E_UTIL_saturate(L_tmp);
  1793.    L_tmp *= s_gcode0;
  1794.    exp_gcode0 += 5;
  1795.    if (exp_gcode0 >= 0)
  1796.    {
  1797.       *gain_code = L_tmp << exp_gcode0; /* gain of code in Q16 */
  1798.    }
  1799.    else
  1800.    {
  1801.       *gain_code = L_tmp >> -exp_gcode0; /* gain of code in Q16 */
  1802.    }
  1803.    /* adjust gain according to energy of code */
  1804.    E_UTIL_l_extract((Word32)*gain_code, &s_exp, &frac);
  1805.    L_tmp = E_UTIL_mpy_32_16(s_exp, frac, (Word16)gcode_inov);
  1806.    if (L_tmp < 0xFFFFFFF)
  1807.    {
  1808.       *gain_code = L_tmp << 3;             /* gcode_inov in Q12 */
  1809.    }
  1810.    else
  1811.    {
  1812.       *gain_code = 0x7FFFFFFF;
  1813.    }
  1814.    /*
  1815.     * qua_ener = 20*log10(g_code)
  1816.     *          = 6.0206*log2(g_code)
  1817.     *          = 6.0206*(log2(g_codeQ11) - 11)
  1818.     */
  1819.    L_tmp = (Word32)floor(t_qua_gain[indice * 2 + 1] * (1 << 11) + 0.5F);
  1820.    L_tmp = E_UTIL_saturate(L_tmp);
  1821.    E_UTIL_log2_32(L_tmp, &s_exp, &frac);
  1822.    s_exp = (Word16)(s_exp - 11);
  1823.    L_tmp = E_UTIL_mpy_32_16(s_exp, frac, 24660);   /* x 6.0206 in Q12 */
  1824.    /* update table of past quantized energies */
  1825.    past_qua_en[3] = past_qua_en[2];
  1826.    past_qua_en[2] = past_qua_en[1];
  1827.    past_qua_en[1] = past_qua_en[0];
  1828.    past_qua_en[0] = (Word16)(L_tmp >> 3); /* result in Q10 */
  1829.    return indice;
  1830. }