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

Symbian

开发平台:

C/C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include <math.h>
  7. #include "hlxclib/memory.h"
  8. #include "typedef.h"
  9. #include "enc_util.h"
  10. #define ORDER        16          /* order of linear prediction filter   */
  11. #define ISF_GAP      128         /* 50                                  */
  12. #define M            16
  13. #define M16k         20          /* Order of LP filter                  */
  14. #define MP1          (M+1)
  15. #define NC16k        (M16k / 2)
  16. #define MU           10923       /* Prediction factor (1.0/3.0) in Q15  */
  17. #define F_MU         (1.0 / 3.0) /* prediction factor                   */
  18. #define N_SURV_MAX   4           /* 4 survivors max                     */
  19. #ifndef PI
  20. #define PI           3.141592654
  21. #endif
  22. /* isp_isf_conversion */
  23. #define SCALE1  (6400.0/PI)
  24. /* chebyshev */
  25. #define  NO_ITER   4    /* no of iterations for tracking the root */
  26. #define  NO_POINTS 100
  27. #define SIZE_BK1        256
  28. #define SIZE_BK2        256
  29. #define SIZE_BK21       64
  30. #define SIZE_BK22       128
  31. #define SIZE_BK23       128
  32. #define SIZE_BK24       32
  33. #define SIZE_BK25       32
  34. #define SIZE_BK21_36b   128
  35. #define SIZE_BK22_36b   128
  36. #define SIZE_BK23_36b   64
  37. #define SIZE_BK_NOISE1  64
  38. #define SIZE_BK_NOISE2  64
  39. #define SIZE_BK_NOISE3  64
  40. #define SIZE_BK_NOISE4  32
  41. #define SIZE_BK_NOISE5  32
  42. extern const Word16 E_ROM_mean_isf[];
  43. extern const Word16 E_ROM_cos[];
  44. extern const Float32 E_ROM_dico1_isf[];
  45. extern const Float32 E_ROM_dico2_isf[];
  46. extern const Float32 E_ROM_dico21_isf[];
  47. extern const Float32 E_ROM_dico22_isf[];
  48. extern const Float32 E_ROM_dico23_isf[];
  49. extern const Float32 E_ROM_dico24_isf[];
  50. extern const Float32 E_ROM_dico25_isf[];
  51. extern const Float32 E_ROM_dico21_isf_36b[];
  52. extern const Float32 E_ROM_dico22_isf_36b[];
  53. extern const Float32 E_ROM_dico23_isf_36b[];
  54. extern const Float32 E_ROM_f_mean_isf[];
  55. extern const Float32 E_ROM_lag_window[];
  56. extern const Float32 E_ROM_grid[];
  57. extern const Float32 E_ROM_f_interpol_frac[];
  58. /*
  59.  * E_LPC_isf_reorder
  60.  *
  61.  * Parameters:
  62.  *    isf          I/O: vector of isfs
  63.  *    min_dist       I: quantized ISFs (in frequency domain)
  64.  *    n              I: LPC order
  65.  *
  66.  * Function:
  67.  *    To make sure that the  isfs are properly order and to keep a certain
  68.  *    minimum distance between consecutive isfs.
  69.  *
  70.  * Returns:
  71.  *    void
  72.  */
  73. static void E_LPC_isf_reorder(Word16 *isf, Word16 min_dist, Word16 n)
  74. {
  75.    Word32 i, isf_min;
  76.    isf_min = min_dist;
  77.    for (i = 0; i < n - 1; i++)
  78.    {
  79.       if (isf[i] < isf_min)
  80.       {
  81.          isf[i] = (Word16)isf_min;
  82.       }
  83.       isf_min = isf[i] + min_dist;
  84.    }
  85.    return;
  86. }
  87. /*
  88.  * E_LPC_isp_pol_get
  89.  *
  90.  * Parameters:
  91.  *    isp            I: Immitance spectral pairs (cosine domaine)
  92.  *    f              O: the coefficients of F1 or F2
  93.  *    n              I: no of coefficients (m/2)
  94.  *    k16            I: 16k flag
  95.  *
  96.  * Function:
  97.  *    Find the polynomial F1(z) or F2(z) from the ISPs.
  98.  *    This is performed by expanding the product polynomials:
  99.  *
  100.  *    F1(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
  101.  *            i=0,2,4,6,8
  102.  *    F2(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
  103.  *             i=1,3,5,7
  104.  *
  105.  *    where isp_i are the ISPs in the cosine domain.
  106.  *
  107.  * Returns:
  108.  *    void
  109.  */
  110. static void E_LPC_isp_pol_get(Word16 *isp, Word32 *f, Word32 n, Word16 k16)
  111. {
  112.    Word32 i, j, t0, s1, s2;
  113.    Word16 hi, lo;
  114.    s1 = 8388608;
  115.    s2 = 512;
  116.    if(k16)
  117.    {
  118.       s1 >>= 2;
  119.       s2 >>= 2;
  120.    }
  121.    /* All computation in Q23 */
  122.    f[0] = s1;              /* f[0] = 1.0; in Q23         */
  123.    f[1] = isp[0] * (-s2);  /* f[1] = -2.0*isp[0] in Q23  */
  124.    f += 2;                 /* Advance f pointer          */
  125.    isp += 2;               /* Advance isp pointer        */
  126.    for(i = 2; i <= n; i++)
  127.    {
  128.       *f = f[ - 2];
  129.       for(j = 1; j < i; j++, f--)
  130.       {
  131.          E_UTIL_l_extract(f[- 1], &hi, &lo);
  132.          t0 = E_UTIL_mpy_32_16(hi, lo, *isp);   /* t0 = f[-1] * isp */
  133.          t0 = (t0 << 1);
  134.          *f = (*f - t0);         /* *f -= t0    */
  135.          *f = (*f + f[ - 2]);    /* *f += f[-2] */
  136.       }
  137.       *f = *f - (*isp * s2);     /* *f -= isp << 8 */
  138.       f += i;     /* Advance f pointer   */
  139.       isp += 2;   /* Advance isp pointer */
  140.    }
  141.    return;
  142. }
  143. static void E_LPC_f_isp_pol_get(Float32 isp[], Float32 f[], Word32 n)
  144. {
  145.    Float32 b;
  146.    Word32 i, j;
  147.    f[0] = 1;
  148.    b = (Float32)(-2.0 * *isp);
  149.    f[1] = b;
  150.    for (i = 2; i <= n; i++)
  151.    {
  152.       isp += 2;
  153.       b = (Float32)(-2.0 * *isp);
  154.       f[i] = (Float32)(b * f[i - 1] + 2.0 * f[i - 2]);
  155.       for (j = i - 1; j > 1; j--)
  156.       {
  157.          f[j] += b * f[j - 1] + f[j - 2];
  158.       }
  159.       f[1] += b;
  160.    }
  161.    return;
  162. }
  163. /*
  164.  * E_LPC_isp_a_conversion
  165.  *
  166.  * Parameters:
  167.  *    isp            I: (Q15) Immittance spectral pairs
  168.  *    a              O: (Q12) Predictor coefficients (order = M)
  169.  *    m              I: order of LP filter
  170.  *
  171.  * Function:
  172.  *    Convert ISPs to predictor coefficients a[]
  173.  *
  174.  * Returns:
  175.  *    void
  176.  */
  177. void E_LPC_isp_a_conversion(Word16 isp[], Word16 a[], Word16 m)
  178. {
  179.    Word32 f1[NC16k + 1], f2[NC16k];
  180.    Word32 i, j, nc, t0;
  181.    Word16 hi, lo;
  182.    nc = m >> 1;
  183.    if (nc > 8)
  184.    {
  185.       E_LPC_isp_pol_get(&isp[0], f1, nc, 1);
  186.       for (i = 0; i <= nc; i++)
  187.       {
  188.          f1[i] = (f1[i] << 2);
  189.       }
  190.    }
  191.    else
  192.    {
  193.       E_LPC_isp_pol_get(&isp[0], f1, nc, 0);
  194.    }
  195.    if (nc > 8)
  196.    {
  197.       E_LPC_isp_pol_get(&isp[1], f2, nc - 1, 1);
  198.       for (i = 0; i <= nc - 1; i++)
  199.       {
  200.          f2[i] = (f2[i] << 2);
  201.       }
  202.    }
  203.    else
  204.    {
  205.       E_LPC_isp_pol_get(&isp[1], f2, nc - 1, 0);
  206.    }
  207.    /* Multiply F2(z) by (1 - z^-2)  */
  208.    for (i = (nc - 1); i > 1; i--)
  209.    {
  210.       f2[i] = f2[i] - f2[i - 2];     /* f2[i] -= f2[i-2]; */
  211.    }
  212.    /*  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1]) */
  213.    for (i = 0; i < nc; i++)
  214.    {
  215.       /* f1[i] *= (1.0 + isp[M-1]); */
  216.       E_UTIL_l_extract(f1[i], &hi, &lo);
  217.       t0 = E_UTIL_mpy_32_16(hi, lo, isp[m - 1]);
  218.       f1[i] = f1[i] + t0;
  219.       /* f2[i] *= (1.0 - isp[M-1]); */
  220.       E_UTIL_l_extract(f2[i], &hi, &lo);
  221.       t0 = E_UTIL_mpy_32_16(hi, lo, isp[m - 1]);
  222.       f2[i] = f2[i] - t0;
  223.    }
  224.    /*
  225.     * A(z) = (F1(z)+F2(z))/2
  226.     * F1(z) is symmetric and F2(z) is antisymmetric
  227.     */
  228.    /* a[0] = 1.0; */
  229.    a[0] = 4096;
  230.    for (i = 1, j = (m - 1); i < nc; i++, j--)
  231.    {
  232.       /* a[i] = 0.5*(f1[i] + f2[i]); */
  233.       t0 = f1[i] + f2[i];                    /* f1[i] + f2[i]             */
  234.       a[i] = (Word16)((t0 + 0x800) >> 12);   /* from Q23 to Q12 and * 0.5 */
  235.       /* a[j] = 0.5*(f1[i] - f2[i]); */
  236.       t0 = (f1[i] - f2[i]);                  /* f1[i] - f2[i]             */
  237.       a[j] = (Word16)((t0 + 0x800) >> 12);   /* from Q23 to Q12 and * 0.5 */
  238.    }
  239.    /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
  240.    E_UTIL_l_extract(f1[nc], &hi, &lo);
  241.    t0 = E_UTIL_mpy_32_16(hi, lo, isp[m - 1]);
  242.    t0 = (f1[nc] + t0);
  243.    a[nc] = (Word16)((t0 + 0x800) >> 12);    /* from Q23 to Q12 and * 0.5 */
  244.    /* a[m] = isp[m-1]; */
  245.    a[m] = (Word16)((isp[m - 1] + 0x4) >> 3); /* from Q15 to Q12          */
  246.    return;
  247. }
  248. void E_LPC_f_isp_a_conversion(Float32 *isp, Float32 *a, Word32 m)
  249. {
  250.    Float32 f1[(M16k / 2) + 1], f2[M16k / 2];
  251.    Word32 i, j, nc;
  252.    nc = m / 2;
  253.    /*
  254.     *  Find the polynomials F1(z) and F2(z)
  255.     */
  256.    E_LPC_f_isp_pol_get(&isp[0], f1, nc);
  257.    E_LPC_f_isp_pol_get(&isp[1], f2, nc-1);
  258.    /*
  259.     *  Multiply F2(z) by (1 - z^-2)
  260.     */
  261.    for (i = (nc - 1); i > 1; i--)
  262.    {
  263.       f2[i] -= f2[i - 2];
  264.    }
  265.    /*
  266.     *  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1])
  267.     */
  268.    for (i = 0; i < nc; i++)
  269.    {
  270.       f1[i] *= (Float32)(1.0 + isp[m - 1]);
  271.       f2[i] *= (Float32)(1.0 - isp[m - 1]);
  272.    }
  273.    /*
  274.     *  A(z) = (F1(z)+F2(z))/2
  275.     *  F1(z) is symmetric and F2(z) is antisymmetric
  276.     */
  277.    a[0] = 1.0;
  278.    for (i = 1, j = m - 1; i < nc; i++, j--)
  279.    {
  280.       a[i] = (Float32)(0.5 * (f1[i] + f2[i]));
  281.       a[j] = (Float32)(0.5 * (f1[i] - f2[i]));
  282.    }
  283.    a[nc] = (Float32)(0.5 * f1[nc] * (1.0 + isp[m - 1]));
  284.    a[m] = isp[m - 1];
  285.    return;
  286. }
  287. /*
  288.  * E_LPC_int_isp_find
  289.  *
  290.  * Parameters:
  291.  *    isp_old           I: isps from past frame
  292.  *    isp_new           I: isps from present frame
  293.  *    frac              I: (Q15) fraction for 3 first subfr
  294.  *    Az                O: LP coefficients in 4 subframes
  295.  *
  296.  * Function:
  297.  *    Find the Word32erpolated ISP parameters for all subframes.
  298.  *
  299.  * Returns:
  300.  *    void
  301.  */
  302. void E_LPC_int_isp_find(Word16 isp_old[], Word16 isp_new[],
  303.                         const Word16 frac[], Word16 Az[])
  304. {
  305.    Word32 i, k, fac_old, fac_new, tmp;
  306.    Word16 isp[M];
  307.    for (k = 0; k < 3; k++)
  308.    {
  309.       fac_new = frac[k];
  310.       fac_old = ((32767 - fac_new) + 1);  /* 1.0 - fac_new */
  311.       for (i = 0; i < M; i++)
  312.       {
  313.          tmp = isp_old[i] * fac_old;
  314.          tmp += (isp_new[i] * fac_new);
  315.          isp[i] = (Word16)((tmp + 0x4000) >> 15);
  316.       }
  317.       E_LPC_isp_a_conversion(isp, Az, M);
  318.       Az += MP1;
  319.    }
  320.    /* 4th subframe: isp_new (frac=1.0) */
  321.    E_LPC_isp_a_conversion(isp_new, Az, M);
  322.    return;
  323. }
  324. void E_LPC_f_int_isp_find(Float32 isp_old[], Float32 isp_new[], Float32 a[],
  325.                           Word32 nb_subfr, Word32 m)
  326. {
  327.   Float32 isp[M], fnew, fold;
  328.   Float32 *p_a;
  329.   Word32 i, k;
  330.   p_a = a;
  331.   for (k = 0; k < nb_subfr; k++)
  332.   {
  333.     fnew = E_ROM_f_interpol_frac[k];
  334.     fold = (Float32)(1.0 - fnew);
  335.     for (i = 0; i < m; i++)
  336.     {
  337.       isp[i] = isp_old[i] * fold + isp_new[i] * fnew;
  338.     }
  339.     E_LPC_f_isp_a_conversion(isp, p_a, m);
  340.     p_a += (m + 1);
  341.   }
  342.   return;
  343. }
  344. /*
  345.  * E_LPC_a_weight
  346.  *
  347.  * Parameters:
  348.  *    a              I: LP filter coefficients
  349.  *    ap             O: weighted LP filter coefficients
  350.  *    gamma          I: weighting factor
  351.  *    m              I: order of LP filter
  352.  *
  353.  * Function:
  354.  *    Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i).
  355.  *
  356.  * Returns:
  357.  *    void
  358.  */
  359. void E_LPC_a_weight(Float32 *a, Float32 *ap, Float32 gamma, Word32 m)
  360. {
  361.    Float32 f;
  362.    Word32 i;
  363.    ap[0] = a[0];
  364.    f = gamma;
  365.    for (i = 1; i <= m; i++)
  366.    {
  367.       ap[i] = f*a[i];
  368.       f *= gamma;
  369.    }
  370.    return;
  371. }
  372. /*
  373.  * E_LPC_isf_2s3s_decode
  374.  *
  375.  * Parameters:
  376.  *    indice            I: quantisation indices
  377.  *    isf_q             O: quantised ISFs in the cosine domain
  378.  *    past_isfq       I/O: past ISF quantizer
  379.  *
  380.  * Function:
  381.  *    Decoding of ISF parameters.
  382.  *
  383.  * Returns:
  384.  *    void
  385.  */
  386. static void E_LPC_isf_2s3s_decode(Word32 *indice, Word16 *isf_q,
  387.                                   Word16 *past_isfq)
  388. {
  389.    Word32 i;
  390.    Word16 tmp;
  391.    for(i = 0; i < 9; i++)
  392.    {
  393.       isf_q[i] = (Word16)((E_ROM_dico1_isf[indice[0] * 9 + i] * 2.56F) + 0.5F);
  394.    }
  395.    for(i = 0; i < 7; i++)
  396.    {
  397.       isf_q[i + 9] =
  398.          (Word16)((E_ROM_dico2_isf[indice[1] * 7 + i] * 2.56F) + 0.5F);
  399.    }
  400.    for(i = 0; i < 5; i++)
  401.    {
  402.       isf_q[i] = (Word16)(isf_q[i] +
  403.          (Word16)((E_ROM_dico21_isf_36b[indice[2] * 5 + i] * 2.56F) + 0.5F));
  404.    }
  405.    for(i = 0; i < 4; i++)
  406.    {
  407.       isf_q[i + 5] = (Word16)(isf_q[i + 5] +
  408.          (Word32)((E_ROM_dico22_isf_36b[indice[3] * 4 + i] * 2.56F) + 0.5F));
  409.    }
  410.    for(i = 0; i < 7; i++)
  411.    {
  412.       isf_q[i + 9] = (Word16)(isf_q[i + 9] +
  413.          (Word32)((E_ROM_dico23_isf_36b[indice[4] * 7 + i] * 2.56F) + 0.5F));
  414.    }
  415.    for(i = 0; i < ORDER; i++)
  416.    {
  417.       tmp = isf_q[i];
  418.       isf_q[i] = (Word16)(tmp + E_ROM_mean_isf[i]);
  419.       isf_q[i] = (Word16)(isf_q[i] + ((MU * past_isfq[i]) >> 15));
  420.       past_isfq[i] = tmp;
  421.    }
  422.    E_LPC_isf_reorder(isf_q, ISF_GAP, ORDER);
  423.    return;
  424. }
  425. /*
  426.  * E_LPC_isf_2s5s_decode
  427.  *
  428.  * Parameters:
  429.  *    indice            I: quantization indices
  430.  *    isf_q             O: quantized ISFs in the cosine domain
  431.  *    past_isfq       I/O: past ISF quantizer
  432.  *    isfold            I: past quantized ISF
  433.  *    isf_buf           I: isf buffer
  434.  *    bfi               I: Bad frame indicator
  435.  *    enc_dec           I:
  436.  *
  437.  * Function:
  438.  *    Decoding of ISF parameters.
  439.  *
  440.  * Returns:
  441.  *    void
  442.  */
  443. void E_LPC_isf_2s5s_decode(Word32 *indice, Word16 *isf_q, Word16 *past_isfq)
  444. {
  445.    Word32 i;
  446.    Word16 tmp;
  447.    for (i = 0; i < 9; i++)
  448.    {
  449.       isf_q[i] = (Word16)((E_ROM_dico1_isf[indice[0] * 9 + i] * 2.56F) + 0.5F);
  450.    }
  451.    for (i = 0; i < 7; i++)
  452.    {
  453.       isf_q[i + 9] =
  454.          (Word16)((E_ROM_dico2_isf[indice[1] * 7 + i] * 2.56F) + 0.5F);
  455.    }
  456.    for (i = 0; i < 3; i++)
  457.    {
  458.       isf_q[i] = (Word16)(isf_q[i] +
  459.          (Word32)((E_ROM_dico21_isf[indice[2] * 3 + i] * 2.56F) + 0.5F));
  460.    }
  461.    for (i = 0; i < 3; i++)
  462.    {
  463.       isf_q[i + 3] = (Word16)(isf_q[i + 3] +
  464.          (Word32)((E_ROM_dico22_isf[indice[3] * 3 + i] * 2.56F) + 0.5F));
  465.    }
  466.    for (i = 0; i < 3; i++)
  467.    {
  468.       isf_q[i + 6] = (Word16)(isf_q[i + 6] +
  469.          (Word32)((E_ROM_dico23_isf[indice[4] * 3 + i] * 2.56F) + 0.5F));
  470.    }
  471.    for (i = 0; i < 3; i++)
  472.    {
  473.       isf_q[i + 9] = (Word16)(isf_q[i + 9] +
  474.          (Word32)((E_ROM_dico24_isf[indice[5] * 3 + i] * 2.56F) + 0.5F));
  475.    }
  476.    for (i = 0; i < 4; i++)
  477.    {
  478.       isf_q[i + 12] = (Word16)(isf_q[i + 12] +
  479.          (Word32)((E_ROM_dico25_isf[indice[6] * 4 + i] * 2.56F) + 0.5F));
  480.    }
  481.    for (i = 0; i < ORDER; i++)
  482.    {
  483.       tmp = isf_q[i];
  484.       isf_q[i] = (Word16)(tmp + E_ROM_mean_isf[i]);
  485.       isf_q[i] = (Word16)(isf_q[i] + ((MU * past_isfq[i]) >> 15));
  486.       past_isfq[i] = tmp;
  487.    }
  488.    E_LPC_isf_reorder(isf_q, ISF_GAP, ORDER);
  489.    return;
  490. }
  491. /*
  492.  * E_LPC_isf_isp_conversion
  493.  *
  494.  * Parameters:
  495.  *    isp            O: (Q15) isp[m] (range: -1<=val<1)
  496.  *    isf            I: (Q15) isf[m] normalized (range: 0.0 <= val <= 0.5)
  497.  *    m              I: LPC order
  498.  *
  499.  * Function:
  500.  *    Transformation isf to isp
  501.  *
  502.  *    ISP are immitance spectral pair in cosine domain (-1 to 1).
  503.  *    ISF are immitance spectral pair in frequency domain (0 to 6400).
  504.  * Returns:
  505.  *    void
  506.  */
  507. void E_LPC_isf_isp_conversion(Word16 isf[], Word16 isp[], Word16 m)
  508. {
  509.    Word32 i, ind, offset, tmp;
  510.    for (i = 0; i < m - 1; i++)
  511.    {
  512.       isp[i] = isf[i];
  513.    }
  514.    isp[m - 1] = (Word16)(isf[m - 1] << 1);
  515.    for (i = 0; i < m; i++)
  516.    {
  517.       ind = isp[i] >> 7;         /* ind    = b7-b15 of isf[i] */
  518.       offset = isp[i] & 0x007f;  /* offset = b0-b6  of isf[i] */
  519.       /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
  520.       tmp = ((E_ROM_cos[ind + 1] - E_ROM_cos[ind]) * offset) << 1;
  521.       isp[i] = (Word16)(E_ROM_cos[ind] + (tmp >> 8));
  522.    }
  523.    return;
  524. }
  525. /*
  526.  * E_LPC_chebyshev
  527.  *
  528.  * Parameters:
  529.  *    x           I: value of evaluation; x=cos(freq)
  530.  *    f           I: coefficients of sum or diff polynomial
  531.  *    n           I: order of polynomial
  532.  *
  533.  * Function:
  534.  *    Evaluates the Chebyshev polynomial series
  535.  *
  536.  *    The polynomial order is n = m/2   (m is the prediction order)
  537.  *    The polynomial is given by
  538.  *    C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2
  539.  *
  540.  * Returns:
  541.  *    the value of the polynomial C(x)
  542.  */
  543. static Float32 E_LPC_chebyshev(Float32 x, Float32 *f, Word32 n)
  544. {
  545.    Float32 b1, b2, b0, x2;
  546.    Word32 i;                        /* for the special case of 10th order  */
  547.                                     /*       filter (n=5)                  */
  548.    x2 = 2.0F * x;                   /* x2 = 2.0*x;                         */
  549.    b2 = f[0];                       /* b2 = f[0];                          */
  550.    b1 = x2 * b2 + f[1];             /* b1 = x2*b2 + f[1];                  */
  551.    for (i = 2; i < n; i++)
  552.    {
  553.       b0 = x2 * b1 - b2 + f[i];     /* b0 = x2 * b1 - 1. + f[2];           */
  554.       b2 = b1;                      /* b2 = x2 * b0 - b1 + f[3];           */
  555.       b1 = b0;                      /* b1 = x2 * b2 - b0 + f[4];           */
  556.    }
  557.    return (x * b1 - b2 + 0.5F * f[n]); /* return (x*b1 - b2 + 0.5*f[5]);   */
  558. }
  559. /*
  560.  * E_LPC_isf_sub_vq
  561.  *
  562.  * Parameters:
  563.  *    x            I/O: unquantised / quantised ISF
  564.  *    dico           I: codebook
  565.  *    dim            I: dimension of vector
  566.  *    dico_size      I: codebook size
  567.  *    distance       O: minimum distance
  568.  *
  569.  * Function:
  570.  *    Quantization of a subvector of size 2 in Split-VQ of ISFs
  571.  *
  572.  * Returns:
  573.  *    quantisation index
  574.  */
  575. Word16 E_LPC_isf_sub_vq(Float32 *x, const Float32 *E_ROM_dico, Word32 dim,
  576.                         Word32 E_ROM_dico_size, Float32 *distance)
  577. {
  578.    Float32 dist_min, dist, temp;
  579.    const Float32 *p_E_ROM_dico;
  580.    Word32 i, j, index = 0;
  581.    dist_min = 1.0e30f;
  582.    p_E_ROM_dico = E_ROM_dico;
  583.    for (i = 0; i < E_ROM_dico_size; i++)
  584.    {
  585.       dist = x[0] - *p_E_ROM_dico++;
  586.       dist *= dist;
  587.       for (j = 1; j < dim; j++)
  588.       {
  589.          temp = x[j] - *p_E_ROM_dico++;
  590.          dist += temp * temp;
  591.       }
  592.       if (dist < dist_min)
  593.       {
  594.          dist_min = dist;
  595.          index = i;
  596.       }
  597.    }
  598.    *distance = dist_min;
  599.    /* Reading the selected vector */
  600.    memcpy(x, &E_ROM_dico[index * dim], dim * sizeof(Float32));
  601.    return (Word16)index;
  602. }
  603. /*
  604.  * E_LPC_lag_wind
  605.  *
  606.  * Parameters:
  607.  *    r         I/O: autocorrelations vector
  608.  *    m           I: window lenght
  609.  *
  610.  * Function:
  611.  *    Lag windowing of the autocorrelations.
  612.  *
  613.  * Returns:
  614.  *    void
  615.  */
  616. void E_LPC_lag_wind(Float32 r[], Word32 m)
  617. {
  618.    Word32 i;
  619.    for (i = 0; i < m; i++)
  620.    {
  621.       r[i] *= E_ROM_lag_window[i];
  622.    }
  623.    return;
  624. }
  625. /*
  626.  * E_LPC_lev_dur
  627.  *
  628.  * Parameters:
  629.  *    r_h         I: vector of autocorrelations (msb)
  630.  *    r_l         I: vector of autocorrelations (lsb)
  631.  *    A           O: LP coefficients (a[0] = 1.0) (m = 16)
  632. *     rc          O: reflection coefficients
  633.  *    mem       I/O: static memory
  634.  *
  635.  * Function:
  636.  *    Wiener-Levinson-Durbin algorithm to compute
  637.  *    the LPC parameters from the autocorrelations of speech.
  638.  *
  639.  * Returns:
  640.  *    void
  641.  */
  642. void E_LPC_lev_dur(Float32 *a, Float32 *r, Word32 m)
  643. {
  644.    Float32 buf[M];
  645.    Float32 *rc;    /* reflection coefficients  0,...,m-1 */
  646.    Float32 s, at, err;
  647.    Word32 i, j, l;
  648.    rc = &buf[0];
  649.    rc[0] = (-r[1]) / r[0];
  650.    a[0] = 1.0F;
  651.    a[1] = rc[0];
  652.    err = r[0] + r[1] * rc[0];
  653.    for (i = 2; i <= m; i++)
  654.    {
  655.       s = 0.0F;
  656.       for (j = 0; j < i; j++)
  657.       {
  658.          s += r[i - j] * a[j];
  659.       }
  660.       rc[i - 1]= (-s) / (err);
  661.       for (j = 1; j <= (i >> 1); j++)
  662.       {
  663.          l = i - j;
  664.          at = a[j] + rc[i - 1] * a[l];
  665.          a[l] += rc[i - 1] * a[j];
  666.          a[j] = at;
  667.       }
  668.       a[i] = rc[i - 1];
  669.       err += rc[i - 1] * s;
  670.       if (err <= 0.0F)
  671.       {
  672.          err = 0.01F;
  673.       }
  674.    }
  675.    return;
  676. }
  677. /*
  678.  * E_LPC_a_isp_conversion
  679.  *
  680.  * Parameters:
  681.  *    a           I: LP filter coefficients
  682.  *    isp         O: Immittance spectral pairs
  683.  *    old_isp     I: ISP vector from past frame
  684.  *
  685.  * Function:
  686.  *    Compute the ISPs from the LPC coefficients a[] using Chebyshev
  687.  *    polynomials. The found ISPs are in the cosine domain with values
  688.  *    in the range from 1 down to -1.
  689.  *    The table E_ROM_grid[] contains the polongs (in the cosine domain) at
  690.  *    which the polynomials are evaluated.
  691.  *
  692.  *    The ISPs are the roots of the two polynomials F1(z) and F2(z)
  693.  *    defined as
  694.  *               F1(z) = A(z) + z^-m A(z^-1)
  695.  *    and        F2(z) = A(z) - z^-m A(z^-1)
  696.  *
  697.  *    for a even order m=2n, F1(z) has 5 conjugate roots on the unit circle
  698.  *    and F2(z) has 4 conjugate roots on the unit circle in addition to two
  699.  *    roots at 0 and pi.
  700.  *
  701.  *    For a 10th order LP analysis, F1(z) and F2(z) can be written as
  702.  *
  703.  *    F1(z) = (1 + a[10])   PRODUCT  (1 - 2 cos(w_i) z^-1 + z^-2 )
  704.  *                       i=0,2,4,6,8
  705.  *
  706.  *    F2(z) = (1 - a[10]) (1 - z^-2) PRODUCT  (1 - 2 cos(w_i) z^-1 + z^-2 )
  707.  *                                  i=1,3,5,7
  708.  *
  709.  *    The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last
  710.  *    predictor coefficient a[M].
  711.  *
  712.  * Returns:
  713.  *    void
  714.  */
  715. void E_LPC_a_isp_conversion(Float32 *a, Float32 *isp, Float32 *old_isp,
  716.                             Word32 m)
  717. {
  718.    Float32 f1[(M >> 1) + 1], f2[M >> 1];
  719.    Float32 *pf;
  720.    Float32 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
  721.    Word32 j, i, nf, ip, order, nc;
  722.    nc = m >> 1;
  723.    /*
  724.     * find the sum and diff polynomials F1(z) and F2(z)
  725.     *      F1(z) = [A(z) + z^m A(z^-1)]
  726.     *      F2(z) = [A(z) - z^m A(z^-1)]/(1-z^-2)
  727.     */
  728.    for (i=0; i < nc; i++)
  729.    {
  730.       f1[i] = a[i] + a[m - i];
  731.       f2[i] = a[i] - a[m - i];
  732.    }
  733.    f1[nc] = 2.0F * a[nc];
  734.    /* divide by (1 - z^-2) */
  735.    for (i = 2; i < nc; i++)
  736.    {
  737.       f2[i] += f2[i - 2];
  738.    }
  739.    /*
  740.     * Find the ISPs (roots of F1(z) and F2(z) ) using the
  741.     * Chebyshev polynomial evaluation.
  742.     * The roots of F1(z) and F2(z) are alternatively searched.
  743.     * We start by finding the first root of F1(z) then we switch
  744.     * to F2(z) then back to F1(z) and so on until all roots are found.
  745.     *
  746.     *  - Evaluate Chebyshev pol. at E_ROM_grid polongs and check for sign change.
  747.     *  - If sign change track the root by subdividing the Word32erval
  748.     *    4 times and ckecking sign change.
  749.     */
  750.    nf=0;      /* number of found frequencies */
  751.    ip=0;      /* flag to first polynomial   */
  752.    pf = f1;  /* start with F1(z) */
  753.    order = nc;
  754.    xlow = E_ROM_grid[0];
  755.    ylow = E_LPC_chebyshev(xlow, pf, nc);
  756.    j = 0;
  757.    while ( (nf < m - 1) && (j < NO_POINTS) )
  758.    {
  759.       j++;
  760.       xhigh = xlow;
  761.       yhigh = ylow;
  762.       xlow = E_ROM_grid[j];
  763.       ylow = E_LPC_chebyshev(xlow, pf, order);
  764.       if (ylow * yhigh <= 0.0F)  /* if sign change new root exists */
  765.       {
  766.          j--;
  767.          /* divide the Word32erval of sign change by NO_ITER */
  768.          for (i = 0; i < NO_ITER; i++)
  769.          {
  770.             xmid = 0.5F * (xlow + xhigh);
  771.             ymid = E_LPC_chebyshev(xmid, pf, order);
  772.             if (ylow * ymid <= 0.0F)
  773.             {
  774.                yhigh = ymid;
  775.                xhigh = xmid;
  776.             }
  777.             else
  778.             {
  779.                ylow = ymid;
  780.                xlow = xmid;
  781.             }
  782.          }
  783.          /* linear interpolation for evaluating the root */
  784.          xint = xlow - ylow * (xhigh - xlow) / (yhigh - ylow);
  785.          isp[nf] = xint;    /* new root */
  786.          nf++;
  787.          ip = 1 - ip;                  /* flag to other polynomial    */
  788.          pf = ip ? f2 : f1;            /* pointer to other polynomial */
  789.          order = ip ? (nc - 1) : nc;   /* order of other polynomial   */
  790.          xlow = xint;
  791.          ylow = E_LPC_chebyshev(xlow, pf, order);
  792.       }
  793.    }
  794.    isp[m - 1] = a[m];
  795.    /*
  796.     * Check if m-1 roots found
  797.     * if not use the ISPs from previous frame
  798.     */
  799.    if (nf < m - 1)
  800.    {
  801.       for(i = 0; i < m; i++)
  802.       {
  803.          isp[i] = old_isp[i];
  804.       }
  805.    }
  806.    return;
  807. }
  808. /*
  809.  * E_LPC_isp_isf_conversion
  810.  *
  811.  * Parameters:
  812.  *    isp            I: isp[m] (range: -1 <= val < 1) (Q15)
  813.  *    isf            O: isf[m] normalized (range: 0 <= val <= 6400)
  814.  *    m              I: LPC order
  815.  *
  816.  * Function:
  817.  *    Transformation isp to isf
  818.  *
  819.  *    ISP are immitance spectral pair in cosine domain (-1 to 1).
  820.  *    ISF are immitance spectral pair in frequency domain (0 to 6400).
  821.  * Returns:
  822.  *    energy of prediction error
  823.  */
  824. void E_LPC_isp_isf_conversion(Float32 isp[], Float32 isf[], Word32 m)
  825. {
  826.    Word32 i;
  827.    /* convert ISPs to frequency domain 0..6400 */
  828.    for(i = 0; i < (m - 1); i++)
  829.    {
  830.       isf[i] = (Float32)(acos(isp[i]) * SCALE1);
  831.    }
  832.    isf[m - 1] = (Float32)(acos(isp[m - 1]) * SCALE1 * 0.5F);
  833.    return;
  834. }
  835. /*
  836.  * E_LPC_stage1_isf_vq
  837.  *
  838.  * Parameters:
  839.  *    x              I: ISF residual vector
  840.  *    dico           I: quantisation codebook
  841.  *    dim            I: dimension of vector
  842.  *    dico_size      I: size of quantization codebook
  843.  *    index          O: indices of survivors
  844.  *    surv           I: number of survivor
  845.  *
  846.  * Function:
  847.  *    1st stage VQ with split-by-2.
  848.  *
  849.  * Returns:
  850.  *    void
  851.  */
  852. static void E_LPC_stage1_isf_vq(Float32 *x, const Float32 *E_ROM_dico,
  853.                                 Word32 dim, Word32 E_ROM_dico_size,
  854.                                 Word32 *index, Word32 surv)
  855. {
  856.    Float32 dist_min[N_SURV_MAX];
  857.    Float32 dist, temp1, temp2;
  858.    const Float32 *p_E_ROM_dico;
  859.    Word32 i, j, k, l;
  860.    for (i = 0; i < surv; i++)
  861.    {
  862.       dist_min[i] = 1.0e30F;
  863.    }
  864.    for (i = 0; i < surv; i++)
  865.    {
  866.       index[i] = i;
  867.    }
  868.    p_E_ROM_dico = E_ROM_dico;
  869.    for (i = 0; i < E_ROM_dico_size; i++)
  870.    {
  871.       dist = x[0] - *p_E_ROM_dico++;
  872.       dist *= dist;
  873.       for (j = 1; j < dim; j += 2)
  874.       {
  875.          temp1 = x[j] - *p_E_ROM_dico++;
  876.          temp2 = x[j + 1] - *p_E_ROM_dico++;
  877.          dist += temp1 * temp1 + temp2 * temp2;
  878.       }
  879.       for (k = 0; k < surv; k++)
  880.       {
  881.          if (dist < dist_min[k])
  882.          {
  883.             for (l = surv - 1; l > k; l--)
  884.             {
  885.                dist_min[l] = dist_min[l - 1];
  886.                index[l] = index[l - 1];
  887.             }
  888.             dist_min[k] = dist;
  889.             index[k] = i;
  890.             break;
  891.          }
  892.       }
  893.    }
  894.    return;
  895. }
  896. /*
  897.  * E_LPC_isf_2s3s_quantise
  898.  *
  899.  * Parameters:
  900.  *    isf1              I: ISF in the frequency domain (0..6400)
  901.  *    isf_q             O: quantized ISF
  902.  *    past_isfq       I/O: past ISF quantizer
  903.  *    indice            O: quantisation indices (5 words)
  904.  *    nb_surv           I: number of survivor (1, 2, 3 or 4)
  905.  *
  906.  * Function:
  907.  *    Quantization of isf parameters with prediction. (36 bits)
  908.  *
  909.  *    The isf vector is quantized using two-stage VQ with split-by-2 in
  910.  *    1st stage and split-by-3 in the second stage.
  911.  * Returns:
  912.  *    void
  913.  */
  914. void E_LPC_isf_2s3s_quantise(Float32 *isf1, Word16 *isf_q, Word16 *past_isfq,
  915.                              Word32 *indice, Word32 nb_surv)
  916. {
  917.    Float32 isf[ORDER], isf_stage2[ORDER];
  918.    Float32 temp, min_err, distance;
  919.    Word32 surv1[N_SURV_MAX];     /* indices of survivors from 1st stage */
  920.    Word32 tmp_ind[5];
  921.    Word32 i, k;
  922.    for (i = 0; i < ORDER; i++)
  923.    {
  924.       isf[i] = (Float32)((isf1[i] - E_ROM_f_mean_isf[i]) -
  925.          F_MU * past_isfq[i] * 0.390625F);
  926.    }
  927.    E_LPC_stage1_isf_vq(&isf[0], E_ROM_dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
  928.    distance = 1.0e30F;
  929.    for (k = 0; k < nb_surv; k++)
  930.    {
  931.       for (i = 0; i < 9; i++)
  932.       {
  933.          isf_stage2[i] = isf[i] - E_ROM_dico1_isf[i + surv1[k] * 9];
  934.       }
  935.       tmp_ind[0] = E_LPC_isf_sub_vq(&isf_stage2[0], E_ROM_dico21_isf_36b, 5,
  936.          SIZE_BK21_36b, &min_err);
  937.       temp = min_err;
  938.       tmp_ind[1] = E_LPC_isf_sub_vq(&isf_stage2[5], E_ROM_dico22_isf_36b, 4,
  939.          SIZE_BK22_36b, &min_err);
  940.       temp += min_err;
  941.       if (temp < distance)
  942.       {
  943.          distance = temp;
  944.          indice[0] = surv1[k];
  945.          for (i = 0; i < 2; i++)
  946.          {
  947.             indice[i + 2] = tmp_ind[i];
  948.          }
  949.       }
  950.    }
  951.    E_LPC_stage1_isf_vq(&isf[9], E_ROM_dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
  952.    distance = 1.0e30F;
  953.    for (k = 0; k < nb_surv; k++)
  954.    {
  955.       for (i = 0; i < 7; i++)
  956.       {
  957.          isf_stage2[i] = isf[9 + i] - E_ROM_dico2_isf[i + surv1[k] * 7];
  958.       }
  959.       tmp_ind[0] = E_LPC_isf_sub_vq(&isf_stage2[0], E_ROM_dico23_isf_36b, 7,
  960.          SIZE_BK23_36b, &min_err);
  961.       temp = min_err;
  962.       if (temp < distance)
  963.       {
  964.          distance = temp;
  965.          indice[1] = surv1[k];
  966.          indice[4]= tmp_ind[0];
  967.       }
  968.    }
  969.    /* decoding the ISF */
  970.    E_LPC_isf_2s3s_decode(indice, isf_q, past_isfq);
  971.    return;
  972. }
  973. /*
  974.  * E_LPC_isf_2s5s_quantise
  975.  *
  976.  * Parameters:
  977.  *    isf1              I: ISF in the frequency domain (0..6400)
  978.  *    isf_q             O: quantized ISF
  979.  *    past_isfq       I/O: past ISF quantizer
  980.  *    indice            O: quantisation indices (5 words)
  981.  *    nb_surv           I: number of survivor (1, 2, 3 or 4)
  982.  *
  983.  * Function:
  984.  *    Quantization of isf parameters with prediction. (46 bits)
  985.  *
  986.  *    The isf vector is quantized using two-stage VQ with split-by-2 in
  987.  *    1st stage and split-by-5 in the second stage.
  988.  * Returns:
  989.  *    void
  990.  */
  991. void E_LPC_isf_2s5s_quantise(Float32 *isf1, Word16 *isf_q, Word16 *past_isfq,
  992.                              Word32 *indice, Word32 nb_surv)
  993. {
  994.    Float32 isf[ORDER], isf_stage2[ORDER];
  995.    Float32 temp, min_err, distance;
  996.    Word32 surv1[N_SURV_MAX];     /* indices of survivors from 1st stage */
  997.    Word32 tmp_ind[5];
  998.    Word32 i, k;
  999.    for (i=0; i<ORDER; i++)
  1000.    {
  1001.       isf[i] = (Float32)((isf1[i] - E_ROM_f_mean_isf[i]) -
  1002.          F_MU * past_isfq[i] * 0.390625F);
  1003.    }
  1004.    E_LPC_stage1_isf_vq(&isf[0], E_ROM_dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
  1005.    distance = 1.0e30F;
  1006.    for (k = 0; k < nb_surv; k++)
  1007.    {
  1008.       for (i = 0; i < 9; i++)
  1009.       {
  1010.          isf_stage2[i] = isf[i] - E_ROM_dico1_isf[i + surv1[k] * 9];
  1011.       }
  1012.       tmp_ind[0] = E_LPC_isf_sub_vq(&isf_stage2[0], E_ROM_dico21_isf, 3,
  1013.          SIZE_BK21, &min_err);
  1014.       temp = min_err;
  1015.       tmp_ind[1] = E_LPC_isf_sub_vq(&isf_stage2[3], E_ROM_dico22_isf, 3,
  1016.          SIZE_BK22, &min_err);
  1017.       temp += min_err;
  1018.       tmp_ind[2] = E_LPC_isf_sub_vq(&isf_stage2[6], E_ROM_dico23_isf, 3,
  1019.          SIZE_BK23, &min_err);
  1020.       temp += min_err;
  1021.       if (temp < distance)
  1022.       {
  1023.          distance = temp;
  1024.          indice[0] = surv1[k];
  1025.          for (i = 0; i < 3; i++)
  1026.          {
  1027.             indice[i + 2] = tmp_ind[i];
  1028.          }
  1029.       }
  1030.    }
  1031.    E_LPC_stage1_isf_vq(&isf[9], E_ROM_dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
  1032.    distance = 1.0e30F;
  1033.    for (k=0; k<nb_surv; k++)
  1034.    {
  1035.       for (i = 0; i < 7; i++)
  1036.       {
  1037.          isf_stage2[i] = isf[9+i] - E_ROM_dico2_isf[i+surv1[k]*7];
  1038.       }
  1039.       tmp_ind[0] = E_LPC_isf_sub_vq(&isf_stage2[0], E_ROM_dico24_isf, 3,
  1040.          SIZE_BK24, &min_err);
  1041.       temp = min_err;
  1042.       tmp_ind[1] = E_LPC_isf_sub_vq(&isf_stage2[3], E_ROM_dico25_isf, 4,
  1043.          SIZE_BK25, &min_err);
  1044.       temp += min_err;
  1045.       if (temp < distance)
  1046.       {
  1047.          distance = temp;
  1048.          indice[1] = surv1[k];
  1049.          for (i = 0; i < 2; i++)
  1050.          {
  1051.             indice[i + 5]= tmp_ind[i];
  1052.          }
  1053.       }
  1054.    }
  1055.    /* decoding the ISFs */
  1056.    E_LPC_isf_2s5s_decode(indice, isf_q, past_isfq);
  1057.    return;
  1058. }