J'ai un peu browsé sur Google Scholar, c'est intéressant comme domaine.
Voilà de quoi par exemple vous donner des idées d'algo un peu plus complexes (mais pas trop non plus puisque ça reste dans le domaine temporel pour la majorité, donc Matlab de base suffira) et sûrement meilleurs, bien adaptés à la voix humaine (et peut-être aux instruments de musique solo, je ne sais pas): https://web.ece.ucsb.edu/Faculty/Rab...inter_2012.pdf
- Short-Time Energy
- Short-Time Average Magnitude
- Short-Time Average Zero Crossing Rate
- Short-Time Autocorrelation
Etc..
cdlt,
GBo
Dernière modification par GBo ; 17/11/2020 à 22h23.
18/11/2020, 17h56
#63
invite7bc59f57
Date d'inscription
janvier 1970
Messages
26
Re : Algorithme sur Matlab
Bonjour,
Merci infiniment pour votre aide, mais je n'ai pas réussi à tirer grand chose de ce que vous m'avez envoyé en anglais, j'avoue ma compréhension en signal, en matlab, ajoutée à celle en anglais n'est pas fameuse. J'ai essayé une nième tentative, cette fois avec la puissance instantanée. L'idée est de ne pas avoir de marge d'erreur, ou d'essayer en tout cas...
Pour cela, j'ai pensé à trouver la puissance seuil, en comparant les puissances en chaque point jusqu'à ce que j'ai appelé Llim. Ensuite, comparer les puissances en chaque point de Llim à L. Si c'est plus grand, il y a un signal utile donc on renvoie 1, sinon on renvoie 0. Voila ce que j'ai écris :
Code:
[y,Fs] = audioread(filepath); % Chargement du fichier :
[L, nbColonnes] = size(y);
if nbColonnes == 1
y2 = y;
else
y2 = mean(y, 2); % Conversion stéréo --> mono
end
Ts = 1/Fs;
t = Ts*(1:L);
D = L/Fs; % Durée totale du signal
Llim = 50*10^(-3)*Fs;% Nombre d'échantillons 50 premières millisecondes
marge = 0 ;
PSeuil = 0;
for k = 1:Llim
if y2(k)^2 > PSeuil
PSeuil = y2(k)^2;
marge = k;
end
end
for i = 1:L
resulat = y2(i)^2 > y2(k)^2;
end
figure
plot(t,y2);
hold on
plot(resultat);
Le résultat que j'obtiens ne veut rien dire, il doit certainement y avoir une ou meme plusieurs erreurs, mais je n'arrive pas à mettre la main dessus.
Merci.
18/11/2020, 20h32
#64
GBo
Date d'inscription
novembre 2005
Localisation
RP Ouest (78)
Messages
4 343
Re : Algorithme sur Matlab
On voit dans la 1ere boucle for que vous essayez d'élaborer un seuil à partir de puissances instantanées, alors que je croyais vous avoir convaincu que la puissance instantanée ne servait à rien dans ce problème puisque le signal utile passe par toutes les valeurs y compris près de zéro => il faut jouer sur des fenêtres cumulant l'énergie E de plusieurs samples comme je vous ai montré Lundi.
En plus vous ne vous servez pas de ce seuil ensuite...
Dans la 2ieme boucle for... resultat n'est pas un vecteur, mais un scalaire que vous écrasez sans cesse.
Bref : ne codez rien tant que vous n'avez pas écrit l'algo noir sur blanc, en le jouant dans la tête sur un exemple avant le moindre codage.
Coté Matlab, ce n'est pas encore ça non plus : je vous conseille de bien maitriser les matrices, vecteurs, opérations utiles associées, et sur la ligne de commande déjà, il y a pleins de tutoriels. Ensuite quand vous passez au script, il faut savoir débugger tout seul : mettez un point d'arrêt sur la ligne 25 (en double cliquant dessus) au milieu de la boucle for, appuyez sur F5 pour y accéder via ce qui précède et faire F10 F10 F10 pour voir pas à pas ce qu'il se passe en surveillant la valeur des variables dans le workspace.
Bon courage.
Dernière modification par GBo ; 18/11/2020 à 20h35.
18/11/2020, 21h36
#65
GBo
Date d'inscription
novembre 2005
Localisation
RP Ouest (78)
Messages
4 343
Re : Algorithme sur Matlab
Regardez, je n'affabule pas : en plein milieu de la note de flute, l'amplitude d'un sample (surligné en jaune) quasiment à 0, et ce n'est pas une exception:
Dernière modification par GBo ; 18/11/2020 à 21h40.