source: Sophya/trunk/SophyaLib/Samba/bruit.cc@ 1683

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

Correction effet de pic dans memnoise
D.Y.

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