Merge "ExternalMedia: Change return object from ExternalMedia to Channel"
[asterisk/asterisk.git] / codecs / lpc10 / placea.c
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_ */