Implémentation sous Matlab

 

    Matlab a l'avantage d'offrir de nombreux outils spécifiques à ce projet tels que l'analyse LPC ou la détection du pitch. Pour comprendre le fonctionnement de la procédure, nous allons commencer par analyser le code du programme principal: LPC10.m

 

%Programme réalisant le codage LPC-10

%Ce codage demande une analyse spectrale

%et une recherche de la fréquence fondamentale (le pitch)

function [ parcor1, parcor2, VF1, VF2]=LPC10(signal);

parcor1=0;

parcor2=0;

VF1=0;

VF2=0;

[Y,FS,MODE,FORMAT]=loadwav(signal);

N=floor(length(Y)/240); %nombre de fenêtres distinctes!! de 30ms

M=3*N;                  %nombre de fenêtres de 80ms

Y=Y(1:N*240);

for i=1:(M-2);

    temp = hamming(240).*Y(((i-1)*80+1):(((i-1)*80)+240));

    %$$$$$$$$$$$$$$$$$$$ANALYSE SPECTRALE$$$$$$$$$$$$$$$$$$$$$$%

    [A,G] = LPC(temp,10);

    ra=lpcar2rf(A);     %LPCAR2RF Convert ar coefficients to PARCOR                         %(reflection)coefficients AR=(RF)

    ramod=codLPC10(ra);

    parcor1 = [parcor1 ra]

    parcor2 = [parcor2 ramod];

    %$$$$$$$$$$$$$$$$DETECTION DU FONDAMENTAL$$$$$$$$$$$$$$$$$$%

    F=pitchp(8000,temp);

    F0=pitchcod(F);

    VF1=[VF1 F];

    VF2=[VF2 F0];

   

end;

 

 

    L'appel de la fonction demande d'abord la définition d'un signal. Ce signal doit, conformément aux spécificités du codeur, être échantillonné à 8000Hz et doit être, au minimum, quantifié sur 12 bits. Ensuite l'appel de la fonction se fait d'une manière habituelle : [parcor1,parcor2,VF1,VF2]=LPC10(signal). les variables parcor1 et VF1 donne respectivement les coefficients PARCOR et le pitch pour chaque tranche de signal analysé. Tandis que parcor2 et VF2 correspondent à ces mêmes paramètres mais après codage. Cela fait peut-être beaucoup de variables de sortie, mais cela permettra de comparer les différents paramètres avant et après codage. Notons que ce processus de codage s'effectue sur des fenêtres de 30 ms coulissantes de 10 ms. 

    L'analyse spectrale se fait grâce à la fonction lpc. Cet outil demande en arguments une tranche du signal et l'ordre à appliquer, c-à-d dans ce cas : 10. Cette fonction renvoie les paramètres A et G qui sont respectivement le vecteur des coefficients de prédiction (a(i)) et un paramètre d'erreur. Ces coefficients doivent être convertis en coefficients PARCOR (ou de réflexion) (k(i)), tous compris entre -1 et 1, cela se fait via la fonction lpcar2rf. Ici intervient un petit problème qui peut prêter à confusion et qu'il est important d'éclaircir. En effet, selon les tables de codage, 10 coefficients k(i) doivent être codés. Or la fonction LPC renvoie 11 coefficients, ce qui est normal selon la théorie. Plus précisément, le premier coefficient a(i) vaut toujours 1 selon l'équation de prédiction : 

                                    1.x(n)=-a(1).x(n-1)-a(2).x(n-2)-...-a(p).x(n-p)+e(n)    

    On voit, dans cet exemple, que a(0)=1. Et c'est là que se pose le problème car Matlab considère ce "1" comme étant a(1) et va jusque a(p+1). Il ne faut donc pas oublier dans la suite du programme d'abandonner ce premier coefficient puisqu'il est constant et donc de commencer à coder à partir de k(2) puisqu'entretemps les coefficients de prédiction auront été transformés en coefficient PARCOR par la fonction lpcar2rf. C'est pourquoi la fonction codLPC10 renvoie un vecteur de 10 k(i), alors qu'elle reçoit un vecteur de 11 coefficients. 

    Le codage s'effectue ainsi grâce à la fonction codLPC10 qui, pour chaque coefficients k(i), va appeler une matrice de trois colonnes : la première colonne sera une borne inférieure, la seconde une borne supérieure et, enfin, la troisième sera la valeur du coefficient de sortie si le coefficient d'entrée est compris entre les deux bornes. Le codage du pitch se basera sur un principe équivalent.

    Autrement dit, le codage est basé sur une quantification des coefficients PARCOR et du pitch, sur une discrétisation du domaine des valeurs attribuables à ces deux paramètres.

    Voyons le début du code de la fonction codLPC10.

  

%Programme appelant les différentes matrices en fonction du Ki

%Effectue ensuite une comparaison

function ramod=codLPC10(ra)

i=1;

ramod=ra;

X=Kone(i);

[a,b]=size(X);

for i=1:a,

if (X(i,1)<=ra(1,2))&(ra(1,2)<=X(i,2))

ramod(1,1)=X(i,3);

end;

end;

...

 

    

    La fonction codLPC10 appelle une fonction Kone (pour k(1) et k(2)) pour consulter les données de la matrice. Cette action n'est en fait qu'une simple consultation de données, puisqu'elle ne demande rien en entrée et renvoie des informations.

    Voici un exemple de matrice utilisée pour le codage des deux premiers k(i). Les autres k(i) ont chacun leur propre matrice. Au fur et à mesure que l'on monte dans l'ordre, les matrices deviennent plus simple, ceci est logique puisque les k(i) éloignés ont une importance moindre.

 

% Reflection Coefficients 1 and 2 (for k(1) and k(2))

function X = Kone(i)

X = [ -1 -0.9844 -0.9844; -0.9843 -0.9688 -0.9688; -0.9687 -0.9531 -0.9531;

-0.9530 -0.9375 -0.9375; -0.9374 -0.9063 -0.9218; -0.9062 -0.8750 -0.8906;

-0.8749 -0.8281 -0.8438; -0.8280 -0.7656 -0.7812; -0.7655 -0.6875 -0.7187;

-0.6874 -0.6094 -0.6406; -0.6093 -0.5313 -0.5625; -0.5312 -0.4219 -0.4688;

-0.4218 -0.3125 -0.3593; -0.3124 -0.2032 -0.2500; -0.2031 -0.0938 -0.1406;

-0.0937 0.0937 0.0313; 0.0938 0.2031 0.1406; 0.2032 0.3124 0.2500; 0.3125 0.4218 0.3593;

0.4219 0.5312 0.4688; 0.5313 0.6093 0.5623; 0.6094 0.6874 0.6406; 0.6875 0.7655 0.7187;

0.7656 0.8280 0.7812; 0.8281 0.8749 0.8438; 0.8750 0.9062 0.8906; 0.9063 0.9374 0.9218;

0.9375 0.9530 0.9375; 0.9531 0.9687 0.9531; 0.9688 0.9843 0.9688; 0.9844 1 0.9844];

 

 

    Le codage du pitch suit le même processus. La fonction pitchp permet la détection du fondamental, cette fonction demande en arguments la fréquence d'échantillonnage ainsi qu'une tranche du signal. C'est une fonction modifiée d'une première version "pitch.m" qui demandait, en plus, la taille de la fenêtre à appliquer. Cet argument a été enlevé puisque l'opération de multiplication par une fenêtre de Hamming de 280 points est effectuée dans le programme principal. 

 

function [f0]= pitchp(sr,xin)

% Copyright (c) 1995 Philipos C. Loizou

cn1=rceps(xin);

 

LF=floor(sr/500);

HF=floor(sr/70);

cn=cn1(LF:HF);

[mx_cep ind]=max(cn);

 

if mx_cep > 0.09 & ind >LF

f0= sr/(LF+ind);

else f0=0;

end

 

    

    Le codage du fondamental se fait de la même manière que pour les coefficients PARCOR : par approximation et comparaison dans une matrice à trois colonnes. C'est la fonction pitchcod qui réalise cela, elle n'appelle pas de matrice externe puisqu'il n'y a qu'une matrice, elle est donc incluse dans la fonction.

 

% Pitch and voicing : encoding

function [F0]= pitchcod(F)

X = [50 52 51; 52 53.5 53; 53.5 55 54; 55 56.5 56; 56.5 58 57; 58 60 59; 60 62 61;

62 64 63; 64 66 65; 66 68 67; 68 70 69; 70 72.5 71; 72.5 75.5 74; 75.5 78.5 77;

78.5 81.5 80; 81.5 85 83;85 89 87; 89 93 91; 93 97.5 95; 97.5 101.5 100; 101.5 104 103; 

104 106.5 105; 106.5 109.5 108; 109.5 112.5 111; 112.5 116 114; 116 119.5 118;

119.5 123 121; 123 127 125; 127 131 129; 131 135.5 133; 135.5 140.5 138;

140.5 145.5 143; 145.5 151 148; 151 157 154; 157 164 160; 164 170.5 167; 170.5 179 174; 

179 187 184; 187 195 190; 195 202.5 200; 202.5 207.5 205; 207.5 213 210; 213 219 216;

219 225 222; 225 231.5 228; 231.5 238.5 235; 238.5 246 242; 246 254 250; 254 262 258;

262 271 266; 271 281 276; 281 291 286; 291 302 296; 302 314 308; 314 326.5 320;

326.5 340.5 333; 340.5 356 348; 356 372.5 364; 372.5 390.5 381; 390.5 450 400];

i=1;

F0=F;

[a,b]=size(X);

for i=1:a,

   if (X(i,1)<=F)&(F<X(i,2))

   F0=X(i,3);

   end;

end;

 

    Il serait très intéressant, maintenant, de vérifier la qualité du codage en implémentant la seconde partie du procédé LPC 10 qui est plus une section de synthèse que de décodage. 

 

 

 

 

 

 

 

 

______________________________________________________________________________________________________________________

Projet Multimédia - Codeur LPC 10 - Implémentation sous Matlab