blob: 22ad6f6996c577ed4d0b17355c15bae6ff0870ec [file] [log] [blame]
Vadim Yanitskiy3262f822016-09-23 01:48:59 +07001/*
2 * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu>
3 * (C) 2016 by Tom Tsou <tom.tsou@ettus.com>
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22#include <stdint.h>
23#include <string.h>
24
25#include <osmocom/core/bits.h>
26#include <osmocom/coding/gsm0503_tables.h>
27#include <osmocom/coding/gsm0503_interleaving.h>
28
29/*
30 * GSM xCCH interleaving and burst mapping
31 *
32 * Interleaving:
33 *
34 * Given 456 coded input bits, form 4 blocks of 114 bits:
35 *
36 * i(B, j) = c(n, k) k = 0, ..., 455
37 * n = 0, ..., N, N + 1, ...
38 * B = B_0 + 4n + (k mod 4)
39 * j = 2(49k mod 57) + ((k mod 8) div 4)
40 *
41 * Mapping on Burst:
42 *
43 * e(B, j) = i(B, j)
44 * e(B, 59 + j) = i(B, 57 + j) j = 0, ..., 56
45 * e(B, 57) = h_l(B)
46 * e(B, 58) = h_n(B)
47 *
48 * Where hl(B) and hn(B) are bits in burst B indicating flags.
49 */
50
51void gsm0503_xcch_deinterleave(sbit_t *cB, const sbit_t *iB)
52{
53 int j, k, B;
54
55 for (k = 0; k < 456; k++) {
56 B = k & 3;
57 j = 2 * ((49 * k) % 57) + ((k & 7) >> 2);
58 cB[k] = iB[B * 114 + j];
59 }
60}
61
62void gsm0503_xcch_interleave(ubit_t *cB, ubit_t *iB)
63{
64 int j, k, B;
65
66 for (k = 0; k < 456; k++) {
67 B = k & 3;
68 j = 2 * ((49 * k) % 57) + ((k & 7) >> 2);
69 iB[B * 114 + j] = cB[k];
70 }
71}
72
73void gsm0503_mcs1_dl_deinterleave(sbit_t *u, sbit_t *hc,
74 sbit_t *dc, const sbit_t *iB)
75{
76 int k;
77 sbit_t c[452];
78 sbit_t cp[456];
79
80 gsm0503_xcch_deinterleave(cp, iB);
81
82 for (k = 0; k < 25; k++)
83 c[k] = cp[k];
84 for (k = 26; k < 82; k++)
85 c[k - 1] = cp[k];
86 for (k = 83; k < 139; k++)
87 c[k - 2] = cp[k];
88 for (k = 140; k < 424; k++)
89 c[k - 3] = cp[k];
90 for (k = 425; k < 456; k++)
91 c[k - 4] = cp[k];
92
93 if (u) {
94 for (k = 0; k < 12; k++)
95 u[k] = c[k];
96 }
97
98 if (hc) {
99 for (k = 12; k < 80; k++)
100 hc[k - 12] = c[k];
101 }
102
103 if (dc) {
104 for (k = 80; k < 452; k++)
105 dc[k - 80] = c[k];
106 }
107}
108
109void gsm0503_mcs1_dl_interleave(const ubit_t *up, const ubit_t *hc,
110 const ubit_t *dc, ubit_t *iB)
111{
112 int k;
113 ubit_t c[452];
114 ubit_t cp[456];
115
116 for (k = 0; k < 12; k++)
117 c[k] = up[k];
118 for (k = 12; k < 80; k++)
119 c[k] = hc[k - 12];
120 for (k = 80; k < 452; k++)
121 c[k] = dc[k - 80];
122
123 for (k = 0; k < 25; k++)
124 cp[k] = c[k];
125 for (k = 26; k < 82; k++)
126 cp[k] = c[k - 1];
127 for (k = 83; k < 139; k++)
128 cp[k] = c[k - 2];
129 for (k = 140; k < 424; k++)
130 cp[k] = c[k - 3];
131 for (k = 425; k < 456; k++)
132 cp[k] = c[k - 4];
133
134 cp[25] = 0;
135 cp[82] = 0;
136 cp[139] = 0;
137 cp[424] = 0;
138
139 gsm0503_xcch_interleave(cp, iB);
140}
141
142void gsm0503_mcs1_ul_deinterleave(sbit_t *hc, sbit_t *dc, const sbit_t *iB)
143{
144 int k;
145 sbit_t c[452];
146 sbit_t cp[456];
147
148 gsm0503_xcch_deinterleave(cp, iB);
149
150 for (k = 0; k < 25; k++)
151 c[k] = cp[k];
152 for (k = 26; k < 82; k++)
153 c[k - 1] = cp[k];
154 for (k = 83; k < 139; k++)
155 c[k - 2] = cp[k];
156 for (k = 140; k < 424; k++)
157 c[k - 3] = cp[k];
158 for (k = 425; k < 456; k++)
159 c[k - 4] = cp[k];
160
161 if (hc) {
162 for (k = 0; k < 80; k++)
163 hc[k] = c[k];
164 }
165
166 if (dc) {
167 for (k = 80; k < 452; k++)
168 dc[k - 80] = c[k];
169 }
170}
171
172void gsm0503_mcs1_ul_interleave(const ubit_t *hc, const ubit_t *dc, ubit_t *iB)
173{
174 int k;
175 ubit_t c[452];
176 ubit_t cp[456];
177
178 for (k = 0; k < 80; k++)
179 c[k] = hc[k];
180 for (k = 80; k < 452; k++)
181 c[k] = dc[k - 80];
182
183 for (k = 0; k < 25; k++)
184 cp[k] = c[k];
185 for (k = 26; k < 82; k++)
186 cp[k] = c[k - 1];
187 for (k = 83; k < 139; k++)
188 cp[k] = c[k - 2];
189 for (k = 140; k < 424; k++)
190 cp[k] = c[k - 3];
191 for (k = 425; k < 456; k++)
192 cp[k] = c[k - 4];
193
194 cp[25] = 0;
195 cp[82] = 0;
196 cp[139] = 0;
197 cp[424] = 0;
198
199 gsm0503_xcch_interleave(cp, iB);
200}
201
202void gsm0503_mcs5_ul_interleave(const ubit_t *hc, const ubit_t *dc,
203 ubit_t *hi, ubit_t *di)
204{
205 int j, k;
206
207 /* Header */
208 for (k = 0; k < 136; k++) {
209 j = 34 * (k % 4) + 2 * (11 * k % 17) + k % 8 / 4;
210 hi[j] = hc[k];
211 }
212
213 /* Data */
214 for (k = 0; k < 1248; k++) {
215 j = gsm0503_interleave_mcs5[k];
216 di[j] = dc[k];
217 }
218}
219
220void gsm0503_mcs5_ul_deinterleave(sbit_t *hc, sbit_t *dc,
221 const sbit_t *hi, const sbit_t *di)
222{
223 int j, k;
224
225 /* Header */
226 if (hc) {
227 for (k = 0; k < 136; k++) {
228 j = 34 * (k % 4) + 2 * (11 * k % 17) + k % 8 / 4;
229 hc[k] = hi[j];
230 }
231 }
232
233 /* Data */
234 if (dc) {
235 for (k = 0; k < 1248; k++) {
236 j = gsm0503_interleave_mcs5[k];
237 dc[k] = di[j];
238 }
239 }
240}
241
242void gsm0503_mcs5_dl_interleave(const ubit_t *hc, const ubit_t *dc,
243 ubit_t *hi, ubit_t *di)
244{
245 int j, k;
246
247 /* Header */
248 for (k = 0; k < 100; k++) {
249 j = 25 * (k % 4) + ((17 * k) % 25);
250 hi[j] = hc[k];
251 }
252
253 /* Data */
254 for (k = 0; k < 1248; k++) {
255 j = gsm0503_interleave_mcs5[k];
256 di[j] = dc[k];
257 }
258}
259
260void gsm0503_mcs5_dl_deinterleave(sbit_t *hc, sbit_t *dc,
261 const sbit_t *hi, const sbit_t *di)
262{
263 int j, k;
264
265 /* Header */
266 if (hc) {
267 for (k = 0; k < 100; k++) {
268 j = 25 * (k % 4) + ((17 * k) % 25);
269 hc[k] = hi[j];
270 }
271 }
272
273 /* Data */
274 if (dc) {
275 for (k = 0; k < 1248; k++) {
276 j = gsm0503_interleave_mcs5[k];
277 dc[k] = di[j];
278 }
279 }
280}
281
282void gsm0503_mcs7_dl_interleave(const ubit_t *hc, const ubit_t *c1,
283 const ubit_t *c2, ubit_t *hi, ubit_t *di)
284{
285 int j, k;
286 ubit_t dc[1224];
287
288 /* Header */
289 for (k = 0; k < 124; k++) {
290 j = 31 * (k % 4) + ((17 * k) % 31);
291 hi[j] = hc[k];
292 }
293
294 memcpy(&dc[0], c1, 612);
295 memcpy(&dc[612], c2, 612);
296
297 /* Data */
298 for (k = 0; k < 1224; k++) {
299 j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
300 (k + 2 - k / 408) % 3;
301 di[j] = dc[k];
302 }
303}
304
305
306void gsm0503_mcs7_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
307 const sbit_t *hi, const sbit_t *di)
308{
309 int j, k;
310 ubit_t dc[1224];
311
312 /* Header */
313 if (hc) {
314 for (k = 0; k < 124; k++) {
315 j = 31 * (k % 4) + ((17 * k) % 31);
316 hc[k] = hi[j];
317 }
318 }
319
320 /* Data */
321 if (c1 && c2) {
322 for (k = 0; k < 1224; k++) {
323 j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
324 (k + 2 - k / 408) % 3;
325 dc[k] = di[j];
326 }
327
328 memcpy(c1, &dc[0], 612);
329 memcpy(c2, &dc[612], 612);
330 }
331}
332
333void gsm0503_mcs7_ul_interleave(const ubit_t *hc, const ubit_t *c1,
334 const ubit_t *c2, ubit_t *hi, ubit_t *di)
335{
336 int j, k;
337 ubit_t dc[1224];
338
339 /* Header */
340 for (k = 0; k < 160; k++) {
341 j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
342 hi[j] = hc[k];
343 }
344
345 memcpy(&dc[0], c1, 612);
346 memcpy(&dc[612], c2, 612);
347
348 /* Data */
349 for (k = 0; k < 1224; k++) {
350 j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
351 (k + 2 - k / 408) % 3;
352 di[j] = dc[k];
353 }
354}
355
356void gsm0503_mcs7_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
357 const sbit_t *hi, const sbit_t *di)
358{
359 int j, k;
360 ubit_t dc[1224];
361
362 /* Header */
363 if (hc) {
364 for (k = 0; k < 160; k++) {
365 j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
366 hc[k] = hi[j];
367 }
368 }
369
370 /* Data */
371 if (c1 && c2) {
372 for (k = 0; k < 1224; k++) {
373 j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
374 (k + 2 - k / 408) % 3;
375 dc[k] = di[j];
376 }
377
378 memcpy(c1, &dc[0], 612);
379 memcpy(c2, &dc[612], 612);
380 }
381}
382
383void gsm0503_mcs8_ul_interleave(const ubit_t *hc, const ubit_t *c1,
384 const ubit_t *c2, ubit_t *hi, ubit_t *di)
385{
386 int j, k;
387 ubit_t dc[1224];
388
389 /* Header */
390 for (k = 0; k < 160; k++) {
391 j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
392 hi[j] = hc[k];
393 }
394
395 memcpy(&dc[0], c1, 612);
396 memcpy(&dc[612], c2, 612);
397
398 /* Data */
399 for (k = 0; k < 1224; k++) {
400 j = 306 * (2 * (k / 612) + (k % 2)) +
401 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
402 di[j] = dc[k];
403 }
404}
405
406void gsm0503_mcs8_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
407 const sbit_t *hi, const sbit_t *di)
408{
409 int j, k;
410 ubit_t dc[1224];
411
412 /* Header */
413 if (hc) {
414 for (k = 0; k < 160; k++) {
415 j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
416 hc[k] = hi[j];
417 }
418 }
419
420 /* Data */
421 if (c1 && c2) {
422 for (k = 0; k < 1224; k++) {
423 j = 306 * (2 * (k / 612) + (k % 2)) +
424 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
425 dc[k] = di[j];
426 }
427
428 memcpy(c1, &dc[0], 612);
429 memcpy(c2, &dc[612], 612);
430 }
431}
432
433void gsm0503_mcs8_dl_interleave(const ubit_t *hc, const ubit_t *c1,
434 const ubit_t *c2, ubit_t *hi, ubit_t *di)
435{
436 int j, k;
437 ubit_t dc[1224];
438
439 /* Header */
440 for (k = 0; k < 124; k++) {
441 j = 31 * (k % 4) + ((17 * k) % 31);
442 hi[j] = hc[k];
443 }
444
445 memcpy(&dc[0], c1, 612);
446 memcpy(&dc[612], c2, 612);
447
448 /* Data */
449 for (k = 0; k < 1224; k++) {
450 j = 306 * (2 * (k / 612) + (k % 2)) +
451 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
452 di[j] = dc[k];
453 }
454}
455
456void gsm0503_mcs8_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
457 const sbit_t *hi, const sbit_t *di)
458{
459 int j, k;
460 ubit_t dc[1224];
461
462 /* Header */
463 if (hc) {
464 for (k = 0; k < 124; k++) {
465 j = 31 * (k % 4) + ((17 * k) % 31);
466 hc[k] = hi[j];
467 }
468 }
469
470 /* Data */
471 if (c1 && c2) {
472 for (k = 0; k < 1224; k++) {
473 j = 306 * (2 * (k / 612) + (k % 2)) +
474 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
475 dc[k] = di[j];
476 }
477
478 memcpy(c1, &dc[0], 612);
479 memcpy(c2, &dc[612], 612);
480 }
481}
482
483/*
484 * GSM TCH FR/EFR/AFS interleaving and burst mapping
485 *
486 * Interleaving:
487 *
488 * Given 456 coded input bits, form 8 blocks of 114 bits,
489 * where even bits of the first 4 blocks and odd bits of the last 4 blocks
490 * are used:
491 *
492 * i(B, j) = c(n, k) k = 0, ..., 455
493 * n = 0, ..., N, N + 1, ...
494 * B = B_0 + 4n + (k mod 8)
495 * j = 2(49k mod 57) + ((k mod 8) div 4)
496 *
497 * Mapping on Burst:
498 *
499 * e(B, j) = i(B, j)
500 * e(B, 59 + j) = i(B, 57 + j) j = 0, ..., 56
501 * e(B, 57) = h_l(B)
502 * e(B, 58) = h_n(B)
503 *
504 * Where hl(B) and hn(B) are bits in burst B indicating flags.
505 */
506
507void gsm0503_tch_fr_deinterleave(sbit_t *cB, sbit_t *iB)
508{
509 int j, k, B;
510
511 for (k = 0; k < 456; k++) {
512 B = k & 7;
513 j = 2 * ((49 * k) % 57) + ((k & 7) >> 2);
514 cB[k] = iB[B * 114 + j];
515 }
516}
517
518void gsm0503_tch_fr_interleave(ubit_t *cB, ubit_t *iB)
519{
520 int j, k, B;
521
522 for (k = 0; k < 456; k++) {
523 B = k & 7;
524 j = 2 * ((49 * k) % 57) + ((k & 7) >> 2);
525 iB[B * 114 + j] = cB[k];
526 }
527}
528
529/*
530 * GSM TCH HR/AHS interleaving and burst mapping
531 *
532 * Interleaving:
533 *
534 * Given 288 coded input bits, form 4 blocks of 114 bits,
535 * where even bits of the first 2 blocks and odd bits of the last 2 blocks
536 * are used:
537 *
538 * i(B, j) = c(n, k) k = 0, ..., 227
539 * n = 0, ..., N, N + 1, ...
540 * B = B_0 + 2n + b
541 * j, b = table[k];
542 *
543 * Mapping on Burst:
544 *
545 * e(B, j) = i(B, j)
546 * e(B, 59 + j) = i(B, 57 + j) j = 0, ..., 56
547 * e(B, 57) = h_l(B)
548 * e(B, 58) = h_n(B)
549 *
550 * Where hl(B) and hn(B) are bits in burst B indicating flags.
551 */
552
553void gsm0503_tch_hr_deinterleave(sbit_t *cB, sbit_t *iB)
554{
555 int j, k, B;
556
557 for (k = 0; k < 228; k++) {
558 B = gsm0503_tch_hr_interleaving[k][1];
559 j = gsm0503_tch_hr_interleaving[k][0];
560 cB[k] = iB[B * 114 + j];
561 }
562}
563
564void gsm0503_tch_hr_interleave(ubit_t *cB, ubit_t *iB)
565{
566 int j, k, B;
567
568 for (k = 0; k < 228; k++) {
569 B = gsm0503_tch_hr_interleaving[k][1];
570 j = gsm0503_tch_hr_interleaving[k][0];
571 iB[B * 114 + j] = cB[k];
572 }
573}