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