1
Filtres pa passe-b sse-bas/p as/passe-haut asse-haut
TP n°2
GE3 II TMS 320 C 6416
Objectif
On cherche dans ce TP à implém implémenter enter 2 types ty pes de filtres : filtre passe-bas et f iltre iltre passe-haut sur DSP DSP 6416.L’im 6416. L’implém plémenta entation tion sera en code C pur sur IDE CCS v3.
Rappel sur les Filtres
Un filtre analogue (de passe bas par exemple) exemple) est quasiment, quasiment, théoriquement théoriquement parfait. C’est-àC’est-à-dire, dire, pour le le cas d’un filtre passe-bas, passe-bas, toute v ariation de signal au-dessus au-dessus d’une fréquence bien détermi déte rminée née (fréquence de coupure ), ), ce signal sera supprim supprimé é de cet te variation brusque, ne laissant que les variations v ariations (fréquences) modérées. modérées. La fonction peut être linéaire linéaire et e t ex primé primé en fonction de la variable de Laplace. Laplace. Le signal est continu et infini.
En mode mode numérique, numérique, les choses chose s ne passent pass ent pas comm comme ainsi mentionné mentionné es. D’abord vue sa capacité capa cité d’acquisition des donné es (mémoire, (mémoire, bus etc.) etc .) en plus l’application l’applicat ion envisagé e (de temps réel, ré el, simulation, simulation, etc. ). De plus plus du dilemm dilemme : il n’est pas possible possible de traite traiterr par un sys tème numérique numérique un signal analogique analogique sans la conversion, la notion de la numérisation numérisation du signal es t 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ése représentant ntant la grandeur qu’on souhaite filtrer. Ce filtrer. Ce fichi f ichier er est bien sûr n’im n’importe porte grand qu’il soit, il n’est pas possible possible de l’assumer l’assumer d’être à une v aleur proche proche de l’infini
Pour pouvoir traiter un un signal numérique, numérique, il faut se référe r à N états é tats précédents, ceciéquivaut ceciéquivaut à appliquer une multiplication multiplication du signal avec une fonction rectangle de de largeur pré-program pré-progra mmé.
Le problème problème réside dans l’équivalent spectral spect ral du signal. La multiplication multiplication avec ave c rectangle rect angle en model temporel c’est équivalent équivalent à une convolution avec sinc av ec le spectre du signal
() () × () () ⇋ () () ∗ () () Il f aut obligatoirem obligatoirement ent tenir compte compte de ceci durant le 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 coeff icients doivent être bien choisis et adéquats à la f enêt re du signal (bande du signal à traiter à la fois).
Coeff icients des filtres
Pour trouver les coeff icients des filtres, on se se rt de MATLAB Filtre passe-bas , filtre passe-haut
Filtre
Filtre
Type :
Filtre passebas.
Type :
Filtre passehaut.
Bande fréquentielle :
[01000Hz]pour8000Hzfréq
Fréquence de coupure:
[1000Hz]pour8000Hzfréq
d’échantillonage)
d’échantillonage)
Ordre :
Ordre :
11
11
MATLAB Fir1 sera utilisé pour générer les coefficients d’un filtre .
a FIR1 10 0.25 hanning 11 freqz a b FIR1 10 0.25 'high' freqz b
Ordre du filtre à implémenter (nombre de coefficients/échantillons par block de calcul)
Type de filtre à implémenter
2
Filtre passe-bas Il existe plusieurs méthodes pour réaliser un filtre passe-bas. F IR1(« low ») et FIR1(« Hanining »).
0 0
) B d ( -50 e d u t i n g -100 a M
-150
) B d ( -50 e d u t i n g -100 a M
0
0.1
0.2
0.3 0.4 0.5 0.6 0.7 0.8 Normalized Frequency ( rad/sample)
0.9
1
0 ) s e e r g e d (
0.1
0.2
0.3 0.4 0.5 0.6 0.7 0.8 Normalized Frequency ( rad/sample)
0.9
1
0
0.1
0.2
0.3 0.4 0.5 0.6 0.7 0.8 Normalized Frequency ( rad/sample)
0.9
1
0
e s -400 a h P
-800
0
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)) Réponse fréquentielle FIR1 avec Hanning
C o m p t e
0
) s -200 e e r g e d ( -400 e s a h -600 P
-200
-600
-150
r e n d u
1
FIR1 (10, 0.25 ,
‘low’)
Réponse fréquentielle FIR1 avec triangle
Page
3
Gain
Gain
Fréquence
Fréquence
Filtre passe-bas (avec triangle)
Filtre passe-bas (avec Hanning)
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 f iltre de passe-haut généré 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
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 coef ficients (qui sont de float ) avec un coefficient plus ou moins de large précision.
2
En multipliant avec un nombre de bits ceci est équivalent avec un décalage à gauche. MATLAB
A1 round(a.*(2^12)) B1 round(b.*(2^12))
A1 -13
Taille :
0
157
500
880
1047
880
500
157
0
B1 15
Schéma de liaison
-13
Taille :
0
-123
-446
-844
3084
-844
-446
-123
0
1x11
1x11
15
Sortie Audio PC Entrée haut-parleurs
Haut-parleurs
PC Line in
Line out
C o m p t e
r e n d u
6 1 4 6 P S D e t r a C
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 , 0, 15 }; -844 , -446 , -123 , //
/* * 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 { whil e (! 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 0 ; i--) dly [i]=dly[i-1]; for( i = N-1 ; i > 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]; 0 ; i--) dly [i]=dly[i-1]; for( i = N-1 ; i > 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 // whil e (! DSK6416_AIC23_write (hCodec ,firdata ));
// Send a sample to the right channel */ whil e (! 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 pouv oir 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