aboutsummaryrefslogtreecommitdiffstats
path: root/edi/reedsolo.py
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2014-10-17 19:39:09 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2014-10-17 19:39:09 +0200
commitc0e21b06f657135f3ffe1d647130419a70e530db (patch)
tree549d1b7cea143c56843a6a91f53068626e9906a0 /edi/reedsolo.py
parent89351fa705159a0f0ec366d5f70b1c87a70837aa (diff)
downloadmmbtools-aux-c0e21b06f657135f3ffe1d647130419a70e530db.tar.gz
mmbtools-aux-c0e21b06f657135f3ffe1d647130419a70e530db.tar.bz2
mmbtools-aux-c0e21b06f657135f3ffe1d647130419a70e530db.zip
Fix EDI analysis RS check
Diffstat (limited to 'edi/reedsolo.py')
-rw-r--r--edi/reedsolo.py16
1 files changed, 9 insertions, 7 deletions
diff --git a/edi/reedsolo.py b/edi/reedsolo.py
index c310d22..1ba0243 100644
--- a/edi/reedsolo.py
+++ b/edi/reedsolo.py
@@ -65,7 +65,8 @@ class ReedSolomonError(Exception):
pass
-gf_exp = [1] * 512
+gf_exp = [0] * 512
+gf_exp[0] = 1
gf_log = [0] * 256
x = 1
for i in range(1, 255):
@@ -113,16 +114,16 @@ def gf_poly_eval(p, x):
y = gf_mul(y, x) ^ p[i]
return y
-def rs_generator_poly(nsym):
+def rs_generator_poly(nsym, fcr=0):
g = [1]
- for i in range(0, nsym):
+ for i in range(fcr, nsym+fcr):
g = gf_poly_mul(g, [1, gf_exp[i]])
return g
-def rs_encode_msg(msg_in, nsym):
+def rs_encode_msg(msg_in, nsym, fcr=0):
if len(msg_in) + nsym > 255:
raise ValueError("message too long")
- gen = rs_generator_poly(nsym)
+ gen = rs_generator_poly(nsym, fcr)
msg_out = bytearray(len(msg_in) + nsym)
msg_out[:len(msg_in)] = msg_in
for i in range(0, len(msg_in)):
@@ -229,8 +230,9 @@ class RSCodec(object):
The ``nsym`` argument is the length of the correction code, and it determines the number of
error bytes (if I understand this correctly, half of ``nsym`` is correctable)
"""
- def __init__(self, nsym=10):
+ def __init__(self, nsym=10, fcr=0):
self.nsym = nsym
+ self.fcr = fcr
def encode(self, data):
if isinstance(data, str):
@@ -239,7 +241,7 @@ class RSCodec(object):
enc = bytearray()
for i in range(0, len(data), chunk_size):
chunk = data[i:i+chunk_size]
- enc.extend(rs_encode_msg(chunk, self.nsym))
+ enc.extend(rs_encode_msg(chunk, self.nsym, self.fcr))
return enc
def decode(self, data):