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