mer feb 12 14:56:57 CET 2003
[asterisk/asterisk.git] / codecs / lpc10 / encode.c
1 /*
2
3 $Log$
4 Revision 1.14  2003/02/12 13:59:15  matteo
5 mer feb 12 14:56:57 CET 2003
6
7 Revision 1.1.1.1  2003/02/12 13:59:15  matteo
8 mer feb 12 14:56:57 CET 2003
9
10 Revision 1.2  2000/01/05 08:20:39  markster
11 Some OSS fixes and a few lpc changes to make it actually work
12
13  * Revision 1.1  1996/08/19  22:32:21  jaf
14  * Initial revision
15  *
16
17 */
18
19 #ifdef P_R_O_T_O_T_Y_P_E_S
20 extern int encode_(integer *voice, integer *pitch, real *rms, real *rc, integer *ipitch, integer *irms, integer *irc);
21 /* comlen contrl_ 12 */
22 #endif
23
24 /*  -- translated by f2c (version 19951025).
25    You must link the resulting object file with the libraries:
26         -lf2c -lm   (in that order)
27 */
28
29 #include "f2c.h"
30
31 /* Common Block Declarations */
32
33 extern struct {
34     integer order, lframe;
35     logical corrp;
36 } contrl_;
37
38 #define contrl_1 contrl_
39
40 /* Table of constant values */
41
42 static integer c__2 = 2;
43
44 /* ***************************************************************** */
45
46 /*      ENCODE Version 54 */
47
48 /* $Log$
49  * Revision 1.14  2003/02/12 13:59:15  matteo
50  * mer feb 12 14:56:57 CET 2003
51  *
52 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
53 /* mer feb 12 14:56:57 CET 2003
54 /*
55 /* Revision 1.2  2000/01/05 08:20:39  markster
56 /* Some OSS fixes and a few lpc changes to make it actually work
57 /*
58  * Revision 1.1  1996/08/19  22:32:21  jaf
59  * Initial revision
60  * */
61 /* Revision 1.5  1996/03/26  19:35:50  jaf */
62 /* Commented out trace statements. */
63
64 /* Revision 1.4  1996/03/21  00:26:29  jaf */
65 /* Added the comment that this subroutine has no local state. */
66
67 /* In the last check-in, I forgot to mention that I had added comments */
68 /* explaining which indices of array arguments are read or written. */
69
70 /* Revision 1.3  1996/03/21  00:22:39  jaf */
71 /* Added comments explaining that all local arrays are effectively */
72 /* constants. */
73
74 /* Revision 1.2  1996/03/13  18:48:33  jaf */
75 /* Comments added explaining that none of the local variables of this */
76 /* subroutine need to be saved from one invocation to the next. */
77
78 /* Revision 1.1  1996/02/07 14:45:29  jaf */
79 /* Initial revision */
80
81
82 /* ***************************************************************** */
83
84 /*  Quantize LPC parameters for transmission */
85
86 /* INPUTS: */
87 /*  VOICE  - Half frame voicing decisions */
88 /*           Indices 1 through 2 read. */
89 /*  PITCH  - Pitch */
90 /*  RMS    - Energy */
91 /*  RC     - Reflection coefficients */
92 /*           Indices 1 through ORDER read. */
93 /*  CORRP  - Error Correction: TRUE = yes, FALSE = none */
94 /*           (this is defined in file control.fh) */
95 /* OUTPUTS: */
96 /*  IPITCH - Coded pitch and voicing */
97 /*  IRMS   - Quantized energy */
98 /*  IRC    - Quantized reflection coefficients */
99 /*           Indices 1 through MAX(ORDER,2) written. */
100 /*           If CORRP is .TRUE., then indices 1 through 10 written */
101 /*           for unvoiced frames. */
102
103 /* This subroutine has no local state. */
104
105 /* Subroutine */ int encode_(integer *voice, integer *pitch, real *rms, real *
106         rc, integer *ipitch, integer *irms, integer *irc)
107 {
108     /* Initialized data */
109
110     static integer enctab[16] = { 0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15 };
111     static integer entau[60] = { 19,11,27,25,29,21,23,22,30,14,15,7,39,38,46,
112             42,43,41,45,37,53,49,51,50,54,52,60,56,58,26,90,88,92,84,86,82,83,
113             81,85,69,77,73,75,74,78,70,71,67,99,97,113,112,114,98,106,104,108,
114             100,101,76 };
115     static integer enadd[8] = { 1920,-768,2432,1280,3584,1536,2816,-1152 };
116     static real enscl[8] = { .0204f,.0167f,.0145f,.0147f,.0143f,.0135f,.0125f,
117             .0112f };
118     static integer enbits[8] = { 6,5,4,4,4,4,3,3 };
119     static integer entab6[64] = { 0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,
120             3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,
121             9,10,10,11,11,12,13,14,15 };
122     static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,
123             384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,
124             92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,
125             14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
126
127     /* System generated locals */
128     integer i__1, i__2;
129
130     /* Builtin functions */
131     integer pow_ii(integer *, integer *);
132
133     /* Local variables */
134     integer idel, nbit, i__, j, i2, i3, mrk;
135
136 /* $Log$
137  * Revision 1.14  2003/02/12 13:59:15  matteo
138  * mer feb 12 14:56:57 CET 2003
139  *
140 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
141 /* mer feb 12 14:56:57 CET 2003
142 /*
143 /* Revision 1.2  2000/01/05 08:20:39  markster
144 /* Some OSS fixes and a few lpc changes to make it actually work
145 /*
146  * Revision 1.1  1996/08/19  22:32:21  jaf
147  * Initial revision
148  * */
149 /* Revision 1.3  1996/03/29  22:03:47  jaf */
150 /* Removed definitions for any constants that were no longer used. */
151
152 /* Revision 1.2  1996/03/26  19:34:33  jaf */
153 /* Added comments indicating which constants are not needed in an */
154 /* application that uses the LPC-10 coder. */
155
156 /* Revision 1.1  1996/02/07  14:43:51  jaf */
157 /* Initial revision */
158
159 /*   LPC Configuration parameters: */
160 /* Frame size, Prediction order, Pitch period */
161 /*       Arguments */
162 /* $Log$
163  * Revision 1.14  2003/02/12 13:59:15  matteo
164  * mer feb 12 14:56:57 CET 2003
165  *
166 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
167 /* mer feb 12 14:56:57 CET 2003
168 /*
169 /* Revision 1.2  2000/01/05 08:20:39  markster
170 /* Some OSS fixes and a few lpc changes to make it actually work
171 /*
172  * Revision 1.1  1996/08/19  22:32:21  jaf
173  * Initial revision
174  * */
175 /* Revision 1.3  1996/03/29  22:05:55  jaf */
176 /* Commented out the common block variables that are not needed by the */
177 /* embedded version. */
178
179 /* Revision 1.2  1996/03/26  19:34:50  jaf */
180 /* Added comments indicating which constants are not needed in an */
181 /* application that uses the LPC-10 coder. */
182
183 /* Revision 1.1  1996/02/07  14:44:09  jaf */
184 /* Initial revision */
185
186 /*   LPC Processing control variables: */
187
188 /* *** Read-only: initialized in setup */
189
190 /*  Files for Speech, Parameter, and Bitstream Input & Output, */
191 /*    and message and debug outputs. */
192
193 /* Here are the only files which use these variables: */
194
195 /* lpcsim.f setup.f trans.f error.f vqsetup.f */
196
197 /* Many files which use fdebug are not listed, since it is only used in */
198 /* those other files conditionally, to print trace statements. */
199 /*      integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
200 /*  LPC order, Frame size, Quantization rate, Bits per frame, */
201 /*    Error correction */
202 /* Subroutine SETUP is the only place where order is assigned a value, */
203 /* and that value is 10.  It could increase efficiency 1% or so to */
204 /* declare order as a constant (i.e., a Fortran PARAMETER) instead of as 
205 */
206 /* a variable in a COMMON block, since it is used in many places in the */
207 /* core of the coding and decoding routines.  Actually, I take that back. 
208 */
209 /* At least when compiling with f2c, the upper bound of DO loops is */
210 /* stored in a local variable before the DO loop begins, and then that is 
211 */
212 /* compared against on each iteration. */
213 /* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
214 /* Similarly for quant, which is given a value of 2400 in SETUP.  quant */
215 /* is used in only a few places, and never in the core coding and */
216 /* decoding routines, so it could be eliminated entirely. */
217 /* nbits is similar to quant, and is given a value of 54 in SETUP. */
218 /* corrp is given a value of .TRUE. in SETUP, and is only used in the */
219 /* subroutines ENCODE and DECODE.  It doesn't affect the speed of the */
220 /* coder significantly whether it is .TRUE. or .FALSE., or whether it is 
221 */
222 /* a constant or a variable, since it is only examined once per frame. */
223 /* Leaving it as a variable that is set to .TRUE.  seems like a good */
224 /* idea, since it does enable some error-correction capability for */
225 /* unvoiced frames, with no change in the coding rate, and no noticeable 
226 */
227 /* quality difference in the decoded speech. */
228 /*      integer quant, nbits */
229 /* *** Read/write: variables for debugging, not needed for LPC algorithm 
230 */
231
232 /*  Current frame, Unstable frames, Output clip count, Max onset buffer, 
233 */
234 /*    Debug listing detail level, Line count on listing page */
235
236 /* nframe is not needed for an embedded LPC10 at all. */
237 /* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
238 /* ERROR, which is only called from RCCHK.  When LPC10 is embedded into */
239 /* an application, I would recommend removing the call to ERROR in RCCHK, 
240 */
241 /* and remove ERROR and nunsfm completely. */
242 /* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in 
243 */
244 /* sread.f.  When LPC10 is embedded into an application, one might want */
245 /* to cause it to be incremented in a routine that takes the output of */
246 /* SYNTHS and sends it to an audio device.  It could be optionally */
247 /* displayed, for those that might want to know what it is. */
248 /* maxosp is never initialized to 0 in SETUP, although it probably should 
249 */
250 /* be, and it is updated in subroutine ANALYS.  I doubt that its value */
251 /* would be of much interest to an application in which LPC10 is */
252 /* embedded. */
253 /* listl and lincnt are not needed for an embedded LPC10 at all. */
254 /*      integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
255 /*      common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
256 /*      common /contrl/ quant, nbits */
257 /*      common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
258 /*       Parameters/constants */
259 /*       These arrays are not Fortran PARAMETER's, but they are defined */
260 /*       by DATA statements below, and their contents are never altered. 
261 */
262 /*       Local variables that need not be saved */
263     /* Parameter adjustments */
264     --irc;
265     --rc;
266     --voice;
267
268     /* Function Body */
269 /*  Scale RMS and RC's to integers */
270     *irms = *rms;
271     i__1 = contrl_1.order;
272     for (i__ = 1; i__ <= i__1; ++i__) {
273         irc[i__] = rc[i__] * 32768.f;
274     }
275 /*      IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER) */
276 /* 800  FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8) */
277 /*  Encode pitch and voicing */
278     if (voice[1] != 0 && voice[2] != 0) {
279         *ipitch = entau[*pitch - 1];
280     } else {
281         if (contrl_1.corrp) {
282             *ipitch = 0;
283             if (voice[1] != voice[2]) {
284                 *ipitch = 127;
285             }
286         } else {
287             *ipitch = (voice[1] << 1) + voice[2];
288         }
289     }
290 /*  Encode RMS by binary table search */
291     j = 32;
292     idel = 16;
293     *irms = min(*irms,1023);
294     while(idel > 0) {
295         if (*irms > rmst[j - 1]) {
296             j -= idel;
297         }
298         if (*irms < rmst[j - 1]) {
299             j += idel;
300         }
301         idel /= 2;
302     }
303     if (*irms > rmst[j - 1]) {
304         --j;
305     }
306     *irms = 31 - j / 2;
307 /*  Encode RC(1) and (2) as log-area-ratios */
308     for (i__ = 1; i__ <= 2; ++i__) {
309         i2 = irc[i__];
310         mrk = 0;
311         if (i2 < 0) {
312             i2 = -i2;
313             mrk = 1;
314         }
315         i2 /= 512;
316         i2 = min(i2,63);
317         i2 = entab6[i2];
318         if (mrk != 0) {
319             i2 = -i2;
320         }
321         irc[i__] = i2;
322     }
323 /*  Encode RC(3) - (10) linearly, remove bias then scale */
324     i__1 = contrl_1.order;
325     for (i__ = 3; i__ <= i__1; ++i__) {
326         i2 = irc[i__] / 2;
327         i2 = (i2 + enadd[contrl_1.order + 1 - i__ - 1]) * enscl[
328                 contrl_1.order + 1 - i__ - 1];
329 /* Computing MIN */
330         i__2 = max(i2,-127);
331         i2 = min(i__2,127);
332         nbit = enbits[contrl_1.order + 1 - i__ - 1];
333         i3 = 0;
334         if (i2 < 0) {
335             i3 = -1;
336         }
337         i2 /= pow_ii(&c__2, &nbit);
338         if (i3 == -1) {
339             --i2;
340         }
341         irc[i__] = i2;
342     }
343 /*          Protect the most significant bits of the most */
344 /*     important parameters during non-voiced frames. */
345 /*     RC(1) - RC(4) are protected using 20 parity bits */
346 /*     replacing RC(5) - RC(10). */
347     if (contrl_1.corrp) {
348         if (*ipitch == 0 || *ipitch == 127) {
349             irc[5] = enctab[(irc[1] & 30) / 2];
350             irc[6] = enctab[(irc[2] & 30) / 2];
351             irc[7] = enctab[(irc[3] & 30) / 2];
352             irc[8] = enctab[(*irms & 30) / 2];
353             irc[9] = enctab[(irc[4] & 30) / 2] / 2;
354             irc[10] = enctab[(irc[4] & 30) / 2] & 1;
355         }
356     }
357 /*      IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER) */
358 /* 801  FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */
359     return 0;
360 } /* encode_ */
361