67 lines
2.2 KiB
Mathematica
67 lines
2.2 KiB
Mathematica
|
clear;
|
||
|
close all;
|
||
|
taille_ecran = get(0, 'ScreenSize');
|
||
|
L = taille_ecran(3);
|
||
|
H = taille_ecran(4);
|
||
|
|
||
|
chemin = '/mnt/n7fs/ens/tp_jmelou/Shazam/Morceaux/';
|
||
|
fichiers = dir([chemin '*.wav']);
|
||
|
|
||
|
% Chargement de la base de données :
|
||
|
load bdd;
|
||
|
|
||
|
% Lecture d'un fichier audio tiré aléatoirement :
|
||
|
numero_morceau = 69;
|
||
|
[y, f_ech] = audioread([chemin fichiers(numero_morceau).name]);
|
||
|
|
||
|
% Extrait de durée variable, tiré aléatoirement :
|
||
|
duree_extrait = 15; % Durée de l'extrait en secondes
|
||
|
debut_extrait = randi(length(y) - f_ech * duree_extrait + 1);
|
||
|
y = y(debut_extrait:debut_extrait + f_ech * duree_extrait - 1);
|
||
|
|
||
|
% Création d'un bruit (blanc ou de parole) :
|
||
|
y_bruit_blanc = randn(size(y));
|
||
|
y_bruit_parole = audioread('/mnt/n7fs/ens/tp_jmelou/Shazam/talking.wav');
|
||
|
debut_y_bruit_parole = randi(length(y_bruit_parole) - length(y) + 1);
|
||
|
y_bruit_parole = y_bruit_parole(debut_y_bruit_parole:debut_y_bruit_parole + length(y) - 1);
|
||
|
|
||
|
% Ajout du bruit (blanc et/ou de parole) :
|
||
|
SNR = 10; % Rapport signal sur bruit
|
||
|
% y = ajout_bruit(y,y_bruit_blanc,SNR);
|
||
|
% y = ajout_bruit(y,y_bruit_parole,SNR);
|
||
|
% sound(y,f_ech);
|
||
|
% pause(duree_extrait);
|
||
|
|
||
|
% Paramètres :
|
||
|
n_fenetre = 512; % Largeur de la fenêtre (en nombre de points)
|
||
|
n_decalage = 256; % Décalage entre deux fenêtres (en nombre de points)
|
||
|
fenetre = 'hann'; % Type de la fenêtre
|
||
|
|
||
|
% Calcul du sonagramme :
|
||
|
[Y, valeurs_t, valeurs_f] = TFCT(y, f_ech, n_fenetre, n_decalage, fenetre);
|
||
|
S = 20 * log10(abs(Y) + eps);
|
||
|
|
||
|
% Calcul des pics spectraux :
|
||
|
[pics_t, pics_f] = pics_spectraux(S);
|
||
|
|
||
|
% Calcul des paires de pics spectraux :
|
||
|
paires = appariement(pics_t, pics_f);
|
||
|
|
||
|
% Calcul des identifiants :
|
||
|
identifiants = indexation(paires);
|
||
|
|
||
|
% Récupération des empreintes présentes dans la base de données :
|
||
|
resultats = recherche_avancee(identifiants, paires(:,3), bdd);
|
||
|
|
||
|
% Recherche du meilleur résultat :
|
||
|
[C, ia, ic] = unique(resultats, 'rows', 'stable');
|
||
|
h = accumarray(ic, 1);
|
||
|
[m, ind] = max(h);
|
||
|
numero_reconnu = C(ind, 1);
|
||
|
|
||
|
if numero_reconnu == numero_morceau
|
||
|
fprintf('Le morceau "%s" a ete correctement reconnu !\n', fichiers(numero_morceau).name(1:end - 4));
|
||
|
else
|
||
|
fprintf('Le morceau "%s" n''a pas ete reconnu !\n', fichiers(numero_morceau).name(1:end - 4));
|
||
|
end
|