FreeCalypso > hg > freecalypso-tools
comparison tchtools/gsm0610.c @ 902:8ddb16a37273
tree org: move TCH and VM utils from miscutil to tchtools
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 28 Dec 2022 07:52:30 +0000 |
parents | miscutil/gsm0610.c@08804864172a |
children |
comparison
equal
deleted
inserted
replaced
901:2e6764022292 | 902:8ddb16a37273 |
---|---|
1 /* | |
2 * This code (lifted from OsmocomBB) facilitates the conversion of 33-byte | |
3 * GSM 06.10 encoded speech frames between the bit order at the 06.10 interface | |
4 * in the de facto standard libgsm implementation and the bit order at the | |
5 * 05.03 channel encoder interface, as realized in TI's Calypso DSP. | |
6 */ | |
7 | |
8 #include <sys/types.h> | |
9 #include <string.h> | |
10 #include <strings.h> | |
11 | |
12 /* GSM FR - subjective importance bit ordering */ | |
13 /* This array encodes GSM 05.03 Table 2. | |
14 * It's also GSM 06.10 Table A.2.1a | |
15 * | |
16 * It converts between serial parameter output by the encoder and the | |
17 * order needed before channel encoding. | |
18 */ | |
19 const u_short gsm0610_bitorder[260] = { | |
20 0, /* LARc0:5 */ | |
21 47, /* Xmaxc0:5 */ | |
22 103, /* Xmaxc1:5 */ | |
23 159, /* Xmaxc2:5 */ | |
24 215, /* Xmaxc3:5 */ | |
25 1, /* LARc0:4 */ | |
26 6, /* LARc1:5 */ | |
27 12, /* LARc2:4 */ | |
28 2, /* LARc0:3 */ | |
29 7, /* LARc1:4 */ | |
30 13, /* LARc2:3 */ | |
31 17, /* LARc3:4 */ | |
32 36, /* Nc0:6 */ | |
33 92, /* Nc1:6 */ | |
34 148, /* Nc2:6 */ | |
35 204, /* Nc3:6 */ | |
36 48, /* Xmaxc0:4 */ | |
37 104, /* Xmaxc1:4 */ | |
38 160, /* Xmaxc2:4 */ | |
39 216, /* Xmaxc3:4 */ | |
40 8, /* LARc1:3 */ | |
41 22, /* LARc4:3 */ | |
42 26, /* LARc5:3 */ | |
43 37, /* Nc0:5 */ | |
44 93, /* Nc1:5 */ | |
45 149, /* Nc2:5 */ | |
46 205, /* Nc3:5 */ | |
47 38, /* Nc0:4 */ | |
48 94, /* Nc1:4 */ | |
49 150, /* Nc2:4 */ | |
50 206, /* Nc3:4 */ | |
51 39, /* Nc0:3 */ | |
52 95, /* Nc1:3 */ | |
53 151, /* Nc2:3 */ | |
54 207, /* Nc3:3 */ | |
55 40, /* Nc0:2 */ | |
56 96, /* Nc1:2 */ | |
57 152, /* Nc2:2 */ | |
58 208, /* Nc3:2 */ | |
59 49, /* Xmaxc0:3 */ | |
60 105, /* Xmaxc1:3 */ | |
61 161, /* Xmaxc2:3 */ | |
62 217, /* Xmaxc3:3 */ | |
63 3, /* LARc0:2 */ | |
64 18, /* LARc3:3 */ | |
65 30, /* LARc6:2 */ | |
66 41, /* Nc0:1 */ | |
67 97, /* Nc1:1 */ | |
68 153, /* Nc2:1 */ | |
69 209, /* Nc3:1 */ | |
70 23, /* LARc4:2 */ | |
71 27, /* LARc5:2 */ | |
72 43, /* bc0:1 */ | |
73 99, /* bc1:1 */ | |
74 155, /* bc2:1 */ | |
75 211, /* bc3:1 */ | |
76 42, /* Nc0:0 */ | |
77 98, /* Nc1:0 */ | |
78 154, /* Nc2:0 */ | |
79 210, /* Nc3:0 */ | |
80 45, /* Mc0:1 */ | |
81 101, /* Mc1:1 */ | |
82 157, /* Mc2:1 */ | |
83 213, /* Mc3:1 */ | |
84 4, /* LARc0:1 */ | |
85 9, /* LARc1:2 */ | |
86 14, /* LARc2:2 */ | |
87 33, /* LARc7:2 */ | |
88 19, /* LARc3:2 */ | |
89 24, /* LARc4:1 */ | |
90 31, /* LARc6:1 */ | |
91 44, /* bc0:0 */ | |
92 100, /* bc1:0 */ | |
93 156, /* bc2:0 */ | |
94 212, /* bc3:0 */ | |
95 50, /* Xmaxc0:2 */ | |
96 106, /* Xmaxc1:2 */ | |
97 162, /* Xmaxc2:2 */ | |
98 218, /* Xmaxc3:2 */ | |
99 53, /* xmc0_0:2 */ | |
100 56, /* xmc0_1:2 */ | |
101 59, /* xmc0_2:2 */ | |
102 62, /* xmc0_3:2 */ | |
103 65, /* xmc0_4:2 */ | |
104 68, /* xmc0_5:2 */ | |
105 71, /* xmc0_6:2 */ | |
106 74, /* xmc0_7:2 */ | |
107 77, /* xmc0_8:2 */ | |
108 80, /* xmc0_9:2 */ | |
109 83, /* xmc0_10:2 */ | |
110 86, /* xmc0_11:2 */ | |
111 89, /* xmc0_12:2 */ | |
112 109, /* xmc1_0:2 */ | |
113 112, /* xmc1_1:2 */ | |
114 115, /* xmc1_2:2 */ | |
115 118, /* xmc1_3:2 */ | |
116 121, /* xmc1_4:2 */ | |
117 124, /* xmc1_5:2 */ | |
118 127, /* xmc1_6:2 */ | |
119 130, /* xmc1_7:2 */ | |
120 133, /* xmc1_8:2 */ | |
121 136, /* xmc1_9:2 */ | |
122 139, /* xmc1_10:2 */ | |
123 142, /* xmc1_11:2 */ | |
124 145, /* xmc1_12:2 */ | |
125 165, /* xmc2_0:2 */ | |
126 168, /* xmc2_1:2 */ | |
127 171, /* xmc2_2:2 */ | |
128 174, /* xmc2_3:2 */ | |
129 177, /* xmc2_4:2 */ | |
130 180, /* xmc2_5:2 */ | |
131 183, /* xmc2_6:2 */ | |
132 186, /* xmc2_7:2 */ | |
133 189, /* xmc2_8:2 */ | |
134 192, /* xmc2_9:2 */ | |
135 195, /* xmc2_10:2 */ | |
136 198, /* xmc2_11:2 */ | |
137 201, /* xmc2_12:2 */ | |
138 221, /* xmc3_0:2 */ | |
139 224, /* xmc3_1:2 */ | |
140 227, /* xmc3_2:2 */ | |
141 230, /* xmc3_3:2 */ | |
142 233, /* xmc3_4:2 */ | |
143 236, /* xmc3_5:2 */ | |
144 239, /* xmc3_6:2 */ | |
145 242, /* xmc3_7:2 */ | |
146 245, /* xmc3_8:2 */ | |
147 248, /* xmc3_9:2 */ | |
148 251, /* xmc3_10:2 */ | |
149 254, /* xmc3_11:2 */ | |
150 257, /* xmc3_12:2 */ | |
151 46, /* Mc0:0 */ | |
152 102, /* Mc1:0 */ | |
153 158, /* Mc2:0 */ | |
154 214, /* Mc3:0 */ | |
155 51, /* Xmaxc0:1 */ | |
156 107, /* Xmaxc1:1 */ | |
157 163, /* Xmaxc2:1 */ | |
158 219, /* Xmaxc3:1 */ | |
159 54, /* xmc0_0:1 */ | |
160 57, /* xmc0_1:1 */ | |
161 60, /* xmc0_2:1 */ | |
162 63, /* xmc0_3:1 */ | |
163 66, /* xmc0_4:1 */ | |
164 69, /* xmc0_5:1 */ | |
165 72, /* xmc0_6:1 */ | |
166 75, /* xmc0_7:1 */ | |
167 78, /* xmc0_8:1 */ | |
168 81, /* xmc0_9:1 */ | |
169 84, /* xmc0_10:1 */ | |
170 87, /* xmc0_11:1 */ | |
171 90, /* xmc0_12:1 */ | |
172 110, /* xmc1_0:1 */ | |
173 113, /* xmc1_1:1 */ | |
174 116, /* xmc1_2:1 */ | |
175 119, /* xmc1_3:1 */ | |
176 122, /* xmc1_4:1 */ | |
177 125, /* xmc1_5:1 */ | |
178 128, /* xmc1_6:1 */ | |
179 131, /* xmc1_7:1 */ | |
180 134, /* xmc1_8:1 */ | |
181 137, /* xmc1_9:1 */ | |
182 140, /* xmc1_10:1 */ | |
183 143, /* xmc1_11:1 */ | |
184 146, /* xmc1_12:1 */ | |
185 166, /* xmc2_0:1 */ | |
186 169, /* xmc2_1:1 */ | |
187 172, /* xmc2_2:1 */ | |
188 175, /* xmc2_3:1 */ | |
189 178, /* xmc2_4:1 */ | |
190 181, /* xmc2_5:1 */ | |
191 184, /* xmc2_6:1 */ | |
192 187, /* xmc2_7:1 */ | |
193 190, /* xmc2_8:1 */ | |
194 193, /* xmc2_9:1 */ | |
195 196, /* xmc2_10:1 */ | |
196 199, /* xmc2_11:1 */ | |
197 202, /* xmc2_12:1 */ | |
198 222, /* xmc3_0:1 */ | |
199 225, /* xmc3_1:1 */ | |
200 228, /* xmc3_2:1 */ | |
201 231, /* xmc3_3:1 */ | |
202 234, /* xmc3_4:1 */ | |
203 237, /* xmc3_5:1 */ | |
204 240, /* xmc3_6:1 */ | |
205 243, /* xmc3_7:1 */ | |
206 246, /* xmc3_8:1 */ | |
207 249, /* xmc3_9:1 */ | |
208 252, /* xmc3_10:1 */ | |
209 255, /* xmc3_11:1 */ | |
210 258, /* xmc3_12:1 */ | |
211 5, /* LARc0:0 */ | |
212 10, /* LARc1:1 */ | |
213 15, /* LARc2:1 */ | |
214 28, /* LARc5:1 */ | |
215 32, /* LARc6:0 */ | |
216 34, /* LARc7:1 */ | |
217 35, /* LARc7:0 */ | |
218 16, /* LARc2:0 */ | |
219 20, /* LARc3:1 */ | |
220 21, /* LARc3:0 */ | |
221 25, /* LARc4:0 */ | |
222 52, /* Xmaxc0:0 */ | |
223 108, /* Xmaxc1:0 */ | |
224 164, /* Xmaxc2:0 */ | |
225 220, /* Xmaxc3:0 */ | |
226 55, /* xmc0_0:0 */ | |
227 58, /* xmc0_1:0 */ | |
228 61, /* xmc0_2:0 */ | |
229 64, /* xmc0_3:0 */ | |
230 67, /* xmc0_4:0 */ | |
231 70, /* xmc0_5:0 */ | |
232 73, /* xmc0_6:0 */ | |
233 76, /* xmc0_7:0 */ | |
234 79, /* xmc0_8:0 */ | |
235 82, /* xmc0_9:0 */ | |
236 85, /* xmc0_10:0 */ | |
237 88, /* xmc0_11:0 */ | |
238 91, /* xmc0_12:0 */ | |
239 111, /* xmc1_0:0 */ | |
240 114, /* xmc1_1:0 */ | |
241 117, /* xmc1_2:0 */ | |
242 120, /* xmc1_3:0 */ | |
243 123, /* xmc1_4:0 */ | |
244 126, /* xmc1_5:0 */ | |
245 129, /* xmc1_6:0 */ | |
246 132, /* xmc1_7:0 */ | |
247 135, /* xmc1_8:0 */ | |
248 138, /* xmc1_9:0 */ | |
249 141, /* xmc1_10:0 */ | |
250 144, /* xmc1_11:0 */ | |
251 147, /* xmc1_12:0 */ | |
252 167, /* xmc2_0:0 */ | |
253 170, /* xmc2_1:0 */ | |
254 173, /* xmc2_2:0 */ | |
255 176, /* xmc2_3:0 */ | |
256 179, /* xmc2_4:0 */ | |
257 182, /* xmc2_5:0 */ | |
258 185, /* xmc2_6:0 */ | |
259 188, /* xmc2_7:0 */ | |
260 191, /* xmc2_8:0 */ | |
261 194, /* xmc2_9:0 */ | |
262 197, /* xmc2_10:0 */ | |
263 200, /* xmc2_11:0 */ | |
264 203, /* xmc2_12:0 */ | |
265 223, /* xmc3_0:0 */ | |
266 226, /* xmc3_1:0 */ | |
267 229, /* xmc3_2:0 */ | |
268 232, /* xmc3_3:0 */ | |
269 235, /* xmc3_4:0 */ | |
270 238, /* xmc3_5:0 */ | |
271 241, /* xmc3_6:0 */ | |
272 244, /* xmc3_7:0 */ | |
273 247, /* xmc3_8:0 */ | |
274 250, /* xmc3_9:0 */ | |
275 253, /* xmc3_10:0 */ | |
276 256, /* xmc3_11:0 */ | |
277 259, /* xmc3_12:0 */ | |
278 11, /* LARc1:0 */ | |
279 29, /* LARc5:0 */ | |
280 }; | |
281 | |
282 static int | |
283 msb_get_bit(buf, bn) | |
284 u_char *buf; | |
285 { | |
286 int pos_byte = bn >> 3; | |
287 int pos_bit = 7 - (bn & 7); | |
288 | |
289 return (buf[pos_byte] >> pos_bit) & 1; | |
290 } | |
291 | |
292 static void | |
293 msb_set_bit(buf, bn, bit) | |
294 u_char *buf; | |
295 { | |
296 int pos_byte = bn >> 3; | |
297 int pos_bit = 7 - (bn & 7); | |
298 | |
299 buf[pos_byte] |= (bit << pos_bit); | |
300 } | |
301 | |
302 void | |
303 gsm0610_tidsp_to_libgsm(inbytes, outbytes) | |
304 u_char *inbytes, *outbytes; | |
305 { | |
306 int i, di, si; | |
307 | |
308 bzero(outbytes, 33); | |
309 outbytes[0] = 0xD0; | |
310 for (i = 0; i < 260; i++) { | |
311 di = gsm0610_bitorder[i]; | |
312 si = (i > 181) ? i + 4 : i; | |
313 msb_set_bit(outbytes, 4 + di, msb_get_bit(inbytes, si)); | |
314 } | |
315 } | |
316 | |
317 void | |
318 gsm0610_libgsm_to_tidsp(inbytes, outbytes) | |
319 u_char *inbytes, *outbytes; | |
320 { | |
321 int i, di, si; | |
322 | |
323 bzero(outbytes, 33); | |
324 for (i = 0; i < 260; i++) { | |
325 si = gsm0610_bitorder[i]; | |
326 di = (i > 181) ? i + 4 : i; | |
327 msb_set_bit(outbytes, di, msb_get_bit(inbytes, 4 + si)); | |
328 } | |
329 } |