# -*- coding: utf-8 -*-
"""
Created on Thu Mar  6 16:56:33 2025

@author: AKourgli
"""

import numpy as np
import matplotlib.pyplot as plt

# Paramètres
T = 1
alphas = [0, 0.25, 0.5, 0.75, 1]
t = np.arange(-10, 10, 0.01)  # Base de temps

# Calcul des réponses impulsionnelles
impulse_responses = []
for alpha in alphas:
    sinc_part = np.sinc(t)  # T=1
    if alpha == 0:
        h = sinc_part
    else:
        denom = 1 - (2 * alpha * t)**2
        cos_term = np.cos(np.pi * alpha * t)
        h = (sinc_part * cos_term) / denom
        
        # Gestion des divisions par zéro
        mask = np.abs(denom) < 1e-6
        limit_val = (alpha / 2) * np.sin(np.pi / (2 * alpha))
        h[mask] = limit_val
    
    impulse_responses.append(h)

# Vérification des zéros aux instants entiers
for i, alpha in enumerate(alphas):
    h = impulse_responses[i]
    # Masque pour les multiples entiers de T (sauf t=0)
    mask = np.isclose(t, np.round(t), atol=1e-6) & (t != 0)
    h_at_integers = h[mask]
    print(f"Alpha={alpha} : Valeurs aux entiers : {np.max(np.abs(h_at_integers)):.2e}")

# Calcul des DSP
psds = []
freqs_list = []
for h in impulse_responses:
    N = len(h)
    dt = 0.01
    H = np.fft.fft(h,4*N) * dt  # Transformée de Fourier
    freq = np.fft.fftfreq(4*N, dt)
    H_shifted = np.fft.fftshift(H)
    freq_shifted = np.fft.fftshift(freq)
    psds.append(np.abs(H_shifted)**2)
    freqs_list.append(freq_shifted)

# Tracés
plt.figure(figsize=(14, 6))
colors = ['blue', 'orange', 'green', 'red', 'purple']

# Réponses impulsionnelles
plt.subplot(211)
for i, alpha in enumerate(alphas):
    plt.plot(t, impulse_responses[i], color=colors[i], label=f'α={alpha}')
plt.title('Réponses impulsionnelles')
plt.xlabel('Temps (t)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.legend()
plt.xlim(-5, 5)

# DSP
plt.subplot(212)
for i, alpha in enumerate(alphas):
    psds[i] = 10 * np.log10(psds[i] + 1e-9)
    plt.plot(freqs_list[i], psds[i], color=colors[i], label=f'α={alpha}')
plt.title('Densités Spectrales de Puissance')
plt.xlabel('Fréquence (Hz)')
plt.ylabel('PSD')
plt.grid(True)
plt.legend()
plt.xlim(-2, 2)

plt.tight_layout()
plt.show()