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

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: placea.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:42  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.1  1996/08/19  22:31:07  jaf
  6.  * Initial revision
  7.  *
  8. */
  9. #ifdef P_R_O_T_O_T_Y_P_E_S
  10. extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
  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. /*  PLACEA Version 48 */
  19. /* $Log: placea.c,v $
  20. /* Revision 1.1.1.1  2002/07/28 05:23:42  freeman_yong
  21. /* lpc10 codec
  22. /*
  23.  * Revision 1.1  1996/08/19  22:31:07  jaf
  24.  * Initial revision
  25.  * */
  26. /* Revision 1.5  1996/03/19  20:41:55  jaf */
  27. /* Added some conditions satisfied by the output values in EWIN. */
  28. /* Revision 1.4  1996/03/19  20:24:17  jaf */
  29. /* Added some conditions satisfied by the output values in AWIN. */
  30. /* Revision 1.3  1996/03/18  21:40:04  jaf */
  31. /* Just added a few comments about which array indices of the arguments */
  32. /* are used, and mentioning that this subroutine has no local state. */
  33. /* Revision 1.2  1996/03/13  16:43:09  jaf */
  34. /* Comments added explaining that none of the local variables of this */
  35. /* subroutine need to be saved from one invocation to the next. */
  36. /* Revision 1.1  1996/02/07 14:48:31  jaf */
  37. /* Initial revision */
  38. /* *********************************************************************** */
  39. /* Input: */
  40. /*  IPITCH */
  41. /*  VOIBUF */
  42. /*          Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/
  43. /*           All other indices untouched. */
  44. /*  OBOUND */
  45. /*  AF */
  46. /*  VWIN */
  47. /*           Indices (1,AF) and (2,AF) read. */
  48. /*           All other indices untouched. */
  49. /*  LFRAME */
  50. /*  MAXWIN */
  51. /* Input/Output: */
  52. /*  AWIN */
  53. /*           Index (1,AF-1) read. */
  54. /*           Indices (1,AF) and (2,AF) written, and then read. */
  55. /*           All other indices untouched. */
  56. /*           In all cases (except possibly one), the final values will */
  57. /*           satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */
  58. /*           In that other case, */
  59. /*           AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */
  60. /* Output: */
  61. /*  EWIN */
  62. /*           Indices (1,AF) and (2,AF) written. */
  63. /*           All other indices untouched. */
  64. /*           In all cases, the final values will satisfy the condition: */
  65. /*           AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */
  66. /*           In other words, the energy window is a sub-window of */
  67. /*           the analysis window. */
  68. /* This subroutine has no local state. */
  69. /* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
  70. obound, integer *af, integer *vwin, integer *awin, integer *ewin, 
  71. integer *lframe, integer *maxwin)
  72. {
  73.     /* System generated locals */
  74.     real r__1;
  75.     /* Builtin functions */
  76.     integer i_nint(real *);
  77.     /* Local variables */
  78.     logical allv, winv;
  79.     integer i__, j, k, l, hrange;
  80.     logical ephase;
  81.     integer lrange;
  82. /*       Arguments */
  83. /*       Local variables that need not be saved */
  84.     /* Parameter adjustments */
  85.     ewin -= 3;
  86.     awin -= 3;
  87.     vwin -= 3;
  88.     --voibuf;
  89.     /* Function Body */
  90.     lrange = (*af - 2) * *lframe + 1;
  91.     hrange = *af * *lframe;
  92. /*   Place the Analysis window based on the voicing window */
  93. /*   placement, onsets, tentative voicing decision, and pitch. */
  94. /*   Case 1:  Sustained Voiced Speech */
  95. /*   If the five most recent voicing decisions are */
  96. /*   voiced, then the window is placed phase-synchronously with the */
  97. /*   previous window, as close to the present voicing window if possible. 
  98. */
  99. /*   If onsets bound the voicing window, then preference is given to */
  100. /*   a phase-synchronous placement which does not overlap these onsets. */
  101. /*   Case 2:  Voiced Transition */
  102. /*   If at least one voicing decision in AF is voicied, and there are no 
  103. */
  104. /*   onsets, then the window is placed as in case 1. */
  105. /*   Case 3:  Unvoiced Speech or Onsets */
  106. /*   If both voicing decisions in AF are unvoiced, or there are onsets, */
  107. /*   then the window is placed coincident with the voicing window. */
  108. /*   Note:  During phase-synchronous placement of windows, the length */
  109. /*   is not altered from MAXWIN, since this would defeat the purpose */
  110. /*   of phase-synchronous placement. */
  111. /* Check for case 1 and case 2 */
  112.     allv = voibuf[(*af - 2 << 1) + 2] == 1;
  113.     allv = allv && voibuf[(*af - 1 << 1) + 1] == 1;
  114.     allv = allv && voibuf[(*af - 1 << 1) + 2] == 1;
  115.     allv = allv && voibuf[(*af << 1) + 1] == 1;
  116.     allv = allv && voibuf[(*af << 1) + 2] == 1;
  117.     winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;
  118.     if (allv || winv && *obound == 0) {
  119. /* APHASE:  Phase synchronous window placement. */
  120. /* Get minimum lower index of the window. */
  121. i__ = (lrange + *ipitch - 1 - awin[(*af - 1 << 1) + 1]) / *ipitch;
  122. i__ *= *ipitch;
  123. i__ += awin[(*af - 1 << 1) + 1];
  124. /* L = the actual length of this frame's analysis window. */
  125. l = *maxwin;
  126. /* Calculate the location where a perfectly centered window would star
  127. t. */
  128. k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;
  129. /* Choose the actual location to be the pitch multiple closest to this
  130. . */
  131. r__1 = (real) (k - i__) / *ipitch;
  132. awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;
  133. awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;
  134. /* If there is an onset bounding the right of the voicing window and t
  135. he */
  136. /* analysis window overlaps that, then move the analysis window backwa
  137. rd */
  138. /* to avoid this onset. */
  139. if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {
  140.     awin[(*af << 1) + 1] -= *ipitch;
  141.     awin[(*af << 1) + 2] -= *ipitch;
  142. }
  143. /* Similarly for the left of the voicing window. */
  144. if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*
  145. af << 1) + 1]) {
  146.     awin[(*af << 1) + 1] += *ipitch;
  147.     awin[(*af << 1) + 2] += *ipitch;
  148. }
  149. /* If this placement puts the analysis window above HRANGE, then */
  150. /* move it backward an integer number of pitch periods. */
  151. while(awin[(*af << 1) + 2] > hrange) {
  152.     awin[(*af << 1) + 1] -= *ipitch;
  153.     awin[(*af << 1) + 2] -= *ipitch;
  154. }
  155. /* Similarly if the placement puts the analysis window below LRANGE. 
  156. */
  157. while(awin[(*af << 1) + 1] < lrange) {
  158.     awin[(*af << 1) + 1] += *ipitch;
  159.     awin[(*af << 1) + 2] += *ipitch;
  160. }
  161. /* Make Energy window be phase-synchronous. */
  162. ephase = TRUE_;
  163. /* Case 3 */
  164.     } else {
  165. awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
  166. awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
  167. ephase = FALSE_;
  168.     }
  169. /* RMS is computed over an integer number of pitch periods in the analysis
  170.  */
  171. /*window.  When it is not placed phase-synchronously, it is placed as clos
  172. e*/
  173. /* as possible to onsets. */
  174.     j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;
  175.     if (j == 0 || ! winv) {
  176. ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
  177. ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
  178.     } else if (! ephase && *obound == 2) {
  179. ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;
  180. ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];
  181.     } else {
  182. ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];
  183. ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;
  184.     }
  185.     return 0;
  186. } /* placea_ */