Académique Documents
Professionnel Documents
Culture Documents
2
Initiation à la programmation
D’un DSP par le logiciel Code Composer
Studio
3
1.1. Objectifs :
L’objectif principal de ce TP est de maitriser les étapes essentielles pour
développer une application de traitement numérique de signal sur la carte
DSK6713 en utilisant l’environnement de travail Code Composer Studio(CCS).
4
b.2-Ajout de la bibliothèque csl6713.lib :
Cliquer sur Project →Properties → CCS Build → C6000 linker → File search
path → Include library file or ... Click Add and select path
"C:\C6xCSL\lib_3x\csl6713.lib"
5
Le projet étant créé et les bibliothèques ajoutées, il ne reste plus qu’à implémenter
le programme sur CCS :
6
c. Configuration de la cible en simulation :
Double click on Project → TMS320C6713.ccxml
7
Puis en charge le programme vers le cible et en exécute le et le console de la CCS
nous affiche le résultat de la somme des deux nombres comme montre la figure
suivante :
8
Implémentation du filtre FIR sur la carte
DSK6713
9
2.1Objectifs :
Les objectifs de ce TP sont :
Simulation sur Matlab d’un filtre à réponse impulsionnelle finie (RIF).
Implanter ce filtre sur la carte DSK6713
Mesure du temps d’exécution du programme
Réduction du temps d’exécution en utilisant les options du compilateur
Maitriser l’emplacement des données
Nous allons aussi implémenter les transformées de fourrier du signal initial et filtré
et les tracer. Nous allons aussi enregistrer les coefficients du filtre sous forme de
fichier « .dat » ainsi que les échantillons du signal à multiples fréquences afin de
les utiliser dans le CCS et comparer les deux résultats.
10
On voit bien que le signal initial en bleu a été filtré pour donner le signal en
rouge et ce même dans le domaine fréquentiel.
2.2. Implémentation d’un filtre FIR sur la Carte DSK6713 :
11
Il faut reprendre les mêmes étapes que dans les travaux pratiques 1 à savoir la
création du projet et l’ajout des différentes bibliothèques et importer également les
fichiers « .dat » générés par Matlab à savoir le fichier « coeff.dat » qui contient les
coefficients du filtre FIR et « input.dat » qui contient les échantillons du signal à
plusieurs fréquences.
Ceci s’effectue en suivant les étapes suivantes :
Sélectionner le projetfileheader filenom du fichier.h : ceci pour la
création des fichier.h dans le code composer au sein desquels nous allons copier les
données voulues.
Voilà nous avons créé les deux fichier.h comme montre la figure suivante :
12
Nous allons donc créer deux fichier.h (« coeff.h » et « input.h ») dans lesquels
nous allons copier les coefficients dans le premier et les échantillons dans le
deuxième comme il est indiqué dans les deux figures ci-dessous :
Ensuite nous allons créer un fichier « main.c » pour implémenter le programme
principal :
Sélectionner le projetfilesource filenom du fichier.h
13
Ensuite nous allons créer un fichier « main.c » pour implémenter le programme
principal
Puis dans cette étape il faut ajouter les fichiers.h que nous avons déjà créés suivant
ces étapes :
Sélectionner le projetfilesource file nom du fichier.h
14
Et également en « Simulator »
ToolsGraphSingle timeconfiguration manuelle des paramètres
Et voilà l’allure de sortie :
15
Optimisation du filtre FIR sur la carte
DSK6713
16
3.1-Objectifs :
Les objectifs de ce TP sont :
Mesure le temps d’exécution du programme à l’aide du périphérique Timer.
Calcul de l’efficacité du DSP en MAC/cycle.
Réduction du temps d’exécution en utilisant les options du compilateur.
Maitrise de l’emplacement des données.
3.2Travail à réaliser :
a-Mesure le temps d’exécution :
La mesure du temps d’exécution d’un programme faite à l’aide des deux Timers de
32 bits à usage général. Ces deux Timer sont utilisés pour faire le comptage des
cycles d’horloge du DSP.
Nous allons régler ce Timer afin qu’un cycle compté par ce Timer afin qu’un cycle
compté par ce Timer corresponds à 4 cycles CPU. C’est le temps minimum qu’un
Timer peut compter.
Et comme travail à faire on va mesurer le temps d’exécution du filtre FIR, en
suivant ces étapes :
- En sélectionnant notre projet puis en ajoutant la bibliothèque CSL.
- En inclure le fichier csl_timer.h
- En déclare les variables suivantes :
TIMER_Handle hTimer;
Unsigned long int start, stop, overhead, diff;
-En configure le Timer comme suivant :
HTimer=TIMER_open (TIMER_DEVANCY ,0) ;
TIMER_configArgs (hTimer, 0x000002C0 ,0xFFFFFFFF, 0x00000000) ;
-En calculant le temps de Timer par l’ajout des instructions suivant dans le
programme :
Start =TIMER_open (TIMER_DEVANCY, 0);
Stop =TIMER_getCount (hTimer);
Overhead=stop-start;
- En calculant la valeur du Timer avant et après le programme puis en calculant
la différence comme suivant :
17
Start =TIMER_getCount (hTimer);
( Programme FIR)
Stop=TIMER_getCount(hTimer);
Diff=(stop-start)-overhead ;
En suivant toutes les étapes précédente afin de créé le programme final qui calcul
le temps d’exécution d’un filtre FIR comme illustre la figure suivante :
18
b- Calcul de l’efficacité du DSP en MAC/cycle :
L’efficacité d’un DSP en MAC /cycle est le rapport entre le nombre de MAC que
nécessitent théoriquement l’algorithme et le nombre de cycle mesuré pratiquement
après l’exécution de l’algorithme.
19
Alors pour sélectionner un niveau d’optimisation il faut suivre les étapes
suivantes :
Sélectionner le projetproperties Build C6000 compiler Optimization
20
Le niveau d’optimisation est réglé il nous reste que lancé l’exécution du
programme pour calculer le nombre de cycle comme montre la figure suivante :
Alors :
Efficacité = (80 000/3359916) = 0.03089918148
De la même manière pour les autres niveaux d’optimisation et en résume tout dans
le tableau suivant :
Niveau d’optimisation Nombre de cycles mesuré Efficacité en MAC/cycle
off 3358460 0.02405864598
0 2614956 0.03089918148
1 1719748 0.04698362783
2 173504 0.4656953154
3 173504 0.4656953154
21
Pour le 1er essai on a stocké toute les variables et les données (Input, output,
coefficient, et le X-buffer) dans IRAM, puis on lance la simulation et la console
affiche le nombre de cycles correspondant à cet essai.
22
Stockage des donnés Cycle L’efficacité
Input et output : L1 174328 0.461286528.
Coefficients et le X-buffer :L1
Input et output : L2 174356 0.46183040
Coefficients et le X-buffer :L2
Input et output : DRAM 486783 0.018990
Coefficients et le X-
buffer :DRAM
Input et output : DRAM 259316 0.31158894
Coefficients et le X-buffer :L1
Input et output : L1 4167560 0.0193901
Coefficients et le X-
buffer :DRAM
Les meilleures performances sont obtenues lorsque tous les coeff, X-buffer, input
output sont stocker dans la mémoire interne L1 ou L2.
Sinon stocker en externe l’input et l’output et les coefficients et X-buffer en interne
parce qu’ils sont beaucoup utilisés.
23
Implémentation et Optimisation du filtre IIR
sur la carte DSK6713
24
4.1-Objectifs :
Les objectifs de ce TP sont :
Simuler sur MATLAB un filtre à réponse impulsionnelle infinie RII.
Implémenter ce filtre sur la carte DSK6713.
Comparer les résultats obtenus par matlab et celles obtenus par la carte.
Optimisation du temps d’exécution.
25
On recoure vers ccs :et après avoir obtenu les coefficients d’après MATLAB on
compare entre le traitement fait à base du simulator et le traitement fait à base de la
carte DSK6713.
On la programmer pour realiser cette tache :
#include <stdio.h>
#include "coef_IIR.h"
#include "input.h"
#include "math.h"
#include "output_ref.h"
#include "csl_timer.h"
float output[H];
TIMER_Handle hTimer;
unsigned long int start,stop,overhead,diff;
26
#pragma DATA_SECTION(input, ".input_DATA");
#pragma DATA_SECTION(output, ".output_DATA");
#pragma DATA_SECTION(coef_a, ".coef_a_DATA");
#pragma DATA_SECTION(coef_b, ".coef_b_DATA");
#pragma DATA_SECTION(x_buffer, ".x_buffer_DATA");
#pragma DATA_SECTION(y_buffer, ".y_buffer_DATA");
void main ()
{
hTimer=TIMER_open(TIMER_DEVANY,0);
TIMER_configArgs(hTimer,0x000002C0,0xFFFFFFFF,0X00000000);
start=TIMER_getCount(hTimer);
stop=TIMER_getCount(hTimer);
overhead=stop-start;
printf("Start prog");
int i;
for (i=0;i<N;i++) {
x_buffer[i]= 0;
y_buffer[i]= 0;
}
for (i=0;i<H;i++)
output[i]=filtre_IIR(input[i]);
stop= TIMER_getCount(hTimer);
diff=(stop-start)-overhead;
printf("End prog");
printf("le nombre de cycle est %d : cycles \n",diff*4);
TIMER_close(hTimer);
27
int compt=0;
float err;
for (i=0;i<H;i++)
{
err= abs(output[i]-output_ref[i]);
if(err> 0.0001)
{
compt++;
}
printf("compt = %f",compt);
y_buffer[1]=yn;
return yn;
}
28
On aura les résultats suivants :
Le signal filtré :
29
Le signal de sortie de référence :
On remarque que les deux figures de sortie sont presque les mêmes.
Maintenant on essaye de faire la même chose mais en exécutant le programme
dans la carte :
Le signal INPUT dans la carte :
30
Le signal OUTPUT de la carte :
31
Ces résultats là sont obtenus en fournissant les coefficients suivant obtenus par
Matlab au programme compilé par le CCS et la carte :
32
Niveau Nombre de cycle Efficacité Temps d’exécution
Off 3358148 0.003 14.9ms
0 2315740 0.0039 11.61ms
1 1720544 0.006 7.63ms
2 173376 0.069 0.769ms
3 173376 0.069 0.769ms
33
FILTRAGE EN TEMPS REEL D’UN SIGNAL
AUDIO PAR LE DSP TMS 320C6713
34
5.1-Objectifs :
t=0:Te:Tm-Te;
f=0:1/Tm:Fe-1/Tm;
X=fft(x);
X1=fft(x1);
[b,a]=butter(N,fc3/(Fe/2),'stop');
y=filter(b,a,x1);
figure(2);
subplot(3,2,1);
plot(t,x1); title('signal temporel x avant filtrage');
xlabel('le temps');
subplot(3,2,3);
plot(t,y,'r'); title('signal temporel x apres filtrage');
xlabel('le temps');
X=fft(x);
Y=fft(y);
subplot(3,2,2);
plot(f,X1,'b');
xlabel('fréquence');
title('signal x avant filtrage');
35
subplot(3,2,4);
plot(f,Y,'r');
xlabel('fréquence');
title('signal x après filtrage');
subplot(3,2,5);
plot(t,x,'g');
title('signal original du son');
subplot(3,2,6);
plot(f,X,'g');
title('spectre du signal original');
p1= audioplayer (y, Fe);
play (p1);
fid1=fopen('coef_b.dat','w');
for i=1:2*N+1
fprintf(fid1,'%.10f,\n',b(i));
end
fclose(fid1);
fid2=fopen('coef_a.dat','w');
for i=1:2*N+1
fprintf(fid2,'%.10f,\n',a(i));
end
fclose(fid2);
imp=[1,zeros(1,M-1)];
h = filter(b,a,imp);
H=fft(h);
figure
subplot(2,1,1)
plot(t,h);
subplot(2,1,2)
plot(f,20*log10(H));
36
37
Après avoir lancé ce code on a eu :
Après on a essayé de faire la même chose mais cette fois avec le CCS :
On a saisi le code convenable pour cette opération :
#include <stdio.h>
#include "math.h"
#include "coef_IIR.h"
#include "csl_timer.h"
38
float y_buffer [N+1] ;
float filtre_IIR (float xn);
TIMER_Handle hTimer;
unsigned long int start,stop,overhead,diff;
#include "dsk6713.h"
#include "dsk6713_aic23.h"
DSK6713_AIC23_Config config = {
0x0017,
0x0017,
0x01f9,
0x01f9,
0x0011,
0x0000,
0x0000,
0x0043,
0x0081,
0x0001,
};
Uint32 buff;
Int16 buff2;
Int16 y;
float filtre_in;
float filtre_out;
void main() {
DSK6713_AIC23_CodecHandle hCodec;
DSK6713_init();
hCodec = DSK6713_AIC23_openCodec (0,&config);
hTimer=TIMER_open(TIMER_DEVANY,0);
TIMER_configArgs(hTimer,0x000002C0,0xFFFFFFFF,0X000
00000);
start=TIMER_getCount(hTimer);
stop=TIMER_getCount(hTimer);
overhead=stop-start;
39
while(1)
{
while(!DSK6713_AIC23_read(hCodec,&buff));
start = TIMER_getCount (hTimer);
buff2=(Int16)buff;
filtre_in =(float)buff2;
filtre_out =filtre_IIR(filtre_in);
y=(Int16)filtre_out;
stop= TIMER_getCount(hTimer);
diff=(stop-start)-overhead;
while (!DSK6713_AIC23_write(hCodec, y));
while (!DSK6713_AIC23_write(hCodec, y));
y_buffer[1]=yn;
return yn;
}
40
Cela est faites avec les coefficients obtenus par Matlab : qui sont comme c’est de
suit :
41