66 lines
1.4 KiB
Python
66 lines
1.4 KiB
Python
# Linear Feedback Shift Register
|
|
class LFSR:
|
|
def __init__(self, poly):
|
|
self.g = [] # mapping von g g[x] == g_x
|
|
self.reg = [] # Register mit dem Zustand
|
|
|
|
for ziffer in poly:
|
|
self.reg.append(0)
|
|
self.g.append(int(ziffer))
|
|
|
|
# poly = str(n, n-1, ..., 0) => g = [0, ..., n-1, n]
|
|
self.g.reverse()
|
|
self.reg.reverse()
|
|
|
|
# Entferne den letzten Eintrag, da dieser den Grad darstellt => Anzahl der Register = len(g) - 1
|
|
self.g.pop()
|
|
self.reg.pop()
|
|
|
|
|
|
def get_reg_as_string(self):
|
|
reg_string = ""
|
|
|
|
for i in self.reg:
|
|
reg_string = reg_string + str(i)
|
|
|
|
return reg_string
|
|
|
|
def shift(self, s_i):
|
|
reg_old = self.reg.copy() # alter Zustand, um überschreibungen zu vermeiden
|
|
|
|
feedback = reg_old[-1] ^ int(s_i)
|
|
|
|
for i, value in enumerate(self.g):
|
|
if i == 0:
|
|
self.reg[i] = feedback
|
|
else:
|
|
if value == 1:
|
|
self.reg[i] = reg_old[i - 1] ^ feedback
|
|
else:
|
|
self.reg[i] = reg_old[i - 1]
|
|
|
|
|
|
def CRC_Parity(daten, g):
|
|
schiebe_reg = LFSR(g)
|
|
|
|
for s in daten:
|
|
schiebe_reg.shift(s)
|
|
|
|
return schiebe_reg.get_reg_as_string()
|
|
|
|
|
|
def channel_bsc(p, n):
|
|
F = 0b0
|
|
'''
|
|
berechne Fehlersequenz F
|
|
Achte auf Bedingung
|
|
'''
|
|
return F
|
|
|
|
|
|
def p_k_Fehler(p):
|
|
n = 1000
|
|
|
|
|
|
def main():
|