-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathInterleaver.py
57 lines (43 loc) · 1.5 KB
/
Interleaver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /usr/bin/env python
# title : Interleaver.py
# description : This class implements an interleaver.
# author : Felix Arnold
# python_version : 3.5.2
import random
import math
class Interleaver(object):
def __init__(self):
self.perm = []
self.perm_inv = []
def get_length(self):
return len(self.perm)
def set_permutation(self, perm):
self.perm = perm
def gen_no_perm(self, l):
self.perm = list(range(l))
self._gen_perm_inv()
def gen_rev_perm(self, l):
self.perm = list(reversed(range(l)))
self._gen_perm_inv()
def gen_rand_perm(self, l):
self.perm = list(range(l))
random.shuffle(self.perm)
self._gen_perm_inv()
def gen_qpp_perm(self, N):
# possible values for N = power of two
self.perm = list(range(N))
k = int((math.log2(N) + 1) / 2)
self.perm = [((2 ** k - 1) * x + 2 ** (k + 1) * x ** 2) % N for x in self.perm]
self._gen_perm_inv()
def gen_qpp_perm_poly(self, N, k1, k2):
self.perm = list(range(N))
self.perm = [(k1 * x + k2 * x ** 2) % N for x in self.perm]
self._gen_perm_inv()
def _gen_perm_inv(self):
self.perm_inv = [0] * len(self.perm)
for i in range(len(self.perm)):
self.perm_inv[self.perm[i]] = i
def interleave(self, data):
return [data[index] for index in self.perm]
def deinterleave(self, data):
return [data[index] for index in self.perm_inv]