Asterisk - The Open Source Telephony Project  18.5.0
placea.c
Go to the documentation of this file.
1 /*
2 
3 $Log$
4 Revision 1.16 2004/06/26 03:50:14 markster
5 Merge source cleanups (bug #1911)
6 
7 Revision 1.15 2003/09/19 01:20:22 markster
8 Code cleanups (bug #66)
9 
10 Revision 1.2 2003/09/19 01:20:22 markster
11 Code cleanups (bug #66)
12 
13 Revision 1.1.1.1 2003/02/12 13:59:15 matteo
14 mer feb 12 14:56:57 CET 2003
15 
16 Revision 1.3 2001/04/12 21:27:53 markh
17 app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
18 
19 Revision 1.2 2000/01/05 08:20:39 markster
20 Some OSS fixes and a few lpc changes to make it actually work
21 
22  * Revision 1.1 1996/08/19 22:31:07 jaf
23  * Initial revision
24  *
25 
26 */
27 
28 /* -- translated by f2c (version 19951025).
29  You must link the resulting object file with the libraries:
30  -lf2c -lm (in that order)
31 */
32 
33 #include "f2c.h"
34 
35 #ifdef P_R_O_T_O_T_Y_P_E_S
36 extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
37 #endif
38 
39 /* *********************************************************************** */
40 
41 /* PLACEA Version 48 */
42 
43 /* $Log$
44  * Revision 1.16 2004/06/26 03:50:14 markster
45  * Merge source cleanups (bug #1911)
46  *
47  * Revision 1.15 2003/09/19 01:20:22 markster
48  * Code cleanups (bug #66)
49  *
50  * Revision 1.2 2003/09/19 01:20:22 markster
51  * Code cleanups (bug #66)
52  *
53  * Revision 1.1.1.1 2003/02/12 13:59:15 matteo
54  * mer feb 12 14:56:57 CET 2003
55  *
56  * Revision 1.3 2001/04/12 21:27:53 markh
57  * app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
58  *
59  * Revision 1.2 2000/01/05 08:20:39 markster
60  * Some OSS fixes and a few lpc changes to make it actually work
61  *
62  * Revision 1.1 1996/08/19 22:31:07 jaf
63  * Initial revision
64  * */
65 /* Revision 1.5 1996/03/19 20:41:55 jaf */
66 /* Added some conditions satisfied by the output values in EWIN. */
67 
68 /* Revision 1.4 1996/03/19 20:24:17 jaf */
69 /* Added some conditions satisfied by the output values in AWIN. */
70 
71 /* Revision 1.3 1996/03/18 21:40:04 jaf */
72 /* Just added a few comments about which array indices of the arguments */
73 /* are used, and mentioning that this subroutine has no local state. */
74 
75 /* Revision 1.2 1996/03/13 16:43:09 jaf */
76 /* Comments added explaining that none of the local variables of this */
77 /* subroutine need to be saved from one invocation to the next. */
78 
79 /* Revision 1.1 1996/02/07 14:48:31 jaf */
80 /* Initial revision */
81 
82 
83 /* *********************************************************************** */
84 /* Input: */
85 /* IPITCH */
86 /* VOIBUF */
87 /* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/
88 /* All other indices untouched. */
89 /* OBOUND */
90 /* AF */
91 /* VWIN */
92 /* Indices (1,AF) and (2,AF) read. */
93 /* All other indices untouched. */
94 /* LFRAME */
95 /* MAXWIN */
96 /* Input/Output: */
97 /* AWIN */
98 /* Index (1,AF-1) read. */
99 /* Indices (1,AF) and (2,AF) written, and then read. */
100 /* All other indices untouched. */
101 /* In all cases (except possibly one), the final values will */
102 /* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */
103 /* In that other case, */
104 /* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */
105 /* Output: */
106 /* EWIN */
107 /* Indices (1,AF) and (2,AF) written. */
108 /* All other indices untouched. */
109 /* In all cases, the final values will satisfy the condition: */
110 /* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */
111 /* In other words, the energy window is a sub-window of */
112 /* the analysis window. */
113 
114 /* This subroutine has no local state. */
115 
116 /* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
117  obound, integer *af, integer *vwin, integer *awin, integer *ewin,
118  integer *lframe, integer *maxwin)
119 {
120  /* System generated locals */
121  real r__1;
122 
123  /* Builtin functions */
124  integer i_nint(real *);
125 
126  /* Local variables */
127  logical allv, winv;
128  integer i__, j, k, l, hrange;
129  logical ephase;
130  integer lrange;
131 
132 /* Arguments */
133 /* Local variables that need not be saved */
134  /* Parameter adjustments */
135  ewin -= 3;
136  awin -= 3;
137  vwin -= 3;
138  --voibuf;
139 
140  /* Function Body */
141  lrange = (*af - 2) * *lframe + 1;
142  hrange = *af * *lframe;
143 /* Place the Analysis window based on the voicing window */
144 /* placement, onsets, tentative voicing decision, and pitch. */
145 
146 /* Case 1: Sustained Voiced Speech */
147 /* If the five most recent voicing decisions are */
148 /* voiced, then the window is placed phase-synchronously with the */
149 /* previous window, as close to the present voicing window if possible.
150 */
151 /* If onsets bound the voicing window, then preference is given to */
152 /* a phase-synchronous placement which does not overlap these onsets. */
153 
154 /* Case 2: Voiced Transition */
155 /* If at least one voicing decision in AF is voicied, and there are no
156 */
157 /* onsets, then the window is placed as in case 1. */
158 
159 /* Case 3: Unvoiced Speech or Onsets */
160 /* If both voicing decisions in AF are unvoiced, or there are onsets, */
161 /* then the window is placed coincident with the voicing window. */
162 
163 /* Note: During phase-synchronous placement of windows, the length */
164 /* is not altered from MAXWIN, since this would defeat the purpose */
165 /* of phase-synchronous placement. */
166 /* Check for case 1 and case 2 */
167  allv = voibuf[((*af - 2) << 1) + 2] == 1;
168  allv = allv && voibuf[((*af - 1) << 1) + 1] == 1;
169  allv = allv && voibuf[((*af - 1) << 1) + 2] == 1;
170  allv = allv && voibuf[(*af << 1) + 1] == 1;
171  allv = allv && voibuf[(*af << 1) + 2] == 1;
172  winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;
173  if (allv || (winv && *obound == 0)) {
174 /* APHASE: Phase synchronous window placement. */
175 /* Get minimum lower index of the window. */
176  i__ = (lrange + *ipitch - 1 - awin[((*af - 1) << 1) + 1]) / *ipitch;
177  i__ *= *ipitch;
178  i__ += awin[((*af - 1) << 1) + 1];
179 /* L = the actual length of this frame's analysis window. */
180  l = *maxwin;
181 /* Calculate the location where a perfectly centered window would star
182 t. */
183  k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;
184 /* Choose the actual location to be the pitch multiple closest to this
185 . */
186  r__1 = (real) (k - i__) / *ipitch;
187  awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;
188  awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;
189 /* If there is an onset bounding the right of the voicing window and t
190 he */
191 /* analysis window overlaps that, then move the analysis window backwa
192 rd */
193 /* to avoid this onset. */
194  if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {
195  awin[(*af << 1) + 1] -= *ipitch;
196  awin[(*af << 1) + 2] -= *ipitch;
197  }
198 /* Similarly for the left of the voicing window. */
199  if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*
200  af << 1) + 1]) {
201  awin[(*af << 1) + 1] += *ipitch;
202  awin[(*af << 1) + 2] += *ipitch;
203  }
204 /* If this placement puts the analysis window above HRANGE, then */
205 /* move it backward an integer number of pitch periods. */
206  while(awin[(*af << 1) + 2] > hrange) {
207  awin[(*af << 1) + 1] -= *ipitch;
208  awin[(*af << 1) + 2] -= *ipitch;
209  }
210 /* Similarly if the placement puts the analysis window below LRANGE.
211 */
212  while(awin[(*af << 1) + 1] < lrange) {
213  awin[(*af << 1) + 1] += *ipitch;
214  awin[(*af << 1) + 2] += *ipitch;
215  }
216 /* Make Energy window be phase-synchronous. */
217  ephase = TRUE_;
218 /* Case 3 */
219  } else {
220  awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
221  awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
222  ephase = FALSE_;
223  }
224 /* RMS is computed over an integer number of pitch periods in the analysis
225  */
226 /*window. When it is not placed phase-synchronously, it is placed as clos
227 e*/
228 /* as possible to onsets. */
229  j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;
230  if (j == 0 || ! winv) {
231  ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
232  ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
233  } else if (! ephase && *obound == 2) {
234  ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;
235  ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];
236  } else {
237  ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];
238  ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;
239  }
240  return 0;
241 } /* placea_ */
integer i_nint(real *x)
Definition: f2clib.c:80
#define TRUE_
Definition: f2c.h:67
int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin)
Definition: placea.c:116
float real
Definition: lpc10.h:79
integer lframe
Definition: analys.c:66
INT32 logical
Definition: lpc10.h:81
INT32 integer
Definition: lpc10.h:80
#define FALSE_
Definition: f2c.h:68