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