'''COMPARAISON D'UN FILTRE PASSE BAS D'ORDRE 1  ET D'UN FILTRE PASSE-BAS D'ORDRE 2'''

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

# définition de la fonction reliant gain et fréquence pour un filtre passe bas d'ordre 1
def gain_passebas1(f, fC):
    """ fC : fréquence de coupure  """
    y = 1 / np.sqrt (1+(f/fC)**2)
    return y

#définition de la fonction reliant gain et fréquence pour un filtre passe bas d'ordre 2
def gain_passebas2(f, fC):
    """ fC : fréquence de coupure  """
    y = 1 / np.sqrt ((1-(0.37*f/fC)**2)**2+9*(0.37*f/fC)**2)
    return y

# Saisie par l'étudiant des valeurs expérimentales du filtre d'ordre 1
f1 = [50,100,  200, 300, 400, 500, 600, 700, 800, 1000, 2000, 3000, 5000]      # liste des fréquences
us1 = [5.04, 5.00, 4.85, 4.52, 4.20, 3.88, 3.62, 3.32, 3.08, 2.64, 1.49,1.0, 0.6]     # liste des amplitudes de la tension de sortie
ue1 = [5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08,  5.08, 5.04]     # liste des amplitudes de la tension d'entrée

F1=np.array(f1)
Us1=np.array(us1)
Ue1=np.array(ue1)

# Saisie par l'étudiant des valeurs expérimentales du filtre d'ordre 2
f2 = [50,200, 400, 500, 600, 800, 1000, 2000, 3000, 5000] #Hz
us2 = [6.07, 5.83, 5.11, 4.70, 4.30, 3.66, 3.10, 1.69, 1.09, 0.600] #crête à crête
ue2 = [6.15, 6.15, 6.11, 6.11, 6.07, 6.03, 6.03, 5.95, 5.95, 5.91] #crête à crête

F2=np.array(f2)
Us2=np.array(us2)*0.5 #amplitude
Ue2=np.array(ue2)*0.5 #amplitude

#définition du gain pour chacun des deux filtres
G1 = Us1/Ue1
G2 = Us2/Ue2

## ajustement de la loi théorique du filtre d'ordre 1 avec les points expérimentaux

# Linéarisation de l'expression du gain en fonction de la fréquence f
X= F1**2
Y= 1/(G1**2)
# Ajustement linéaire des points expérimentaux
a1, b1 = np.polyfit(X,Y,1)
fc1 = 1/ np.sqrt(a1)
print(" Filtre d'ordre 1 : fréquence de coupure =",fc1, "Hz")
# expression du gain ajusté pour le filtre d'ordre 1
G_fit1 = gain_passebas1(F1, fc1)


##ajustement de la loi théorique du filtre d'ordre 2 avec les points expérimentaux
popt, pcov = curve_fit(gain_passebas2, F2, G2) #popt est un tableau contenant la liste des paramètres optimisés : ici fC uniquement ; pcov permet d'estimer l'incertitude sur popt
fc2 = popt[0]
print("Filtre d'ordre 2 : fréquence de coupure =",fc2, "Hz")
# expression du gain ajusté pour le filtre d'ordre 2
G_fit2 = gain_passebas2(F2, fc2)

##superposition des courbes de gain des filtres d'ordre 1 et d'ordre 2

plt.figure(1)
plt.plot(F1, G1, 'bo', label="gain expérimental ordre 1")
plt.plot(F1, G_fit1, color="blue", label="gain théorique filtre ordre 1")
plt.plot(F2, G2, 'rx', label="gain expérimental ordre 2")
plt.plot(F2, G_fit2, color="red", label="gain théorique filtre ordre 2")
plt.xlabel('fréquence')
plt.ylabel('Gain')
plt.legend()
plt.grid()
plt.show()
