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