source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/onde.c@ 652

Last change on this file since 652 was 637, checked in by ansari, 26 years ago

archediab version 24 initial import

File size: 5.1 KB
Line 
1#include "diabolo.h"
2#include "bolo.h"
3#include "onde.h"
4
5
6static long x0=0;
7
8typedef 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
18void calonde(void);
19void ondelette(int init,double* y);
20
21
22ondestruct mononde;
23
24
25void exec_ondelette(int fen,int item,double valeur,...)
26{
27static double y[nb_max_bolo];
28
29int j;
30
31switch(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
102double valtest(int i);
103double valtest(int i)
104{
105double x;
106x=random(0);
107if( (i>3000) && (i<5000) ) x+=0.5*sin(i*0.5);
108if(i>7000) x*=2;
109return(x);
110}
111
112*/
113
114
115void ondelette(int init,double* y)
116{
117static int mpos;
118static double *mm[nb_max_bolo];
119static flag_init=0;
120int i,j;
121double vr,vc;
122double x;
123static double yo[nb_max_bolo];
124if(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
147if ( (!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
193void calonde(void)
194{
195double t,a,nbp;
196double somme=0,gaus=0,norme=0;
197int i;
198
199mononde.w=2*3.14159*mononde.f; // w en unite de point
200mononde.lg=mononde.s*5./(mononde.w*mononde.tech);
201if(mononde.or) free(mononde.or);
202if(mononde.oc) free(mononde.oc);
203mononde.or=malloc(2*mononde.lg*sizeof(double));
204mononde.oc=malloc(2*mononde.lg*sizeof(double));
205
206for(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 }
216somme=somme/gaus;
217nbp=1/sqrt(norme);
218printf("normalisation: somme=%g gaus=%g \n",somme,gaus);
219nbp*=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
221for(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
Note: See TracBrowser for help on using the repository browser.