Asterisk - The Open Source Telephony Project GIT-master-f36a736
placev.c
Go to the documentation of this file.
1/*
2
3$Log$
4Revision 1.15 2004/06/26 03:50:14 markster
5Merge source cleanups (bug #1911)
6
7Revision 1.14 2003/02/12 13:59:15 matteo
8mer feb 12 14:56:57 CET 2003
9
10Revision 1.1.1.1 2003/02/12 13:59:15 matteo
11mer feb 12 14:56:57 CET 2003
12
13Revision 1.3 2001/04/12 21:27:53 markh
14app_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.
15
16Revision 1.2 2000/01/05 08:20:39 markster
17Some OSS fixes and a few lpc changes to make it actually work
18
19 * Revision 1.1 1996/08/19 22:31:02 jaf
20 * Initial revision
21 *
22
23*/
24
25/* -- translated by f2c (version 19951025).
26 You must link the resulting object file with the libraries:
27 -lf2c -lm (in that order)
28*/
29
30#include "f2c.h"
31
32#ifdef P_R_O_T_O_T_Y_P_E_S
33extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
34#endif
35
36/* ****************************************************************** */
37
38/* PLACEV Version 48 */
39
40/* $Log$
41 * Revision 1.15 2004/06/26 03:50:14 markster
42 * Merge source cleanups (bug #1911)
43 *
44 * Revision 1.14 2003/02/12 13:59:15 matteo
45 * mer feb 12 14:56:57 CET 2003
46 *
47 * Revision 1.1.1.1 2003/02/12 13:59:15 matteo
48 * mer feb 12 14:56:57 CET 2003
49 *
50 * Revision 1.3 2001/04/12 21:27:53 markh
51 * 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.
52 *
53 * Revision 1.2 2000/01/05 08:20:39 markster
54 * Some OSS fixes and a few lpc changes to make it actually work
55 *
56 * Revision 1.1 1996/08/19 22:31:02 jaf
57 * Initial revision
58 * */
59/* Revision 1.6 1996/03/19 20:42:19 jaf */
60/* Added some conditions satisfied by the output values in VWIN. */
61
62/* Revision 1.5 1996/03/19 18:37:56 jaf */
63/* Strengthened the specification of which indices of VWIN are read and */
64/* written. */
65
66/* Revision 1.4 1996/03/15 16:38:33 jaf */
67/* One tiny comment added. */
68
69/* Revision 1.3 1996/03/15 16:36:13 jaf */
70/* Added comments giving In/Out status of arguments. */
71
72/* Revision 1.2 1996/03/12 23:56:01 jaf */
73/* Comments added explaining that none of the local variables of this */
74/* subroutine need to be saved from one invocation to the next. */
75
76/* Revision 1.1 1996/02/07 14:48:39 jaf */
77/* Initial revision */
78
79
80/* ****************************************************************** */
81
82/* Input: */
83/* OSBUF Buffer which holds sorted indexes of onsets */
84/* I believe that only indices 1 through OSPTR-1 can be read. */
85/* OSLEN */
86/* OSPTR Free pointer into OSBUF */
87/* AF */
88/* LFRAME */
89/* MINWIN */
90/* MAXWIN */
91/* DVWINL */
92/* DVWINH (This argument is never used. Should it be?) */
93/* Input/Output: */
94/* VWIN Buffer of Voicing Window Positions (Modified) */
95/* Index (2,AF-1) is read. */
96/* Indices (1,AF) and (2,AF) are written, */
97/* and then possibly read. */
98/* All other indices are unused. */
99/* In all cases, the final values will satsify the condition:*/
100/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
101/* I'm not certain yet, but they may also satisfy: */
102/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
103/* Output: */
104/* OBOUND This variable is set by this procedure and used */
105/* in placing analysis windows (PLACEA). Bit 1 */
106/* indicates whether an onset bounds the left side */
107/* of the voicing window, and bit 2 indicates whether */
108/* an onset bounds the right side of the voicing window. */
109
110/* This subroutine has no local state. */
111
112/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
113 integer *obound, integer *vwin, integer *af, integer *lframe, integer
114 *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
115{
116 /* System generated locals */
117 integer i__1, i__2;
118
119 /* Local variables */
120 logical crit;
121 integer i__, q, osptr1, hrange, lrange;
122
123/* Arguments */
124/* Local variables that need not be saved */
125/* Variables */
126/* LRANGE, HRANGE Range in which window is placed */
127/* OSPTR1 OSPTR excluding samples in 3F */
128/* Local state */
129/* None */
130/* Voicing Window Placement */
131
132/* __________________ __________________ ______________ */
133/* | | | */
134/* | 1F | 2F | 3F ... */
135/* |__________________|__________________|______________ */
136
137/* Previous | */
138/* Window | */
139/* ...________| */
140
141/* | | */
142/* ------>| This window's placement range |<------ */
143/* | | */
144
145/* There are three cases. Note that these are different from those */
146/* given in the LPC-10e phase 1 report. */
147
148/* 1. If there are no onsets in this range, then the voicing window */
149/* is centered in the pitch window. If such a placement is not within
150*/
151/* the window's placement range, then the window is placed in the left-
152*/
153/* most portion of the placement range. Its length is always MAXWIN. */
154
155/* 2. If the first onset is in 2F and there is sufficient room to place
156 */
157/* the window immediately before this onset, then the window is placed
158*/
159/* there, and its length is set to the maximum possible under these */
160/* constraints. */
161
162/* "Critical Region Exception": If there is another onset in 2F */
163/* such that a window can be placed between the two onsets, the */
164/* window is placed there (ie, as in case 3). */
165
166/* 3. Otherwise, the window is placed immediately after the onset. The
167 */
168/* window's length */
169/* is the longest length that can fit in the range under these constraint
170s,*/
171/* except that the window may be shortened even further to avoid overlapp
172ing*/
173/* other onsets in the placement range. In any case, the window's length
174*/
175/* is at least MINWIN. */
176
177/* Note that the values of MINWIN and LFRAME must be chosen such */
178/* that case 2 = false implies case 3 = true. This means that */
179/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */
180/* would have to be added for when the window cannot fit either before
181*/
182/* or after the onset. */
183
184/* Note also that onsets which weren't in 2F last time may be in 1F this
185 */
186/* time, due to the filter delays in computing onsets. The result is tha
187t*/
188/* occasionally a voicing window will overlap that onset. The only way
189*/
190/* to circumvent this problem is to add more delay in processing input
191*/
192/* speech. In the trade-off between delay and window-placement, window
193*/
194/* placement lost. */
195/* Compute the placement range */
196 /* Parameter adjustments */
197 --osbuf;
198 vwin -= 3;
199
200 /* Function Body */
201/* Computing MAX */
202 i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
203 lrange = max(i__1,i__2);
204 hrange = *af * *lframe;
205/* Compute OSPTR1, so the following code only looks at relevant onsets. */
206 for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
207 if (osbuf[osptr1] <= hrange) {
208 goto L90;
209 }
210 }
211L90:
212 ++osptr1;
213/* Check for case 1 first (fast case): */
214 if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
215/* Computing MAX */
216 i__1 = vwin[((*af - 1) << 1) + 2] + 1;
217 vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
218 vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;
219 *obound = 0;
220 } else {
221/* Search backward in OSBUF for first onset in range. */
222/* This code relies on the above check being performed first. */
223 for (q = osptr1 - 1; q >= 1; --q) {
224 if (osbuf[q] < lrange) {
225 goto L100;
226 }
227 }
228L100:
229 ++q;
230/* Check for case 2 (placement before onset): */
231/* Check for critical region exception: */
232 i__1 = osptr1 - 1;
233 for (i__ = q + 1; i__ <= i__1; ++i__) {
234 if (osbuf[i__] - osbuf[q] >= *minwin) {
235 crit = TRUE_;
236 goto L105;
237 }
238 }
239 crit = FALSE_;
240L105:
241/* Computing MAX */
242 i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
243 if (! crit && osbuf[q] > max(i__1,i__2)) {
244 vwin[(*af << 1) + 2] = osbuf[q] - 1;
245/* Computing MAX */
246 i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
247 vwin[(*af << 1) + 1] = max(i__1,i__2);
248 *obound = 2;
249/* Case 3 (placement after onset) */
250 } else {
251 vwin[(*af << 1) + 1] = osbuf[q];
252L110:
253 ++q;
254 if (q >= osptr1) {
255 goto L120;
256 }
257 if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
258 goto L120;
259 }
260 if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
261 goto L110;
262 }
263 vwin[(*af << 1) + 2] = osbuf[q] - 1;
264 *obound = 3;
265 return 0;
266L120:
267/* Computing MIN */
268 i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
269 vwin[(*af << 1) + 2] = min(i__1,hrange);
270 *obound = 1;
271 }
272 }
273 return 0;
274} /* placev_ */
integer lframe
Definition: analys.c:66
#define min(a, b)
Definition: f2c.h:197
#define TRUE_
Definition: f2c.h:67
#define FALSE_
Definition: f2c.h:68
#define max(a, b)
Definition: f2c.h:198
INT32 integer
Definition: lpc10.h:80
INT32 logical
Definition: lpc10.h:81
int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
Definition: placev.c:112