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

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: preemp.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:44  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.1  1996/08/19  22:30:58  jaf
  6.  * Initial revision
  7.  *
  8. */
  9. #ifdef P_R_O_T_O_T_Y_P_E_S
  10. extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
  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. /*  PREEMP Version 55 */
  19. /* $Log: preemp.c,v $
  20. /* Revision 1.1.1.1  2002/07/28 05:23:44  freeman_yong
  21. /* lpc10 codec
  22. /*
  23.  * Revision 1.1  1996/08/19  22:30:58  jaf
  24.  * Initial revision
  25.  * */
  26. /* Revision 1.3  1996/03/14  23:16: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/11  23:23:34  jaf */
  30. /* Added a bunch of comments to an otherwise simple subroutine. */
  31. /* Revision 1.1  1996/02/07 14:48:48  jaf */
  32. /* Initial revision */
  33. /* ******************************************************************* */
  34. /*   Preemphasize speech with a single-zero filter. */
  35. /*  (When coef = .9375, preemphasis is as in LPC43.) */
  36. /* Inputs: */
  37. /*  NSAMP  - Number of samples to filter */
  38. /*  INBUF  - Input speech buffer */
  39. /*           Indices 1 through NSAMP are read. */
  40. /*  COEF   - Preemphasis coefficient */
  41. /* Input/Output: */
  42. /*  Z      - Filter state */
  43. /* Output: */
  44. /*  PEBUF  - Preemphasized speech buffer (can be equal to INBUF) */
  45. /*           Indices 1 through NSAMP are modified. */
  46. /* This subroutine has no local state. */
  47. /* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
  48. coef, real *z__)
  49. {
  50.     /* System generated locals */
  51.     integer i__1;
  52.     /* Local variables */
  53.     real temp;
  54.     integer i__;
  55. /*       Arguments */
  56. /*       Local variables */
  57. /*       None of these need to have their values saved from one */
  58. /*       invocation to the next. */
  59. /*       Logically, this subroutine computes the output sequence */
  60. /*       pebuf(1:nsamp) defined by: */
  61. /*       pebuf(i) = inbuf(i) - coef * inbuf(i-1) */
  62. /*       where inbuf(0) is defined by the value of z given as input to */
  63. /*       this subroutine. */
  64. /*       What is this filter's frequency response and phase response? */
  65. /*       Why is this filter applied to the speech? */
  66. /*       Could it be more efficient to apply multiple filters */
  67. /*       simultaneously, by combining them into one equivalent filter? */
  68. /*       Are there ever cases when "factoring" one high-order filter into 
  69. */
  70. /*       multiple smaller-order filter actually reduces the number of */
  71. /*       arithmetic operations needed to perform them? */
  72. /*       When I first read this subroutine, I didn't understand why the */
  73. /*       variable temp was used.  It seemed that the statements in the do 
  74. */
  75. /*       loop could be replaced with the following: */
  76. /*           pebuf(i) = inbuf(i) - coef * z */
  77. /*           z = inbuf(i) */
  78. /*       The reason for temp is so that even if pebuf and inbuf are the */
  79. /*       same arrays in memory (i.e., they are aliased), then this */
  80. /*       subroutine will still work correctly.  I didn't realize this */
  81. /*       until seeing the comment after PEBUF above that says "(can be */
  82. /*       equal to INBUF)". */
  83.     /* Parameter adjustments */
  84.     --pebuf;
  85.     --inbuf;
  86.     /* Function Body */
  87.     i__1 = *nsamp;
  88.     for (i__ = 1; i__ <= i__1; ++i__) {
  89. temp = inbuf[i__] - *coef * *z__;
  90. *z__ = inbuf[i__];
  91. pebuf[i__] = temp;
  92. /* L10: */
  93.     }
  94.     return 0;
  95. } /* preemp_ */