BOURAS Farid BEKANGBA Gracia
TP4 : FILTRAGE NUMERIQUE OBJECTIF DU TP :
L’objectif du TP est de mettre en pratique les connaissances acquises sur le filtrage numérique en cours de traitement du signal. On pourra par la suite réaliser différents types de filtre que l’on appliquera à un signal audio.
PARTIE 1 : implantation d’un filtre FIR passe bas En premier lieu nous allons mettre au point un filtre passe bas a réponse impulsionnelle finie qui sera ensuite implanté sur la carte EZKIT LITE. Pour cela on fera appel au TP 5 de l’unité de traitement du signal pour pouvoir via le logiciel Scilab calculer les coefficients du filtre qui seront implanté dans un programme que l’on chargera sur la carte. 1) calcul des coefficients du filtre passe bas. On peut classer les filtres de différentes manières : Filtre récursif : La sortie dépend des échantillons d’entrée mais aussi des échantillons de sortie des instants précédents. Filtre non récursif : La sortie dépend uniquement des échantillons d’entrée. Pour un filtre FIR qui est de type non récursif la formule de filtrage s’exprime de la façon suivante (on notera h(t) la réponse impulsionnelle du filtre, y(t) la sortie et x(t) l’entrée). y(t) = x(t) * h(t) = T =∞
∫h(T)x(t −T)dT
T =0
Cette forme ne peu être directement utilisé en filtrage numérique on doit ainsi passer dans le domaine numérique et on obtient : y(n) = k =N − 1
h(k).x(n−k) ∑ k =0
Les h(k) étant les coefficients de pondération du filtre. Les coefficients du filtre représentent les coefficients de la réponse impulsionnelle discrétisée ; on conçoit aisément alors que cette dernière va jouer un rôle important dans les méthodes de synthèses. Nous allons ici aborder la méthode dite de la fenêtre. Principe de la méthode des fenêtres : Cette méthode consiste à partir d’un gabarit fréquentielle souhaité à déterminer une reponse impulsionnelle réalisable. Les principaux points sont :
Le choix d’un gabarit idéal La périodisation de ce gabarit due a l’échantillonnage La décomposition en série de Fourier du gabarit périodisé pour obtenir les coefficients de la réponse impulsionnel ; La troncature symetrique de la réponse imlpulsionnelle de manière à limiter le nombre d'échantillons ; Suivant le placement de la fenêtre de troncature le filtre sera a nombre d’échantillions pair ou impair, avec les propriétés qui en découlent ; Le décalage de la réponse pour obtenir un filtre causal. La décomposition en série de Fourier de notre filtre a pour expression h(n) =
(Vu en TP de traitement du signal). 2Fc.sin(2π.nFc/ Fe) Fe.2π.Fc / Fe
h(n) constitue ainsi la réponse impulsionnelle du filtre. On décale la réponse impulsionnelle de N échantillons pour rendre ce filtre causal. On obtient ainsi l’expression suivante : h(n) =
= 2. 2.Fc.sin(2.π.(n−N / 2)Te.Fc) 2.π.(n−N / 2).Fc
. sinc(2
Fc Fe
)
π.(n− N / 2).Te.Fc
Cette nouvelle expression va nous permettre de calculer les coefficients du filtre, mais si l’on veut optimiser le gabarit de ce filtre il est nécessaire de considérer un grand nombre de coefficient. Pour ce faire nous allons utiliser le logiciel de calcul matriciel Scilab qui va générer un fichier contenant tout les coefficients. Pour commencer nous allons réaliser se calcul pour notre filtre FIR passe bas a la fréquence de coupure Fc de 2KHz avec un nombre de coefficients égal a 4. La fréquence d’échantillonnage du CODEC a été fixée a 8KHz et d’après le théorème de Shannon la fréquence de coupure doit être inférieur a la moitié de la fréquence d’échantillonnage (Fe > 2Fc). Ainsi Fc ne doit pas dépasser les 4 KHZ pour éviter le recouvrement spectral. Cette condition étant bien respectée on calcul les coefficients par Scilab : 1.949D-17 0.3183099 0.5 0.3183099 Et voici le gabarit correspondant :
Ce gabarit ne correspond pas à nos attentes bien évidemment car le nombre d’échantillons calculés est beaucoup trop faible.
2) Conception et algorithme de filtrage. Dans cette partie nous allons aborder la conception du programme qui va permettre d’effectuer le calcul du filtrage. Pour en simplifier la réalisation, nous allons résonner sur l’exemple d’un filtre avec 4 coefficients puis nous généraliseronsl’algorithme à N coefficients. L’équation de filtrage pour N échantillons est la suivante : y(n) = . k = N −1
∑h(k).x(n−k) k =0
Par exemple si on veut calculer l’équation de filtrage pour N=4 coefficients qui donne la valeur de y(n=3), on obtient :
y(3)=h(0).x(3) + h(1).x(2) + h(2).x(1) + h(3).x(0). Le programme qui réalise l’équation de filtrage sera donc le suivant :
#define n 4 .section/data .var/circ .section/data .var/circ
dm_data; x[n]="entree.dat"; pm_data; h[n]="coeffir.dat";
.section/pm vect_ints; jump start;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti; rti;rti;rti;rti;
/*reset*/ /*IRQ2*/ /*IRQL1*/ /*IRQL0*/ /*Tx_SPORT0*/ /*Rx_SPORT0*/ /*IRQE*/ /*BDMA*/ /*Tx_SPORT1*/ /*Rx_SPORT1*/ /*TIMER*/ /*POWER DOWN*/
.section/pm pm_code; start: I0=x; L0=n; M0=1; I6=h; L6=n; M6=1; MR=0; CNTR=n-1; MX0=DM(I0,M0) , MY0=PM(I6,M6); do loop1 until ce; loop1: MR=MR+MX0*MY0(SS), MX0=DM(I0,M0), MY0=PM(I6,M6); MR=MR+MX0*MY0(SS); wait: idle ; jump wait;
Si on calcul l’équation y(n=4), on obtient :
y(4)=h(0).x(4) + h(1).x(3) + h(2).x(2) + h(3).x(1) On constate que x(4) vient remplacer x(0) en mémoire. Cependant nous savons qu’une fois l’acquisition et l’enregistrement du nouvel échantillon effectué, le DAG2 pointe sur x(1) tandis que le DAG1 pointe toujours sur h(3). Autrement dit, on va bien multiplier x(1) par h(3) au départ puis x(2) par h(2),…De plus la boucle s’effectuant N fois le DAG2 reviendra au départ et pointera sur x(4) qui sera alors multiplié par h(0). Ainsi il n’y a rien à modifier à l’algorithme. L’algorithme pour N coefficients reste quasiment inchangé. On utilisera simplement en plus l’instruction « if MV SAT MR » pour gérer les dépassements éventuels de calcul de l’unité MAC. 3) Test de l’algorithme. Test de l’algorithme sur la carte.
A l’aide de Scilab on calcule un filtre passe bas comportant 128 coefficients avec une fréquence de coupure égale a 3KHz. On prendra Fe = 8 Khz, Fc = 0,375.Fe. Voici le gabarit obtenu :
Cette fois ci on voit bien qu’avec un plus grand nombre d’échantillons, on optimise le gabarit du filtre. Aussi on relève bien la fréquence de coupure désirée.
Ce filtre est ensuite implanté dans le programme canevas en complétant les parties suivantes : /* --- Définition de constantes éventuelles --- */ #define n 128 /*---------------- définitions des variables -----------------*/ .section/data dm_data; // buffers circulaires nécessaires au fonctionnement du programme sinus .var/circ
x[n]="entree.dat";
// Activation des interruptions (Rx_SPORT0 Tx_SPORT0 éventuellement IRQE) ax0=imask; ay0=b#0001100000; ar=ax0 or ay0; imask=ar; //initialisation du pointeur du DAG pour les buffer circulaires */ I0=x; L0=n; I4=h; L1=n; L4=n; // Boucle d'attente d'interruption boucle: idle; jump boucle; // Programme d'interruption Rx SPORT0 /* Cette interruption est utilisé pour réceptionner les échantillons du tampon d'entée et les dans le tampon de sortie.*/ sport0_rx_isr: ena sec_reg;
// activer les registre secondaires
ax0=dm(rx_buf+1);
// réception du canal gauche
ay0=dm(rx_buf+2); ar=ax0+ay0; dm(I0,M0)=ar; /* Ecrire l'algorithme du filtre à cet emplacement*/ DIS M_MODE; CNTR=n-1;
PARTIE 2 : Implantation d’un filtre FIR passe bande. Dans cette partie les mêmes méthodes que précédemment seront utilisées et le seul changement proviendra du programme Scilab qui calculera les nouveaux coefficients d’un tel filtre. Ainsi se programme est fourni sur le poly. N=128 (de manière à obtenir un gabarit acceptable). Fe=8KHz Fc1=1KHz Fc2=2KHz Le gabarit obtenu sous Scilab est le suivant :
On observe bien le gabarit d’un filtre passe bande
Faute de temps la simulation n’a pu être faite.