⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 关于对传统的只能传递文本信息的G。729的改进
💻 C
字号:
/*

   ITU-T G.729 Annex C - Reference C code for floating point

                         implementation of G.729

                         Version 1.01 of 15.September.98

*/



/*

----------------------------------------------------------------------

                    COPYRIGHT NOTICE

----------------------------------------------------------------------

   ITU-T G.729 Annex C ANSI C source code

   Copyright (C) 1998, AT&T, France Telecom, NTT, University of

   Sherbrooke.  All rights reserved.



----------------------------------------------------------------------

*/



/*

 File : FILTER.C

 Used for the floating point version of both

 G.729 main body and G.729A

*/



/***************************************/

/* General filter routines             */

/***************************************/



#include "typedef.h"

#include "version.h"

#ifdef VER_G729A

 #include "ld8a.h"

#else

 #include "ld8k.h"

#endif



/*-----------------------------------------------------------*

 * convolve - convolve vectors x and h and put result in y   *

 *-----------------------------------------------------------*/



void convolve(

 FLOAT x[],             /* input : input vector x[0:l]                     */

 FLOAT h[],             /* input : impulse response or second input h[0:l] */

 FLOAT y[],             /* output: x convolved with h , y[0:l]             */

 int  l                 /* input : dimension of all vectors                */

)

{

   FLOAT temp;

   int    i, n;



   for (n = 0; n < l; n++)

     {

        temp = (F)0.0;

        for (i = 0; i <= n; i++)

          temp += x[i]*h[n-i];

        y[n] = temp;

     }



   return;

}



/*-----------------------------------------------------------*

 * syn_filt - filter with synthesis filter 1/A(z)            *

 *-----------------------------------------------------------*/



void syn_filt(

 FLOAT a[],     /* input : predictor coefficients a[0:m]    */

 FLOAT x[],     /* input : excitation signal                */

 FLOAT y[],     /* output: filtered output signal           */

 int  l,        /* input : vector dimension                 */

 FLOAT mem[],   /* in/out: filter memory                    */

 int  update    /* input : 0 = no memory update, 1 = update */

)

{

   int  i,j;



   /* This is usually done by memory allocation (l+m) */

   FLOAT yy_b[L_SUBFR+M];

   FLOAT s, *yy, *py, *pa;



   /* Copy mem[] to yy[] */



   yy = yy_b;

   for (i = 0; i <M; i++)  *yy++ =  *mem++;



   /* Filtering */



   for (i = 0; i < l; i++)

     {

        py=yy;

        pa=a;

        s = *x++;

        for (j = 0; j <M; j++)  s -= (*++pa) * (*--py);

        *yy++ = s;

        *y++ = s;

     }



   /* Update memory if required */



   if(update !=0 ) for (i = 0; i <M; i++)  *--mem =*--yy;



   return;

}



/*-----------------------------------------------------------*

 * residu - filter input vector with all-zero filter A(Z)    *

 *-----------------------------------------------------------*/



void residu(    /* filter A(z)                                       */

 FLOAT *a,      /* input : prediction coefficients a[0:m+1], a[0]=1. */

 FLOAT *x,      /* input : input signal x[0:l-1], x[-1:m] are needed */

 FLOAT *y,      /* output: output signal y[0:l-1] NOTE: x[] and y[]

                            cannot point to same array               */

 int  l        /* input : dimension of x and y                      */

)

{

  FLOAT s;

  int  i, j;



  for (i = 0; i < l; i++)

  {

    s = x[i];

    for (j = 1; j <= M; j++) s += a[j]*x[i-j];

    *y++ = s;

  }

  return;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -