summaryrefslogtreecommitdiff
path: root/gr-fec/python/fec/polar/decoder.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-fec/python/fec/polar/decoder.py')
-rw-r--r--gr-fec/python/fec/polar/decoder.py75
1 files changed, 52 insertions, 23 deletions
diff --git a/gr-fec/python/fec/polar/decoder.py b/gr-fec/python/fec/polar/decoder.py
index ae62943275..8748d284f7 100644
--- a/gr-fec/python/fec/polar/decoder.py
+++ b/gr-fec/python/fec/polar/decoder.py
@@ -202,6 +202,33 @@ class PolarDecoder(PolarCommon):
data = np.packbits(data)
return data
+ def _extract_info_bits_reversed(self, y):
+ info_bit_positions_reversed = self._vector_bit_reversed(self.info_bit_position, self.power)
+ return y[info_bit_positions_reversed]
+
+ def decode_systematic(self, data):
+ if not len(data) == self.N:
+ raise ValueError("len(data)={0} is not equal to n={1}!".format(len(data), self.N))
+ # data = self._reverse_bits(data)
+ data = self._lr_sc_decoder_efficient(data)
+ data = self._encode_natural_order(data)
+ data = self._extract_info_bits_reversed(data)
+ return data
+
+
+def test_systematic_decoder():
+ ntests = 1000
+ n = 16
+ k = 8
+ frozenbitposition = np.array((0, 1, 2, 3, 4, 5, 8, 9), dtype=int)
+ encoder = PolarEncoder(n, k, frozenbitposition)
+ decoder = PolarDecoder(n, k, frozenbitposition)
+ for i in range(ntests):
+ bits = np.random.randint(2, size=k)
+ y = encoder.encode_systematic(bits)
+ u_hat = decoder.decode_systematic(y)
+ assert (bits == u_hat).all()
+
def test_reverse_enc_dec():
n = 16
@@ -240,29 +267,31 @@ def compare_decoder_impls():
def main():
- power = 3
- n = 2 ** power
- k = 4
- frozenbits = np.zeros(n - k, dtype=int)
- frozenbitposition = np.array((0, 1, 2, 4), dtype=int)
- frozenbitposition4 = np.array((0, 1), dtype=int)
-
-
- encoder = PolarEncoder(n, k, frozenbitposition, frozenbits)
- decoder = PolarDecoder(n, k, frozenbitposition, frozenbits)
-
- bits = np.ones(k, dtype=int)
- print "bits: ", bits
- evec = encoder.encode(bits)
- print "froz: ", encoder._insert_frozen_bits(bits)
- print "evec: ", evec
-
- evec[1] = 0
- deced = decoder._lr_sc_decoder(evec)
- print 'SC decoded:', deced
-
- test_reverse_enc_dec()
- compare_decoder_impls()
+ # power = 3
+ # n = 2 ** power
+ # k = 4
+ # frozenbits = np.zeros(n - k, dtype=int)
+ # frozenbitposition = np.array((0, 1, 2, 4), dtype=int)
+ # frozenbitposition4 = np.array((0, 1), dtype=int)
+ #
+ #
+ # encoder = PolarEncoder(n, k, frozenbitposition, frozenbits)
+ # decoder = PolarDecoder(n, k, frozenbitposition, frozenbits)
+ #
+ # bits = np.ones(k, dtype=int)
+ # print "bits: ", bits
+ # evec = encoder.encode(bits)
+ # print "froz: ", encoder._insert_frozen_bits(bits)
+ # print "evec: ", evec
+ #
+ # evec[1] = 0
+ # deced = decoder._lr_sc_decoder(evec)
+ # print 'SC decoded:', deced
+ #
+ # test_reverse_enc_dec()
+ # compare_decoder_impls()
+
+ test_systematic_decoder()
if __name__ == '__main__':