Vous êtes sur la page 1sur 3

Projet de Filtrage Numérique

SEATECH parcours IRIS


Codeur-décodeur de parole type CELP

1 Avant de commencer
L’objectif de ce projet est double : Premièrement, vous permettre de mettre en oeuvre des techniques vues
en cours et en TP afin de résoudre un problème technique. Deuxièmement, vous exercer à présenter votre
démarche et vos résultats sous la forme d’un rapport technique (appelé compte-rendu). Vous rendrez vos
codes Matlab, mais on insiste sur le fait que la moitié de l’évaluation porte sur la rédaction du compte-rendu.
En particulier, les points techniques devront être illustrés par de nombreux graphiques pertinents et lisibles.

2 Traitement de l’audio par trames


Dans ce projet, on utilisera le signal audio contenu dans le fichier meteo.wav. Il s’agit d’un signal mono-
phonique (1 canal) échantillonné à 8000 Hz.

Le squelette du codeur-décodeur de parole consiste en un découpage du signal en trames de 128 échantillons,


sans recouvrement entre trames sucessives. Le signal de sortie complet est donc constitué de la concaténation
simple du signal de sortie obtenu trame par trame.

Ecrire le squelette en supposant pour commencer que le signal de sortie trame par trame est identique au
signal d’entrée trame par trame. Ecrire le signal de sortie complet dans un fichier wav, et vérifier qu’il est
identique au signal de sortie.

Pour chaque trame, tracer les formes d’onde et les spectres des signaux d’entrée et de sortie.

3 Prédiction linéaire à long terme et à court terme


Comme indiqué dans le cours, le traitement principal appliqué au signal consiste en deux filtres de prédiction
linéaire, un à court terme (STP) et un à long terme (LTP). Dans la partie analyse, ces traitements s’écrivent,
dans l’ordre d’application :

R1(z) = HLP C (z) X(z)

1
R2(z) = R1(z)
1 − gz −T

X désigne le signal d’entrée, R1 le résiduel à court terme et R2 le résiduel à long terme.

HLP C est le filtre RIF obtenu en sortie de la fonction Matlab lpc. On choisira un ordre de prédiction P = 10.

g et T sont les paramètres de gain et de retard du prédicteur à long terme, et sont calculés à partir de la
fonction d’auto-corrélation du signal R1, comme expliqué ci-après.

1
On note X1[k] la fonction d’auto-corrélation de R1 (fonction Matlab xcorr). On choisira une valeur du
paramètre maxlag égale à 100 échantillons. On recherche le premier maxima local notable de la fonction
X1. Pour cela, on la multiplie par une fonction de pondération gaussienne :
(k−γ)2
p[k] = e− 2σ 2

On choisira comme valeurs des paramètres : γ = 30 et σ = 30.

On calcule donc le maximum de la fonction X1[k].p[k]. La position du maximum (en nombre d’échantillons)
correspond à la valeur recherchée du paramètre de retard T . La valeur de l’auto-corrélation au maximum
correspond à la valeur recherchée du paramètre de gain g (voir la figure ci-dessous).

Dans la partie synthèse, les traitements s’écrivent, dans l’ordre d’application :

E1(z) = 1 − gz −T

E2(z)

1
Y (z) = E1(z)
HLP C (z)

Y désigne le signal de sortie, E1 le signal d’excitation à court terme et E2 le signal d’excitation à long
terme. Dans un premier temps, on suppose que E2 = R2 en l’absence de codage du résiduel.

2
Afin de garantir la continuité des processus de filtrage entre la trame courante et la trame précédente, il
faut utiliser les fonctionnalités d’état initial et d’état final de la mémoire du filtre disponible avec la fonction
filter (selon l’implémentation DN, voir le cours partie VIII) :

[y,final_state] = filter(B,A,x,init_state)

Lors du traitement sur le bloc courant, l’état initial de chaque filtre doit être l’état final du filtre dans le
bloc précédent. Dans le premier bloc, l’état initial est une variable vide.

Insérer les filtres d’analyse et de synthèse trame par trame dans le squelette du codeur. Pour chacun des 4
filtres, mettre en place une mémoire de l’état du filtre entre trames. En l’abscence de codage du résiduel, le
signal de sortie doit être identique au signal d’entrée. Tracer les formes d’ondes et les spectres des signaux
résiduel et d’excitation.

4 Codage et décodage du résiduel


Pour obtenir un effet de compression, il faut réduire le volume des données sevant à coder le résiduel R2.
Pour cela, on sous-quantifie le résiduel sur 3 niveaux (au lieu des 216 niveaux d’origine en codage 16 bits).

On note r2[n] le signal résiduel et σr2 l’écart-type de |r2[n]| (fonction Matlab std). Le résiduel sous-quantifié
sur 3 niveaux s’écrit :


 ρ2[n] = 1 lorsque r2[n] ≥ σr2
ρ2[n] = 0 lorsque −σr2 < r2[n] < σr2
ρ2[n] = −1 lorsque r2[n] ≤ −σr2

Dans le cas d’un système complet, le flux binaire comprendrait, pour la trame courante, les paramètres
suivants :

– Les 10 coefficients ak du filtre STP


– Les coefficients g et T du filtre LTP
– L’écart-type du résiduel σr2
– La suite de valeur dans {−1, 0, 1} correspondant au résiduel sous-quantifié ρ2[n]

Ici, on ne s’intéresse pas aux aspects "informatiques" de la mise en form de ce flux binaire. On suppose
simplement que tous les paramètres sont transmis tels quel au décodeur.

La partie décodage du résiduel consiste mettre à l’échelle le signal sous quantifié ρ2[n], de telle sorte que
l’énergie du signal résultant soit égale à celle du résiduel d’origine r2[n]. On note σρ2 l’écart-type de |ρ2[n]|.
Le décodage s’écrit alors :

σr2
r2[n]
b = ρ2[n]
σρ2

Implémenter à la suite le codage et le décodage du résiduel dans la boucle sur les trames, pour simuler la
mise en série du codeur et du décodeur en l’abscence d’erreurs de transmission. Tracer les formes d’onde et
les spectres des signaux dans la partie décodeur, et les comparer à ceux des signaux dans la partie analyse.
Enregistrer les signaux dans des fichiers wav pour pouvoir les écouter.

Vous aimerez peut-être aussi