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. 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 Fichier Audio Voix_enfant.wav Son généré (bruit) sin(2*f1*t) f1=2700Hz Filtre FIR Coupe bande (fcoupée = 2700Hz) Matlab DSK6713

Polycope TP - 4 Filtre FIR

  • Upload
    arctanx

  • View
    51

  • Download
    4

Embed Size (px)

DESCRIPTION

tp filtrage

Citation preview

Page 1: Polycope TP - 4 Filtre FIR

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.

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

Fichier Audio Voix_enfant.wav

Son généré (bruit)

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

Filtre FIR Coupe bande (fcoupée = 2700Hz)

Matlab DSK6713

Page 2: Polycope TP - 4 Filtre FIR

Page 2 sur 6

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 3: Polycope TP - 4 Filtre FIR

Page 3 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

1. Lancez l’outil FDATool dans Matlab 2. Sélectionnez la configuration suivante des choix et paramètres

Astop

|H|dB

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

0

Apass1 Apass2

Page 4: Polycope TP - 4 Filtre FIR

Page 4 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 5: Polycope TP - 4 Filtre FIR

Page 5 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<(2

15-1), soit

//-32,768<yn<32,767 (codage sur

//16 bits)

Page 6: Polycope TP - 4 Filtre FIR

Page 6 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)