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