## Modules
import numpy as np
import matplotlib.pyplot as plt

## Constantes
f = 1
t = np.linspace(0, 3, 1000)

f0 = 2
Q = 10

c_n = [1, 2, 2, 4, 1] #Spectre
phi_n = [0, 0.1, -0.3, -0.6, 1] #phases à l'origine


## Fonctions

def ue(t): 
    ''' Renvoie la tension d'entrée en fonction du temps. 
        entrée : t un tableau numpy
        sortie : res un tableau numpy'''
    res = c_n[0] 
    for i in range(1, len(c_n)): 
        res = res + c_n[i]*np.cos(2*np.pi*f*t*i+ phi_n[i])
    return res

def PB1(f): 
    ''' Fonction de transfert d'un filtre passe bas du premier ordre
        entrée : f un flottant, la fréquence de coupure
        sortie : res un complexe'''
    return 1/(1+1j*f/f0)
def PB2(f): 
    ''' Fonction de transfert d'un filtre passe bande du deuxième ordre
        entrée : f un flottant, la fréquence de coupure
        sortie : res un complexe'''
    return 1/(1-(f/f0)**2 + 1j*f/f0/Q)

def us(filtre, t): 
    '''Calcule la tension de sortie du filtre. 
        entrées : filtre, une fonction
                  t un tableau numpy
        sortie  : res un tableau numpy '''
    res = c_n[0]*np.abs(filtre(0)) 
    for i in range(1, len(c_n)): 
        fi = f*i
        G = np.abs(filtre(fi))
        phi = np.angle(filtre(fi))
        res = res + c_n[i]*G*np.cos(2*np.pi*t*fi+ phi_n[i]+phi)
    return res

## Tracé

plt.close('all')
plt.figure('Filtrage')
plt.plot(t, ue(t), 'k', label = r'$u_e$')
plt.plot(t, us(PB1, t), 'r', label = r'$u_s$')
plt.legend()
plt.xlabel(r'$t$ (s)')
plt.ylabel(r'$u$ (V)')
plt.show()
    