ivfilt.c
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: ivfilt.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.1  1996/08/19  22:31:53  jaf
  6.  * Initial revision
  7.  *
  8. */
  9. #ifdef P_R_O_T_O_T_Y_P_E_S
  10. extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);
  11. #endif
  12. /*  -- translated by f2c (version 19951025).
  13.    You must link the resulting object file with the libraries:
  14. -lf2c -lm   (in that order)
  15. */
  16. #include "f2c.h"
  17. /* ********************************************************************* */
  18. /*  IVFILT Version 48 */
  19. /* $Log: ivfilt.c,v $
  20. /* Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  21. /* lpc10 codec
  22. /*
  23.  * Revision 1.1  1996/08/19  22:31:53  jaf
  24.  * Initial revision
  25.  * */
  26. /* Revision 1.3  1996/03/15  21:36:29  jaf */
  27. /* Just added a few comments about which array indices of the arguments */
  28. /* are used, and mentioning that this subroutine has no local state. */
  29. /* Revision 1.2  1996/03/13  00:01:00  jaf */
  30. /* Comments added explaining that none of the local variables of this */
  31. /* subroutine need to be saved from one invocation to the next. */
  32. /* Revision 1.1  1996/02/07 14:47:34  jaf */
  33. /* Initial revision */
  34. /* ********************************************************************* */
  35. /*   2nd order inverse filter, speech is decimated 4:1 */
  36. /* Input: */
  37. /*  LEN    - Length of speech buffers */
  38. /*  NSAMP  - Number of samples to filter */
  39. /*  LPBUF  - Low pass filtered speech buffer */
  40. /*           Indices LEN-NSAMP-7 through LEN read. */
  41. /* Output: */
  42. /*  IVBUF  - Inverse filtered speech buffer */
  43. /*           Indices LEN-NSAMP+1 through LEN written. */
  44. /*  IVRC   - Inverse filter reflection coefficients (for voicing) */
  45. /*          Indices 1 and 2 both written (also read, but only after writing).
  46. */
  47. /* This subroutine has no local state. */
  48. /* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *
  49. nsamp, real *ivrc)
  50. {
  51.     /* System generated locals */
  52.     integer i__1;
  53.     /* Local variables */
  54.     integer i__, j, k;
  55.     real r__[3], pc1, pc2;
  56. /*  Arguments */
  57. /*       Local variables that need not be saved */
  58. /*       Local state */
  59. /*       None */
  60. /*  Calculate Autocorrelations */
  61.     /* Parameter adjustments */
  62.     --ivbuf;
  63.     --lpbuf;
  64.     --ivrc;
  65.     /* Function Body */
  66.     for (i__ = 1; i__ <= 3; ++i__) {
  67. r__[i__ - 1] = 0.f;
  68. k = i__ - 1 << 2;
  69. i__1 = *len;
  70. for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {
  71.     r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];
  72. }
  73.     }
  74. /*  Calculate predictor coefficients */
  75.     pc1 = 0.f;
  76.     pc2 = 0.f;
  77.     ivrc[1] = 0.f;
  78.     ivrc[2] = 0.f;
  79.     if (r__[0] > 1e-10f) {
  80. ivrc[1] = r__[1] / r__[0];
  81. ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);
  82. pc1 = ivrc[1] - ivrc[1] * ivrc[2];
  83. pc2 = ivrc[2];
  84.     }
  85. /*  Inverse filter LPBUF into IVBUF */
  86.     i__1 = *len;
  87.     for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {
  88. ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];
  89.     }
  90.     return 0;
  91. } /* ivfilt_ */