// Pour exécuter ce script Scilab, mettre les fichiers "Exemple1.sce" et "SonBruite.wav" dans le même répertoire.

// Augmentation de la taille de la mémoire allouée à Scilab
stacksize("max");

// Changement du répertoire courant de Scilab
// Avec détection automatique du chemin du fichier exécuté
cheminExemple = get_absolute_file_path("Exemple1.sce");
cd(cheminExemple);
// Changement manuel du répertoire courant de Scilab
// cd <nom du répertoire>

// Chargement du fichier son
[signalBruite, infosSignal] = loadwave("SonBruite.wav");
frequenceEchant = infosSignal(3);
nbEchantillons = infosSignal($);

// Tracé du signal original bruité
scf(); // Ouverture d'une nouvelle fenêtre graphique
plot(signalBruite)
xtitle("Signal original bruité")

// Calcul et tracé de la FFT du signal original bruité
moduleFftSignalBruite = abs(fft(signalBruite));
scf();
plot(moduleFftSignalBruite);
xtitle("Module de la FFT du signal bruité")

// La Transformée de Fourier est symétrique
// Pour la suite on ne garde que la première moitié des points 
frequences = frequenceEchant*(0:(nbEchantillons/2))/nbEchantillons;

// Recherche de la valeur du pic à filtrer
[valeurPic, indicePic] = max(moduleFftSignalBruite(1:size(frequences, "*")));
// Calcul du filtre de Butterworth correspondant
hzFiltre1 = iir(3, "sb", "butt", [frequences(indicePic)-100 frequences(indicePic)+100]/frequenceEchant, [0 0]);
// Diagramme de Bode du filtre
scf();
bode(hzFiltre1)

// Filtrage du signal original bruité
signalFiltre = filter(hzFiltre1.num, hzFiltre1.den, signalBruite);

// Calcul et tracé de la FFT du signal filtré
moduleFftSignalFiltre = abs(fft(signalFiltre));
scf();
plot(frequences, moduleFftSignalFiltre(1:size(frequences, "*")));
xtitle("Module de la FFT signal après premier fitrage")

// Recherche de la valeur du pic à filtrer
[valeurPic, indicePic] = max(moduleFftSignalFiltre(1:size(frequences, "*")));
// Calcul du filtre de Chebyshev correspondant
hzFiltre2 = iir(3, "sb", "cheb1", [frequences(indicePic)-100 frequences(indicePic)+100]/frequenceEchant, [0.01 0]);

// Filtrage du signal original bruité
signalFiltre = filter(hzFiltre2.num, hzFiltre2.den, signalFiltre);

// Tracé du signal filtré
scf();
plot(signalFiltre)
xtitle("Signal après second filtrage")

// Calcul et tracé de la FFT du signal filtré
moduleFftSignalFiltre = abs(fft(signalFiltre));
scf();
plot(frequences, moduleFftSignalFiltre(1:size(frequences, "*")));
xtitle("Module FFT signal après second fitrage")

// Sauvegarde du son filtré
savewave("SonApresFiltrage.wav", signalFiltre)
