import numpy as np
import matplotlib.pyplot as plt

def sinusoide(E,T,t) :
    valeur = E*np.cos(2*np.pi*t/T)
    return valeur

# Dans la fonction suivante on suppose implicitement que t >= 0

def creneau(E,T,t) :
    assert t >= 0
    t1 = t
    while t1 >= T :
        t1 = t1 - T
    if t1 < T/2 :
        return E
    else :
        return -E

tmin = 0
tmax = 5e-3
N = 1000
f = 1000
T = 1/f
E = 5

dates = np.linspace(tmin,tmax,N)
# liste_sinus = [ sinusoide(E,T,t) for t in dates ]
# liste_creneau = [ creneau(E,T,t) for t in dates ]

# plt.close()
# plt.figure()
# plt.plot(dates, liste_sinus)
# plt.show()

###################################################

def fourier(n,E,T,t) :
    F = 0
    for k in range(n+1) :
        F += 4*E/np.pi/(2*k+1)*np.sin( 2*np.pi*(2*k+1)*t/T )
    return F

n = 50
liste_Fouriern = [ fourier(n,E,T,t) for t in dates ]

# plt.close()
# plt.figure()
# plt.plot(dates, liste_Fouriern)
# plt.show()

##############################################


N = 1000
f = 1000
T = 1/f
tmin = 0
tmax = 5*T
N = 1000
Te = (tmax - tmin)/N


def liste_ech_signal(s) :
    L = [ s(E,T,tmin + n*Te) for n in range(N) ]
    return L

## Filtrage numérique

def filtre_PB_num(Eech, fc) :
    wc = 2*np.pi*fc
    N = len(Eech)
    Sech = N*[0]
    for n in range(N-1) :
        Sech[n+1] = Sech[n]*(1-wc*Te) + wc*Te*Eech[n]
    return Sech

fc = 10000
ech_entree = liste_ech_signal(creneau)
ech_sortie = filtre_PB_num(ech_entree,fc)

dates = [ tmin + n*Te for n in range(N) ]

# plt.close()
# plt.figure()
# plt.plot(dates,ech_entree, "blue")
# plt.plot(dates,ech_sortie, "red")
# plt.show()

##  Calcul d'un spectre en amplitude

N = 1000
f = 1000
T = 1/f
tmin = 0
tmax = T
N = 1000
Te = (tmax - tmin)/N


def coefficient_C(k,Sech) :
    Ck = 0
    for n in range(N) :
        Ck += 2/N*Sech[n]*np.exp(-1j*2*np.pi*n*k/N)
    return Ck

F = [ k*f for k in range(10) ]
ech = liste_ech_signal(creneau)
Amplitude = [ abs(coefficient_C(k, ech)) for k in range(10)]


# plt.close()
# plt.figure()
#
# for k in range(10) :
#     plt.plot([k*f,k*f], [0,Amplitude[k]], "blue")
#
# plt.xlabel("fréquences")
# plt.ylabel("amplitudes")
# plt.show()


