Bonjour à tous,
Je suis un jeune étudiant (ou plutôt vieux suivant les points de vues), actuellement en échange à Buenos Aires, je bosse sur des projets de traitement de la parole ou de la voix.
Bref, je m'essaye sur quelques petits algorithmes en mettant en pratique les notions de bases du traitement de la parole. Notamment la méthode LPC (Linear Predictive Coding), outil puissant et surtout très simple permettant de rapidement modéliser pendant un court instant le conduit vocal par un filtre linéaire.
Pour l'instant, je veux simplement extraire les coefficients d'une frame donnée, préalablement fenêtrée par une fenêtre de Hamming afin d'optimiser le calcul des coefficients. De ces coefficients je veux construire le signal prédit puis faire la différent signal vrai-signal prédit pour extraire le pitch.
Mon problème est le suivant, je calcule les coefficient via une fonction coefslpc.m , faisant appel à la fonction matlab très pratique car déjà codée.
je la met pour information :
Cette fonction fonctionne très bien, je recupère en sortie ma matrice de frame fenetrée et mes coefficients associés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 %% %%% % x : data waveform % p : filter order % fs: sample frequency % overlap: between 0 and 1 % w_t = windows time function [Coefs frames] =CalculCoefsLPC(x,p,fs,overlap,w_t) %Window design size_w = w_t*fs; w = hamming(size_w); %Hamming windows l_x = length(x); Coefs = zeros(floor(l_x/size_w),p+1); %%Frame Matrix frames = zeros(floor(l_x/size_w),size_w); for i=1:round(floor(l_x/size_w)/overlap) if ((i-1)*round(size_w*overlap)+size_w)> l_x %%%We ignore lasts samples don't care about it else frames(i,:)=x((i-1)*round(size_w*overlap)+1:(i-1)*round(size_w*overlap)+size_w).*w; Coefs(i,:)=lpc(x((i-1)*round(size_w*overlap)+1:(i-1)*round(size_w*overlap)+size_w).*w,p); end end end
Ensuite, je veux prédire mon signal :
Et là malheur, le signal prédit a la bonne forme si je le compare au frame dont il est issu, mais a une amplitude 40 fois inférieur, je ne comprends d'où cela provient ? Auriez-vous une idée ? Je ne fais pas de pre-emphasis (j'ai essayé avec, le résultat est presque pire, ni de sous échantillonage .. bref je bloque vraiment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 %% % Z : Windowed frame % coefs : LPC coefficients corresponding to this frame % N : frame size (in samples) % function predic = CalculExcitation(Z,coefs) p = length(coefs)-1; predic = zeros(1,length(Z)); for n=(1+p):length(Z) for i=p:-1:1 predic(n)= predic(n) + coefs(i)*Z(n-i); end end end
Si quelqu'un connait un peu ce domaine et a une idée je suis vraiment preneur.
Merci de m'avoir lu. Je reste à disposition pour vos questions.
Au revoir.
Partager