Vous êtes sur la page 1sur 6

TP4 Filtres Rponse Impulsionnelle Finie FIR

Manipulation N1 : Implmentation dun filtre FIR coupe bande

Filtres FIR (voir cours traitement numrique du signal) Les chantillons la sortie y(k) dun filtre FIR se calculs en fonction de lentre x(k) par la formule suivante :

Les coefficients h(k) dterminent la nature et le type du filtre. Notre objectif est dimplmenter un filtre FIR coupe bande, avec la frquence coupe fixe 2700Hz. Le schma suivant rsume lobjectif de notre TP.
Matlab
Fichier Audio Voix_enfant.wav

DSK6713

Filtre FIR Coupe bande (fcoupe = 2700Hz)

Son gnr (bruit) sin(2*f1*t) f1=2700Hz

Gnration de la parole bruite Le listing ci-dessous est un programme matlab qui permet de : 1. 2. 3. 4. Lire le fichier audio voix_enfant.wav Gnrer un son (bruit) de frquence fixe 2700Hz Mlanger les deux sons Faire lanalyse spectrale du fichier audio voix_enfant.wav, avant et aprs lajout du bruit

Analysez le programme votre disposition et testez-le

% % % % % %

voix_plus_buit.m Mlange d'un fichier audio (voix_enfant.wav) avec un signal sonore sinusoidal de frquence 2700Hz. L = Nombre d'chantillons dans le fichier voix_enfant.wav Fs = frquence d'chantillonage f1 = frquence du signal bruit (2700Hz)

clear all Fs=8000; input('Lecture du fichier voix_enfant.wav ...'); y=wavread('voix_enfant'); % Lecture des donnes du fichier wavplay(y,Fs); % envoi des donnes la carte son du PC L=length(y); % L contient la taille des donnes figure(1) clf plot(y) input('gnration d un signal sinusodal de frquence 2700Hz ...'); f1=2700; n=1:1:L; s(n)=sin(2*pi*f1*n/Fs); % gnration du bruit - sinus de 2700Hz soundsc(s); % envoi des donnes la carte son du PC input('Mlange des deux sigaux ...'); s=s/25; % rglage de la tonalit du bruit z=y+s'; % Mlange des deux sons parole + buit wavplay(z,Fs); % envoi des donnes la carte son du PC figure(2) clf plot(z) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % FFT : voir le help de Matlab %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); % Plot single-sided amplitude spectrum. figure(3) clf plot(f,2*abs(Y(1:NFFT/2+1))) axis([0 4000 0 6e-3]) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)')

Page 2 sur 6

ylabel('|Y(f)|') NFFT = 2^nextpow2(L); % Next power of 2 from length of y Z = fft(z,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); % Plot single-sided amplitude spectrum. figure(4) clf plot(f,2*abs(Z(1:NFFT/2+1))) axis([0 4000 0 6e-3]) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Z(f)|')

Conception dun filtre FIR avec Matlab dtermination des coefficients h(n) du filtre La conception de notre filtre coupe-bande doit commencer par la dtermination des coefficients h(k). Matlab dispose de deux outils destins la conception de filtres numriques SPTool et FDATool, nous utiliserons dans ce TP loutil FDATool. Le schma suivant reprsente le gabarit dsir pour notre filtre avec : Fpass1 = 2500Hz Fstop1 = Fstop2 = 2700Hz Fpass2 = 2900Hz Apass1 = Apass2 = 0,5 dB Astop = 40 dB |H|dB Apass1 0 Apass2

Astop

Fpass1

Fstop1

Fstop2

Fpass2

Fs/2

f(Hz)

1. Lancez loutil FDATool dans Matlab 2. Slectionnez la configuration suivante des choix et paramtres Page 3 sur 6

Response Type : Bandstop Design Method : FIR et Window Filter Order : Minimum order Options : i. Scale Passband : coche ii. Window : Kaiser e. Frequency Specifications : i. Units : Hz ii. Fs : 8000 iii. Fpass1 : 2500 iv. Fstop1 : 2700 v. Fstop2 : 2700 vi. Fpass2 : 2900 f. Magnitude Specifications : i. Units : dB ii. Apass1 : 0.5 iii. Astop : 40 iv. Apass2 : 0.5 3. Appuyiez sur Design Filter 4. Le champ Current Filter Information , vous donne des informations sur le filtre gnr, ordre et stabilit. Vous devez obtenir un filtre dordre 91. 5. Les icnes de la fentre vous permettent de visualiser, en plus du module de votre filtre: a. sa phase, sa rponse impulsionnelle, sa rponse pour un signal chelon b. les ples et les zros c. les valeurs des coefficients h(n) Visualisez ces diffrentes donnes. Les coefficients sont donc disponibles (pour un copier coller), mais ne sont pas utilisables directement puisquils sont en virgule flottante (avec ce format, le calcul est plus prcis au dtriment du temps de calcul qui peut tre lev). Il est ncessaire de transformer le format des coefficients en entiers-signs . 1. Allez dans le menu Target et slectionnez Generate C Header 2. Slectionnez les choix suivants : a. Numerator : h b. Numerator length : N c. Export as : coche i. Signed 16-bit integer 3. Cliquez sur Generate Les coefficients sont enregistrs dans le fichier fdacoefs.h par dfaut. Nous voulons plutt mettre ces donnes dans un fichier de terminaisons .cof . 4. Changez le nom et lextension du fichier : fdacoefs.h fdacoefs2700.cof 5. Ouvrez le fichier fdacoefs.cof dans un diteur de text a. Enlever tous les commentaires Page 4 sur 6

a. b. c. d.

b. Enlever la ligne : #include tmwtypes.h c. Remplacez les deux lignes :


const const int N = 91 ; int16_T h[91]

par
#define N 91 ; Short h[91] =

Le fichier fdacoefs.cof est prt tre incorpor dans le projet dimplmentation du filtre dans la DSK6713. Implmentation du filtre FIR coupe bande dans la DSK6713 Ayant les coefficients de notre filtre il faut calculer les termes :

Ou x(k) reprsentent les chantillons lentre du filtre et y(n) sa sortie. Le programme en C suivant permet de faire ce calcul. Il utilise le mode interruptions dj vu.
//Fir.c Filtre FIR //fichier coefficients du filtre //codec-dsk //Echantillonnage 8KHz //initialisation de la sortie //du filtre //retard de la sortie //ISR si interruption

#include "fdacoefs2700.cof" #include "dsk6713_aic23.h" Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; int yn = 0; short dly[N]; interrupt void c_int11() { short i; dly[0]=input_sample(); yn = 0; for (i = 0; i< N; i++) yn += (h[i] * dly[i]); for (i = N-1; i > 0; i--) dly[i] = dly[i-1]; output_sample(yn >> 15);

//nouveau chantillon //initialisation de la sortie //y(n) += h(i)* x(n-i) //dbut : fin du tableau //dcalage des donnes //sortie du rsultat, avec une mise // lchelle -215<yn<(215-1), soit //-32,768<yn<32,767 (codage sur //16 bits)

Page 5 sur 6

return; } void main() { comm_intr(); while(1); }

//initialisation DSK, codec, McBSP //boucle infinie

Crer un nouveau projet en incluant les fichiers suivants : Fir.c c6713dskinit.c Vectors_intr.asm C6713dsk.cmd csl6713.lib dsk6713bsl.lib rts6700.lib Les options de compilation sont ceux utilises dans les premiers TP. 1. 2. 3. 4. 5. Compilez votre projet Appliquez lentre de la DSK (Line IN) un signal sinusodal damplitude 0.1V Visualisez loscilloscope lentre du GBF et la sortie de la DSK (Line OUT) Modifiez la frquence de lentre dans la plage suivante f = *100Hz 4000Hz] et notez ce qui se passe pour la frquence particulire de 2700Hz. Test du filtrage du fichier bruit voix_enfant.wav a. Reliez lentre (Line IN) de la DSK la sortie audio du PC (sortie de la carte son du PC) b. Reliez la sortie (HEADPHONE) de la DSK aux hauts parleurs ou au casque mis votre disposition c. Tapez dans matlab la commande : (le fichier matlab voix_plus_buit.m ayant t excut auparavant) >> wavplay(z,Fs) d. Vrifiez que la sortie de la DSK le signal sonore correspondant la sinusode de 2700Hz disparu et que le filtre fonctionne donc correctement. i. Si le volume du son est faible (son non audible) remplacez la commande de matlab par : (multiplication par 5) >> wavplay(5*z,Fs)

Page 6 sur 6