Commit 75e948e1 authored by Fabre Alexis's avatar Fabre Alexis
Browse files

Update Python/Modele_N_recepteurs.py

parent 4b318545
......@@ -5,28 +5,28 @@ import numpy as np
def sgn(s, i):
"""
Retourne 1 si i est dans s, -1 sinon
Return 1 if i is included in s, else -1
"""
return 2 * (i in s) - 1
def generate(g, sigma, P, N):
"""
Générer un signal bruité et atténué
Generate a noise attenuated signal
"""
# Générer aléatoirement les signes
# Randomly generate the signs
S = np.random.choice([0, 1], N)
# Trouver les indices où il y a un signe positif
signes = [i + 1 for i in range(len(S)) if S[i] == 1]
# Find the idexes where are the positive signs
signs = [i + 1 for i in range(len(S)) if S[i] == 1]
# En connaissant les signes, on peut calculer les valeurs des r_k
r = [math.sqrt(P[i] / 2) * sgn(signes, i + 1) for i in range(len(P))]
# Knowing the signs, we can compute the values of the r_k
r = [math.sqrt(P[i] / 2) * sgn(signs, i + 1) for i in range(len(P))]
# On fait la somme des signaux
# We sum the signals
x = sum(r)
# On atténue et on génère on bruit aléatoire
# We attenuate and we generate the random noise
n = np.random.normal(0, sigma)
y = x * g + n
......@@ -35,30 +35,30 @@ def generate(g, sigma, P, N):
def decode(y, g, P, N):
"""
On décode les signaux, où y correspond à la somme de N signaux de puissances P, et où l'atténuation vaut g
We decode the signals, where y corresponds to the sum of N signals of power P of which g is the attenuation
"""
r_decode = []
for i in range(N, 0, -1):
# On interprète le bit à l'indice i
# We interprete the bit at the index i
if y > 0:
r_decode.insert(0, g * math.sqrt(P[i - 1] / 2))
else:
r_decode.insert(0, -g * math.sqrt(P[i - 1] / 2))
# On retranche à y la valeur interprétée
# We subtract from y the interpreted value
y -= r_decode[0]
return r_decode
def stats(g, sigma, P, N, it):
# La liste des résultats : 1 si bien décodé, 0 sinon
# List of the results : 1 if decoded without any error, else 0
result = []
for _ in range(it):
result.append([])
# On décode le signal
# We decode the signal
y, r = generate(g, sigma, P, N)
r_decode = decode(y, g, P, N)
......@@ -68,15 +68,15 @@ def stats(g, sigma, P, N, it):
else:
result[-1].insert(0, 0)
# Nombre de fois qu'une erreur a été réalisée pour chaque indice
erreurs = [0] * N
# Number of each time an error has occured for each index
errors = [0] * N
for k in range(it):
for i in range(N, 0, -1):
erreurs[i - 1] += 1 - result[k][i - 1]
errors[i - 1] += 1 - result[k][i - 1]
erreurs = np.array(erreurs) / it
return erreurs
errors = np.array(errors) / it
return errors
if __name__ == '__main__':
......@@ -86,16 +86,16 @@ if __name__ == '__main__':
P = [5**k for k in range(N)]
it = 10000
print("N =", N)
print("Puissances =", P)
print("Atténuation g =", g)
print("Bruit de variance σ² =", sigma**2)
print("Simulation de n = {} itérations".format(it))
erreurs = stats(g, sigma, P, N, it) * 100
print(erreurs)
plt.bar(range(1, N + 1), erreurs)
plt.xlabel("Indice du signal décodé")
plt.ylabel("Pourcentage d'erreur")
plt.title("Estimation du nombre d'erreurs sur {} itérations".format(it))
print("Powers =", P)
print("Attenuation g =", g)
print("Noise of variance σ² =", sigma**2)
print("Simulation of n = {} iterations".format(it))
errors = stats(g, sigma, P, N, it) * 100
print(errors)
plt.bar(range(1, N + 1), errors)
plt.xlabel("Index of the decoded signal")
plt.ylabel("Percentage of error")
plt.title("Estimated number of errors over {} iterations".format(it))
plt.show()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment