1
|
|
2
|
# Helper for poly
|
3
|
poly = lambda *args: sum([(1<<x) for x in args])
|
4
|
|
5
|
|
6
|
# ----------------------------------------------------------------------------
|
7
|
# xCCH (SACCH/FACCH/SDCCH)
|
8
|
# ----------------------------------------------------------------------------
|
9
|
|
10
|
# Fire code
|
11
|
# g(D) = (D23 + 1)*(D17 + D3 + 1)
|
12
|
# = D40 + D26 + D23 + D17 + D3 + D1
|
13
|
# Remainder: 0
|
14
|
#crc_cch = Crc(
|
15
|
#
|
16
|
#)
|
17
|
|
18
|
# Convolutional Code
|
19
|
# 224 bits + 4 flush(0) bits, rate 1/2, k=5
|
20
|
#
|
21
|
# G0 = 1 + D3 + D4
|
22
|
# G1 = 1 + D + D3 + D4
|
23
|
conv_xcch = ConvolutionalCode(
|
24
|
224, 4, 5,
|
25
|
[
|
26
|
( poly(0,3,4), 1 ),
|
27
|
( poly(0,1,3,4), 1 ),
|
28
|
],
|
29
|
)
|
30
|
|
31
|
|
32
|
# ----------------------------------------------------------------------------
|
33
|
# TCH/AFS
|
34
|
# ----------------------------------------------------------------------------
|
35
|
|
36
|
# 12.2 kbits
|
37
|
# ----------
|
38
|
|
39
|
conv_tch_afs_12_2 = ConvolutionalCode(
|
40
|
250, 5,
|
41
|
[
|
42
|
( 1, 1 ),
|
43
|
( poly(0,1,3,4), poly(0,3,4) ),
|
44
|
],
|
45
|
name = 'tch_afs_12_2',
|
46
|
description = """250 bits block, rate 1/2, punctured
|
47
|
|
48
|
G0/G0 = 1
|
49
|
G1/G0 = 1 + D + D3 + D4 / 1 + D3 + D4
|
50
|
"""
|
51
|
)
|
52
|
|
53
|
[
|
54
|
321, 325, 329, 333, 337, 341, 345, 349, 353, 357, 361, 363,
|
55
|
365, 369, 373, 377, 379, 381, 385, 389, 393, 395, 397, 401,
|
56
|
405, 409, 411, 413, 417, 421, 425, 427, 429, 433, 437, 441,
|
57
|
443, 445, 449, 453, 457, 459, 461, 465, 469, 473, 475, 477,
|
58
|
481, 485, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507,
|
59
|
]
|
60
|
|
61
|
|
62
|
# 10.2 kbits
|
63
|
# ----------
|
64
|
|
65
|
# G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
|
66
|
# G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
|
67
|
# G3/G3 = 1
|
68
|
|
69
|
conv_tch_afs_10_2 = ConvolutionalCode(
|
70
|
210, 4, 5,
|
71
|
[
|
72
|
( poly(0,1,3,4), poly(0,1,2,3,4) ),
|
73
|
( poly(0,2,4), poly(0,1,2,3,4) ),
|
74
|
( 1, 1 ),
|
75
|
],
|
76
|
)
|
77
|
|
78
|
[
|
79
|
1, 4, 7, 10, 16, 19, 22, 28, 31, 34, 40, 43,
|
80
|
46, 52, 55, 58, 64, 67, 70, 76, 79, 82, 88, 91,
|
81
|
94, 100, 103, 106, 112, 115, 118, 124, 127, 130, 136, 139,
|
82
|
142, 148, 151, 154, 160, 163, 166, 172, 175, 178, 184, 187,
|
83
|
190, 196, 199, 202, 208, 211, 214, 220, 223, 226, 232, 235,
|
84
|
238, 244, 247, 250, 256, 259, 262, 268, 271, 274, 280, 283,
|
85
|
286, 292, 295, 298, 304, 307, 310, 316, 319, 322, 325, 328,
|
86
|
331, 334, 337, 340, 343, 346, 349, 352, 355, 358, 361, 364,
|
87
|
367, 370, 373, 376, 379, 382, 385, 388, 391, 394, 397, 400,
|
88
|
403, 406, 409, 412, 415, 418, 421, 424, 427, 430, 433, 436,
|
89
|
439, 442, 445, 448, 451, 454, 457, 460, 463, 466, 469, 472,
|
90
|
475, 478, 481, 484, 487, 490, 493, 496, 499, 502, 505, 508,
|
91
|
511, 514, 517, 520, 523, 526, 529, 532, 535, 538, 541, 544,
|
92
|
547, 550, 553, 556, 559, 562, 565, 568, 571, 574, 577, 580,
|
93
|
583, 586, 589, 592, 595, 598, 601, 604, 607, 609, 610, 613,
|
94
|
616, 619, 621, 622, 625, 627, 628, 631, 633, 634, 636, 637,
|
95
|
639, 640,
|
96
|
]
|
97
|
|
98
|
|
99
|
# 7.95 kbits
|
100
|
# ----------
|
101
|
|
102
|
# G4/G4 = 1
|
103
|
# G5/G4 = 1 + D + D4 + D6 / 1 + D2 + D3 + D5 + D6
|
104
|
# G6/G4 = 1 + D + D2 + D3 + D4 + D6 / 1 + D2 + D3 + D5 + D6
|
105
|
|
106
|
conv_tch_afs_7_95 = ConvolutionalCode(
|
107
|
165, 6, 7,
|
108
|
[
|
109
|
( 1, 1 ),
|
110
|
( poly(0,1,4,6), poly(0,2,3,5,6) ),
|
111
|
( poly(0,1,2,3,4,6), poly(0,2,3,5,6) ),
|
112
|
],
|
113
|
)
|
114
|
|
115
|
[
|
116
|
1, 2, 4, 5, 8, 22, 70, 118, 166, 214, 262, 310,
|
117
|
317, 319, 325, 332, 334, 341, 343, 349, 356, 358, 365, 367,
|
118
|
373, 380, 382, 385, 389, 391, 397, 404, 406, 409, 413, 415,
|
119
|
421, 428, 430, 433, 437, 439, 445, 452, 454, 457, 461, 463,
|
120
|
469, 476, 478, 481, 485, 487, 490, 493, 500, 502, 503, 505,
|
121
|
506, 508, 509, 511, 512
|
122
|
]
|
123
|
|
124
|
|
125
|
# 7.4 kbits
|
126
|
# ---------
|
127
|
|
128
|
#
|
129
|
# G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
|
130
|
# G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
|
131
|
# G3/G3 = 1
|
132
|
#
|
133
|
|
134
|
conv_tch_afs_7_4 = ConvolutionalCode(
|
135
|
154, 4, 5,
|
136
|
[
|
137
|
( poly(0,1,3,4), poly(0,1,2,3,4) ),
|
138
|
( poly(0,2,4), poly(0,1,2,3,4) ),
|
139
|
( 1, 1 ),
|
140
|
],
|
141
|
)
|
142
|
|
143
|
[
|
144
|
0, 355, 361, 367, 373, 379, 385, 391, 397, 403, 409, 415,
|
145
|
421, 427, 433, 439, 445, 451, 457, 460, 463, 466, 468, 469,
|
146
|
471, 472,
|
147
|
]
|
148
|
|
149
|
# 6.7 kbits
|
150
|
# ---------
|
151
|
|
152
|
# G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
|
153
|
# G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
|
154
|
# G3/G3 = 1
|
155
|
# G3/G3 = 1
|
156
|
|
157
|
conv_tch_afs_6_7 = ConvolutionalCode(
|
158
|
140, 4, 5,
|
159
|
[
|
160
|
( poly(0,1,3,4), poly(0,1,2,3,4) ),
|
161
|
( poly(0,2,4), poly(0,1,2,3,4) ),
|
162
|
( 1, 1 ),
|
163
|
( 1, 1 ),
|
164
|
],
|
165
|
)
|
166
|
|
167
|
[
|
168
|
1, 3, 7, 11, 15, 27, 39, 55, 67, 79, 95, 107,
|
169
|
119, 135, 147, 159, 175, 187, 199, 215, 227, 239, 255, 267,
|
170
|
279, 287, 291, 295, 299, 303, 307, 311, 315, 319, 323, 327,
|
171
|
331, 335, 339, 343, 347, 351, 355, 359, 363, 367, 369, 371,
|
172
|
375, 377, 379, 383, 385, 387, 391, 393, 395, 399, 401, 403,
|
173
|
407, 409, 411, 415, 417, 419, 423, 425, 427, 431, 433, 435,
|
174
|
439, 441, 443, 447, 449, 451, 455, 457, 459, 463, 465, 467,
|
175
|
471, 473, 475, 479, 481, 483, 487, 489, 491, 495, 497, 499,
|
176
|
503, 505, 507, 511, 513, 515, 519, 521, 523, 527, 529, 531,
|
177
|
535, 537, 539, 543, 545, 547, 549, 551, 553, 555, 557, 559,
|
178
|
561, 563, 565, 567, 569, 571, 573, 575
|
179
|
]
|
180
|
|
181
|
|
182
|
# 5.9 kbits
|
183
|
# ---------
|
184
|
|
185
|
# 124 bits + 6 flush(0) bits, rate 1/4, k=7
|
186
|
#
|
187
|
# G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
|
188
|
# G5/G6 = 1 + D + D4 + D6 / 1 + D + D2 + D3 + D4 + D6
|
189
|
# G6/G6 = 1
|
190
|
# G6/G6 = 1
|
191
|
|
192
|
conv_tch_afs_5_9 = ConvolutionalCode(
|
193
|
124, 6, 7,
|
194
|
[
|
195
|
( poly(0,2,3,5,6), poly(0,1,2,3,4,6) ),
|
196
|
( poly(0,1,4,6), poly(0,1,2,3,4,6) ),
|
197
|
( 1, 1 ),
|
198
|
( 1, 1 ),
|
199
|
],
|
200
|
)
|
201
|
|
202
|
[
|
203
|
0, 1, 3, 5, 7, 11, 15, 31, 47, 63, 79, 95,
|
204
|
111, 127, 143, 159, 175, 191, 207, 223, 239, 255, 271, 287,
|
205
|
303, 319, 327, 331, 335, 343, 347, 351, 359, 363, 367, 375,
|
206
|
379, 383, 391, 395, 399, 407, 411, 415, 423, 427, 431, 439,
|
207
|
443, 447, 455, 459, 463, 467, 471, 475, 479, 483, 487, 491,
|
208
|
495, 499, 503, 507, 509, 511, 512, 513, 515, 516, 517, 519,
|
209
|
]
|
210
|
|
211
|
# 5.15 kbits
|
212
|
# ----------
|
213
|
|
214
|
# G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
|
215
|
# G1/G3 = 1 + D + D3 + D4 / 1 + D + D2 + D3 + D4
|
216
|
# G2/G3 = 1 + D2 + D4 / 1 + D + D2 + D3 + D4
|
217
|
# G3/G3 = 1
|
218
|
# G3/G3 = 1
|
219
|
|
220
|
conv_tch_afs_5_15 = ConvolutionalCode(
|
221
|
109, 4, 5,
|
222
|
[
|
223
|
( poly(0,1,3,4), poly(0,1,2,3,4) ),
|
224
|
( poly(0,1,3,4), poly(0,1,2,3,4) ),
|
225
|
( poly(0,2,4), poly(0,1,2,3,4) ),
|
226
|
( 1, 1 ),
|
227
|
( 1, 1 ),
|
228
|
],
|
229
|
)
|
230
|
|
231
|
[
|
232
|
0, 4, 5, 9, 10, 14, 15, 20, 25, 30, 35, 40,
|
233
|
50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160,
|
234
|
170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280,
|
235
|
290, 300, 310, 315, 320, 325, 330, 334, 335, 340, 344, 345,
|
236
|
350, 354, 355, 360, 364, 365, 370, 374, 375, 380, 384, 385,
|
237
|
390, 394, 395, 400, 404, 405, 410, 414, 415, 420, 424, 425,
|
238
|
430, 434, 435, 440, 444, 445, 450, 454, 455, 460, 464, 465,
|
239
|
470, 474, 475, 480, 484, 485, 490, 494, 495, 500, 504, 505,
|
240
|
510, 514, 515, 520, 524, 525, 529, 530, 534, 535, 539, 540,
|
241
|
544, 545, 549, 550, 554, 555, 559, 560, 564,
|
242
|
]
|
243
|
|
244
|
|
245
|
# 4.75 kbits
|
246
|
# ----------
|
247
|
|
248
|
# G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
|
249
|
# G4/G6 = 1 + D2 + D3 + D5 + D6 / 1 + D + D2 + D3 + D4 + D6
|
250
|
# G5/G6 = 1 + D + D4 + D6 / 1 + D + D2 + D3 + D4 + D6
|
251
|
# G6/G6 = 1
|
252
|
# G6/G6 = 1
|
253
|
|
254
|
conv_tch_afs_4_75 = ConvolutionalCode(
|
255
|
101, 6, 7,
|
256
|
[
|
257
|
( poly(0,2,3,5,6), poly(0,1,2,3,4,6) ),
|
258
|
( poly(0,2,3,5,6), poly(0,1,2,3,4,6) ),
|
259
|
( poly(0,1,4,6), poly(0,1,2,3,4,6) ),
|
260
|
( 1, 1 ),
|
261
|
( 1, 1 ),
|
262
|
],
|
263
|
)
|
264
|
|
265
|
[
|
266
|
0, 1, 2, 4, 5, 7, 9, 15, 25, 35, 45, 55,
|
267
|
65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175,
|
268
|
185, 195, 205, 215, 225, 235, 245, 255, 265, 275, 285, 295,
|
269
|
305, 315, 325, 335, 345, 355, 365, 375, 385, 395, 400, 405,
|
270
|
410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 459, 460,
|
271
|
465, 470, 475, 479, 480, 485, 490, 495, 499, 500, 505, 509,
|
272
|
510, 515, 517, 519, 520, 522, 524, 525, 526, 527, 529, 530,
|
273
|
531, 532, 534,
|
274
|
]
|
275
|
|
276
|
|
277
|
# ----------------------------------------------------------------------------
|
278
|
# TCH/AHS
|
279
|
# ----------------------------------------------------------------------------
|
280
|
|
281
|
|
282
|
# ----------------------------------------------------------------------------
|
283
|
# TCH/EFS
|
284
|
# ----------------------------------------------------------------------------
|
285
|
# EFS preprocessing
|
286
|
|
287
|
# Bits used for the CRC
|
288
|
39, 40, 41, 42, 43, 44, 48, 87,
|
289
|
45, 2, 3, 8, 10, 18, 19, 24,
|
290
|
46, 47, 142, 143, 144, 145, 146, 147,
|
291
|
92, 93, 195, 196, 98, 137, 148, 94,
|
292
|
197, 149, 150, 95, 198, 4, 5, 11,
|
293
|
12, 16, 9, 6, 7, 13, 17, 20,
|
294
|
96, 199, 1, 14, 15, 21, 25, 26,
|
295
|
28, 151, 201, 190, 240, 88, 138, 191,
|
296
|
241,
|
297
|
|
298
|
# CRC:
|
299
|
# Divider: g(D) = D8 + D4 + D3 + D2 + 1
|
300
|
# Remainder: 0
|
301
|
|
302
|
|
303
|
# ----------------------------------------------------------------------------
|
304
|
# TCH/FS
|
305
|
# ----------------------------------------------------------------------------
|
306
|
|
307
|
# CRC: (GSM 05.03 3.1.1)
|
308
|
# Divider: g(D) = D3 + D + 1
|
309
|
# Remainder: 1 + D + D2
|
310
|
|
311
|
# Convolutional Code: (GSM 05.03 3.1.2)
|
312
|
# 185 bits + 4 flush(0) bits, rate 1/2, k=5
|
313
|
#
|
314
|
# G0 = 1 + D3 + D4
|
315
|
# G1 = 1 + D + D3 + D4
|
316
|
#
|
317
|
|
318
|
|
319
|
# ----------------------------------------------------------------------------
|
320
|
# TCH/HS
|
321
|
# ----------------------------------------------------------------------------
|
322
|
|
323
|
# CRC: (GSM 05.03 3.2.1) (same as TCH/FS -> TCH/xS)
|
324
|
# Divider: g(D) = D3 + D + 1
|
325
|
# Remainder: 1 + D + D2
|
326
|
|
327
|
# Convolutional Code: (GSM 05.03 3.2.2)
|
328
|
# 98 bits + 6 flush(0) bits, rate 1/3, k=7, punctured
|
329
|
#
|
330
|
# G4 = 1 + D2 + D3 + D5 + D6
|
331
|
# G5 = 1 + D + D4 + D6
|
332
|
# G6 = 1 + D + D2 + D3 + D4 + D6
|
333
|
#
|
334
|
# + puncturing see GSM 05.03 - 3.2.2
|
335
|
#
|
336
|
|
337
|
|
338
|
# ----------------------------------------------------------------------------
|
339
|
# TCH/F CSD
|
340
|
# ----------------------------------------------------------------------------
|
341
|
|
342
|
# TCH/F9.6
|
343
|
# --------
|
344
|
# 9.6 kbits service (12 kbits radio interface)
|
345
|
|
346
|
# Convolutional Code: (GSM 05.03 3.3.3)
|
347
|
# 240 bits + 4 flush(0) bits, rate 1/2, k=5
|
348
|
#
|
349
|
# G0 = 1 + D3 + D4
|
350
|
# G1 = 1 + D + D3 + D4
|
351
|
#
|
352
|
|
353
|
|
354
|
# TCH/F4.8
|
355
|
# --------
|
356
|
# 4.8 kbits service (6 kbits radio interface)
|
357
|
|
358
|
# Convolutional Code: (GSM 05.03 3.4.3)
|
359
|
# 152 bits, rate 1/2, k=5
|
360
|
#
|
361
|
# G1 = 1 + D + D3 + D4
|
362
|
# G2 = 1 + D2 + D4
|
363
|
# G3 = 1 + D + D2 + D3 + D4
|
364
|
#
|
365
|
|
366
|
|
367
|
# TCH/H4.8
|
368
|
# --------
|
369
|
# 4.8 kbits service (6 kbits radio interface)
|
370
|
|
371
|
# Same convolutional code as TCH/F9.6
|
372
|
|
373
|
|
374
|
# TCH/F2.4
|
375
|
# --------
|
376
|
# 2.4 kbits service (3.6 kbits radio interface)
|
377
|
|
378
|
# Same convolutional code as TCH/F4.8
|
379
|
|
380
|
|
381
|
# TCH/F14.4
|
382
|
# ---------
|
383
|
# 14.4 kbits service (14.5 kbits radio interface)
|
384
|
|
385
|
# Convolutional Code: (GSM 05.03 3.8.3)
|
386
|
# 290 bits + 4 flush(0) bits, rate 1/2, k=5, punctured
|
387
|
#
|
388
|
# G0 = 1 + D3 + D4
|
389
|
# G1 = 1 + D + D3 + D4
|
390
|
#
|
391
|
# The code is punctured in such a way that the following 132 coded bits:
|
392
|
# {C(18*j+1), C(18*j+6), C(18*j+11), C(18*j+15) for j = 0,1,...,31}
|
393
|
# and the bits C(577), C(582), C(584) and C(587) are not transmitted.
|
394
|
|
395
|
|
396
|
# ----------------------------------------------------------------------------
|
397
|
# TCH/H CSD
|
398
|
# ----------------------------------------------------------------------------
|
399
|
|
400
|
# ----------------------------------------------------------------------------
|
401
|
# E-TCH/F ECSD
|
402
|
# ----------------------------------------------------------------------------
|
403
|
|