Several changes to codec_dahdi to play nice with G723.
[asterisk/asterisk.git] / codecs / lpc10 / lpcini.c
1 /*
2
3 $Log$
4 Revision 1.18  2003/10/21 18:08:11  markster
5 Fix include order
6
7 Revision 1.5  2003/10/21 18:08:11  markster
8 Fix include order
9
10 Revision 1.4  2003/10/21 02:57:29  markster
11 FreeBSD patch, take 2
12
13 Revision 1.3  2003/10/16 21:11:30  martinp
14 Revert the previous patch since it's braking compilation
15
16 Revision 1.1  2003/02/12 13:59:15  matteo
17 Initial revision
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.2  1996/08/20  20:35:41  jaf
23  * Added functions for allocating and initializing lpc10_encoder_state
24  * and lpc10_decoder_state structures.
25  *
26  * Revision 1.1  1996/08/19  22:31:40  jaf
27  * Initial revision
28  *
29
30 */
31
32 /*  -- translated by f2c (version 19951025).
33    You must link the resulting object file with the libraries:
34         -lf2c -lm   (in that order)
35 */
36
37 #include "asterisk.h"
38 #include "f2c.h"
39
40 #ifdef P_R_O_T_O_T_Y_P_E_S
41 extern int lpcini_(void);
42 /* comlen contrl_ 12 */
43 /*:ref: initlpcenc_ 14 0 */
44 /*:ref: initlpcdec_ 14 0 */
45 #endif
46
47 /* Common Block Declarations */
48
49 struct {
50     integer order, lframe;
51     logical corrp;
52 } contrl_;
53
54 #define contrl_1 contrl_
55
56 /* ***************************************************************** */
57
58 /* $Log$
59  * Revision 1.18  2003/10/21 18:08:11  markster
60  * Fix include order
61  *
62  * Revision 1.5  2003/10/21 18:08:11  markster
63  * Fix include order
64  *
65  * Revision 1.4  2003/10/21 02:57:29  markster
66  * FreeBSD patch, take 2
67  *
68  * Revision 1.3  2003/10/16 21:11:30  martinp
69  * Revert the previous patch since it's braking compilation
70  *
71  * Revision 1.1  2003/02/12 13:59:15  matteo
72  * Initial revision
73  *
74  * Revision 1.2  2000/01/05 08:20:39  markster
75  * Some OSS fixes and a few lpc changes to make it actually work
76  *
77  * Revision 1.2  1996/08/20  20:35:41  jaf
78  * Added functions for allocating and initializing lpc10_encoder_state
79  * and lpc10_decoder_state structures.
80  *
81  * Revision 1.1  1996/08/19  22:31:40  jaf
82  * Initial revision
83  * */
84 /* Revision 1.1  1996/03/28  00:04:05  jaf */
85 /* Initial revision */
86
87
88 /* ***************************************************************** */
89
90 /* Initialize COMMON block variables used by LPC-10 encoder and decoder, */
91 /* and call initialization routines for both of them. */
92
93 /* Subroutine */ int lpcini_(void)
94 {
95
96 /* $Log$
97  * Revision 1.18  2003/10/21 18:08:11  markster
98  * Fix include order
99  *
100  * Revision 1.5  2003/10/21 18:08:11  markster
101  * Fix include order
102  *
103  * Revision 1.4  2003/10/21 02:57:29  markster
104  * FreeBSD patch, take 2
105  *
106  * Revision 1.3  2003/10/16 21:11:30  martinp
107  * Revert the previous patch since it's braking compilation
108  *
109  * Revision 1.1  2003/02/12 13:59:15  matteo
110  * Initial revision
111  *
112  * Revision 1.2  2000/01/05 08:20:39  markster
113  * Some OSS fixes and a few lpc changes to make it actually work
114  *
115  * Revision 1.2  1996/08/20  20:35:41  jaf
116  * Added functions for allocating and initializing lpc10_encoder_state
117  * and lpc10_decoder_state structures.
118  *
119  * Revision 1.1  1996/08/19  22:31:40  jaf
120  * Initial revision
121  * */
122 /* Revision 1.3  1996/03/29  22:03:47  jaf */
123 /* Removed definitions for any constants that were no longer used. */
124
125 /* Revision 1.2  1996/03/26  19:34:33  jaf */
126 /* Added comments indicating which constants are not needed in an */
127 /* application that uses the LPC-10 coder. */
128
129 /* Revision 1.1  1996/02/07  14:43:51  jaf */
130 /* Initial revision */
131
132 /*   LPC Configuration parameters: */
133 /* Frame size, Prediction order, Pitch period */
134 /* $Log$
135  * Revision 1.18  2003/10/21 18:08:11  markster
136  * Fix include order
137  *
138  * Revision 1.5  2003/10/21 18:08:11  markster
139  * Fix include order
140  *
141  * Revision 1.4  2003/10/21 02:57:29  markster
142  * FreeBSD patch, take 2
143  *
144  * Revision 1.3  2003/10/16 21:11:30  martinp
145  * Revert the previous patch since it's braking compilation
146  *
147  * Revision 1.1  2003/02/12 13:59:15  matteo
148  * Initial revision
149  *
150  * Revision 1.2  2000/01/05 08:20:39  markster
151  * Some OSS fixes and a few lpc changes to make it actually work
152  *
153  * Revision 1.2  1996/08/20  20:35:41  jaf
154  * Added functions for allocating and initializing lpc10_encoder_state
155  * and lpc10_decoder_state structures.
156  *
157  * Revision 1.1  1996/08/19  22:31:40  jaf
158  * Initial revision
159  * */
160 /* Revision 1.3  1996/03/29  22:05:55  jaf */
161 /* Commented out the common block variables that are not needed by the */
162 /* embedded version. */
163
164 /* Revision 1.2  1996/03/26  19:34:50  jaf */
165 /* Added comments indicating which constants are not needed in an */
166 /* application that uses the LPC-10 coder. */
167
168 /* Revision 1.1  1996/02/07  14:44:09  jaf */
169 /* Initial revision */
170
171 /*   LPC Processing control variables: */
172
173 /* *** Read-only: initialized in setup */
174
175 /*  Files for Speech, Parameter, and Bitstream Input & Output, */
176 /*    and message and debug outputs. */
177
178 /* Here are the only files which use these variables: */
179
180 /* lpcsim.f setup.f trans.f error.f vqsetup.f */
181
182 /* Many files which use fdebug are not listed, since it is only used in */
183 /* those other files conditionally, to print trace statements. */
184 /*      integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
185 /*  LPC order, Frame size, Quantization rate, Bits per frame, */
186 /*    Error correction */
187 /* Subroutine SETUP is the only place where order is assigned a value, */
188 /* and that value is 10.  It could increase efficiency 1% or so to */
189 /* declare order as a constant (i.e., a Fortran PARAMETER) instead of as 
190 */
191 /* a variable in a COMMON block, since it is used in many places in the */
192 /* core of the coding and decoding routines.  Actually, I take that back. 
193 */
194 /* At least when compiling with f2c, the upper bound of DO loops is */
195 /* stored in a local variable before the DO loop begins, and then that is 
196 */
197 /* compared against on each iteration. */
198 /* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
199 /* Similarly for quant, which is given a value of 2400 in SETUP.  quant */
200 /* is used in only a few places, and never in the core coding and */
201 /* decoding routines, so it could be eliminated entirely. */
202 /* nbits is similar to quant, and is given a value of 54 in SETUP. */
203 /* corrp is given a value of .TRUE. in SETUP, and is only used in the */
204 /* subroutines ENCODE and DECODE.  It doesn't affect the speed of the */
205 /* coder significantly whether it is .TRUE. or .FALSE., or whether it is 
206 */
207 /* a constant or a variable, since it is only examined once per frame. */
208 /* Leaving it as a variable that is set to .TRUE.  seems like a good */
209 /* idea, since it does enable some error-correction capability for */
210 /* unvoiced frames, with no change in the coding rate, and no noticeable 
211 */
212 /* quality difference in the decoded speech. */
213 /*      integer quant, nbits */
214 /* *** Read/write: variables for debugging, not needed for LPC algorithm 
215 */
216
217 /*  Current frame, Unstable frames, Output clip count, Max onset buffer, 
218 */
219 /*    Debug listing detail level, Line count on listing page */
220
221 /* nframe is not needed for an embedded LPC10 at all. */
222 /* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
223 /* ERROR, which is only called from RCCHK.  When LPC10 is embedded into */
224 /* an application, I would recommend removing the call to ERROR in RCCHK, 
225 */
226 /* and remove ERROR and nunsfm completely. */
227 /* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in 
228 */
229 /* sread.f.  When LPC10 is embedded into an application, one might want */
230 /* to cause it to be incremented in a routine that takes the output of */
231 /* SYNTHS and sends it to an audio device.  It could be optionally */
232 /* displayed, for those that might want to know what it is. */
233 /* maxosp is never initialized to 0 in SETUP, although it probably should 
234 */
235 /* be, and it is updated in subroutine ANALYS.  I doubt that its value */
236 /* would be of much interest to an application in which LPC10 is */
237 /* embedded. */
238 /* listl and lincnt are not needed for an embedded LPC10 at all. */
239 /*      integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
240 /*      common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
241 /*      common /contrl/ quant, nbits */
242 /*      common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
243     contrl_1.order = 10;
244     contrl_1.lframe = 180;
245     contrl_1.corrp = TRUE_;
246     return 0;
247 } /* lpcini_ */
248
249
250
251 /* Allocate memory for, and initialize, the state that needs to be
252    kept from encoding one frame to the next for a single
253    LPC-10-compressed audio stream.  Return 0 if malloc fails,
254    otherwise return pointer to new structure. */
255
256 struct lpc10_encoder_state *
257 create_lpc10_encoder_state()
258 {
259     struct lpc10_encoder_state *st;
260
261     st = (struct lpc10_encoder_state *)
262         malloc((unsigned) sizeof (struct lpc10_encoder_state));
263     if (st != 0) {
264         init_lpc10_encoder_state(st);
265     }
266     return (st);
267 }
268
269
270
271 void init_lpc10_encoder_state(struct lpc10_encoder_state *st)
272 {
273     int i;
274
275     lpcini_();
276
277     /* State used only by function hp100 */
278     st->z11 = 0.0f;
279     st->z21 = 0.0f;
280     st->z12 = 0.0f;
281     st->z22 = 0.0f;
282     
283     /* State used by function analys */
284     for (i = 0; i < 540; i++) {
285         st->inbuf[i] = 0.0f;
286         st->pebuf[i] = 0.0f;
287     }
288     for (i = 0; i < 696; i++) {
289         st->lpbuf[i] = 0.0f;
290     }
291     for (i = 0; i < 312; i++) {
292         st->ivbuf[i] = 0.0f;
293     }
294     st->bias = 0.0f;
295     /* integer osbuf[10];  */ /* no initial value necessary */
296     st->osptr = 1;
297     for (i = 0; i < 3; i++) {
298         st->obound[i] = 0;
299     }
300     st->vwin[4] = 307;
301     st->vwin[5] = 462;
302     st->awin[4] = 307;
303     st->awin[5] = 462;
304     for (i = 0; i < 8; i++) {
305         st->voibuf[i] = 0;
306     }
307     for (i = 0; i < 3; i++) {
308         st->rmsbuf[i] = 0.0f;
309     }
310     for (i = 0; i < 30; i++) {
311         st->rcbuf[i] = 0.0f;
312     }
313     st->zpre = 0.0f;
314
315
316     /* State used by function onset */
317     st->n = 0.0f;
318     st->d__ = 1.0f;
319     /* real fpc;   */ /* no initial value necessary */
320     for (i = 0; i < 16; i++) {
321         st->l2buf[i] = 0.0f;
322     }
323     st->l2sum1 = 0.0f;
324     st->l2ptr1 = 1;
325     st->l2ptr2 = 9;
326     /* integer lasti; */   /* no initial value necessary */
327     st->hyst = FALSE_;
328
329     /* State used by function voicin */
330     st->dither = 20.0f;
331     st->maxmin = 0.0f;
332     for (i = 0; i < 6; i++) {
333         st->voice[i] = 0.0f;
334     }
335     st->lbve = 3000;
336     st->fbve = 3000;
337     st->fbue = 187;
338     st->ofbue = 187;
339     st->sfbue = 187;
340     st->lbue = 93;
341     st->olbue = 93;
342     st->slbue = 93;
343     st->snr = (real) (st->fbve / st->fbue << 6);
344
345     /* State used by function dyptrk */
346     for (i = 0; i < 60; i++) {
347         st->s[i] = 0.0f;
348     }
349     for (i = 0; i < 120; i++) {
350         st->p[i] = 0;
351     }
352     st->ipoint = 0;
353     st->alphax = 0.0f;
354
355     /* State used by function chanwr */
356     st->isync = 0;
357
358 }
359
360
361
362 /* Allocate memory for, and initialize, the state that needs to be
363    kept from decoding one frame to the next for a single
364    LPC-10-compressed audio stream.  Return 0 if malloc fails,
365    otherwise return pointer to new structure. */
366
367 struct lpc10_decoder_state *
368 create_lpc10_decoder_state()
369 {
370     struct lpc10_decoder_state *st;
371
372     st = (struct lpc10_decoder_state *)
373         malloc((unsigned) sizeof (struct lpc10_decoder_state));
374     if (st != 0) {
375         init_lpc10_decoder_state(st);
376     }
377     return (st);
378 }
379
380
381
382 void init_lpc10_decoder_state(struct lpc10_decoder_state *st)
383 {
384     int i;
385
386     lpcini_();
387
388     /* State used by function decode */
389     st->iptold = 60;
390     st->first = TRUE_;
391     st->ivp2h = 0;
392     st->iovoic = 0;
393     st->iavgp = 60;
394     st->erate = 0;
395     for (i = 0; i < 30; i++) {
396         st->drc[i] = 0;
397     }
398     for (i = 0; i < 3; i++) {
399         st->dpit[i] = 0;
400         st->drms[i] = 0;
401     }
402
403     /* State used by function synths */
404     for (i = 0; i < 360; i++) {
405         st->buf[i] = 0.0f;
406     }
407     st->buflen = 180;
408
409     /* State used by function pitsyn */
410     /* ivoico; */  /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
411     /* ipito;  */  /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
412     st->rmso = 1.0f;
413     /* rco[10]; */  /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
414     /* integer jsamp; */   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
415     st->first_pitsyn = TRUE_;
416
417     /* State used by function bsynz */
418     st->ipo = 0;
419     for (i = 0; i < 166; i++) {
420         st->exc[i] = 0.0f;
421         st->exc2[i] = 0.0f;
422     }
423     st->lpi1 = 0.0f;
424     st->lpi2 = 0.0f;
425     st->lpi3 = 0.0f;
426     st->hpi1 = 0.0f;
427     st->hpi2 = 0.0f;
428     st->hpi3 = 0.0f;
429     st->rmso_bsynz = 0.0f;
430
431     /* State used by function random */
432     st->j = 2;
433     st->k = 5;
434     st->y[0] = (shortint) -21161;
435     st->y[1] = (shortint) -8478;
436     st->y[2] = (shortint) 30892;
437     st->y[3] = (shortint) -10216;
438     st->y[4] = (shortint) 16950;
439
440     /* State used by function deemp */
441     st->dei1 = 0.0f;
442     st->dei2 = 0.0f;
443     st->deo1 = 0.0f;
444     st->deo2 = 0.0f;
445     st->deo3 = 0.0f;
446 }