| [637] | 1 | #include "diabolo.h"
 | 
|---|
 | 2 | #include "bolo.h"
 | 
|---|
 | 3 | #include "onde.h" 
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | 
 | 
|---|
 | 6 | static long x0=0;
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | typedef struct
 | 
|---|
 | 9 |         {
 | 
|---|
 | 10 |         double tech;            //      temps d'échantillonage
 | 
|---|
 | 11 |         double s,f,w;           //      sigma, frequence, pulsation
 | 
|---|
 | 12 |         int lg;                         //  demi largeur de l'ondelette en points
 | 
|---|
 | 13 |         double *or;                     //      pointeur sur la table contenant l'ondelette (cos)
 | 
|---|
 | 14 |         double *oc;                     //      pointeur sur la table contenant l'ondelette (sin)
 | 
|---|
 | 15 |         }ondestruct;
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | 
 | 
|---|
 | 18 | void    calonde(void);
 | 
|---|
 | 19 | void    ondelette(int init,double* y);
 | 
|---|
 | 20 | 
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 | ondestruct mononde;
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | 
 | 
|---|
 | 25 | void exec_ondelette(int fen,int item,double valeur,...)
 | 
|---|
 | 26 | {
 | 
|---|
 | 27 | static double y[nb_max_bolo];
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | int  j;
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | switch(item)
 | 
|---|
 | 32 |     {
 | 
|---|
 | 33 |     case ouverture      :       gg->trace_ouvert=gg->trace_ouvert | 8 ; 
 | 
|---|
 | 34 |                                                 mononde.or=0;
 | 
|---|
 | 35 |                                                 mononde.oc=0;
 | 
|---|
 | 36 | 
 | 
|---|
 | 37 |                                         selectgra(fen);
 | 
|---|
 | 38 |                                         graph->ymin=0;
 | 
|---|
 | 39 |                                                 graph->ymax=1000;
 | 
|---|
 | 40 |                                         graph->ypas=100;
 | 
|---|
 | 41 |                                         strcpy(graph->ytitre,"nV/sqr(Hz)");
 | 
|---|
 | 42 |                                         graph->xmax=200;
 | 
|---|
 | 43 |                                         graph->xpas=20;
 | 
|---|
 | 44 |                                                 graph->taille_graduations=7;
 | 
|---|
 | 45 |                                         graph->sans_image=1;
 | 
|---|
 | 46 | //                                              graph->flag_tracen=0;
 | 
|---|
 | 47 | //                                              for(j=0;j<nb_max_bolo;j++)      if(gg->bolo_type[j])    graph->flag_tracen+=(1<<j);
 | 
|---|
 | 48 |                                 
 | 
|---|
 | 49 |                                 ondelette(1,y);
 | 
|---|
 | 50 |                                 
 | 
|---|
 | 51 |                                 
 | 
|---|
 | 52 |                                 break;
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 |     case fermeture :    gg->trace_ouvert=gg->trace_ouvert & (255-8);            // enleve le 8
 | 
|---|
 | 55 |                                 ondelette(2,y);
 | 
|---|
 | 56 |                                         break;
 | 
|---|
 | 57 |                 
 | 
|---|
 | 58 |         case ond_sigma :
 | 
|---|
 | 59 |         
 | 
|---|
 | 60 |                                                 {
 | 
|---|
 | 61 |                                                 int i;
 | 
|---|
 | 62 |                                                 ondelette(1,y);
 | 
|---|
 | 63 |                                                 efface(fen);
 | 
|---|
 | 64 |                                                 graph->couleur_trace=rouge;
 | 
|---|
 | 65 |                                                 style(fen);
 | 
|---|
 | 66 |                                                 for(i=0;i<2*mononde.lg;i++)
 | 
|---|
 | 67 |                                                         {
 | 
|---|
 | 68 |                                                         trace(fen,mononde.tech*i,mononde.or[i]);
 | 
|---|
 | 69 |                                                         }
 | 
|---|
 | 70 |                                                 graph->couleur_trace=bleu;
 | 
|---|
 | 71 |                                                 style(fen);
 | 
|---|
 | 72 |                                                 for(i=0;i<2*mononde.lg;i++)
 | 
|---|
 | 73 |                                                         {
 | 
|---|
 | 74 |                                                         trace(fen,mononde.tech*i,mononde.oc[i]);
 | 
|---|
 | 75 |                                                         }
 | 
|---|
 | 76 |                                                 graph->couleur_trace=vert;
 | 
|---|
 | 77 |                                                 style(fen);
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 |                                                 }
 | 
|---|
 | 80 | 
 | 
|---|
 | 81 |                                                 break;
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 |         case ond_frequ: ondelette(1,y);
 | 
|---|
 | 84 |                                         break;
 | 
|---|
 | 85 |                  
 | 
|---|
 | 86 |         case ond_raz :  gg->temps_origine=gg->temps_cntl;       efface(fen);
 | 
|---|
 | 87 |                                 break;
 | 
|---|
 | 88 |                  
 | 
|---|
 | 89 |                  
 | 
|---|
 | 90 |         case    0       :       for(j=0;j<nb_max_bolo;j++)      y[j]=xbol(j);
 | 
|---|
 | 91 |                                         ondelette(0,y);
 | 
|---|
 | 92 |                                         break;
 | 
|---|
 | 93 |                 
 | 
|---|
 | 94 |         
 | 
|---|
 | 95 |     default     :   break;
 | 
|---|
 | 96 |     }
 | 
|---|
 | 97 | }
 | 
|---|
 | 98 | 
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 | /*
 | 
|---|
 | 101 | 
 | 
|---|
 | 102 | double valtest(int i);
 | 
|---|
 | 103 | double valtest(int i)
 | 
|---|
 | 104 | {
 | 
|---|
 | 105 | double x;
 | 
|---|
 | 106 | x=random(0);
 | 
|---|
 | 107 | if( (i>3000) && (i<5000) ) x+=0.5*sin(i*0.5);
 | 
|---|
 | 108 | if(i>7000)  x*=2;
 | 
|---|
 | 109 | return(x);
 | 
|---|
 | 110 | }
 | 
|---|
 | 111 | 
 | 
|---|
 | 112 | */
 | 
|---|
 | 113 | 
 | 
|---|
 | 114 | 
 | 
|---|
 | 115 | void ondelette(int init,double* y)
 | 
|---|
 | 116 | {
 | 
|---|
 | 117 | static int mpos;
 | 
|---|
 | 118 | static double *mm[nb_max_bolo];
 | 
|---|
 | 119 | static flag_init=0;
 | 
|---|
 | 120 | int i,j;
 | 
|---|
 | 121 | double vr,vc;
 | 
|---|
 | 122 | double x;
 | 
|---|
 | 123 | static double yo[nb_max_bolo];
 | 
|---|
 | 124 | if(init)                        // init==1 pour initialisation    //  init==2 pour free
 | 
|---|
 | 125 |         {
 | 
|---|
 | 126 |         
 | 
|---|
 | 127 |         if(flag_init==4)        {flag_init=1;for(j=0;j<nb_max_bolo;j++) if(mm[j]) free(mm[j]);flag_init=0;}
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 |         if( (init==1) && (flag_init==0) )
 | 
|---|
 | 130 |                 {
 | 
|---|
 | 131 |                 flag_init=2;
 | 
|---|
 | 132 |                 mononde.tech=gg->periode_echantillonage;
 | 
|---|
 | 133 |                 mononde.s=litD(fenetre_ondelette,ond_sigma,0);
 | 
|---|
 | 134 |                 mononde.f=litD(fenetre_ondelette,ond_frequ,0);
 | 
|---|
 | 135 |                 calonde();
 | 
|---|
 | 136 |                 for(j=0;j<nb_max_bolo;j++)
 | 
|---|
 | 137 |                         {
 | 
|---|
 | 138 |                         mm[j]=malloc(2*mononde.lg*sizeof(double));
 | 
|---|
 | 139 |                         for(i=0;i<2*mononde.lg;i++)     mm[j][i]=0;
 | 
|---|
 | 140 |                         yo[j]=0;
 | 
|---|
 | 141 |                         }
 | 
|---|
 | 142 |                 mpos=0;
 | 
|---|
 | 143 |                 flag_init=4;
 | 
|---|
 | 144 |                 }
 | 
|---|
 | 145 |         }
 | 
|---|
 | 146 | 
 | 
|---|
 | 147 | if ( (!init) && (flag_init==4) )
 | 
|---|
 | 148 |         {
 | 
|---|
 | 149 | 
 | 
|---|
 | 150 |         for(j=0;j<nb_max_bolo;j++)      mm[j][mpos]=y[j];
 | 
|---|
 | 151 |                                                 
 | 
|---|
 | 152 | 
 | 
|---|
 | 153 |         if(mpos % (mononde.lg/10) ==0 )
 | 
|---|
 | 154 |                 {
 | 
|---|
 | 155 |                 double filtre;
 | 
|---|
 | 156 |                 filtre=litD(fenetre_ondelette,ond_filtre,0L);
 | 
|---|
 | 157 |                 if(filtre>1) filtre=1./filtre;
 | 
|---|
 | 158 |                 for(j=0;j<nb_max_bolo;j++)
 | 
|---|
 | 159 |                                 {       
 | 
|---|
 | 160 |                                 vr=0;vc=0;
 | 
|---|
 | 161 |                                 for(i=0;i<2*mononde.lg;i++)
 | 
|---|
 | 162 |                                         {
 | 
|---|
 | 163 |                                         vr+=mm[j][mpos]*mononde.or[i];
 | 
|---|
 | 164 |                                         vc+=mm[j][mpos]*mononde.oc[i];
 | 
|---|
 | 165 |                                         mpos++;if(mpos>=2*mononde.lg) mpos=0;
 | 
|---|
 | 166 |                                         }
 | 
|---|
 | 167 | 
 | 
|---|
 | 168 |                                 yo[j]=yo[j]*(1-filtre)+filtre * sqrt(vr*vr+vc*vc)*1000; // en nV/sqr(Hz)
 | 
|---|
 | 169 |                                 }
 | 
|---|
 | 170 |                 x=gg->periode_echantillonage*(double)gg->temps_cntl-gg->temps_origine;
 | 
|---|
 | 171 |                 if(x<0)                 {
 | 
|---|
 | 172 |                                                 graph->xmax-=graph->xmin;graph->xmin=0;
 | 
|---|
 | 173 |                                                  gg->temps_origine=gg->periode_echantillonage*(double)gg->temps_cntl;   
 | 
|---|
 | 174 |                                                  x=0;
 | 
|---|
 | 175 |                                                 }
 | 
|---|
 | 176 |                 montracen(fenetre_ondelette,nb_max_bolo,x,yo);
 | 
|---|
 | 177 |                 if(!(graph->scroll_courbe) &&
 | 
|---|
 | 178 |                                  ( (x<graph->xmin) ou (x>graph->xmax) )) 
 | 
|---|
 | 179 |                                                 {
 | 
|---|
 | 180 |                                                 graph->xmax-=graph->xmin;graph->xmin=0;
 | 
|---|
 | 181 |                                                  gg->temps_origine=gg->periode_echantillonage*(double)gg->temps_cntl;   
 | 
|---|
 | 182 |                                                  x=0;
 | 
|---|
 | 183 |                                                 }
 | 
|---|
 | 184 |                 }       
 | 
|---|
 | 185 |         mpos++;if(mpos>=2*mononde.lg) mpos=0;
 | 
|---|
 | 186 |         }
 | 
|---|
 | 187 | }
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 | 
 | 
|---|
 | 190 | //--------------------  fonction  fabriQUE L'ONDELETTE et fait les malloc  -------------------------------
 | 
|---|
 | 191 | 
 | 
|---|
 | 192 | 
 | 
|---|
 | 193 | void calonde(void)
 | 
|---|
 | 194 | {
 | 
|---|
 | 195 | double t,a,nbp;
 | 
|---|
 | 196 | double somme=0,gaus=0,norme=0;
 | 
|---|
 | 197 | int i;
 | 
|---|
 | 198 | 
 | 
|---|
 | 199 | mononde.w=2*3.14159*mononde.f;          // w en unite de point
 | 
|---|
 | 200 | mononde.lg=mononde.s*5./(mononde.w*mononde.tech); 
 | 
|---|
 | 201 | if(mononde.or) free(mononde.or);
 | 
|---|
 | 202 | if(mononde.oc) free(mononde.oc);
 | 
|---|
 | 203 | mononde.or=malloc(2*mononde.lg*sizeof(double));
 | 
|---|
 | 204 | mononde.oc=malloc(2*mononde.lg*sizeof(double));
 | 
|---|
 | 205 | 
 | 
|---|
 | 206 | for(i=0;i<2*mononde.lg;i++)
 | 
|---|
 | 207 |         {
 | 
|---|
 | 208 |         t=mononde.tech*(i-mononde.lg)*mononde.w;
 | 
|---|
 | 209 |         a=t/mononde.s;a=exp (-a*a/ 2.);
 | 
|---|
 | 210 |         mononde.or[i]=a  * cos(t);
 | 
|---|
 | 211 |         mononde.oc[i]=a  * sin(t);
 | 
|---|
 | 212 |         somme+=mononde.or[i];
 | 
|---|
 | 213 |         norme+=a*a;
 | 
|---|
 | 214 |         gaus+=a;
 | 
|---|
 | 215 |         }
 | 
|---|
 | 216 | somme=somme/gaus;
 | 
|---|
 | 217 | nbp=1/sqrt(norme);
 | 
|---|
 | 218 | printf("normalisation: somme=%g  gaus=%g \n",somme,gaus);
 | 
|---|
 | 219 | nbp*=sqrt(2*mononde.tech);              // dépendance avec la frequence d'échantillonage
 | 
|---|
 | 220 | //  en mettant 2* le temps d'échantillonage, on améliore la correspondance avec le spectre RMS
 | 
|---|
 | 221 | for(i=0;i<2*mononde.lg;i++)     
 | 
|---|
 | 222 |         {
 | 
|---|
 | 223 |         t=mononde.tech*(i-mononde.lg)*mononde.w;
 | 
|---|
 | 224 |         a=t/mononde.s;a=exp (-a*a/ 2.);
 | 
|---|
 | 225 |         mononde.or[i]-=a*somme;
 | 
|---|
 | 226 |         mononde.or[i]*=nbp;
 | 
|---|
 | 227 |         mononde.oc[i]*=nbp;
 | 
|---|
 | 228 |         }
 | 
|---|
 | 229 | }
 | 
|---|
 | 230 | 
 | 
|---|
 | 231 | 
 | 
|---|
 | 232 | 
 | 
|---|