Méthode LPC (Voice processing)
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 :
Code:
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 |
Cette fonction fonctionne très bien, je recupère en sortie ma matrice de frame fenetrée et mes coefficients associés.
Ensuite, je veux prédire mon signal :
Code:
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 |
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.
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.