import numpy as np
import matplotlib.pyplot as plt


def F(w, w0, Q, type_filtre) :
    if type_filtre == 'Aucun':
        H = 1
    if type_filtre == 'Passe-bas 1er ordre' :
        H = 1/(1+1j*(w/w0))
    if type_filtre == 'Passe-haut 1er ordre' :
        H = 1/(1+1j*(w0/w))
    if type_filtre == 'Passe-bas 2ième ordre' :
        H = 1/(1- w**2/w0**2 + 1j*w/(w0*Q) )
    if type_filtre == 'Passe-bande' :
        H = 1/(1- 1j*Q*(w/w0 -w0/w)  )
    if type_filtre == 'Passe-haut 2ième ordre' :
        H = -(w/w0)**2/(1-(w/w0)**2 + 1j*(w/(Q*w0) ))
    if type_filtre == 'Coupe-bande':
        H = (1-(w/w0)**2)/(1-(w/w0)**2 + 1j*(w/(Q*w0)) )
    return H


def trace_bode(omega, omega_0, Q, type_filtre):
    H = F(omega, omega_0, Q,type_filtre)
    plt.figure('Diagramme de Bode ' + str(i), figsize = [5, 5])
    plt.axes([0.18, 0.58, 0.8, 0.4])
    plt.loglog(omega, np.abs(H), 'k')
    plt.grid('on')
    plt.ylabel(r'$G_{dB}$')
    plt.axes([0.18, 0.1, 0.8, 0.4])
    plt.semilogx(omega, np.angle(H), 'k')
    plt.grid('on')
    plt.ylabel(r'$\varphi \, {\rm (rad)}$')
    plt.xlabel(r'$\omega \, {\rm (rad.s^{-1})}$')
    plt.show()


lst_omega_0 = [100, 30, 7]
lst_Q = [5, 0.1, 10]
lst_type_filtre = ['Passe-bas 2ième ordre', 'Passe-bande' , 'Passe-haut 1er ordre']
omega = np.logspace(-2, 4.5, 1000)
plt.close('all')
for i in range(len(lst_omega_0)):
    trace_bode(omega, lst_omega_0[i], lst_Q[i], lst_type_filtre[i])
    plt.savefig(str(i))