You are on page 1of 6

1

Filtres passe-bas/passe-haut

TP n2

Kal l e l A hm e d Y ahi a
Raboudi H am za

GE3 II
TM S 320 C 6416

Objectif

On cherche dans ce TP implmenter 2 types de filtres : filtre passe-bas et filtre passe-haut sur DSP 6416. Limplmentation sera en code C
pur sur IDE CCS v3.

Rappel sur les Filtres

Un filtre analogue (de passe bas par exemple) est quasiment, thoriquement parfait.
Cest--dire, pour le cas dun filtre passe-bas, toute variation de signal au-dessus dune frquence bien
dtermine (frquence de coupure), ce signal sera supprim de cette variation brusque, ne laissant que
les variations (frquences) modres.
La fonction peut tre linaire et exprim en fonction de la variable de Laplace. Le signal est continu et
infini.

En mode numrique, les choses ne passent pas comme ainsi mentionnes. Dabord vue sa capacit
dacquisition des donnes (mmoire, bus etc.) en plus lapplication envisage (de temps rel, simulation,
etc.). De plus du dilemme : il nest pas possible de traiter par un systme numrique un signal
analogique sans la conversion, la notion de la numrisation du signal est ne.
La numrisation du signal, permettant la fin dacqurir le signal ainsi traiter sera sous forme dun
fichier (ensemble/tableau) de chiffres entiers reprsentant la grandeur quon souhaite filtrer. Ce fichier
est bien sr nimporte grand quil soit, il nest pas possible de lassumer dtre une valeur proche de
linfini

Pour pouvoir traiter un signal numrique, il faut se rfrer N tats prcdents, ceci quivaut
appliquer une multiplication du signal avec une fonction rectangle de largeur pr-programm.

Le problme rside dans lquivalent spectral du signal.


La multiplication avec rectangle en model temporel cest quivalent une convolution avec sinc avec le
spectre du signal
() () () ()

Il faut obligatoirement tenir compte de ceci durant le filtrage.


Filtre numrique

x[k]

C o m p t e

r e n d u

Filtre numrique

y[k] = x[k] * h[k]

Page

Chaque filtre numrique possde des coefficients de pondration appliquer sur le signal quon dsire traiter (dit signal dentr).
Les coefficients doivent tre bien choisis et adquats la fentre du signal (bande du signal traiter la fois).

Coefficients des filtres

Pour trouver les coefficients des filtres, on se sert de MATLAB


Filtre passe-bas , filtre passe-haut

Filtre
Type

Bande frquentielle

Filtre
Type

[0 1000Hz] pour 8000Hz frq

Frquence de coupure

dchantillonage)

Ordre

Filtre passe bas.

Filtre passe haut.

[1000Hz] pour 8000Hz frq

dchantillonage)

Ordre

11

11

MATLAB
Fi l t r e p asse b as

Fir1 sera utilis pour


gnrer les coefficients
dun filtre .

a= FIR1( 10, 0.25, hanning(11))


freqz( a)
b= FIR1( 10, 0.25, 'high')
freqz( b)

de gr e

v al e u r

de gr e

Ordre du filtre
implmenter (nombre de
coefficients/chantillons
par block de calcul)

Type de filtre
implmenter

Filtre passe-bas
Il existe plusieurs mthodes pour raliser un filtre passe-bas. FIR1( low ) et FIR1( Hanining ).

Magnitude (dB)

Magnitude (dB)

-50

-100

-150

0.1

0.2

0.3
0.4
0.5
0.6
0.7
0.8
Normalized Frequency ( rad/sample)

0.9

Phase (degrees)

Phase (degrees)

0.1

0.2

0.3
0.4
0.5
0.6
0.7
0.8
Normalized Frequency ( rad/sample)

0.9

0.1

0.2

0.3
0.4
0.5
0.6
0.7
0.8
Normalized Frequency ( rad/sample)

0.9

-200

-400

-200
-400
-600
-800

0.1

0.2

0.3
0.4
0.5
0.6
0.7
0.8
Normalized Frequency ( rad/sample)

0.9

FIR1(10, 0.25, hanning(11))


Rponse frquentielle
FIR1 avec Hanning

C o m p t e

-100

-150

-600

-50

r e n d u

FIR1(10, 0.25, low)


Rponse frquentielle
FIR1 avec triangle

Page

Gain

Gain

Frquence

Frquence

Filtre passe-bas (avec triangle)

Filtre passe-bas (avec Hanning)

Lutilisation de Hanning permet de rduire les ondulations, mais en contrepartie la transition (coupure) a une pente lente .

Filtre passe-haut
Rponse frquentielle dun filtre de passe-haut gnr par MATLAB

Coefficients

a
-0.003084

Taille :

2.4918e-18

0.038368

0.12208

0.21478

0.25569

0.21478

0.12208

0.038368

2.4918e-18

b
0.0036158

C o m p t e

r e n d u

-0.0030842

Taille :
-8.212e-18

-0.02997

-0.10901

-0.20614

0.75303

-0.20614

-0.10901

-0.02997

-8.212e-18

1x11

1x11

0.0036158

Page

Coefficients pour C6416


Vu son architecture Fixed-point, le C6416 doit muler toute instruction de nombres dcimaux.
Pour viter tout problme, on multiplie les coefficients (qui sont de float ) avec un coefficient plus ou moins de large prcision.
En multipliant avec un nombre de 2 bits ceci est quivalent avec un dcalage gauche.
MATLAB

A1= round(a.*(2^12))
B1= round(b.*(2^12))

A1
-13

Taille :

157

500

880

1047

880

500

157

B1
15

Schma de liaison

-13

Taille :

-123

-446

-844

3084

-844

-446

-123

1x11

1x11

15

Sortie Audio PC
Entre haut-parleurs

Haut-parleurs

PC

Line out

C o m p t e

r e n d u

Carte DSP 6416

Line in

Page

5
C (start.c)

/*
* Copyright 2005 by Ubvideo Tunisia.
* All rights reserved. Property of UBT.
*/
#include "dsk6416.h"
#include "dsk6416_aic23.h"//codec pour lecture/criture aprs CAN
#include "audio.h"//fichier header pour les fonctions audio
#define N 11//nb chantillons

//
//Ajouter les coefficients des filtre passe bas et passe haut trouver avec le matlab
short f_bas[11] = {-13 ,
0,
157,
500,
880,
1047,
880,
500 ,
157,
0,
-13};
short f_high[11] = {15 ,
0,
-123,
-446,
-844,
3084,
-844,
-446 ,
-123,
0,
15 };
//

/*
* main() - Main code routine, initializes BSL and generates tone
*/
void main()
{
DSK6416_AIC23_CodecHandle hCodec;
Uint32 inputsample;
Uint16 firdata;
short dly[N];
int yn=0;
short i;
//char SW0,SW1;

/* Initialize the board support library, must be called first */


DSK6416_init();
/* Start the codec */
hCodec = DSK6416_AIC23_openCodec(0, &config);
/* Set the sampling frequency */
DSK6416_AIC23_setFreq(hCodec, DSK6416_AIC23_FREQ_96KHZ);
while(1) // infinite loop
{
while (!DSK6416_AIC23_read(hCodec, &inputsample));
//Attendre jusqu une nouvelle valeur du can/codec
/*WRITE FIR DATA HERE*/
if(DSK6416_DIP_get(0) ==0) { //voir si DIP 0 est actif (filtre passe-bas)
dly[0] = inputsample;
yn = 0;
for( i = 0 ; i < N ; i++) yn += f_bas[i] * dly[i];//calcul
for( i = N-1 ; i >0 ; i--) dly[i]=dly[i-1];
firdata = (Uint16)(yn>>12); //division par 2^12

C o m p t e

r e n d u

Page

} else if(DSK6416_DIP_get(1) ==0) {//sinon voir si DIP 1 est actif (passe-haut)


dly[0] = inputsample;
yn = 0;
for( i = 0 ; i < N ; i++) yn += f_high[i] * dly[i];
for( i = N-1 ; i >0 ; i--) dly[i]=dly[i-1];
firdata = (Uint16)(yn>>12);
} else {//si DIP0 et DIP1 ne sont pas actifs, retourner le signal tel quil
est
firdata= (Uint16)inputsample;
}

// Send a sample to the left channel //


while (!DSK6416_AIC23_write(hCodec,firdata));
// Send a sample to the right channel */
while (!DSK6416_AIC23_write(hCodec, firdata));
}
/* Close the codec */
DSK6416_AIC23_closeCodec(hCodec);
}

On Remarque que le filtrage passe-bas ne modifier vraiment pas le signal, tandis que celui de filtrage passe-haut est presque muet.
Ceci est clair lorsquon joue une pice musicale daprs le PC.
Pour une frquence dchantillonnage 96 khz, valeur cutoff normalise 0.25 : la valeur de coupure/cutoff relle sera 12khz qui est dj
largement suprieur aux frquences de paroles voire la plupart des autres instruments musicales.

En dimuniant la frquence dchantillonnage 8khz (directement), soit une valeur de frquence de coupure 1000 khz, le passe haut et le passe
bas sont nettement visible, sauf que la qualit du signal (audio) produit est mdiocre. (Moins dchantillons, prcision perdue)

Remarque
On a essay aussi de modifier le programme pour pouvoir appliquer les 2 filtres en mme temps (if(a){}, if(b){}, if ( !a && !b){}), on peut
couter (pour un signal auditif) un peu daudio ce qui met en vidence la pente quon a dj parl de.

C o m p t e

r e n d u

Page