Ce projet explore la transmission de messages via des ondes radio. Il s'agit d'un exercice de compréhension et de maîtrise des principes de la communication par radiofréquences.
import numpy as np #Ce module permet d’effectuer des calculs numériques avec Python
import matplotlib.pyplot as plt #Ce module permet de créer et personnaliser des graphiques
import sounddevice as sd #Ce module permet de jouer un son
Message = str(input('Entrez le message à envoyer : '))
total_binary='' #Création d'une chaîne de caractère vide "total_binary" qui va contenir le message binaire complet
for i in range(len(Message)): #Création d'une boucle for qui se répètera jusqu'à atteindre la valeur de la taille du message en partant de 0
binary='' #Création d'une chaîne de caractère vide "binary" qui va stocker les 7 bits correspondant à chaque lettre du message
string_ord = ord(Message[i]) #Renvoie le décimal correspondant à chaque caratère de la chaîne de caractère
while string_ord>0: #Boucle tant que se répétant tant que la décimale du caractère est supérieure à 0
x = string_ord % 2 #Stockage du reste de la division euclidienne de la décimale par 2
string_ord = string_ord // 2 #Stockage du résultat de la division euclidienne de la décimale par 2 sans le reste.
binary = str(x) + str(binary) #Stockage de chaques reste correcpondants à un bit (0 ou 1)
total_binary += binary #Stockage et ajout du code binaire (7 bits) correspondant à chacune des lettres du message
print(total_binary) #Affichage du message binaire complet
def xor(a,b):
resultat = [] #Initialisation du résultat sous forme d'une liste vide
for i in range(1,len(b)): #Création d'une boucle pour appliquer la fonction XOR (si les bits sont les même, alors XOR vaut 0, sinon XOR vaut 1)
if a[i]== b[i]: #Création d'un conditionnel if qui va comparer 2 bits et appliquer la fonction XOR
resultat.append('0') #Ajout de le caractère '0' à la liste resultat
else:
resultat.append('1') #Ajout de le caractère '1' à la liste resultat
return ''.join(resultat) #On retourne les données de la fonction XOR sous forme d'une chaîne de caractères sans espaces
def Division_eucl(divident,diviseur):
val = len(diviseur) #Stockage de la taille du diviseur dans la variable "val"
tmp = divident[0 : val] #Stockage des val-premières données du divident
while valRes2[i]: #Conditionnel if qui vérifie si la i-ème valeur de Res1 est supérieure à la i-ème valeur de Res2
y.append(1) #Ajout de la valeur 1 à la liste "y" si la condition est vérifiée
if Res1[i]0 #Si >0 renvoie True, sinon renvoie False
message_recu_decode=[] #Initialisation d'une liste vide
for iii in range(0,len(message_demodule)): #Boucle for allant de 0 à la valeur de la taille de "message_demodule"
if message_demodule[iii]==True: #Conditionnel if qui vérifie si la iii-ème valeur de "message_demodule" est égale à "True"
message_recu_decode.extend([int(1)]) #Ajout de la valeur 1 à la liste "message_recu_decode" si la condition est vérifiée
if message_demodule[iii]==False: #Conditionnel if qui vérifie si la iii-ème valeur de "message_demodule" est égale à "False"
message_recu_decode.extend([int(0)]) #Ajout de la valeur 0 à la liste "message_recu_decode" si la condition est vérifiée
message_recu_bin=[] #Initialisation d'une liste vide
for iiii in range(0, len(message_demodule),2): #Boucle for allant de 0 à la valeur de la taille de "message_demodule" par pas de 2 afin de revenir à un bit et non 2 bits par état
if message_recu_decode[iiii]==1 and message_recu_decode[iiii+1]==0: #Conditionnel if qui vérifie si la iiii-ème valeur de "message_recu_decode" est égale à 1 et si la (iiii+1)-ème valeur de "message_recu_decode" est égale à 0
message_recu_bin.extend([str(1)]) #Ajout d'un caractère 1 à la liste mesage_recu_bin si la condition est vérifiée
if message_recu_decode[iiii]==0 and message_recu_decode[iiii+1]==1: #Conditionnel if qui vérifie si la iiii-ème valeur de "message_recu_decode" est égale à 0 et si la (iiii+1)-ème valeur de "message_recu_decode" est égale à 1
message_recu_bin.extend([str(0)]) #Ajout d'un caractère 0 à la liste mesage_recu_bin si la condition est vérifiée
print(message_recu_bin) #Affichage de la liste de caractères "message_recu_bin" contenant le message initial envoyé par l'agent après avoir été codé en CRC
#conversion liste en chaine de caractère
message_réceptionné=''.join(message_recu_bin)
print(message_réceptionné)
#Définition de la fonction de décodage
def decodage(data_crc, key):
length_key = len(key) #Stockage de la taille de la clé
data_ajout = data_crc + '0'*(length_key-1) #Ajout des '0' en fonction de la taille de la clé-1
reste = Division_eucl(data_ajout, key) #Stockage du reste de la division euclidienne du message auquel on ajouté les 0 par la clé
return reste #On retourne la valeur du reste
key = '11010' #Initialisation de la clé (c'est la même que dans la phase d'émission)
check = decodage(message_réceptionné, key) #Récupération du reste de la division euclidienne du message réceptionné par la clé
print("Le reste de la division après décodage est ->" +check) #Affichage du reste de la division après décodage
temp = "0" * (len(key) - 1) #Récupération du message de base
if check == temp: #Conditionnel if qui vérifie si check est égal à temp
print("Les données -> "+message_réceptionné +"<- sont bien reçues!") #Affichage d'un message de confirmation de la validité du message si la condition est vérifiée
else:
print("Erreur de réception") #Affichage d'un message d'erreur si la condition n'est pas vérifiée
#Définition de la fonction de conversion du binaire en décimale
def BinaryToDecimal(binary):
#initialisation des variables
decimal = 0
i = 0
n = 0
while(binary != 0): #Boucle tant que qui s'execute tant que le code binaire est différent de 0
dec = binary % 10 #On récupère le reste de la division euclidienne du code binaire par 10
decimal = decimal + dec * pow(2, i) #On récupère la décimale correspondant au code binaire
binary = binary//10 #On effectue la division euclidienne du code binaire par 10 sans récupérer le reste
i += 1 #On incrémente i de 1
return (decimal) #On retourne la valeur décimale du code binaire entré
#Conversion du message binaire en texte via la table ASCII
Total_texte='' #Initialisation d'une chaîne de caractère vide
for i in range(0,len(message_réceptionné),7): #Boucle for allant de 0 à la taille de "message_réceptionné"
bin_data=int(message_réceptionné[i:i+7]) #Stockage des 7 bits correspondant à une lettre
decimal_data = BinaryToDecimal(bin_data) #Conversion du code binaire (7 bits) en décimal
Total_texte = Total_texte + chr(decimal_data) #Conversion de la décimale en texte puis ajout du caractère à la liste "Total_teste"
#Affichage du message
print(Total_texte)
verification = int(check,2) #Conversion de "check" binaire en décimal provenant du décodage CRC
FeA=44100 #Initialisation de la fréquence d'échantillonnage pour un signal de fréquence comprise dans le spectre de l'audible par l'oreille humaine
t=np.arange(0,0.2,1/FeA) #Génération d'un vecteur temps de durée 0.2s (ce temps nous parrait suffisant pour un accusé de réception(bip sonore) mais il reste mdifiable)
Accusé_réception=np.sin(2*np.pi*5000*t) #Génération d'un signal quelconque de fréquence 5 000Hz
if verification == 0: #Conditionnel if qui vérifie si le message est bien reçu
sd.play(Accusé_réception, FeA) #Émission du message sous forme de signal (Jouer le son) si la condition est vérifiée, sinon pas d'accusé de réception
Retour au portfolio