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