source: Sophya/trunk/Poubelle/DPC:FitsIOServer/Samba/bruit.cc@ 658

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

no message

File size: 11.7 KB
RevLine 
[658]1#include <stdlib.h>
2#include <stdio.h>
3#include <math.h>
4
5#ifdef __MWERKS__
6 #include "mwerksmath.h"
7 #include "unixmac.h"
8#endif
9
10#include "fmath.h"
11
12#include "bruit.h"
13#include "nbrandom.h"
14// #include "rancern.h"
15// #include "hbook.h"
16
17// Le code des classes NoiseGenerator RWalkNoise
18
19//++
20// Class NoiseGenerator
21//
22// include bruit.h math.h fmath.h nbrandom.h
23//
24//--
25//++
26//
27// Links Childs
28//
29// RWalkNoise OOFNoise EXPNoise MemNoise SumNoise
30//
31//--
32//++
33// Titre Constructors
34//--
35
36/* --Methode-- */
37//++
38NoiseGenerator::NoiseGenerator(float sigma)
39//
40//--
41{
42if (sigma < 0.) sigma = 1.;
43mNCoups = 0;
44mSigma = sigma;
45//printf("-- NoiseGenerator::NoiseGenerator(%g) (Constructeur) ---\n", sigma);
46}
47
48//++
49// Titre Destructor
50//--
51/* --Methode-- */
52//++
53NoiseGenerator::~NoiseGenerator()
54//
55//--
56{
57 //printf("-- NoiseGenerator::~NoiseGenerator() (Destructeur) --- \n");
58}
59
60
61//++
62//
63// inline unsigned long int NoiseGenerator::NCoups()
64//--
65//++
66// Titre Public Methods
67//--
68
69/* --Methode-- */
70//++
71float NoiseGenerator::Noise()
72//
73//--
74{
75mNCoups++;
76return(NorRand()*mSigma);
77}
78//++
79// Class RWalkNoise
80//
81// include bruit.h math.h fmath.h nbrandom.h
82//
83//--
84//++
85//
86// Links Parents
87//
88// NoiseGenerator
89//
90//--
91//++
92// Titre Constructor
93//--
94
95/* --Methode-- */
96//++
97RWalkNoise::RWalkNoise(float sigma)
98 : NoiseGenerator(sigma)
99//
100//--
101{
102mState = 0.;
103//printf("-- RWalkNoise::RWalkNoise(%g) (Constructeur) ---\n", sigma);
104}
105
106
107//++
108// Titre Destructor
109//--
110/* --Methode-- */
111//++
112RWalkNoise::~RWalkNoise()
113//
114//--
115{
116//printf("-- RWalkNoise::~RWalkNoise (Destructeur) ---\n");
117
118}
119
120//++
121// Titre Public Methods
122//--
123/* --Methode-- */
124//++
125float RWalkNoise::Noise()
126//
127//--
128{
129mState += NoiseGenerator::Noise();
130return(mState);
131}
132
133//++
134// Class OOFNoise
135//
136// include bruit.h math.h fmath.h nbrandom.h
137//
138//--
139//++
140//
141// Links Parents
142//
143// NoiseGenerator
144//
145//--
146//++
147// Titre Constructor
148//--
149
150/* --Methode-- */
151//++
152OOFNoise::OOFNoise(float sigma, int typacf, int mem, float tau)
153 : NoiseGenerator(sigma)
154//
155//--
156{
157if (typacf != ACF_Exp) typacf = ACF_Exp;
158// Fonction d'autocorrelation donnant un bruit en 1/f
159//
160mTypACF = typacf;
161if (mem < 1) mem = 1;
162mMemL = mem;
163if (tau < 1.e-6) tau = 1.e-6;
164mTau = tau;
165mState = new double[mem];
166mDyn = new double[mem];
167int i;
168mDyn[0]=1.;
169mState[0]=0.;
170for(i=1; i<mem; i++) {
171 mState[i] = 0.; mDyn[i] = 1./sqrt((double)i);
172}
173//printf("-- OOFNoise::OOFNoise(%g,%d,%d,%g) (Constructeur) ---\n",
174// sigma, typacf, mem, tau);
175}
176
177
178//++
179// Titre Destructor
180//--
181/* --Methode-- */
182//++
183OOFNoise::~OOFNoise()
184//
185//--
186{
187delete[] mState;
188delete[] mDyn;
189// printf("-- OOFNoise::~OOFNoise (Destructeur) ---\n");
190}
191
192
193//++
194// Titre Public Methods
195//--
196/* --Methode-- */
197//++
198float OOFNoise::Noise()
199//
200//--
201{
202int i;
203double rn;
204
205for(i=(mMemL-1); i>0; i--) mState[i] = mState[i-1];
206mState[0] = NoiseGenerator::Noise();
207rn = 0.;
208for(i=0; i< mMemL; i++) rn += mDyn[i]*mState[i];
209return(rn);
210}
211
212/* --Methode-- */
213//++
214void OOFNoise::Print()
215//
216//--
217{
218int i,j;
219printf("OOFNoise::Print() MemL=%d Tau= %g \n", mMemL, mTau);
220printf("OOFNoise::Print() Vecteur de Dynamique / Etat : \n");
221for(i=0; i<mMemL-1; i+=2)
222 printf("%d: D=%g S=%g | %d: D=%g S=%g \n", i,
223 mDyn[i], mState[i], i+1, mDyn[i], mState[i]);
224return;
225}
226//++
227// Class EXPNoise
228//
229// include bruit.h math.h fmath.h nbrandom.h
230//
231//--
232//++
233//
234// Links Parents
235//
236// NoiseGenerator
237//
238//--
239//++
240// Titre Constructor
241//--
242
243/* --Methode-- */
244//++
245EXPNoise::EXPNoise(float sigma, int typacf, int mem, float tau)
246 : NoiseGenerator(sigma)
247//
248//--
249{
250if (typacf != ACF_Exp) typacf = ACF_Exp;
251// Fonction d'autocorrelation exponentiel disponible uniquement
252// Reza , Juillet 97
253mTypACF = typacf;
254if (mem < 1) mem = 1;
255mMemL = mem;
256if (tau < 1.e-6) tau = 1.e-6;
257mTau = tau;
258mState = new double[mem];
259mDyn = new double[mem];
260int i;
261for(i=0; i<mem; i++) {
262 mState[i] = 0.; mDyn[i] = exp(-(double)i/tau);
263}
264//printf("-- EXPNoise::EXPNoise(%g,%d,%d,%g) (Constructeur) ---\n",
265// sigma, typacf, mem, tau);
266}
267
268
269//++
270// Titre Destructor
271//--
272/* --Methode-- */
273//++
274EXPNoise::~EXPNoise()
275//
276//--
277{
278delete[] mState;
279delete[] mDyn;
280//printf("-- EXPNoise::~EXPNoise (Destructeur) ---\n");
281}
282
283
284//++
285// Titre Public Methods
286//--
287/* --Methode-- */
288//++
289float EXPNoise::Noise()
290//
291//--
292{
293int i;
294double rn;
295
296for(i=(mMemL-1); i>0; i--) mState[i] = mState[i-1];
297mState[0] = NoiseGenerator::Noise();
298rn = 0.;
299for(i=0; i< mMemL; i++) rn += mDyn[i]*mState[i];
300return(rn);
301}
302
303/* --Methode-- */
304//++
305void EXPNoise::Print()
306//
307//--
308{
309int i,j;
310printf("EXPNoise::Print() MemL=%d Tau= %g \n", mMemL, mTau);
311printf("EXPNoise::Print() Vecteur de Dynamique / Etat : \n");
312for(i=0; i<mMemL-1; i+=2)
313 printf("%d: D=%g S=%g | %d: D=%g S=%g \n", i,
314 mDyn[i], mState[i], i+1, mDyn[i], mState[i]);
315
316return;
317}
318
319//++
320// Class MemNoise
321//
322// include bruit.h math.h fmath.h nbrandom.h
323//
324//--
325//++
326//
327// Links Parents
328//
329// NoiseGenerator
330//
331//--
332//++
333// Titre Constructor
334//--
335
336
337
338/* --Methode-- */
339//++
340MemNoise::MemNoise(float sigma, int mem, float tau, int ava)
341 : NoiseGenerator(sqrtf(fabsf(tau))*sigma)
342//
343//--
344{
345/* on tire les instants des impulsions successives selon une
346loi de distance exponentielle de duree tau
347*/
348const int place = 1000;
349mTypACF = ACF_Exp;
350if (mem < 1) mem = 1;
351mMemL = place;
352mCoupHaut=mem;
353if (tau < 1.) tau = 1.;
354mTau = tau;
355mStPos = new float[place];
356mStNeg = new float[place];
357mTePos = new float[place];
358mTeNeg = new float[place];
359// printf("apres reservation\n");
360int i;
361for(i=0; i<place; i++)
362{
363mStNeg[i] = 0.; mStPos[i] = 0.;
364}
365// printf("apres initialisation tableaux \n");
366
367mNappel=0;
368mNtirage=1;
369mNappLast=0;
370mMemPos=1;
371mMemNeg=1;
372mduree=0.;
373mTePos[0]=0.;
374mTeNeg[0]=0.;
375mTdernier=0.;
376
377Avance(ava);
378// printf("fin du createur MemNoise \n");
379//printf("-- EXPNoise::EXPNoise(%g,%d,%d,%g) (Constructeur) ---\n",
380// sigma, typacf, mem, tau);
381}
382
383
384//++
385// Titre Destructor
386//--
387/* --Methode-- */
388//++
389MemNoise::~MemNoise()
390//
391//--
392{
393delete[] mStPos;
394delete[] mStNeg;
395delete[] mTePos;
396delete[] mTeNeg;
397//printf("-- EXPNoise::~EXPNoise (Destructeur) ---\n");
398}
399
400//++
401// Titre Public Methods
402//--
403/* --Methode-- */
404//++
405float MemNoise::Noise()
406//
407//--
408{
409return(Avance(0));
410}
411
412/* --Methode-- */
413//++
414float MemNoise::Avance(long Asauter)
415//
416//--
417{
418int i,j;
419float boum;
420float rn;
421float Somme,SbaryT,Poids,BaryT,Approx,Erreur;
422int nReduit;
423const float epsilon=.05;
424// printf("entree dans methode Noise de MemNoise \n");
425long mNsaut;
426for (mNsaut = Asauter ; mNsaut >= 0 ; mNsaut--)
427 { // debut mNsaut
428 // printf("mNsaut = %ld\n",mNsaut);
429mNappel++;
430mTdernier += 1.;
431for(i=0; i<mMemPos; i++) mTePos[i] += 1.;
432for(i=0; i<mMemNeg; i++) mTeNeg[i] += 1.;
433
434if (mduree < mTdernier)
435 {
436 /* la duree depuis le dernier tirage est maintenant ecoulee
437 on commence par remettre a jour le temps ecoule entre la derniere
438 impulsion (celle qu'on va tirer maintenant) et l'instant present */
439
440 mTdernier = mTdernier - mduree;
441
442 /* puis on tire une nouvelle impulsion de bruit */
443
444 boum = NoiseGenerator::Noise();
445
446 /* on decale la memoire d'une case vers le passe
447 puis on met a jour la case [0] */
448
449if(boum>0)
450 {
451 for(i=mMemPos; i>0; i--)
452 {
453 mStPos[i] = mStPos[i-1];
454 mTePos[i] = mTePos[i-1];
455 }
456 mTePos[0] = mTdernier;
457 mStPos[0] = boum;
458 if (mMemPos<mMemL) mMemPos++;
459/* a chaque tirage, on regroupe les impulsions precedentes */
460for(i=mMemPos-2 ; i>0 ; i--)
461 {
462 if(mStPos[i]==0.)continue;
463 // printf("i,temps,bruit %d,%g,%g \n",i,mTePos[i],mStPos[i]);
464 Somme = mStPos[i]/sqrtf(mTePos[i]);
465 SbaryT = mStPos[i] * mTePos[i];
466 Poids = mStPos[i];
467 for(j=i-1 ; j>=0 ; j--)
468 {
469 // printf(" j,temps,bruit %d,%g,%g \n",j,mTePos[j],mStPos[j]);
470 Somme += mStPos[j]/sqrtf(mTePos[j]);
471 Poids += mStPos[j];
472 SbaryT += mStPos[j] * mTePos[j];
473 BaryT = SbaryT / Poids;
474 Approx = Poids / sqrtf(BaryT);
475 Erreur = (Approx - Somme) / Somme;
476 // printf("i,j = %d %d Approx = %g \n",i,j,fabsf(Erreur));
477 // printf("Temps,Bruit = %g %g \n",BaryT,Poids);
478 if(fabsf(Erreur)<epsilon)
479 {
480 mStPos[i]=Poids;
481 mTePos[i]=BaryT;
482 mStPos[j]=0.;
483 }
484 else break;
485 }
486 }
487nReduit=0;
488for(i=0; i<mMemPos-1 ; i++)
489 {
490 if(mStPos[i]!=0)
491 {
492 mStPos[nReduit]=mStPos[i];
493 mTePos[nReduit]=mTePos[i];
494 nReduit++;
495 }
496 }
497mMemPos=nReduit+1;
498
499 }
500else
501 {
502 for(i=mMemNeg; i>0; i--)
503 {
504 mStNeg[i] = mStNeg[i-1];
505 mTeNeg[i] = mTeNeg[i-1];
506 }
507 mTeNeg[0] = mTdernier;
508 mStNeg[0] = boum;
509 if (mMemNeg<mMemL) mMemNeg++;
510
511
512/* idem pour negatifs */
513for(i=mMemNeg-2 ; i>0 ; i--)
514 {
515 if(mStNeg[i]==0.)continue;
516 // printf("i,temps,bruit %d,%g,%g \n",i,mTeNeg[i],mStNeg[i]);
517 Somme = mStNeg[i]/sqrtf(mTeNeg[i]);
518 SbaryT = mStNeg[i] * mTeNeg[i];
519 Poids = mStNeg[i];
520 for(j=i-1 ; j>=0 ; j--)
521 {
522 // printf(" j,temps,bruit %d,%g,%g \n",j,mTeNeg[j],mStNeg[j]);
523 Somme += mStNeg[j]/sqrtf(mTeNeg[j]);
524 Poids += mStNeg[j];
525 SbaryT += mStNeg[j] * mTeNeg[j];
526 BaryT = SbaryT / Poids;
527 Approx = Poids / sqrtf(BaryT);
528 Erreur = (Approx - Somme) / Somme;
529 // printf("i,j = %d %d Approx = %g \n",i,j,Erreur);
530 // printf("Temps,Bruit = %g %g \n",BaryT,Poids);
531 if(fabsf(Erreur)<epsilon)
532 {
533 mStNeg[i]=Poids;
534 mTeNeg[i]=BaryT;
535 mStNeg[j]=0.;
536 }
537 else break;
538 }
539 }
540nReduit=0;
541for(i=0; i<mMemNeg-1 ; i++)
542 {
543 if(mStNeg[i]!=0)
544 {
545 mStNeg[nReduit]=mStNeg[i];
546 mTeNeg[nReduit]=mTeNeg[i];
547 nReduit++;
548 }
549 }
550mMemNeg=nReduit+1;
551 }
552/* on tire la duree a attendre avant la prochaine impulsion de bruit */
553// $CHECK$ avec Francois - rndm() remplace par Reza 10/01/99
554mduree = -mTau*log(frand01());
555
556// if(mNtirage<mMemL) mNtirage++;
557mNtirage++;
558/*
559int idn=1;
560float pds=1.;
561float nul=0.;
562hfill_(&idn,&mduree,&nul,&pds);
563*/
564// printf("Ntirage %d,mMemPos,Neg %d,%d, Suppress = %d \n",mNtirage,mMemPos,mMemNeg, Suppress);
565 }
566/* On calcule le bruit total */
567
568//printf("mMemPos,Neg,%d %d\n",mMemPos,mMemNeg);
569//for(i=0;i<mMemPos;i++) printf("mTePos %g \n",mTePos);
570//for(i=0;i<mMemNeg;i++) printf("mTeNeg %g \n",mTeNeg);
571if(mNsaut == 0)
572 {
573 // printf("coucou\n");
574rn = 0.;
575int indlim=0;
576for(i=0; i < mMemPos-1; i++)
577{
578if(mTePos[i] > .1)break;
579rn += mStPos[i];
580indlim++;
581}
582// float ajout=0.;
583for(i=indlim; i < mMemPos-1; i++) rn += mStPos[i]/sqrtf(mTePos[i]);
584indlim=0;
585for(i=0; i < mMemNeg-1; i++)
586{
587if(mTeNeg[i] > .1) break;
588rn += mStNeg[i];
589indlim++;
590}
591for(i=indlim; i < mMemNeg-1; i++) rn += mStNeg[i]/sqrtf(mTeNeg[i]);
592}
593}
594return(rn);
595}
596/* --Methode-- */
597//++
598int MemNoise::Print()
599//
600//--
601{
602int i,j,rc=0;
603printf("MemNoise::Print() MemL=%d Tau= %g \n", mMemL, mTau);
604printf("mNtirage= %d , mMemPos= %d , mMemNeg= %d \n",mNtirage,mMemPos,mMemNeg);
605// printf("MemNoise::Print() Vecteur de Dynamique / Etat : \n");
606/* for(i=0; i<mMemL-1; i+=2)
607 printf("%d: D=%g S=%g | %d: D=%g S=%g \n", i,
608 mDyn[i], mState[i], i+1, mDyn[i], mState[i]);
609 */
610return(rc);
611}
612
613
614//++
615// Class SumNoise
616// Generateur de bruit blanc + 1/f avec fknee
617//
618// include bruit.h math.h fmath.h nbrandom.h
619//
620//--
621//++
622//
623// Links Parents
624//
625// NoiseGenerator
626//
627//--
628//++
629// Titre Constructor
630//--
631// Generateur de bruit blanc + 1/f avec fknee
632
633
634/* --Methode-- */
635//++
636SumNoise::SumNoise(float fknee, float sig)
637 : NoiseGenerator(sig)
638//
639//--
640{
641// Reza 27/01/98 :
642// Je calcule les sigma du MemNoise d'apres la formule de Francois
643mn = new MemNoise(sig*fknee);
644}
645
646
647//++
648// Titre Destructor
649//--
650/* --Methode-- */
651//++
652SumNoise::~SumNoise()
653//
654//--
655{
656delete mn;
657}
658
659//++
660// Titre Public Methods
661//--
662/* --Methode-- */
663//++
664float SumNoise::Noise()
665//
666//--
667{
668return(NoiseGenerator::Noise() + mn->Noise());
669}
Note: See TracBrowser for help on using the repository browser.