Sie sind auf Seite 1von 3

Master Spécialisé SEIB

Systèmes Embarqués et Ingénierie Biomédicale


2ème Année 2019/2020
Pr. Rachid LATIF

Examen de Rattrapage de Programmation


Parallèle OpenCL
Durée : 4h - Documents autorisés - Salle K5
Mercredi 15 Janvier 2020, 8h30 – 12h30
ANNEXE (Figure 5 : Code en C/C++)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
int sb[8],g[8],cnv[8];
double t[1024], d[8], c[8];
FILE *myfile;
double myvariable;
char rti[8];
int i;
//______________________________ Block 1 ____________________________________________________
////////////////// Partie est dédiée au calcul de nombre de bits dans la sortie /////////////////
int nbrECGdata(double *a) {
int nbr=0; /// nbr : variable contient le nombre de bits pour le codage de chaque valeur de ECG
/// Elle varie entre 4 et 8
for(i=0;i<8;i+=2){
if(((a[i]*100)+a[i+1])<255){ // si la valeur de a[i]*100)+a[i+1])<255 alors il faut réserver 1 bit
nbr++;
}else if(((a[i+1]*100)+a[i])<255){ /// si a[i+1]*100)+a[i])<255 est vraie alors il faut réserver un 1 bit
sinon il faut réserver 2 bits
nbr++;
}else{
nbr++;
nbr++;
}
printf("tour %i equation1 =%f \t",i,((a[i]*100)+a[i+1]));
printf("equation2 =%f \t",((a[i+1]*100)+a[i]));
printf(" nbr='%i' \n\n",nbr);
}
return nbr;
}
//______________________________ Block 2 ___________________________________________________
//////////////////// Partie de l’application de la normalisation ////////////////////////////
void normalization(double *c, double *ecgdata, int *cnv, int *g) {
FILE *myfile2;
myfile2=fopen("ECGsortie.txt", "w");
char ascciChar;
int ii;
int n=0,ecg=0;
if(c[0]>200){ /// Test sur le bits 1 de fenêtrage si <200 ou > 200 pour appliquer la normalisation
ii=c[0]/200;
c[0]=(int)c[0]%200;
}
/// Partie de regroupement ///////////////////////
for(i=0;i<7;i+=2){
if(((c[i]*100)+c[i+1])<255){
printf("\n\n\n groupement direct");
ecgdata[ecg]=(c[i]*100)+c[i+1];
ascciChar=ecgdata[ecg];
fprintf(myfile2, "%c", ascciChar);
g[i]=0; /// si nous avons un groupement direct, il faut donc affecter 01
g[i+1]=1;
}else if(((c[i+1]*100)+c[i])<255){
printf("\n\n\n groupement inverse");
ecgdata[ecg]=(c[i+1]*100)+c[i];
ascciChar=ecgdata[ecg];
fprintf(myfile2, "%c", ascciChar);
g[i]=1; /// si nous avons un groupement inverse, il faut donc affecter 10
g[i+1]=0;
}else{
printf("\n\n\n aucun groupement");
ecgdata[ecg]=c[i];
ecgdata[ecg+1]=c[i+1];
ascciChar=ecgdata[ecg];
fprintf(myfile2, "%c", ascciChar);
ascciChar=ecgdata[ecg+1];
fprintf(myfile2, "%c", ascciChar);
ecg++;
g[i]=0; /// si pas de regroupement, il faut garder alors 00
g[i+1]=0;
}
if((c[i]>99) || (c[i+1])>99){
cnv[n]=1;
}else{
cnv[n]=0;
}
ecg++;
n++;
}
fclose(myfile2);
printf("\n\n\n c[0] = [%f]\t ii = %i \n\n",c[0],ii);
}
//______________________________ Block 3 ___________________________________________________
///////////////////////////// Génération de bits de signe ///////////////////////////////////
void dTest(double d[], int sb[], double a[8]){
for(i=0;i<8;i++){
if(d[i]<0){ /// ici après l'application de delta: si la valeur est positive alors sb égal 1 sinon il faut
multiplier par 1000
sb[i]=1;
}else{
sb[i]=0;
}
a[i]=fabs(d[i])*1000;
}
/// pour afficher le test
for(i=0;i<8;i++){
printf("D[%i] = [%f]\t SB[%i] = [%i] \t C[%i]= [%f]\n\n",i,d[i],i,sb[i],i,a[i]);
}
}
//______________________________ Block 4 ___________________________________________________
////////////////////// Block relatif au fenêtrage 8 par 8 et le codage delta ////////////////////////
void huitparhuit(double t[], double d[], int sb[], double c[],int *cnv){
int g[8];
for(i=0;i<1024;i=i+8){
d[0]=t[i];
d[1]=t[i+1]-t[i]; /// Application du codage delta
d[2]=t[i+2]-t[i+1];
d[3]=t[i+3]-t[i+2];
d[4]=t[i+4]-t[i+3];
d[5]=t[i+5]-t[i+4];
d[6]=t[i+6]-t[i+5];
d[7]=t[i+7]-t[i+6];
dTest(d,sb,c);
int nbr=nbrECGdata(c);
double ecgdata[nbr];
normalization(c,ecgdata,g,cnv);
for(i=0;i<nbr;i++){
printf("ecgData[%i] = [%lf] \n",i,ecgdata[i]);
}
}
}
//______________________________ Fonction principale ____________________________________________
int main(void)
{
myfile=fopen("ECG2.txt", "r");
for(i = 0; i < 1024; i++) {
fseek(myfile, 17+(i*25), SEEK_SET); /// Séparation de ligne pour prendre seulement la deuxième ligne
fscanf(myfile,"%lf",&myvariable);
//printf("%.3f ",myvariable);
t[i]=myvariable; /// Affectation de ligne des valeurs vers un tableau
printf("\n");
}
fclose(myfile);
huitparhuit(t,d,sb,c,cnv); /// Fonction de fenêtrage et application de l'algorithme
for(i=0;i<4;i++){
printf("cnv[%i] = [%i] \n",i,cnv[i]);
}
for(i=0;i<8;i++){
printf("G[%i] = [%i] \n",i,g[i]);
}
for(i=0;i<1024;i++){
printf("T[%i] = [%.3f] \n",i,t[i]);
break;
}
}