% Reconnaissance de voyelles
clear all;
close all;

%% Paramètres utilisateur
% Mode verbose. Permet d'afficher certaines coubes.
verbose = 0;
% Fichier .wav à charger
% Fichiers disponibles : 'blank.wav', 'voyelle_a.wav', 'voyelle_i.wav', 'voyelle_ou.wav'
[DATA, fs] = audioread('voyelle_ou.wav');
data = DATA(:,1);

%% Bases de temps et de fréquence
% Génération d'une base de temps
Te = 1/fs;
M = length(data);
Temps=Te*[0:M-1];
% Génération des paramètres fréquentiels
dF = fs/M;
Frequence = dF*[0:1:M-1];

%% Visualisation du signal d'origine (mode verbose uniquement)
if (verbose == 1)
    figure(1)
    plot(Temps, data)
    grid
    title('Original signal')
    xlabel('Time (samples)')
    ylabel('Amplitude')
end

%% Tracé des fft (mode verbose uniquement)
if (verbose == 1)
    F = fft(data)
    plot(Frequence/fs, abs(F))
    title('Fast Fourier Transform')
    xlabel('Frequency')
    ylabel('Relative amplitude')
    grid
end

%% Mise en place des filtres

% Paramètres de coupure
% Formant 1
Wc0 = 100;
Wc1 = 300;
WcA = [Wc0, Wc1]/(fs);
% Formant 2
Wc2 = 450;
Wc3 = 800;
WcB = [Wc2, Wc3]/(fs/2);
% Formant 3
Wc4 = 900;
Wc5 = 1200;
WcC = [Wc4, Wc5]/(fs/2);

% Filtre butterworth
% Ordre souhaité (pair)
ordre = 6;

[num1, den1] = butter(ordre/2, WcA);
[num2, den2] = butter(ordre/2, WcB);
[num3, den3] = butter(ordre/2, WcC);

% Filtrage
SigF1 = filter(num1, den1, data);
SigF2 = filter(num2, den2, data);
SigF3 = filter(num3, den3, data);

% Tracé des bodes des filtres
if (verbose == 1)
    figure(2)
    freqz(num1, den1)
    hold on
    freqz(num2, den2)
    freqz(num3, den3)
end

%% Energie des signaux filtrés
Ea1 = sum(power(SigF1,2));
Ea2 = sum(power(SigF2,2));
Ea3 = sum(power(SigF3,2));

%% Vecteur des énergies par formant et seuils
E = [Ea1, Ea2, Ea3];
if (verbose == 1)
    E
end
Seuil1 = 1;
Seuil2 = 1;
Seuil3 = 1;


%% Vérification des seuils
if (E(1) > Seuil1)
    if ((E(2)>Seuil2)&&(E(3)>Seuil3))
        disp('Voyelle "A" détectée')
    elseif ((E(2)>Seuil2)&&(E(3)<Seuil3))
        disp('Voyelle "OU" détectée')
    elseif ((E(2)<Seuil2)&&(E(3)<Seuil3))
        disp('Voyelle "I" détectée')
    else  
        disp('Son inconnu détecté')
    end
else
    disp('Pas de son')
end









