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