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

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*-------------------------------------------------------------------*
  3.  * Function  Convolve:                                               *
  4.  *           ~~~~~~~~~                                               *
  5.  *-------------------------------------------------------------------*
  6.  * Perform the convolution between two vectors x[] and h[] and       *
  7.  * write the result in the vector y[].                               *
  8.  * All vectors are of length N.                                      *
  9.  *-------------------------------------------------------------------*/
  10. #include "typedef.h"
  11. #include "basic_op.h"
  12. #include "ld8k.h"
  13. void Convolve(
  14.   Word16 x[],      /* (i)     : input vector                           */
  15.   Word16 h[],      /* (i) Q12 : impulse response                       */
  16.   Word16 y[],      /* (o)     : output vector                          */
  17.   Word16 L         /* (i)     : vector size                            */
  18. )
  19. {
  20.    Word16 i, n;
  21.    Word32 s;
  22.    for (n = 0; n < L; n++)
  23.    {
  24.      s = 0;
  25.      for (i = 0; i <= n; i++)
  26.        s = L_mac(s, x[i], h[n-i]);
  27.      s    = L_shl(s, 3);                   /* h is in Q12 and saturation */
  28.      y[n] = extract_h(s);
  29.    }
  30.    return;
  31. }
  32. /*-----------------------------------------------------*
  33.  * procedure Syn_filt:                                 *
  34.  *           ~~~~~~~~                                  *
  35.  * Do the synthesis filtering 1/A(z).                  *
  36.  *-----------------------------------------------------*/
  37. void Syn_filt(
  38.   Word16 a[],     /* (i) Q12 : a[m+1] prediction coefficients   (m=10)  */
  39.   Word16 x[],     /* (i)     : input signal                             */
  40.   Word16 y[],     /* (o)     : output signal                            */
  41.   Word16 lg,      /* (i)     : size of filtering                        */
  42.   Word16 mem[],   /* (i/o)   : memory associated with this filtering.   */
  43.   Word16 update   /* (i)     : 0=no update, 1=update of memory.         */
  44. )
  45. {
  46.   Word16 i, j;
  47.   Word32 s;
  48.   Word16 tmp[80];     /* This is usually done by memory allocation (lg+M) */
  49.   Word16 *yy;
  50.   /* Copy mem[] to yy[] */
  51.   yy = tmp;
  52.   for(i=0; i<M; i++)
  53.   {
  54.     *yy++ = mem[i];
  55.   }
  56.   /* Do the filtering. */
  57.   for (i = 0; i < lg; i++)
  58.   {
  59.     s = L_mult(x[i], a[0]);
  60.     for (j = 1; j <= M; j++)
  61.       s = L_msu(s, a[j], yy[-j]);
  62.     s = L_shl(s, 3);
  63.     *yy++ = round(s);
  64.   }
  65.   for(i=0; i<lg; i++)
  66.   {
  67.     y[i] = tmp[i+M];
  68.   }
  69.   /* Update of memory if update==1 */
  70.   if(update != 0)
  71.      for (i = 0; i < M; i++)
  72.      {
  73.        mem[i] = y[lg-M+i];
  74.      }
  75.  return;
  76. }
  77. /*-----------------------------------------------------------------------*
  78.  * procedure Residu:                                                     *
  79.  *           ~~~~~~                                                      *
  80.  * Compute the LPC residual  by filtering the input speech through A(z)  *
  81.  *-----------------------------------------------------------------------*/
  82. void Residu(
  83.   Word16 a[],    /* (i) Q12 : prediction coefficients                     */
  84.   Word16 x[],    /* (i)     : speech (values x[-m..-1] are needed         */
  85.   Word16 y[],    /* (o)     : residual signal                             */
  86.   Word16 lg      /* (i)     : size of filtering                           */
  87. )
  88. {
  89.   Word16 i, j;
  90.   Word32 s;
  91.   for (i = 0; i < lg; i++)
  92.   {
  93.     s = L_mult(x[i], a[0]);
  94.     for (j = 1; j <= M; j++)
  95.       s = L_mac(s, a[j], x[i-j]);
  96.     s = L_shl(s, 3);
  97.     y[i] = round(s);
  98.   }
  99.   return;
  100. }