'''ETUDE D'UN FILTRE PASSE BAS D'ORDRE 2'''

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

## Relevé des grandeurs expérimentales

# 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
G2 = Us2/Ue2

## Détermination de la fréquence de coupure

#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


# 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('fréquence de coupure =',fc2, "Hz")

G_fit = gain_passebas2(F2, fc2)

## superposition des courbes de gain expérimentale et théorique pour le filtre d'ordre 2'

plt.figure(1)
plt.plot(F2, G2, 'ro', label="gain expérimental ordre 2")
plt.plot(F2, G_fit, color="black", label="gain théorique filtre ordre 2")
plt.xlabel('fréquence')
plt.ylabel('Gain')
plt.legend()
plt.grid()
plt.show()
