comparison miscutil/gsm0610.c @ 5:7eaa3307e5df

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