# -*- coding: utf-8 -*-
"""
Created on Thu Mar  6 17:35:19 2025

@author: AKourgli
"""

import numpy as np
import matplotlib.pyplot as plt

# Paramètres
N_symbols = 16000      # Nombre de symboles
sps = 32              # Samples par symbole
alpha = 0.5          # Roll-off factor
T = 1                 # Durée symbole
L = 6                 # Span du filtre (symboles)

# Génération des symboles 4-Aires (-3, -1, 1, 3)
symbols = np.random.randint(0, 4, N_symbols)
levels = 2*symbols - 3

# Upsampling
upsampled = np.zeros(N_symbols * sps)
upsampled[::sps] = levels

# Génération du filtre cosinus surélevé
t = np.arange(-L*T, L*T + 1/sps, 1/sps)
h = np.sinc(t/T) * np.cos(np.pi*alpha*t/T) / (1 - (2*alpha*t/T)**2)

# Gestion des divisions par zéro
denom = 1 - (2*alpha*t/T)**2
mask = np.abs(denom) < 1e-6
if alpha != 0:
    limit_val = (alpha/2) * np.sin(np.pi/(2*alpha))
    h[mask] = limit_val

# Normalisation du filtre
#h /= np.linalg.norm(h)  # Normalisation
#h /= np.sum(h**2)**0.5
h /= np.max(h)

# Application du filtre
shaped_signal = np.convolve(upsampled, h, mode='same')

# Ajout de bruit
SNR_dB = 30
puissance_signal = np.mean(shaped_signal**2)
puissance_bruit = puissance_signal / (10**(SNR_dB/10))
bruit = np.random.normal(0, np.sqrt(puissance_bruit), len(shaped_signal))
signal_bruite = shaped_signal + bruit
#signal_bruite = shaped_signal

# Découpage pour éliminer les transitoires
start = L * sps
end = -L * sps
signal_cut = signal_bruite[start:end]

# Création du diagramme de l'œil
N = 3 * sps  # Fenêtre de 2 symboles
num_eyes = len(signal_cut) // N
eye = signal_cut[:num_eyes*N].reshape(num_eyes, N)

plt.figure(figsize=(10, 6))
for i in range(0, num_eyes, 50):  # On trace 1 trace sur 50
    plt.plot(np.arange(N)/sps, eye[i], 'navy', alpha=0.3)

plt.title('Diagramme de l\'œil pour modulation 4-Aires (α=0.5) avec SNR =30')
plt.xlabel('Temps (en périodes de symbole)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.xlim(0, 2)
plt.axvline(1, color='red', linestyle='--', alpha=1)
plt.show()