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