filter.c
上传用户:zhouyunkk
上传日期:2013-01-10
资源大小:59k
文件大小:4k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729
  4.                          Version 1.01 of 15.September.98
  5. */
  6. /*
  7. ----------------------------------------------------------------------
  8.                     COPYRIGHT NOTICE
  9. ----------------------------------------------------------------------
  10.    ITU-T G.729 Annex C ANSI C source code
  11.    Copyright (C) 1998, AT&T, France Telecom, NTT, University of
  12.    Sherbrooke.  All rights reserved.
  13. ----------------------------------------------------------------------
  14. */
  15. /*
  16.  File : FILTER.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. /***************************************/
  21. /* General filter routines             */
  22. /***************************************/
  23. #include "typedef.h"
  24. #include "version.h"
  25. #ifdef VER_G729A
  26.  #include "ld8a.h"
  27. #else
  28.  #include "ld8k.h"
  29. #endif
  30. /*-----------------------------------------------------------*
  31.  * convolve - convolve vectors x and h and put result in y   *
  32.  *-----------------------------------------------------------*/
  33. void convolve(
  34.  FLOAT x[],             /* input : input vector x[0:l]                     */
  35.  FLOAT h[],             /* input : impulse response or second input h[0:l] */
  36.  FLOAT y[],             /* output: x convolved with h , y[0:l]             */
  37.  int  l                 /* input : dimension of all vectors                */
  38. )
  39. {
  40.    FLOAT temp;
  41.    int    i, n;
  42.    for (n = 0; n < l; n++)
  43.      {
  44.         temp = (F)0.0;
  45.         for (i = 0; i <= n; i++)
  46.           temp += x[i]*h[n-i];
  47.         y[n] = temp;
  48.      }
  49.    return;
  50. }
  51. /*-----------------------------------------------------------*
  52.  * syn_filt - filter with synthesis filter 1/A(z)            *
  53.  *-----------------------------------------------------------*/
  54. void syn_filt(
  55.  FLOAT a[],     /* input : predictor coefficients a[0:m]    */
  56.  FLOAT x[],     /* input : excitation signal                */
  57.  FLOAT y[],     /* output: filtered output signal           */
  58.  int  l,        /* input : vector dimension                 */
  59.  FLOAT mem[],   /* in/out: filter memory                    */
  60.  int  update    /* input : 0 = no memory update, 1 = update */
  61. )
  62. {
  63.    int  i,j;
  64.    /* This is usually done by memory allocation (l+m) */
  65.    FLOAT yy_b[L_SUBFR+M];
  66.    FLOAT s, *yy, *py, *pa;
  67.    /* Copy mem[] to yy[] */
  68.    yy = yy_b;
  69.    for (i = 0; i <M; i++)  *yy++ =  *mem++;
  70.    /* Filtering */
  71.    for (i = 0; i < l; i++)
  72.      {
  73.         py=yy;
  74.         pa=a;
  75.         s = *x++;
  76.         for (j = 0; j <M; j++)  s -= (*++pa) * (*--py);
  77.         *yy++ = s;
  78.         *y++ = s;
  79.      }
  80.    /* Update memory if required */
  81.    if(update !=0 ) for (i = 0; i <M; i++)  *--mem =*--yy;
  82.    return;
  83. }
  84. /*-----------------------------------------------------------*
  85.  * residu - filter input vector with all-zero filter A(Z)    *
  86.  *-----------------------------------------------------------*/
  87. void residu(    /* filter A(z)                                       */
  88.  FLOAT *a,      /* input : prediction coefficients a[0:m+1], a[0]=1. */
  89.  FLOAT *x,      /* input : input signal x[0:l-1], x[-1:m] are needed */
  90.  FLOAT *y,      /* output: output signal y[0:l-1] NOTE: x[] and y[]
  91.                             cannot point to same array               */
  92.  int  l        /* input : dimension of x and y                      */
  93. )
  94. {
  95.   FLOAT s;
  96.   int  i, j;
  97.   for (i = 0; i < l; i++)
  98.   {
  99.     s = x[i];
  100.     for (j = 1; j <= M; j++) s += a[j]*x[i-j];
  101.     *y++ = s;
  102.   }
  103.   return;
  104. }