Files
InfTh/P2/main.py
2025-06-08 03:47:04 +02:00

115 lines
2.4 KiB
Python

import random
import matplotlib.pyplot as plt
# Linear Feedback Shift Register
class LFSR:
def __init__(self, poly):
# LSB -> MSB
self.g = []
self.reg = []
'''
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.g.append(int(ziffer))
def get_reg_as_string(self):
reg_string = ""
for i in self.reg:
reg_string += str(i) # LSB -> MSB
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(s, g):
schiebe_reg = LFSR(g)
# LSB -> MSB => MSB -> LSB
for s_i in s[::-1]:
schiebe_reg.shift(s_i)
return schiebe_reg.get_reg_as_string()
def channel_bsc(p, n):
f = ""
for i in range(n):
p_i = random.random()
# p_i <= p ? F += "1" : F += "0"
f += "1" if p_i <= p else "0"
return f
def p_k_Fehler(p):
# P_k = (nCk) * p^k * (1-p)^(n-k)
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():
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()