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

语音压缩

开发平台:

C/C++

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