#include "diabolo.h" #include "acqui.h" #include "fourier.h" void spectreRMS(double *y,int n); void fou(int n_fou,double*t_fou,int bolo); double* t_fou=0L; int i=0; int k,n=0; double ff,qq; int indfen=0; int fenet[100]; // foufou crée un tableau de doubles qui contiendra k traces et k transformees de fourier // ou k est le niombre de bolos : k=nb_max_bolo // trace bolo j : y[i]=t_fou[(n+10)*j+i]; // fourier bolo j : y[i]=t_fou[(n+10)*k+(n+10)*j+i]; // gg->flag_fou est le flag qui contient 0 si rien ne se passe ou une transformee en memoire // 1 s'il faut initialiser la transformee // 2 si une transformee est en cours // foufou est apelle si flag>0 // ces deux definitions ne marchent que si n (nb de pts pour fourier) et k (nombre de bolo) sont connus //#define tr(j,i) t_fou[((n)+10)*(j)+(i)] //#define fo(j,i) t_fou[((n)+10)*k+((n)+10)*(j)+(i)] #define tr(k,n,j,i) t_fou[((n)+10)*(2*(j))+(i)] #define fo(k,n,j,i) t_fou[((n)+10)*(2*(j)+1)+(i)] void foufou() { int j; if(gg->flag_fou==1) // initialisation { if(!fenetre(fenetre_fourier)) ouvreD(fenetre_fourier,fourier_id,"transformée de fourier",exec_fourier); else {select(fenetre_fourier);exec_fourier(fenetre_fourier,ouverture,0L);} return; } if((i % 10)==0) ecritD(fenetre_fourier,f_message,"prise de donnee: %d",i); for(j=0;jn) { // fin de prise de donnees char ss[256]; double m1,mm; gg->flag_fou=0; for(j=0;jperiode_echantillonage; printf("echantillonage=%g msec , ",qq*1000.); qq=n*qq; printf("temps total=%6.2f sec \n",qq); if(qq>1) ff=1./qq;else ff=1.; printf("unité de frequence : %6.2f mHz \n",ff*1000.); qq=sqrt(qq); ecritD(fenetre_fourier,f_message,"f=%5.2f,%4.1f Hz",ff*10.,ff*(double)n/8 ); printf("\n bruit des bolos entre f=%5.2f et f=%5.1f \n\n",ff*10.,ff*(double)n/8); ss[0]=0; for(j=0;j1) mm=1000.*qq*mm/m1; printf("%s: %5.1f nV\n",parametr.nom_coef[parametr.bolo[j].numero_nom_coef].bolo_nom,mm); if(strlen(ss)<200) sprintf(ss+strlen(ss),"%s: %5.1f nV\r",parametr.nom_coef[parametr.bolo[j].numero_nom_coef].bolo_nom,mm); if(strlen(ss) > 240) erreur("dans fourier, string trop long "); } ecritD(fenetre_fourier,f_resu,ss); printf("\n"); } } //-------------------- fonction exec de la fenetre : fourier ------------------------------- void exec_fourier(int fen,int item,double valeur,...) { int f; int j; char ss[256]; double m; if(item>1000) item-=1000; // pour appeler le case pour tous les cara d'un edit texte switch(item) { case ouverture : //j=litD(fenetre_acquisition,e_nb_pts,0L); j=litD(fenetre_fourier,f_nb_pts,0L); for(n=64;n<=j;n*=2) {}; n=n/2; // n est le nombre de points de la transformée k=nb_max_bolo; // k est le nombre de bolos if(t_fou) free(t_fou); t_fou=malloc((n+10)*2*k*sizeof(double)); printf(" malloc pour le tableau t_fou avec %d octets \n",2*k*(n+10)*sizeof(double)); changecontrole(fenetre_fourier,f_bolo,1,k,idem,idem,idem,""); i=0; // compteur de prise de données ecritD(fenetre_fourier,f_resu,""); gg->flag_fou=2; break; case fermeture : gg->flag_fou=0; while(indfen) {indfen--;if(fenetre(fenet[indfen])) ferme(fenet[indfen]);} if(t_fou) {free(t_fou);t_fou=0;} break; case f_calcule : gg->flag_fou=1; break; case f_fourier : j=litD(fen,f_bolo,0)-1; if( (j<0) ou (j>=k) ) j=0; sprintf(ss,"fourier bolo %d ",j+1); f=ouvreD(0,0,ss,0L); if(indfen<90) {fenet[indfen]=f;indfen++;} selectgra(f); strcpy(graph->xtitre,"Hz"); strcpy(graph->ytitre,"nV/sqrt(Hz)"); graph->xlog=1; graph->ylog=1; graph->xmin=litD(fen,f_xmin,0); graph->xmax=litD(fen,f_xmax,0); graph->ymin=litD(fen,f_ymin,0); graph->ymax=litD(fen,f_ymax,0); graph->grille=1; efface(f); for(i=1;i<=(n/2);i++) trace(f,ff*(double)i,1000.*qq*fo(k,n,j,i)); /* en µV / ˆ Hz */ break; case f_trace : j=litD(fen,f_bolo,0)-1; if( (j<0) ou (j>=k) ) j=0; sprintf(ss,"trace bolo %d ",j+1); f=ouvreD(0,0,ss,0L); if(indfen<90) {fenet[indfen]=f;indfen++;} selectgra(f); graph->ymax=litD(fen,f_traceymax,0); graph->ymin=-litD(fen,f_traceymax,0); graph->ypas=litD(fen,f_traceymax,0)/4.; graph->grille=1; strcpy(graph->xtitre,"sec"); strcpy(graph->ytitre,"µV"); efface(f); m=0; for(i=1;i<=n;i++) m+=tr(k,n,j,i); for(i=1;i<=n;i++) trace(f,gg->periode_echantillonage*(double)i,tr(k,n,j,i)-m/(double)n); autox(f); break; default : break; } }