# -*- coding: utf-8 -*-
"""
Created on Fri Sep  5 16:18:37 2025

@author: AKourgli
"""

# -*- coding: utf-8 -*-
"""
TP1 : Caractéristiques élémentaires d’antennes
Simulation en Python de plusieurs types d’antennes
"""

import numpy as np
import matplotlib.pyplot as plt

# -----------------------------
# 1. Calcul du SWR (exemple sur dipôle λ/2)
# -----------------------------
freq = np.linspace(200, 400, 500)  # MHz
f0 = 300  # MHz (fréquence de résonance)
Rr = 73   # Ω (résistance de rayonnement dipôle)
X = 2*(freq - f0)  # partie réactive fictive

Z0 = 50  # ligne 50 ohms
Z = Rr + 1j*X
Gamma = (Z - Z0) / (Z + Z0)
SWR = (1 + np.abs(Gamma)) / (1 - np.abs(Gamma))

plt.figure(1)
plt.plot(freq, SWR, 'b')
plt.title("SWR vs fréquence (dipôle λ/2)")
plt.xlabel("Fréquence (MHz)")
plt.ylabel("SWR")
plt.ylim(1, 5)
plt.grid(True)

# -----------------------------
# 2. Diagrammes de rayonnement
# -----------------------------
theta = np.linspace(1e-3, np.pi-1e-3, 500)

# Dipôle λ/2
F_dipole = np.abs(np.cos((np.pi/2) * np.cos(theta)) / np.sin(theta))
F_dipole /= np.max(F_dipole)

# Monopôle λ/4 (hémisphérique, même forme que dipôle mais limité à 0–90°)
F_monopole = np.copy(F_dipole)
F_monopole[theta > np.pi/2] = 0

# Isotrope
F_iso = np.ones_like(theta)

# Parabole (modèle gaussien autour de 90°)
beamwidth = np.deg2rad(10)  # ouverture à -3dB ~ 10°
F_parab = np.exp(-((theta - np.pi/2)**2) / (2*beamwidth**2))

# Patch rectangulaire (approx cos^2(θ))
F_patch = np.cos(theta)**2
F_patch[F_patch < 0] = 0

# -----------------------------
# 3. Tracés comparatifs
# -----------------------------
plt.figure(2)
ax = plt.subplot(111, polar=True)
ax.plot(theta, F_dipole, label="Dipôle λ/2")
ax.plot(theta, F_monopole, label="Monopôle λ/4")
ax.plot(theta, F_iso, label="Isotrope")
ax.plot(theta, F_parab, label="Parabole (approx.)")
ax.plot(theta, F_patch, label="Patch (cos²)")
ax.set_title("Diagrammes de rayonnement comparés")
ax.legend(loc="upper right", bbox_to_anchor=(1.3, 1.1))
plt.show(block=True)

# -----------------------------
# 4. Perte de polarisation
# -----------------------------
angles = [0, 30, 45, 90]  # degrés
losses = [-20*np.log10(np.cos(np.deg2rad(a))) if a < 90 else np.inf for a in angles]

print("\n--- Pertes de polarisation ---")
for a, l in zip(angles, losses):
    if np.isinf(l):
        print(f"{a}° : Signal nul (∞ dB)")
    else:
        print(f"{a}° : {l:.2f} dB")

# Gains théoriques
print("\n--- Gains théoriques ---")
print("Dipôle λ/2 : 2.15 dBi")
print("Monopôle λ/4 : ~5.15 dBi (au-dessus plan de masse)")
print("Isotrope : 0 dBi (référence)")
print("Parabole (dépend de D/λ) → voir formule Friis")
print("Patch : ~6–9 dBi selon dimensions")
