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

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: vparms.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:52  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.1  1996/08/19  22:30:04  jaf
  6.  * Initial revision
  7.  *
  8. */
  9. #ifdef P_R_O_T_O_T_Y_P_E_S
  10. extern int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *dither, integer *mintau, integer *zc, integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *ar_f__);
  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. /* Table of constant values */
  18. static real c_b2 = 1.f;
  19. /* ********************************************************************* */
  20. /*  VPARMS Version 50 */
  21. /* $Log: vparms.c,v $
  22. /* Revision 1.1.1.1  2002/07/28 05:23:52  freeman_yong
  23. /* lpc10 codec
  24. /*
  25.  * Revision 1.1  1996/08/19  22:30:04  jaf
  26.  * Initial revision
  27.  * */
  28. /* Revision 1.6  1996/03/29  18:01:16  jaf */
  29. /* Added some more comments about the range of INBUF and LPBUF that can */
  30. /* be read.  Note that it is possible for index VWIN(2)+1 to be read from */
  31. /* INBUF, which might be outside of its defined range, although that will */
  32. /* require more careful checking. */
  33. /* Revision 1.5  1996/03/19  00:02:02  jaf */
  34. /* I just noticed that the argument DITHER is modified inside of this */
  35. /* subroutine.  Comments were added explaining the possible final values. */
  36. /* Revision 1.4  1996/03/18  22:22:59  jaf */
  37. /* Finishing the job I said I did with the last check-in comments. */
  38. /* Revision 1.3  1996/03/18  22:22:17  jaf */
  39. /* Just added a few comments about which array indices of the arguments */
  40. /* are used, and mentioning that this subroutine has no local state. */
  41. /* Revision 1.2  1996/03/13  15:02:58  jaf */
  42. /* Comments added explaining that none of the local variables of this */
  43. /* subroutine need to be saved from one invocation to the next. */
  44. /* Revision 1.1  1996/02/07 14:50:42  jaf */
  45. /* Initial revision */
  46. /* ********************************************************************* */
  47. /*  Calculate voicing parameters: */
  48. /* Input: */
  49. /*  VWIN   - Voicing window limits */
  50. /*           Indices 1 through 2 read. */
  51. /*  INBUF  - Input speech buffer */
  52. /*           Indices START-1 through STOP read, */
  53. /*          where START and STOP are defined in the code (only written once).
  54. */
  55. /*           Note that STOP can be as large as VWIN(2)+1 ! */
  56. /*  LPBUF  - Low pass filtered speech */
  57. /*           Indices START-MINTAU through STOP+MINTAU read, */
  58. /*          where START and STOP are defined in the code (only written once).
  59. */
  60. /*  BUFLIM - Array bounds for INBUF and LPBUF */
  61. /*           Indices 1 through 4 read. */
  62. /*  HALF   - Half frame (1 or 2) */
  63. /*  MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) */
  64. /* Input/Output: */
  65. /*  DITHER - Zero crossing threshold */
  66. /*           The resulting value might be the negation of the input */
  67. /*           value.  It might always be the same as the input value, */
  68. /*           if the DO loop below always executes an even number of times. */
  69. /* Output: (all of them are written on every call) */
  70. /*  ZC     - Zero crossing rate */
  71. /*  LBE    - Low band energy (sum of magnitudes - SM) */
  72. /*  FBE    - Full band energy (SM) */
  73. /*  QS     - Ratio of 6 dB/oct preemphasized energy to full band energy */
  74. /*  RC1    - First reflection coefficient */
  75. /*  AR_B   - Product of the causal forward and reverse pitch */
  76. /*           prediction gains */
  77. /*  AR_F   - Product of the noncausal forward and reverse pitch */
  78. /*           prediction gains */
  79. /* Internal: */
  80. /*  OLDSGN - Previous sign of dithered signal */
  81. /*  VLEN   - Length of voicing window */
  82. /*  START  - Lower address of current half of voicing window */
  83. /*  STOP   - Upper address of current half of voicing window */
  84. /*  E_0    - Energy of LPF speech (sum of squares - SS) */
  85. /*  E_B    - Energy of LPF speech backward one pitch period (SS) */
  86. /*  E_F    - Energy of LPF speech forward one pitch period (SS) */
  87. /*  R_B    - Autocovariance of LPF speech backward one pitch period */
  88. /*  R_F    - Autocovariance of LPF speech forward one pitch period */
  89. /*  LP_RMS - Energy of LPF speech (sum of magnitudes - SM) */
  90. /*  AP_RMS - Energy of all-pass speech (SM) */
  91. /*  E_PRE  - Energy of 6dB preemphasized speech (SM) */
  92. /*  E0AP   - Energy of all-pass speech (SS) */
  93. /* This subroutine has no local state. */
  94. /* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer 
  95. *buflim, integer *half, real *dither, integer *mintau, integer *zc, 
  96. integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *
  97. ar_f__)
  98. {
  99.     /* System generated locals */
  100.     integer inbuf_offset, lpbuf_offset, i__1;
  101.     real r__1, r__2;
  102.     /* Builtin functions */
  103.     double r_sign(real *, real *);
  104.     integer i_nint(real *);
  105.     /* Local variables */
  106.     integer vlen, stop, i__;
  107.     real e_pre__;
  108.     integer start;
  109.     real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;
  110. /*       Arguments */
  111. /*       Local variables that need not be saved */
  112. /*   Calculate zero crossings (ZC) and several energy and correlation */
  113. /*   measures on low band and full band speech.  Each measure is taken */
  114. /*   over either the first or the second half of the voicing window, */
  115. /*   depending on the variable HALF. */
  116.     /* Parameter adjustments */
  117.     --vwin;
  118.     --buflim;
  119.     lpbuf_offset = buflim[3];
  120.     lpbuf -= lpbuf_offset;
  121.     inbuf_offset = buflim[1];
  122.     inbuf -= inbuf_offset;
  123.     /* Function Body */
  124.     lp_rms__ = 0.f;
  125.     ap_rms__ = 0.f;
  126.     e_pre__ = 0.f;
  127.     e0ap = 0.f;
  128.     *rc1 = 0.f;
  129.     e_0__ = 0.f;
  130.     e_b__ = 0.f;
  131.     e_f__ = 0.f;
  132.     r_f__ = 0.f;
  133.     r_b__ = 0.f;
  134.     *zc = 0;
  135.     vlen = vwin[2] - vwin[1] + 1;
  136.     start = vwin[1] + (*half - 1) * vlen / 2 + 1;
  137.     stop = start + vlen / 2 - 1;
  138. /* I'll use the symbol HVL in the table below to represent the value */
  139. /* VLEN/2.  Note that if VLEN is odd, then HVL should be rounded down, */
  140. /* i.e., HVL = (VLEN-1)/2. */
  141. /* HALF  START          STOP */
  142. /* 1     VWIN(1)+1      VWIN(1)+HVL */
  143. /* 2     VWIN(1)+HVL+1  VWIN(1)+2*HVL */
  144. /* Note that if VLEN is even and HALF is 2, then STOP will be */
  145. /* VWIN(1)+VLEN = VWIN(2)+1.  That could be bad, if that index of INBUF */
  146. /* is undefined. */
  147.     r__1 = inbuf[start - 1] - *dither;
  148.     oldsgn = r_sign(&c_b2, &r__1);
  149.     i__1 = stop;
  150.     for (i__ = start; i__ <= i__1; ++i__) {
  151. lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));
  152. ap_rms__ += (r__1 = inbuf[i__], abs(r__1));
  153. e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));
  154. /* Computing 2nd power */
  155. r__1 = inbuf[i__];
  156. e0ap += r__1 * r__1;
  157. *rc1 += inbuf[i__] * inbuf[i__ - 1];
  158. /* Computing 2nd power */
  159. r__1 = lpbuf[i__];
  160. e_0__ += r__1 * r__1;
  161. /* Computing 2nd power */
  162. r__1 = lpbuf[i__ - *mintau];
  163. e_b__ += r__1 * r__1;
  164. /* Computing 2nd power */
  165. r__1 = lpbuf[i__ + *mintau];
  166. e_f__ += r__1 * r__1;
  167. r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];
  168. r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];
  169. r__1 = inbuf[i__] + *dither;
  170. if (r_sign(&c_b2, &r__1) != oldsgn) {
  171.     ++(*zc);
  172.     oldsgn = -oldsgn;
  173. }
  174. *dither = -(*dither);
  175.     }
  176. /*   Normalized short-term autocovariance coefficient at unit sample delay
  177.  */
  178.     *rc1 /= max(e0ap,1.f);
  179. /*  Ratio of the energy of the first difference signal (6 dB/oct preemphas
  180. is)*/
  181. /*   to the energy of the full band signal */
  182. /* Computing MAX */
  183.     r__1 = ap_rms__ * 2.f;
  184.     *qs = e_pre__ / max(r__1,1.f);
  185. /*   aR_b is the product of the forward and reverse prediction gains, */
  186. /*   looking backward in time (the causal case). */
  187.     *ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));
  188. /*  aR_f is the same as aR_b, but looking forward in time (non causal case
  189. ).*/
  190.     *ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));
  191. /*   Normalize ZC, LBE, and FBE to old fixed window length of 180. */
  192. /*   (The fraction 90/VLEN has a range of .58 to 1) */
  193.     r__2 = (real) (*zc << 1);
  194.     r__1 = r__2 * (90.f / vlen);
  195.     *zc = i_nint(&r__1);
  196. /* Computing MIN */
  197.     r__1 = lp_rms__ / 4 * (90.f / vlen);
  198.     i__1 = i_nint(&r__1);
  199.     *lbe = min(i__1,32767);
  200. /* Computing MIN */
  201.     r__1 = ap_rms__ / 4 * (90.f / vlen);
  202.     i__1 = i_nint(&r__1);
  203.     *fbe = min(i__1,32767);
  204.     return 0;
  205. } /* vparms_ */