'''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=np.array([])
Us1=np.array([])
Ue1=np.array([])

# Saisie par l'étudiant des valeurs expérimentales du filtre d'ordre 2

F2=np.array([])
Us2=np.array([])
Ue2=np.array([])

#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
## LEGENDES A COMPLETER

plt.figure(1)
plt.plot(F1, G1, 'bo', label="A COMPLETER")
plt.plot(F1, G_fit1, color="blue", label="A COMPLETER")
plt.plot(F2, G2, 'rx', label="A COMPLETER")
plt.plot(F2, G_fit2, color="red", label="A COMPLETER")
plt.xlabel('fréquence')
plt.ylabel('Gain')
plt.legend()
plt.grid()
plt.show()
