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; } }