Vous êtes sur la page 1sur 6

1

Kal l e l A hm e d Y ahi a
TP n°2 Filtres passe-bas/passe-haut Raboudi H am za

GE3 II
TM S 320 C 6416

Objectif 
On cherche dans ce TP à implémenter 2 types de filtres : filtre passe-bas et filtre passe-haut sur DSP 6416. L’implémentation sera en code C
pur sur IDE CCS v3.

Rappel sur les Filtres 

Un filtre analogue (de passe bas par exemple) est quasiment, théoriquement parfait.

C’est-à-dire, pour le cas d’un filtre passe-bas, toute variation de signal au-dessus d’une fréquence bien
déterminée (fréquence de coupure), ce signal sera supprimé de cette variation brusque, ne laissant que
les variations (fréquences) modérées.

La fonction peut être linéaire et exprimé en fonction de la variable de Laplace. Le signal est continu et
infini.

En mode numérique, les choses ne passent pas comme ainsi mentionnées. D’abord vue sa capacité
d’acquisition des données (mémoire, bus etc.) en plus l’application envisagée (de temps réel, simulation,
etc.). De plus du dilemme : il n’est pas possible de traiter par un système numérique un signal
analogique sans la conversion, la notion de la numérisation du signal est née.

La numérisation du signal, permettant à la fin d’acquérir le signal ainsi à traiter sera sous forme d’un
fichier (ensemble/tableau) de chiffres entiers représentant la grandeur qu’on souhaite filtrer. Ce fichier
est bien sûr n’importe grand qu’il soit, il n’est pas possible de l’assumer d’être à une valeur proche de
l’infini

Pour pouvoir traiter un signal numérique, il faut se référer à N états précédents, ceci équivaut à
appliquer une multiplication du signal avec une fonction rectangle de largeur pré-programmé.

Le problème réside dans l’équivalent spectral du signal.

La multiplication avec rectangle en model temporel c’est équivalent à une convolution avec sinc avec le
spectre du signal

𝑥(𝑡) × 𝑟𝑒𝑐𝑡(𝑡) ⇋ 𝑋(𝑓) ∗ 𝑠𝑖𝑛𝑐(𝑓)

Il faut obligatoirement tenir compte de ceci durant le filtrage.

Filtre numérique

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


Filtre numérique

C o m p t e r e n d u Page
2

Chaque filtre numérique possède des coefficients de pondération à appliquer sur le signal qu’on désire traiter (dit signal d’entré).

Les coefficients doivent être bien choisis et adéquats à la fenêtre 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 Filtre

Type : Filtre passe bas. Type : Filtre passe haut.

Bande fréquentielle : [0 1000Hz] pour 8000Hz fréq Fréquence de coupure : [1000Hz] pour 8000Hz fréq
d’échantillonage) d’échantillonage)
Ordre : 11 Ordre : 11

MATLAB
Fi l t r e p asse b as
a= FIR1( 10, 0.25, hanning(11)) Fir1 sera utilisé pour
freqz( a) générer les coefficients
d’un filtre .
b= FIR1( 10, 0.25, 'high')
freqz( b)
de gré e
v al e u r Ordre du filtre à
de gré e
Type de filtre à 𝐹𝑐𝑜𝑢𝑝𝑢𝑟𝑒 implémenter (nombre de
implémenter 𝐹𝑒 coefficients/échantillons
2 par block de calcul)

Filtre passe-bas

Il existe plusieurs méthodes pour réaliser un filtre passe-bas. FIR1(« low ») et FIR1(« Hanining »).

0
0
Magnitude (dB)

-50
Magnitude (dB)

-50

-100
-100

-150
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 -150
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Normalized Frequency ( rad/sample) Normalized Frequency (  rad/sample)
0 0
Phase (degrees)

Phase (degrees)

-200
-200
-400
-400
-600

-600 -800
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Normalized Frequency (  rad/sample)
Normalized Frequency ( rad/sample)

FIR1(10, 0.25, hanning(11)) FIR1(10, 0.25, ‘low’)

Réponse fréquentielle Réponse fréquentielle


FIR1 avec Hanning FIR1 avec triangle

C o m p t e r e n d u Page
3

Gain Gain

Fréquence Fréquence

Filtre passe-bas (avec Hanning) Filtre passe-bas (avec triangle)

L’utilisation de Hanning permet de réduire les ondulations, mais en contrepartie la transition (coupure) a une pente lente .

Filtre passe-haut

Réponse fréquentielle d’un filtre de passe-haut généré par MATLAB

Coefficients

a Taille : 1x11

-0.003084 2.4918e-18 0.038368 0.12208 0.21478 0.25569 0.21478 0.12208 0.038368 2.4918e-18 -0.0030842

b Taille : 1x11

0.0036158 -8.212e-18 -0.02997 -0.10901 -0.20614 0.75303 -0.20614 -0.10901 -0.02997 -8.212e-18 0.0036158

C o m p t e r e n d u Page
4

Coefficients pour C6416

Vu son architecture Fixed-point, le C6416 doit émuler toute instruction de nombres décimaux.

Pour éviter tout problème, on multiplie les coefficients (qui sont de float ) avec un coefficient plus ou moins de large précision.

En multipliant avec un nombre de 2𝑛 bits ceci est équivalent avec un décalage à gauche.

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

A1 Taille : 1x11

-13 0 157 500 880 1047 880 500 157 0 -13

B1 Taille : 1x11

15 0 -123 -446 -844 3084 -844 -446 -123 0 15

Schéma de liaison 
Sortie Audio PC

Entrée haut-parleurs

Haut-parleurs

PC

Line in
Carte DSP 6416

Line out

C o m p t e r e n d u 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 après 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
6

} 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 qu’il
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 lorsqu’on joue une pièce musicale d’après le PC.

Pour une fréquence d’échantillonnage 96 khz, à valeur cutoff normalisée 0.25 : la valeur de coupure/cutoff réelle sera 12khz qui est déjà
largement supérieur aux fréquences de paroles voire la plupart des autres instruments musicales.

En dimuniant la fréquence d’échantillonnage à 8khz (directement), soit une valeur de fréquence de coupure 1000 khz, le passe haut et le passe
bas sont nettement visible, sauf que la qualité du signal (audio) produit est médiocre. (Moins d’échantillons, précision perdue)

Remarque

On a essayé aussi de modifier le programme pour pouvoir appliquer les 2 filtres en même temps (if(a){}, if(b){}, if ( !a && !b){}), on peut
écouter (pour un signal auditif) un peu d’audio ce qui met en évidence la pente qu’on a déjà parlé de.

C o m p t e r e n d u Page

Vous aimerez peut-être aussi