bsc und p_k_fehler
This commit is contained in:
95
P2/main.py
95
P2/main.py
@@ -1,32 +1,34 @@
|
|||||||
|
import random
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
|
||||||
# Linear Feedback Shift Register
|
# Linear Feedback Shift Register
|
||||||
class LFSR:
|
class LFSR:
|
||||||
def __init__(self, poly):
|
def __init__(self, poly):
|
||||||
self.g = [] # mapping von g g[x] == g_x
|
# LSB -> MSB
|
||||||
self.reg = [] # Register mit dem Zustand
|
self.g = []
|
||||||
|
self.reg = []
|
||||||
|
|
||||||
for ziffer in poly:
|
'''
|
||||||
|
poly = str(n, n-1, ..., 0) => g = [0, ..., n-1]
|
||||||
|
0, 1, ..., -1
|
||||||
|
|
||||||
|
[-1:0:-1] = von(inkl.):bis(exkl.):Schritt => [Ende:Anfang[
|
||||||
|
'''
|
||||||
|
for ziffer in poly[-1:0:-1]:
|
||||||
self.reg.append(0)
|
self.reg.append(0)
|
||||||
self.g.append(int(ziffer))
|
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):
|
def get_reg_as_string(self):
|
||||||
reg_string = ""
|
reg_string = ""
|
||||||
|
|
||||||
for i in self.reg:
|
for i in self.reg:
|
||||||
reg_string = reg_string + str(i)
|
reg_string += str(i) # LSB -> MSB
|
||||||
|
|
||||||
return reg_string
|
return reg_string
|
||||||
|
|
||||||
def shift(self, s_i):
|
def shift(self, s_i):
|
||||||
reg_old = self.reg.copy() # alter Zustand, um überschreibungen zu vermeiden
|
reg_old = self.reg.copy() # alter Zustand, um überschreibungen zu vermeiden
|
||||||
|
|
||||||
feedback = reg_old[-1] ^ int(s_i)
|
feedback = reg_old[-1] ^ int(s_i)
|
||||||
|
|
||||||
@@ -40,26 +42,73 @@ class LFSR:
|
|||||||
self.reg[i] = reg_old[i - 1]
|
self.reg[i] = reg_old[i - 1]
|
||||||
|
|
||||||
|
|
||||||
def CRC_Parity(daten, g):
|
def CRC_Parity(s, g):
|
||||||
schiebe_reg = LFSR(g)
|
schiebe_reg = LFSR(g)
|
||||||
|
|
||||||
for s in daten:
|
# LSB -> MSB => MSB -> LSB
|
||||||
schiebe_reg.shift(s)
|
for s_i in s[::-1]:
|
||||||
|
schiebe_reg.shift(s_i)
|
||||||
|
|
||||||
return schiebe_reg.get_reg_as_string()
|
return schiebe_reg.get_reg_as_string()
|
||||||
|
|
||||||
|
|
||||||
def channel_bsc(p, n):
|
def channel_bsc(p, n):
|
||||||
F = 0b0
|
f = ""
|
||||||
'''
|
|
||||||
berechne Fehlersequenz F
|
for i in range(n):
|
||||||
Achte auf Bedingung
|
p_i = random.random()
|
||||||
'''
|
# p_i <= p ? F += "1" : F += "0"
|
||||||
return F
|
f += "1" if p_i <= p else "0"
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
|
||||||
def p_k_Fehler(p):
|
def p_k_Fehler(p):
|
||||||
|
# P_k = (nCk) * p^k * (1-p)^(n-k)
|
||||||
n = 1000
|
n = 1000
|
||||||
|
p_k = []
|
||||||
|
k_values = list(range(1, n + 1))
|
||||||
|
|
||||||
|
for k in k_values:
|
||||||
|
nCk = 1
|
||||||
|
for i in range(1, k + 1, 1):
|
||||||
|
nCk = nCk * ((n + 1 - i) / i)
|
||||||
|
|
||||||
|
# p_k = (nCk) * p^k * (1-p)^(n-k)
|
||||||
|
p_k.append(nCk * pow(p, k) * pow((1 - p), (n - k)))
|
||||||
|
|
||||||
|
plt.figure(figsize=(12, 8))
|
||||||
|
plt.plot(k_values, p_k) # plot(x,y)
|
||||||
|
|
||||||
|
# Achsenbeschriftung
|
||||||
|
plt.xlabel('k (Anzahl Fehler)', fontsize=12)
|
||||||
|
plt.ylabel('p_k', fontsize=12)
|
||||||
|
plt.title(f'Fehlerwahrscheinlichkeiten BSC Kanal (p={p}, n={n})', fontsize=14)
|
||||||
|
|
||||||
|
# Grid
|
||||||
|
plt.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
# Zeige Plot
|
||||||
|
plt.tight_layout() # Besseres Layout
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
p = 0.1
|
||||||
|
|
||||||
|
# LSB -> MSB
|
||||||
|
s = "110011101100101"
|
||||||
|
|
||||||
|
# MSB -> LSB
|
||||||
|
g = "100101"
|
||||||
|
|
||||||
|
prf = CRC_Parity(s, g)
|
||||||
|
print(prf)
|
||||||
|
|
||||||
|
print(channel_bsc(p, 15))
|
||||||
|
|
||||||
|
p_k_Fehler(p)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user