LPC.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:23k
源码类别:

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*-----------------------------------------------------*
  3.  * Function Autocorr()                                 *
  4.  *                                                     *
  5.  *   Compute autocorrelations of signal with windowing *
  6.  *                                                     *
  7.  *-----------------------------------------------------*/
  8. #include "typedef.h"
  9. #include "basic_op.h"
  10. #include "oper_32b.h"
  11. #include "ld8k.h"
  12. #include "tab_ld8k.h"
  13. void Autocorr(
  14.   Word16 x[],      /* (i)    : Input signal                      */
  15.   Word16 m,        /* (i)    : LPC order                         */
  16.   Word16 r_h[],    /* (o)    : Autocorrelations  (msb)           */
  17.   Word16 r_l[]     /* (o)    : Autocorrelations  (lsb)           */
  18. )
  19. {
  20.   Word16 i, j, norm;
  21.   Word16 y[L_WINDOW];
  22.   Word32 sum;
  23.   extern Flag Overflow;
  24.   /* Windowing of signal */
  25.   for(i=0; i<L_WINDOW; i++)
  26.   {
  27.     y[i] = mult_r(x[i], hamwindow[i]);
  28.   }
  29.   /* Compute r[0] and test for overflow */
  30.   do {
  31.     Overflow = 0;
  32.     sum = 1;                   /* Avoid case of all zeros */
  33.     for(i=0; i<L_WINDOW; i++)
  34.       sum = L_mac(sum, y[i], y[i]);
  35.     /* If overflow divide y[] by 4 */
  36.     if(Overflow != 0)
  37.     {
  38.       for(i=0; i<L_WINDOW; i++)
  39.       {
  40.         y[i] = shr(y[i], 2);
  41.       }
  42.     }
  43.   }while (Overflow != 0);
  44.   /* Normalization of r[0] */
  45.   norm = norm_l(sum);
  46.   sum  = L_shl(sum, norm);
  47.   L_Extract(sum, &r_h[0], &r_l[0]);     /* Put in DPF format (see oper_32b) */
  48.   /* r[1] to r[m] */
  49.   for (i = 1; i <= m; i++)
  50.   {
  51.     sum = 0;
  52.     for(j=0; j<L_WINDOW-i; j++)
  53.       sum = L_mac(sum, y[j], y[j+i]);
  54.     sum = L_shl(sum, norm);
  55.     L_Extract(sum, &r_h[i], &r_l[i]);
  56.   }
  57.   return;
  58. }
  59. /*-------------------------------------------------------*
  60.  * Function Lag_window()                                 *
  61.  *                                                       *
  62.  * Lag_window on autocorrelations.                       *
  63.  *                                                       *
  64.  * r[i] *= lag_wind[i]                                   *
  65.  *                                                       *
  66.  *  r[i] and lag_wind[i] are in special double precision.*
  67.  *  See "oper_32b.c" for the format                      *
  68.  *                                                       *
  69.  *-------------------------------------------------------*/
  70. void Lag_window(
  71.   Word16 m,         /* (i)     : LPC order                        */
  72.   Word16 r_h[],     /* (i/o)   : Autocorrelations  (msb)          */
  73.   Word16 r_l[]      /* (i/o)   : Autocorrelations  (lsb)          */
  74. )
  75. {
  76.   Word16 i;
  77.   Word32 x;
  78.   for(i=1; i<=m; i++)
  79.   {
  80.      x  = Mpy_32(r_h[i], r_l[i], lag_h[i-1], lag_l[i-1]);
  81.      L_Extract(x, &r_h[i], &r_l[i]);
  82.   }
  83.   return;
  84. }
  85. /*___________________________________________________________________________
  86.  |                                                                           |
  87.  |      LEVINSON-DURBIN algorithm in double precision                        |
  88.  |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                        |
  89.  |---------------------------------------------------------------------------|
  90.  |                                                                           |
  91.  | Algorithm                                                                 |
  92.  |                                                                           |
  93.  |       R[i]    autocorrelations.                                           |
  94.  |       A[i]    filter coefficients.                                        |
  95.  |       K       reflection coefficients.                                    |
  96.  |       Alpha   prediction gain.                                            |
  97.  |                                                                           |
  98.  |       Initialization:                                                     |
  99.  |               A[0] = 1                                                    |
  100.  |               K    = -R[1]/R[0]                                           |
  101.  |               A[1] = K                                                    |
  102.  |               Alpha = R[0] * (1-K**2]                                     |
  103.  |                                                                           |
  104.  |       Do for  i = 2 to M                                                  |
  105.  |                                                                           |
  106.  |            S =  SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]                      |
  107.  |                                                                           |
  108.  |            K = -S / Alpha                                                 |
  109.  |                                                                           |
  110.  |            An[j] = A[j] + K*A[i-j]   for j=1 to i-1                       |
  111.  |                                      where   An[i] = new A[i]             |
  112.  |            An[i]=K                                                        |
  113.  |                                                                           |
  114.  |            Alpha=Alpha * (1-K**2)                                         |
  115.  |                                                                           |
  116.  |       END                                                                 |
  117.  |                                                                           |
  118.  | Remarks on the dynamics of the calculations.                              |
  119.  |                                                                           |
  120.  |       The numbers used are in double precision in the following format :  |
  121.  |       A = AH <<16 + AL<<1.  AH and AL are 16 bit signed integers.         |
  122.  |       Since the LSB's also contain a sign bit, this format does not       |
  123.  |       correspond to standard 32 bit integers.  We use this format since   |
  124.  |       it allows fast execution of multiplications and divisions.          |
  125.  |                                                                           |
  126.  |       "DPF" will refer to this special format in the following text.      |
  127.  |       See oper_32b.c                                                      |
  128.  |                                                                           |
  129.  |       The R[i] were normalized in routine AUTO (hence, R[i] < 1.0).       |
  130.  |       The K[i] and Alpha are theoretically < 1.0.                         |
  131.  |       The A[i], for a sampling frequency of 8 kHz, are in practice        |
  132.  |       always inferior to 16.0.                                            |
  133.  |                                                                           |
  134.  |       These characteristics allow straigthforward fixed-point             |
  135.  |       implementation.  We choose to represent the parameters as           |
  136.  |       follows :                                                           |
  137.  |                                                                           |
  138.  |               R[i]    Q31   +- .99..                                      |
  139.  |               K[i]    Q31   +- .99..                                      |
  140.  |               Alpha   Normalized -> mantissa in Q31 plus exponent         |
  141.  |               A[i]    Q27   +- 15.999..                                   |
  142.  |                                                                           |
  143.  |       The additions are performed in 32 bit.  For the summation used      |
  144.  |       to calculate the K[i], we multiply numbers in Q31 by numbers        |
  145.  |       in Q27, with the result of the multiplications in Q27,              |
  146.  |       resulting in a dynamic of +- 16.  This is sufficient to avoid       |
  147.  |       overflow, since the final result of the summation is                |
  148.  |       necessarily < 1.0 as both the K[i] and Alpha are                    |
  149.  |       theoretically < 1.0.                                                |
  150.  |___________________________________________________________________________|
  151. */
  152. /* Last A(z) for case of unstable filter */
  153. static Word16 old_A[M+1]={4096,0,0,0,0,0,0,0,0,0,0};
  154. static Word16 old_rc[2]={0,0};
  155. void Levinson(
  156.   Word16 Rh[],      /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */
  157.   Word16 Rl[],      /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */
  158.   Word16 A[],       /* (o) Q12 : A[M]    LPC coefficients  (m = 10)       */
  159.   Word16 rc[]       /* (o) Q15 : rc[M]   Reflection coefficients.         */
  160. )
  161. {
  162.  Word16 i, j;
  163.  Word16 hi, lo;
  164.  Word16 Kh, Kl;                /* reflection coefficient; hi and lo           */
  165.  Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent         */
  166.  Word16 Ah[M+1], Al[M+1];      /* LPC coef. in double prec.                   */
  167.  Word16 Anh[M+1], Anl[M+1];    /* LPC coef.for next iteration in double prec. */
  168.  Word32 t0, t1, t2;            /* temporary variable                          */
  169. /* K = A[1] = -R[1] / R[0] */
  170.   t1  = L_Comp(Rh[1], Rl[1]);           /* R[1] in Q31      */
  171.   t2  = L_abs(t1);                      /* abs R[1]         */
  172.   t0  = Div_32(t2, Rh[0], Rl[0]);       /* R[1]/R[0] in Q31 */
  173.   if(t1 > 0) t0= L_negate(t0);          /* -R[1]/R[0]       */
  174.   L_Extract(t0, &Kh, &Kl);              /* K in DPF         */
  175.   rc[0] = Kh;
  176.   t0 = L_shr(t0,4);                     /* A[1] in Q27      */
  177.   L_Extract(t0, &Ah[1], &Al[1]);        /* A[1] in DPF      */
  178. /*  Alpha = R[0] * (1-K**2) */
  179.   t0 = Mpy_32(Kh ,Kl, Kh, Kl);          /* K*K      in Q31 */
  180.   t0 = L_abs(t0);                       /* Some case <0 !! */
  181.   t0 = L_sub( (Word32)0x7fffffffL, t0 ); /* 1 - K*K  in Q31 */
  182.   L_Extract(t0, &hi, &lo);              /* DPF format      */
  183.   t0 = Mpy_32(Rh[0] ,Rl[0], hi, lo);    /* Alpha in Q31    */
  184. /* Normalize Alpha */
  185.   alp_exp = norm_l(t0);
  186.   t0 = L_shl(t0, alp_exp);
  187.   L_Extract(t0, &alp_h, &alp_l);         /* DPF format    */
  188. /*--------------------------------------*
  189.  * ITERATIONS  I=2 to M                 *
  190.  *--------------------------------------*/
  191.   for(i= 2; i<=M; i++)
  192.   {
  193.     /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i] */
  194.     t0 = 0;
  195.     for(j=1; j<i; j++)
  196.       t0 = L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i-j], Al[i-j]));
  197.     t0 = L_shl(t0,4);                  /* result in Q27 -> convert to Q31 */
  198.                                        /* No overflow possible            */
  199.     t1 = L_Comp(Rh[i],Rl[i]);
  200.     t0 = L_add(t0, t1);                /* add R[i] in Q31                 */
  201.     /* K = -t0 / Alpha */
  202.     t1 = L_abs(t0);
  203.     t2 = Div_32(t1, alp_h, alp_l);     /* abs(t0)/Alpha                   */
  204.     if(t0 > 0) t2= L_negate(t2);       /* K =-t0/Alpha                    */
  205.     t2 = L_shl(t2, alp_exp);           /* denormalize; compare to Alpha   */
  206.     L_Extract(t2, &Kh, &Kl);           /* K in DPF                        */
  207.     rc[i-1] = Kh;
  208.     /* Test for unstable filter. If unstable keep old A(z) */
  209.     if (sub(abs_s(Kh), 32750) > 0)
  210.     {
  211.       for(j=0; j<=M; j++)
  212.       {
  213.         A[j] = old_A[j];
  214.       }
  215.       rc[0] = old_rc[0];        /* only two rc coefficients are needed */
  216.       rc[1] = old_rc[1];
  217.       return;
  218.     }
  219.     /*------------------------------------------*
  220.      *  Compute new LPC coeff. -> An[i]         *
  221.      *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *
  222.      *  An[i]= K                                *
  223.      *------------------------------------------*/
  224.     for(j=1; j<i; j++)
  225.     {
  226.       t0 = Mpy_32(Kh, Kl, Ah[i-j], Al[i-j]);
  227.       t0 = L_add(t0, L_Comp(Ah[j], Al[j]));
  228.       L_Extract(t0, &Anh[j], &Anl[j]);
  229.     }
  230.     t2 = L_shr(t2, 4);                  /* t2 = K in Q31 ->convert to Q27  */
  231.     L_Extract(t2, &Anh[i], &Anl[i]);    /* An[i] in Q27                    */
  232.     /*  Alpha = Alpha * (1-K**2) */
  233.     t0 = Mpy_32(Kh ,Kl, Kh, Kl);          /* K*K      in Q31 */
  234.     t0 = L_abs(t0);                       /* Some case <0 !! */
  235.     t0 = L_sub( (Word32)0x7fffffffL, t0 ); /* 1 - K*K  in Q31 */
  236.     L_Extract(t0, &hi, &lo);              /* DPF format      */
  237.     t0 = Mpy_32(alp_h , alp_l, hi, lo);   /* Alpha in Q31    */
  238.     /* Normalize Alpha */
  239.     j = norm_l(t0);
  240.     t0 = L_shl(t0, j);
  241.     L_Extract(t0, &alp_h, &alp_l);         /* DPF format    */
  242.     alp_exp = add(alp_exp, j);             /* Add normalization to alp_exp */
  243.     /* A[j] = An[j] */
  244.     for(j=1; j<=i; j++)
  245.     {
  246.       Ah[j] =Anh[j];
  247.       Al[j] =Anl[j];
  248.     }
  249.   }
  250.   /* Truncate A[i] in Q27 to Q12 with rounding */
  251.   A[0] = 4096;
  252.   for(i=1; i<=M; i++)
  253.   {
  254.     t0   = L_Comp(Ah[i], Al[i]);
  255.     old_A[i] = A[i] = round(L_shl(t0, 1));
  256.   }
  257.   old_rc[0] = rc[0];
  258.   old_rc[1] = rc[1];
  259.   return;
  260. }
  261. /*-------------------------------------------------------------*
  262.  *  procedure Az_lsp:                                          *
  263.  *            ~~~~~~                                           *
  264.  *   Compute the LSPs from  the LPC coefficients  (order=10)   *
  265.  *-------------------------------------------------------------*/
  266. /* local function */
  267. static Word16 Chebps_11(Word16 x, Word16 f[], Word16 n);
  268. static Word16 Chebps_10(Word16 x, Word16 f[], Word16 n);
  269. void Az_lsp(
  270.   Word16 a[],        /* (i) Q12 : predictor coefficients              */
  271.   Word16 lsp[],      /* (o) Q15 : line spectral pairs                 */
  272.   Word16 old_lsp[]   /* (i)     : old lsp[] (in case not found 10 roots) */
  273. )
  274. {
  275.  Word16 i, j, nf, ip;
  276.  Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
  277.  Word16 x, y, sign, exp;
  278.  Word16 *coef;
  279.  Word16 f1[M/2+1], f2[M/2+1];
  280.  Word32 t0, L_temp;
  281.  Flag   ovf_coef;
  282.  Word16 (*pChebps)(Word16 x, Word16 f[], Word16 n);
  283. /*-------------------------------------------------------------*
  284.  *  find the sum and diff. pol. F1(z) and F2(z)                *
  285.  *    F1(z) <--- F1(z)/(1+z**-1) & F2(z) <--- F2(z)/(1-z**-1)  *
  286.  *                                                             *
  287.  * f1[0] = 1.0;                                                *
  288.  * f2[0] = 1.0;                                                *
  289.  *                                                             *
  290.  * for (i = 0; i< NC; i++)                                     *
  291.  * {                                                           *
  292.  *   f1[i+1] = a[i+1] + a[M-i] - f1[i] ;                       *
  293.  *   f2[i+1] = a[i+1] - a[M-i] + f2[i] ;                       *
  294.  * }                                                           *
  295.  *-------------------------------------------------------------*/
  296.  ovf_coef = 0;
  297.  pChebps = Chebps_11;
  298.  f1[0] = 2048;          /* f1[0] = 1.0 is in Q11 */
  299.  f2[0] = 2048;          /* f2[0] = 1.0 is in Q11 */
  300.  for (i = 0; i< NC; i++)
  301.  {
  302.    Overflow = 0;
  303.    t0 = L_mult(a[i+1], 16384);          /* x = (a[i+1] + a[M-i]) >> 1        */
  304.    t0 = L_mac(t0, a[M-i], 16384);       /*    -> From Q12 to Q11             */
  305.    x  = extract_h(t0);
  306.    if ( Overflow ) {
  307.      ovf_coef = 1;      }
  308.    Overflow = 0;
  309.    f1[i+1] = sub(x, f1[i]);    /* f1[i+1] = a[i+1] + a[M-i] - f1[i] */
  310.    if ( Overflow ) {
  311.      ovf_coef = 1;      }
  312.    Overflow = 0;
  313.    t0 = L_mult(a[i+1], 16384);          /* x = (a[i+1] - a[M-i]) >> 1        */
  314.    t0 = L_msu(t0, a[M-i], 16384);       /*    -> From Q12 to Q11             */
  315.    x  = extract_h(t0);
  316.    if ( Overflow ) {
  317.      ovf_coef = 1;      }
  318.    Overflow = 0;
  319.    f2[i+1] = add(x, f2[i]);    /* f2[i+1] = a[i+1] - a[M-i] + f2[i] */
  320.    if ( Overflow ) {
  321.      ovf_coef = 1;      }
  322.  }
  323.  if ( ovf_coef ) {
  324.    /*printf("===== OVF ovf_coef =====n");*/
  325.    pChebps = Chebps_10;
  326.    f1[0] = 1024;          /* f1[0] = 1.0 is in Q10 */
  327.    f2[0] = 1024;          /* f2[0] = 1.0 is in Q10 */
  328.    for (i = 0; i< NC; i++)
  329.    {
  330.      t0 = L_mult(a[i+1], 8192);          /* x = (a[i+1] + a[M-i]) >> 1        */
  331.      t0 = L_mac(t0, a[M-i], 8192);       /*    -> From Q11 to Q10             */
  332.      x  = extract_h(t0);
  333.      f1[i+1] = sub(x, f1[i]);    /* f1[i+1] = a[i+1] + a[M-i] - f1[i] */
  334.      t0 = L_mult(a[i+1], 8192);          /* x = (a[i+1] - a[M-i]) >> 1        */
  335.      t0 = L_msu(t0, a[M-i], 8192);       /*    -> From Q11 to Q10             */
  336.      x  = extract_h(t0);
  337.      f2[i+1] = add(x, f2[i]);    /* f2[i+1] = a[i+1] - a[M-i] + f2[i] */
  338.    }
  339.  }
  340. /*-------------------------------------------------------------*
  341.  * find the LSPs using the Chebichev pol. evaluation           *
  342.  *-------------------------------------------------------------*/
  343.  nf=0;          /* number of found frequencies */
  344.  ip=0;          /* indicator for f1 or f2      */
  345.  coef = f1;
  346.  xlow = grid[0];
  347.  ylow = (*pChebps)(xlow, coef, NC);
  348.  j = 0;
  349.  while ( (nf < M) && (j < GRID_POINTS) )
  350.  {
  351.    j =add(j,1);
  352.    xhigh = xlow;
  353.    yhigh = ylow;
  354.    xlow  = grid[j];
  355.    ylow  = (*pChebps)(xlow,coef,NC);
  356.    L_temp = L_mult(ylow ,yhigh);
  357.    if ( L_temp <= (Word32)0)
  358.    {
  359.      /* divide 4 times the interval */
  360.      for (i = 0; i < 4; i++)
  361.      {
  362.        xmid = add( shr(xlow, 1) , shr(xhigh, 1)); /* xmid = (xlow + xhigh)/2 */
  363.        ymid = (*pChebps)(xmid,coef,NC);
  364.        L_temp = L_mult(ylow,ymid);
  365.        if ( L_temp <= (Word32)0)
  366.        {
  367.          yhigh = ymid;
  368.          xhigh = xmid;
  369.        }
  370.        else
  371.        {
  372.          ylow = ymid;
  373.          xlow = xmid;
  374.        }
  375.      }
  376.     /*-------------------------------------------------------------*
  377.      * Linear interpolation                                        *
  378.      *    xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);            *
  379.      *-------------------------------------------------------------*/
  380.      x   = sub(xhigh, xlow);
  381.      y   = sub(yhigh, ylow);
  382.      if(y == 0)
  383.      {
  384.        xint = xlow;
  385.      }
  386.      else
  387.      {
  388.        sign= y;
  389.        y   = abs_s(y);
  390.        exp = norm_s(y);
  391.        y   = shl(y, exp);
  392.        y   = div_s( (Word16)16383, y);
  393.        t0  = L_mult(x, y);
  394.        t0  = L_shr(t0, sub(20, exp) );
  395.        y   = extract_l(t0);            /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */
  396.        if(sign < 0) y = negate(y);
  397.        t0   = L_mult(ylow, y);                  /* result in Q26 */
  398.        t0   = L_shr(t0, 11);                    /* result in Q15 */
  399.        xint = sub(xlow, extract_l(t0));         /* xint = xlow - ylow*y */
  400.      }
  401.      lsp[nf] = xint;
  402.      xlow    = xint;
  403.      nf =add(nf,1);
  404.      if(ip == 0)
  405.      {
  406.        ip = 1;
  407.        coef = f2;
  408.      }
  409.      else
  410.      {
  411.        ip = 0;
  412.        coef = f1;
  413.      }
  414.      ylow = (*pChebps)(xlow,coef,NC);
  415.    }
  416.  }
  417.  /* Check if M roots found */
  418.  if( sub(nf, M) < 0)
  419.  {
  420.     for(i=0; i<M; i++)
  421.     {
  422.       lsp[i] = old_lsp[i];
  423.     }
  424.  /* printf("n !!Not 10 roots found in Az_lsp()!!!n"); */
  425.  }
  426.  return;
  427. }
  428. /*--------------------------------------------------------------*
  429.  * function  Chebps_11, Chebps_10:                              *
  430.  *           ~~~~~~~~~~~~~~~~~~~~                               *
  431.  *    Evaluates the Chebichev polynomial series                 *
  432.  *--------------------------------------------------------------*
  433.  *                                                              *
  434.  *  The polynomial order is                                     *
  435.  *     n = M/2   (M is the prediction order)                    *
  436.  *  The polynomial is given by                                  *
  437.  *    C(x) = T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 *
  438.  * Arguments:                                                   *
  439.  *  x:     input value of evaluation; x = cos(frequency) in Q15 *
  440.  *  f[]:   coefficients of the pol.                             *
  441.  *                         in Q11(Chebps_11), in Q10(Chebps_10) *
  442.  *  n:     order of the pol.                                    *
  443.  *                                                              *
  444.  * The value of C(x) is returned. (Saturated to +-1.99 in Q14)  *
  445.  *                                                              *
  446.  *--------------------------------------------------------------*/
  447. static Word16 Chebps_11(Word16 x, Word16 f[], Word16 n)
  448. {
  449.   Word16 i, cheb;
  450.   Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
  451.   Word32 t0;
  452.  /* Note: All computation are done in Q24. */
  453.   b2_h = 256;                    /* b2 = 1.0 in Q24 DPF */
  454.   b2_l = 0;
  455.   t0 = L_mult(x, 512);                  /* 2*x in Q24          */
  456.   t0 = L_mac(t0, f[1], 4096);           /* + f[1] in Q24       */
  457.   L_Extract(t0, &b1_h, &b1_l);          /* b1 = 2*x + f[1]     */
  458.   for (i = 2; i<n; i++)
  459.   {
  460.     t0 = Mpy_32_16(b1_h, b1_l, x);      /* t0 = 2.0*x*b1              */
  461.     t0 = L_shl(t0, 1);
  462.     t0 = L_mac(t0,b2_h,(Word16)-32768L); /* t0 = 2.0*x*b1 - b2         */
  463.     t0 = L_msu(t0, b2_l, 1);
  464.     t0 = L_mac(t0, f[i], 4096);         /* t0 = 2.0*x*b1 - b2 + f[i]; */
  465.     L_Extract(t0, &b0_h, &b0_l);        /* b0 = 2.0*x*b1 - b2 + f[i]; */
  466.     b2_l = b1_l;                 /* b2 = b1; */
  467.     b2_h = b1_h;
  468.     b1_l = b0_l;                 /* b1 = b0; */
  469.     b1_h = b0_h;
  470.   }
  471.   t0 = Mpy_32_16(b1_h, b1_l, x);        /* t0 = x*b1;              */
  472.   t0 = L_mac(t0, b2_h,(Word16)-32768L);  /* t0 = x*b1 - b2          */
  473.   t0 = L_msu(t0, b2_l, 1);
  474.   t0 = L_mac(t0, f[i], 2048);           /* t0 = x*b1 - b2 + f[i]/2 */
  475.   t0 = L_shl(t0, 6);                    /* Q24 to Q30 with saturation */
  476.   cheb = extract_h(t0);                 /* Result in Q14              */
  477.   return(cheb);
  478. }
  479. static Word16 Chebps_10(Word16 x, Word16 f[], Word16 n)
  480. {
  481.   Word16 i, cheb;
  482.   Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
  483.   Word32 t0;
  484.  /* Note: All computation are done in Q23. */
  485.   b2_h = 128;                    /* b2 = 1.0 in Q23 DPF */
  486.   b2_l = 0;
  487.   t0 = L_mult(x, 256);                  /* 2*x in Q23          */
  488.   t0 = L_mac(t0, f[1], 4096);           /* + f[1] in Q23       */
  489.   L_Extract(t0, &b1_h, &b1_l);          /* b1 = 2*x + f[1]     */
  490.   for (i = 2; i<n; i++)
  491.   {
  492.     t0 = Mpy_32_16(b1_h, b1_l, x);      /* t0 = 2.0*x*b1              */
  493.     t0 = L_shl(t0, 1);
  494.     t0 = L_mac(t0,b2_h,(Word16)-32768L); /* t0 = 2.0*x*b1 - b2         */
  495.     t0 = L_msu(t0, b2_l, 1);
  496.     t0 = L_mac(t0, f[i], 4096);         /* t0 = 2.0*x*b1 - b2 + f[i]; */
  497.     L_Extract(t0, &b0_h, &b0_l);        /* b0 = 2.0*x*b1 - b2 + f[i]; */
  498.     b2_l = b1_l;                 /* b2 = b1; */
  499.     b2_h = b1_h;
  500.     b1_l = b0_l;                 /* b1 = b0; */
  501.     b1_h = b0_h;
  502.   }
  503.   t0 = Mpy_32_16(b1_h, b1_l, x);        /* t0 = x*b1;              */
  504.   t0 = L_mac(t0, b2_h,(Word16)-32768L);  /* t0 = x*b1 - b2          */
  505.   t0 = L_msu(t0, b2_l, 1);
  506.   t0 = L_mac(t0, f[i], 2048);           /* t0 = x*b1 - b2 + f[i]/2 */
  507.   t0 = L_shl(t0, 7);                    /* Q23 to Q30 with saturation */
  508.   cheb = extract_h(t0);                 /* Result in Q14              */
  509.   return(cheb);
  510. }