compte rendu tp dsp 2
DESCRIPTION
Compte rendu du TP DSP 2, Filtrage numérique (d'un fichier son) à l'aide d'un microprocesseur DSP TMS320 C6416. Ce TP a été réalisé à l'ENIS en 2015TRANSCRIPT
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 1/6
C o m p t e r e n d u P a g e
TP n°2 Filtres passe-bas/passe-haut
TMS 320 C 6416
Objectif On cherche dans ce TP à implémenter 2 types de filtres : filtre passe-bas et f iltre 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 f ichierest 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
GE3 II
Ka l l e l Ahmed Yahia
Raboudi Hamza
Filtre numérique
x[k] y[k] = x[k] * h[k]
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 2/6
C o m p t e r e n d u P a g e
Chaque filtre numérique possède des coeff icients 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 fenêtre du signal (bande du signal à traiter à la fois).
Coeff icients des filtres
Pour trouver les coeff icients des filtres, on se sert de MATLAB
Filtre passe-bas , filtre passe-haut
MATLAB
a=FIR1 10, 0.25, hanning 11))
freqz a)
b=FIR1 10, 0.25, 'high')
freqz b)
Filtre passe-bas
Il existe plusieurs méthodes pour réaliser un filtre passe-bas. FIR1(« low ») et FIR1(« Hanining »).
Réponse fréquentielle Réponse fréquentielle
FIR1 avec Hanning FIR1 avec triangle
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-600
-400
-200
0
Normalized Frequency ( rad/sample)
P h a s e ( d e g r e e s )
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-150
-100
-50
0
Normalized Frequency ( rad/sample)
M a g n i t u d e
( d B )
Filtre
Type : Filtre passebas.
Bande fréquentielle : [01000Hz]pour8000Hzfréq
d’échantillonage)
Ordre : 11
Filtre
Type : Filtre passehaut.
Fréquence de coupure: [1000Hz]pour8000Hzfréq
d’échantillonage)
Ordre : 11
i l t re passe bas
Fir1 sera utilisé pour
générer les coefficients
d’un filtre .
d e g r é e
Ordre du filtre à
implémenter (nombre de
coefficients/échantillons
par block de calcul)
va l eur
2
d e g r é e
Type de filtre à
implémenter
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-800
-600
-400
-200
0
Normalized Frequency ( rad/sample)
P h a s e ( d e g r e e s )
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-150
-100
-50
0
Normalized Frequency ( rad/sample)
M a g n i t u d e ( d B
)
FIR1(10, 0.25, hanning(11)) FIR1(10, 0.25, ‘low’)
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 3/6
C o m p t e r e n d u P a g e
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
-0.003084 2.4918e-18 0.038368 0.12208 0.21478 0.25569 0.21478 0.12208 0.038368 2.4918e-18 -0.0030842
0.0036158 -8.212e-18 -0.02997 -0.10901 -0.20614 0.75303 -0.20614 -0.10901 -0.02997 -8.212e-18 0.0036158
Filtre passe-bas (avec Hanning)
Gain Gain
Fréquence Fréquence
Filtre passe-bas (avec triangle)
a
b
Taille : 1x11
Taille : 1x11
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 4/6
C o m p t e r e n d u P a g e
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))
-13 0 157 500 880 1047 880 500 157 0 -13
15 0 -123 -446 -844 3084 -844 -446 -123 0 15
Schéma de liaison
A1Taille : 1x11
B1Taille : 1x11
Sortie Audio PC
Entrée haut-parleurs
Line in
Line out
PC
C a r t e
D S P
6 4 1 6
Haut-parleurs
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 5/6
C o m p t e r e n d u P a g e
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 matlabshort 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
7/21/2019 Compte Rendu TP DSP 2
http://slidepdf.com/reader/full/compte-rendu-tp-dsp-2 6/6
C o m p t e r e n d u P a g e
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.
} 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’ilest
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);
}