# TP filtrage son

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import rfft

import csv

file=open("son.csv","r")           # on ouvre le fichier, 'r' pour read
reader=csv.reader(file,delimiter=";")  # on le lit en séparant les champs

lx=[]
ly=[]
for row in reader:                     # pour toutes les rangées
    try:               # essaie de convertir, si c'est du texte, ne fait rien !
        virgule=row[0].replace(",",".")# sinon, on change le virgule
        lx.append(float(virgule))      # et on stocke cela dans la liste lx

        virgule=row[1].replace(",",".")# idem pour la seconde colonne, etc...
        ly.append(float(virgule))

    except:                            # si ce n'est pas des données
        pass                           # on passe à la suite

file.close()                           # on ferme le fichier


t=np.array(lx)   # convertit les listes en tableaux plus pratiques
e=np.array(ly)   # pas obligatoire...

N=len(e)
duree=t[N-1]
fe=N/duree

# tracé

def trace(e,titre):
    plt.figure(figsize=(15,7))

    plt.scatter(t,e,marker='+')

    plt.grid()
    plt.title(titre, fontsize=25)
    plt.xlabel("temps en s",fontsize=15)
    plt.ylabel("tension du micro en V",fontsize=15)

    plt.show()

trace(e,"Son enregistré")

# tracé du spectre
def spectre(y):

    tfd=rfft(y)
    spectre=np.absolute(tfd)*2/N

    spectre[0]=spectre[0]/2

    f=np.linspace(0,fe/2,int(N/2+1))

    plt.figure(figsize=(10,4))
    plt.plot(f,spectre,'r')
    plt.xlabel("f en Hz")
    plt.ylabel("Amplitude")
    plt.grid()
    plt.show()


spectre(e)

# filtrage -----------------------------------------------------------------

s=np.zeros(N)

s[0]=e[0]

fc=400
wc=2*np.pi*fc
for i in range(1,N):
    s[i]=(e[i]*wc+s[i-1]*fe)/(wc+fe)

#----------------------------------------------------------------------------

# affichage spectre et signal filtré
spectre(s)
trace(s,"Signal filtré")

# enregistrement du fichier .csv

file=open("son1.csv","w",newline='')

writer=csv.writer(file,delimiter=";")
writer.writerow(['t', 'signal filtré'])

for i in range(N):
    vir=str(t[i]).replace(".",",")
    vir1=str(s[i]).replace(".",",")
    writer.writerow([vir,vir1])

file.close()


e
