Vous êtes sur la page 1sur 6

TP4 – Filtres à Réponse Impulsionnelle

Finie – FIR –

Manipulation N°1 : Implémentation d’un filtre FIR coupe bande

Filtres FIR (voir cours traitement numérique du signal)

Les échantillons à la sortie « y(k) » d’un filtre FIR se calculs en fonction de l’entrée « x(k) » par la
formule suivante :

Les coefficients h(k) déterminent la nature et le type du filtre.

Notre objectif est d’implémenter un filtre FIR coupe bande, avec la fréquence ‘coupée’ fixée à
2700Hz. Le schéma suivant résume l’objectif de notre TP.

Matlab DSK6713

Fichier Audio
Voix_enfant.wav
Filtre FIR Coupe bande
(fcoupée = 2700Hz)

Son généré (bruit)


sin(2*f1*t)
f1=2700Hz

Génération de la parole bruitée

Le listing ci-dessous est un programme matlab qui permet de :

1. Lire le fichier audio voix_enfant.wav


2. Générer un son (bruit) de fréquence fixe 2700Hz
3. Mélanger les deux sons
4. Faire l’analyse spectrale du fichier audio voix_enfant.wav, avant et après l’ajout du bruit
 Analysez le programme à votre disposition et testez-le

% voix_plus_buit.m
% Mélange d'un fichier audio (voix_enfant.wav) avec un signal
% sonore sinusoidal de fréquence 2700Hz.
% L = Nombre d'échantillons dans le fichier voix_enfant.wav
% Fs = fréquence d'échantillonage
% f1 = fréquence du signal bruit (2700Hz)

clear all
Fs=8000;

input('Lecture du fichier voix_enfant.wav ...');


y=wavread('voix_enfant'); % Lecture des données du fichier
wavplay(y,Fs); % envoi des données à la carte son du PC
L=length(y); % L contient la taille des données
figure(1)
clf
plot(y)

input('génération d un signal sinusoïdal de fréquence 2700Hz ...');


f1=2700;
n=1:1:L;
s(n)=sin(2*pi*f1*n/Fs); % génération du bruit - sinus de 2700Hz
soundsc(s); % envoi des données à la carte son du PC

input('Mélange des deux sigaux ...');


s=s/25; % réglage de la tonalité du bruit
z=y+s'; % Mélange des deux sons parole + buit
wavplay(z,Fs); % envoi des données à 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 d’un filtre FIR avec Matlab – détermination des coefficients h(n) du filtre

La conception de notre filtre coupe-bande doit commencer par la détermination des coefficients
h(k). Matlab dispose de deux outils destinés à la conception de filtres numériques SPTool et
FDATool, nous utiliserons dans ce TP l’outil FDATool. Le schéma suivant représente le gabarit
désiré pour notre filtre avec :
 Fpass1 = 2500Hz
 Fstop1 = Fstop2 = 2700Hz
 Fpass2 = 2900Hz
 Apass1 = Apass2 = 0,5 dB
 Astop = 40 dB

|H|dB
Apass1 Apass2

Astop

0 Fpass1 Fstop1 Fstop2 Fpass2 Fs/2 f(Hz)

1. Lancez l’outil FDATool dans Matlab


2. Sélectionnez la configuration suivante des choix et paramètres
Page 3 sur 6
a. Response Type : « Bandstop »
b. Design Method : « FIR » et « Window »
c. Filter Order : « Minimum order »
d. Options :
i. « Scale Passband » : cochée
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
généré, ordre et stabilité. Vous devez obtenir un filtre d’ordre 91.
5. Les icônes de la fenêtre vous permettent de visualiser, en plus du module de votre filtre:
a. sa phase, sa réponse impulsionnelle, sa réponse pour un signal échelon
b. les pôles et les zéros
c. les valeurs des coefficients h(n)

 Visualisez ces différentes données.

Les coefficients sont donc disponibles (pour un copier coller), mais ne sont pas utilisables
directement puisqu’ils sont en virgule flottante (avec ce format, le calcul est plus précis au
détriment du temps de calcul qui peut être élevé). Il est nécessaire de transformer le format des
coefficients en « entiers-signés ».
1. Allez dans le menu « Target » et sélectionnez « Generate C Header … »
2. Sélectionnez les choix suivants :
a. Numerator : h
b. Numerator length : N
c. Export as : cochée
i. Signed 16-bit integer
3. Cliquez sur « Generate »

Les coefficients sont enregistrés dans le fichier « fdacoefs.h » par défaut. Nous voulons plutôt
mettre ces données dans un fichier de terminaisons « .cof ».

4. Changez le nom et l’extension 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
b. Enlever la ligne : #include ‘’tmwtypes.h’’
c. Remplacez les deux lignes :

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

par

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

Le fichier « fdacoefs.cof » est prêt à être incorporé dans le projet d’implémentation du filtre
dans la DSK6713.

Implémentation du filtre FIR coupe bande dans la DSK6713

Ayant les coefficients de notre filtre il faut calculer les termes :

Ou x(k) représentent les échantillons à l’entrée du filtre et y(n) sa sortie. Le programme en C


suivant permet de faire ce calcul. Il utilise le mode interruptions déjà vu.

//Fir.c Filtre FIR

#include "fdacoefs2700.cof" //fichier coefficients du filtre


#include "dsk6713_aic23.h" //codec-dsk
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //Echantillonnage à 8KHz
int yn = 0; //initialisation de la sortie
//du filtre
short dly[N]; //retard de la sortie

interrupt void c_int11() //ISR – si interruption


{
short i;

dly[0]=input_sample(); //nouveau échantillon


yn = 0; //initialisation de la sortie
for (i = 0; i< N; i++)
yn += (h[i] * dly[i]); //y(n) += h(i)* x(n-i)
for (i = N-1; i > 0; i--) //début : fin du tableau
dly[i] = dly[i-1]; //décalage des données
output_sample(yn >> 15); //sortie du résultat, avec une mise
//à l’échelle -215<yn<(215-1), soit
//-32,768<yn<32,767 (codage sur
//16 bits)

Page 5 sur 6
return;
}

void main()
{
comm_intr(); //initialisation DSK, codec, McBSP
while(1); //boucle infinie
}

Créer 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 utilisées dans les premiers TP.

1. Compilez votre projet


2. Appliquez à l’entrée de la DSK (Line IN) un signal sinusoïdal d’amplitude 0.1V
3. Visualisez à l’oscilloscope l’entrée du GBF et la sortie de la DSK (Line OUT)
4. Modifiez la fréquence de l’entrée dans la plage suivante f = *100Hz  4000Hz] et notez
ce qui se passe pour la fréquence particulière de 2700Hz.
5. Test du filtrage du fichier bruité « voix_enfant.wav »
a. Reliez l’entrée (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é exécuté auparavant)

>> wavplay(z,Fs)

d. Vérifiez que à la sortie de la DSK le signal sonore correspondant à la sinusoïde 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

Vous aimerez peut-être aussi