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 : 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
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 : 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
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.