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