ef7d4eeacccd32afd691f03e84500b4cdcee00c5
[asterisk/asterisk.git] / codecs / lpc10 / lpc10.h
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.1  2000/01/05 00:20:06  markster
11 Add broken lpc10 code...  It's not too far from working I don't think...
12
13  * Revision 1.1  1996/08/19  22:47:31  jaf
14  * Initial revision
15  *
16
17 */
18
19 #ifndef __LPC10_H__
20 #define __LPC10_H__
21
22 #define LPC10_SAMPLES_PER_FRAME 180
23 #define LPC10_BITS_IN_COMPRESSED_FRAME 54
24
25
26 /*
27
28   The "#if defined"'s in this file are by no means intended to be
29   complete.  They are what Nautilus uses, which has been successfully
30   compiled under DOS with the Microsoft C compiler, and under a few
31   versions of Unix with the GNU C compiler.
32
33  */
34
35 #if defined(unix)
36 typedef short           INT16;
37 typedef int             INT32;
38 #endif
39
40
41 #if defined(__MSDOS__) || defined(MSDOS)
42 typedef int             INT16;
43 typedef long            INT32;
44 #endif
45
46
47
48 /* The initial values for every member of this structure is 0, except
49    where noted in comments. */
50
51 /* These two lines are copied from f2c.h.  There should be a more
52    elegant way of doing this than having the same declarations in two
53    files. */
54
55 typedef float real;
56 typedef INT32 integer;
57 typedef INT32 logical;
58 typedef INT16 shortint;
59
60 struct lpc10_encoder_state {
61     /* State used only by function hp100 */
62     real z11;
63     real z21;
64     real z12;
65     real z22;
66     
67     /* State used by function analys */
68     real inbuf[540], pebuf[540];
69     real lpbuf[696], ivbuf[312];
70     real bias;
71     integer osbuf[10];  /* no initial value necessary */
72     integer osptr;     /* initial value 1 */
73     integer obound[3];
74     integer vwin[6]     /* was [2][3] */;   /* initial value vwin[4] = 307; vwin[5] = 462; */
75     integer awin[6]     /* was [2][3] */;   /* initial value awin[4] = 307; awin[5] = 462; */
76     integer voibuf[8]   /* was [2][4] */;
77     real rmsbuf[3];
78     real rcbuf[30]      /* was [10][3] */;
79     real zpre;
80
81
82     /* State used by function onset */
83     real n;
84     real d__;   /* initial value 1.f */
85     real fpc;   /* no initial value necessary */
86     real l2buf[16];
87     real l2sum1;
88     integer l2ptr1;   /* initial value 1 */
89     integer l2ptr2;   /* initial value 9 */
90     integer lasti;    /* no initial value necessary */
91     logical hyst;   /* initial value FALSE_ */
92
93     /* State used by function voicin */
94     real dither;   /* initial value 20.f */
95     real snr;
96     real maxmin;
97     real voice[6]       /* was [2][3] */;   /* initial value is probably unnecessary */
98     integer lbve, lbue, fbve, fbue;
99     integer ofbue, sfbue;
100     integer olbue, slbue;
101     /* Initial values:
102         lbve = 3000;
103         fbve = 3000;
104         fbue = 187;
105         ofbue = 187;
106         sfbue = 187;
107         lbue = 93;
108         olbue = 93;
109         slbue = 93;
110         snr = (real) (fbve / fbue << 6);
111         */
112
113     /* State used by function dyptrk */
114     real s[60];
115     integer p[120]      /* was [60][2] */;
116     integer ipoint;
117     real alphax;
118
119     /* State used by function chanwr */
120     integer isync;
121
122 };
123
124
125 struct lpc10_decoder_state {
126
127     /* State used by function decode */
128     integer iptold;   /* initial value 60 */
129     logical first;   /* initial value TRUE_ */
130     integer ivp2h;
131     integer iovoic;
132     integer iavgp;   /* initial value 60 */
133     integer erate;
134     integer drc[30]     /* was [3][10] */;
135     integer dpit[3];
136     integer drms[3];
137
138     /* State used by function synths */
139     real buf[360];
140     integer buflen;   /* initial value 180 */
141
142     /* State used by function pitsyn */
143     integer ivoico;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
144     integer ipito;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
145     real rmso;   /* initial value 1.f */
146     real rco[10];   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
147     integer jsamp;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
148     logical first_pitsyn;   /* initial value TRUE_ */
149
150     /* State used by function bsynz */
151     integer ipo;
152     real exc[166];
153     real exc2[166];
154     real lpi1;
155     real lpi2;
156     real lpi3;
157     real hpi1;
158     real hpi2;
159     real hpi3;
160     real rmso_bsynz;
161
162     /* State used by function random */
163     integer j;   /* initial value 2 */
164     integer k;   /* initial value 5 */
165     shortint y[5];  /* initial value { -21161,-8478,30892,-10216,16950 } */
166
167     /* State used by function deemp */
168     real dei1;
169     real dei2;
170     real deo1;
171     real deo2;
172     real deo3;
173
174 };
175
176
177
178 /*
179
180   Calling sequence:
181
182   Call create_lpc10_encoder_state(), which returns a pointer to an
183   already initialized lpc10_encoder_state structure.
184
185   lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
186   array speech[], and writes indices 0 through
187   (LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
188   and writes the lpc10_encoder_state structure contents.  The
189   lpc10_encoder_state structure should *not* be initialized for every
190   frame of encoded speech.  Once at the beginning of execution, done
191   automatically for you by create_lpc10_encoder_state(), is enough.
192
193   init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
194   structure.  This might be useful if you are finished processing one
195   sound sample, and want to reuse the same lpc10_encoder_state
196   structure to process another sound sample.  There might be other
197   uses as well.
198
199   Note that the comments in the lpc10/lpcenc.c file imply that indices
200   1 through 180 of array speech[] are read.  These comments were
201   written for the Fortran version of the code, before it was
202   automatically converted to C by the conversion program f2c.  f2c
203   seems to use the convention that the pointers to arrays passed as
204   function arguments point to the first index used in the Fortran
205   code, whatever index that might be (usually 1), and then it modifies
206   the pointer inside of the function, like so:
207
208   if (speech) {
209       --speech;
210   }
211
212   So that the code can access the first value at index 1 and the last
213   at index 180.  This makes the translated C code "closer" to the
214   original Fortran code.
215
216   The calling sequence for the decoder is similar to the encoder.  The
217   only significant difference is that the array bits[] is read
218   (indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
219   array speech[] is written (indices 0 through
220   (LPC10_SAMPLES_PER_FRAME-1)).
221   
222   */
223
224 struct lpc10_encoder_state * create_lpc10_encoder_state ();
225 void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
226 int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
227
228 struct lpc10_decoder_state * create_lpc10_decoder_state ();
229 void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
230 int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
231
232 #endif /* __LPC10_H__ */