Version 0.1.12 from FTP
[asterisk/asterisk.git] / codecs / lpc10 / chanwr.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:20:24  jaf
11  * Removed all static local variables that were SAVE'd in the Fortran
12  * code, and put them in struct lpc10_encoder_state that is passed as an
13  * argument.
14  *
15  * Revision 1.1  1996/08/19  22:40:31  jaf
16  * Initial revision
17  *
18
19 */
20
21 #ifdef P_R_O_T_O_T_Y_P_E_S
22 extern int chanwr_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits, struct lpc10_encoder_state *st);
23 extern int chanrd_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits);
24 #endif
25
26 /*  -- translated by f2c (version 19951025).
27    You must link the resulting object file with the libraries:
28         -lf2c -lm   (in that order)
29 */
30
31 #include "f2c.h"
32
33 /* *********************************************************************** */
34
35 /*      CHANL Version 49 */
36
37 /* $Log$
38  * Revision 1.11  2000/01/05 08:20:39  markster
39  * Version 0.1.12 from FTP
40  *
41 /* Revision 1.2  2000/01/05 08:20:39  markster
42 /* Some OSS fixes and a few lpc changes to make it actually work
43 /*
44  * Revision 1.2  1996/08/20  20:20:24  jaf
45  * Removed all static local variables that were SAVE'd in the Fortran
46  * code, and put them in struct lpc10_encoder_state that is passed as an
47  * argument.
48  *
49  * Revision 1.1  1996/08/19  22:40:31  jaf
50  * Initial revision
51  * */
52 /* Revision 1.3  1996/03/21  15:14:57  jaf */
53 /* Added comments about which indices of argument arrays are read or */
54 /* written, and about the one bit of local state in CHANWR.  CHANRD */
55 /* has no local state. */
56
57 /* Revision 1.2  1996/03/13  18:55:10  jaf */
58 /* Comments added explaining which of the local variables of this */
59 /* subroutine need to be saved from one invocation to the next, and which */
60 /* do not. */
61
62 /* Revision 1.1  1996/02/07 14:43:31  jaf */
63 /* Initial revision */
64
65
66 /* *********************************************************************** */
67
68 /* CHANWR: */
69 /*   Place quantized parameters into bitstream */
70
71 /* Input: */
72 /*  ORDER  - Number of reflection coefficients (not really variable) */
73 /*  IPITV  - Quantized pitch/voicing parameter */
74 /*  IRMS   - Quantized energy parameter */
75 /*  IRC    - Quantized reflection coefficients */
76 /*           Indices 1 through ORDER read. */
77 /* Output: */
78 /*  IBITS  - Serial bitstream */
79 /*           Indices 1 through 54 written. */
80 /*           Bit 54, the SYNC bit, alternates from one call to the next. */
81
82 /* Subroutine CHANWR maintains one bit of local state from one call to */
83 /* the next, in the variable ISYNC.  I believe that this one bit is only */
84 /* intended to allow a receiver to resynchronize its interpretation of */
85 /* the bit stream, by looking for which of the 54 bits alternates every */
86 /* frame time.  This is just a simple framing mechanism that is not */
87 /* useful when other, higher overhead framing mechanisms are used to */
88 /* transmit the coded frames. */
89
90 /* I'm not going to make an entry to reinitialize this bit, since it */
91 /* doesn't help a receiver much to know whether the first sync bit is a 0 */
92 /* or a 1.  It needs to examine several frames in sequence to have */
93 /* reasonably good assurance that its framing is correct. */
94
95
96 /* CHANRD: */
97 /*   Reconstruct parameters from bitstream */
98
99 /* Input: */
100 /*  ORDER  - Number of reflection coefficients (not really variable) */
101 /*  IBITS  - Serial bitstream */
102 /*           Indices 1 through 53 read (SYNC bit is ignored). */
103 /* Output: */
104 /*  IPITV  - Quantized pitch/voicing parameter */
105 /*  IRMS   - Quantized energy parameter */
106 /*  IRC    - Quantized reflection coefficients */
107 /*           Indices 1 through ORDER written */
108
109 /* Entry CHANRD has no local state. */
110
111
112
113 /*   IBITS is 54 bits of LPC data ordered as follows: */
114 /*      R1-0, R2-0, R3-0,  P-0,  A-0, */
115 /*      R1-1, R2-1, R3-1,  P-1,  A-1, */
116 /*      R1-2, R4-0, R3-2,  A-2,  P-2, R4-1, */
117 /*      R1-3, R2-2, R3-3, R4-2,  A-3, */
118 /*      R1-4, R2-3, R3-4, R4-3,  A-4, */
119 /*       P-3, R2-4, R7-0, R8-0,  P-4, R4-4, */
120 /*      R5-0, R6-0, R7-1,R10-0, R8-1, */
121 /*      R5-1, R6-1, R7-2, R9-0,  P-5, */
122 /*      R5-2, R6-2,R10-1, R8-2,  P-6, R9-1, */
123 /*      R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
124 /* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv, 
125         integer *irms, integer *irc, integer *ibits,
126                                struct lpc10_encoder_state *st)
127 {
128     /* Initialized data */
129
130     integer *isync;
131     static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };
132     static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,
133             13,12,11,10,2,13,12,11,10,2,1,12,7,6,1,10,9,8,7,4,6,9,8,7,5,1,9,8,
134             4,6,1,5,9,8,7,5,6 };
135
136     /* System generated locals */
137     integer i__1;
138
139     /* Local variables */
140     integer itab[13], i__;
141
142 /*       Arguments */
143 /*       Parameters/constants */
144 /*       These arrays are not Fortran PARAMETER's, but they are defined */
145 /*       by DATA statements below, and their contents are never altered. 
146 */
147 /*       Local variables that need not be saved */
148 /*       Local state */
149 /*       ISYNC is only used by CHANWR, not by ENTRY CHANRD. */
150
151     /* Parameter adjustments */
152     --irc;
153     --ibits;
154
155     /* Function Body */
156     switch(n__) {
157         case 1: goto L_chanrd;
158         }
159
160     isync = &(st->isync);
161
162 /* ***********************************************************************
163  */
164 /*      Place quantized parameters into bitstream */
165 /* ***********************************************************************
166  */
167 /*   Place parameters into ITAB */
168     itab[0] = *ipitv;
169     itab[1] = *irms;
170     itab[2] = 0;
171     i__1 = *order;
172     for (i__ = 1; i__ <= i__1; ++i__) {
173         itab[i__ + 2] = irc[*order + 1 - i__] & 32767;
174     }
175 /*   Put 54 bits into IBITS array */
176     for (i__ = 1; i__ <= 53; ++i__) {
177         ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;
178         itab[iblist[i__ - 1] - 1] /= 2;
179     }
180     ibits[54] = *isync & 1;
181     *isync = 1 - *isync;
182     return 0;
183 /* ***********************************************************************
184  */
185 /*      Reconstruct parameters from bitstream */
186 /* ***********************************************************************
187  */
188
189 L_chanrd:
190 /*   Reconstruct ITAB */
191     for (i__ = 1; i__ <= 13; ++i__) {
192         itab[i__ - 1] = 0;
193     }
194     for (i__ = 1; i__ <= 53; ++i__) {
195         itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)
196                  + ibits[54 - i__];
197     }
198 /*   Sign extend RC's */
199     i__1 = *order;
200     for (i__ = 1; i__ <= i__1; ++i__) {
201         if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {
202             itab[i__ + 2] -= bit[i__ - 1] << 1;
203         }
204     }
205 /*   Restore variables */
206     *ipitv = itab[0];
207     *irms = itab[1];
208     i__1 = *order;
209     for (i__ = 1; i__ <= i__1; ++i__) {
210         irc[i__] = itab[*order + 4 - i__ - 1];
211     }
212     return 0;
213 } /* chanwr_ */
214
215 /* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms, 
216         integer *irc, integer *ibits, struct lpc10_encoder_state *st)
217 {
218     return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
219     }
220
221 /* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms, 
222         integer *irc, integer *ibits)
223 {
224     return chanwr_0_(1, order, ipitv, irms, irc, ibits, 0);
225     }