# -*- coding: utf-8 -*-
"""
Created on Fri Sep  5 16:52:55 2025

@author: AKourgli
"""

# -*- coding: utf-8 -*-
"""
TP : Propagation des ondes électromagnétiques
Simulation pédagogique en Python
"""

import numpy as np
import matplotlib.pyplot as plt

# -----------------------------
# Partie 1 : FSPL (Free Space Path Loss)
# -----------------------------
d = np.linspace(0.1, 100, 500)  # distances en km
frequences = [100, 2400, 10000]  # MHz

plt.figure(figsize=(8,6))
for f in frequences:
    FSPL = 20*np.log10(d) + 20*np.log10(f) + 32.44
    plt.plot(d, FSPL, label=f"{f} MHz")
plt.xlabel("Distance (km)")
plt.ylabel("FSPL (dB)")
plt.title("Pertes en espace libre (FSPL)")
plt.legend()
plt.grid(True)



# -----------------------------
# Partie 2 : Formule de Friis
# -----------------------------
d = np.linspace(0.1, 50, 500)  # distances en km
f = 2400  # MHz
FSPL = 20*np.log10(d) + 20*np.log10(f) + 32.44

Pt_dBm = 30    # puissance émise = 1 W
Gt_dBi = 3     # gain antenne Tx
Gr_dBi = 3     # gain antenne Rx

Pr_dBm = Pt_dBm + Gt_dBi + Gr_dBi - FSPL

plt.figure(figsize=(8,6))
plt.plot(d, Pr_dBm, 'r')
plt.xlabel("Distance (km)")
plt.ylabel("Puissance reçue (dBm)")
plt.title("Puissance reçue vs distance (Formule de Friis)")
plt.grid(True)


# -----------------------------
# Partie 3 : Multi-trajets et Fading
# -----------------------------
# paramètres
f = 2400e6  # Hz
c = 3e8
lam = c / f

# Chemin direct
d1 = 1000  # m

# Variation de chemin réfléchi
delta_d = np.linspace(0, 2*lam, 500)
d2 = d1 + delta_d

# Amplitudes supposées égales (réflexion parfaite)
phi = 2*np.pi*(d2-d1)/lam
signal = 1 + np.exp(-1j*phi)  # somme vectorielle
Pr = np.abs(signal)**2

plt.figure(figsize=(8,6))
plt.plot(delta_d/lam, 10*np.log10(Pr/np.max(Pr)))
plt.xlabel("Différence de chemin (λ)")
plt.ylabel("Puissance relative (dB)")
plt.title("Fading dû aux multi-trajets")
plt.grid(True)



# -----------------------------
# Partie 4 : Perte de polarisation
# -----------------------------
theta = np.linspace(0, 90, 500)
Lp = -20*np.log10(np.cos(np.deg2rad(theta)))
Lp[Lp > 50] = np.nan  # éviter infini

plt.figure(figsize=(8,6))
plt.plot(theta, Lp, 'g')
plt.xlabel("Angle entre polarisations (°)")
plt.ylabel("Perte (dB)")
plt.title("Perte de polarisation")
plt.grid(True)

print("\n--- Valeurs numériques exemples ---")
print("FSPL à 2.4 GHz, 1 km : {:.2f} dB".format(
    20*np.log10(1) + 20*np.log10(2400) + 32.44))
print("Puissance reçue à 2.4 GHz, 1 km : {:.2f} dBm".format(
    Pt_dBm + Gt_dBi + Gr_dBi - (20*np.log10(1) + 20*np.log10(2400) + 32.44)))
print("Perte de polarisation à 45° : {:.2f} dB".format(-20*np.log10(np.cos(np.deg2rad(45)))))
