Allink  v0.1
VarSegnali.cpp
1 #include "VarSegnali.h"
2 Variabili::Variabili(int nSegn,int nPeriodi,double xMediaSu,double xScartoSu,double xMediaGiu,double xScartoGiu,double xPasso,double xIncr){
3  NSegn = nSegn;
4  Periodi = nPeriodi;
5  Passo = xPasso;
6  MediaSu = xMediaSu;
7  ScartoSu = xScartoSu;
8  MediaGiu = xMediaGiu;
9  ScartoGiu = xScartoGiu;
10  Incr = xIncr;
11  NMass = (int)((double)Periodi/(double)Passo);
12  sMedia = new double[NMass];
13  st = new bool[NMass];
14  mSu = new Matematica();
15  mGiu = new Matematica();
16 }
17 bool Variabili::Simula(){
18  double Fase=0.;
19  bool Livello=0;
20  double Delta=0;
21  double IncrSu=0.;
22  double IncrGiu=0.;
23  //------------------Per le volte successive------------
24  if(NMass != (int)((double)Periodi/(double)Passo)){
25  NMass = (int)((double)Periodi/(double)Passo);
26  delete sMedia;
27  delete st;
28  sMedia = new double[NMass];
29  st = new bool[NMass];
30  }
31  printf("Inizializzo %d Segnali da %d Punti (%d Periodi con Passo %.3f)\n con livello 1 %.2f +- %.2f con livello 0 %.2f +- %.2f\n incrementando di %.2f\n",
32  NSegn,NMass,Periodi,Passo,MediaSu,ScartoSu,MediaGiu,ScartoGiu,Incr);
33  if(!mSu->InizializzaGaussiano(ScartoSu,(int)(MediaSu/Passo)) )
34  return 0;
35  if(!mGiu->InizializzaGaussiano(ScartoGiu,(int)(MediaGiu/Passo)) )
36  return 0;
37  double Temp=0.;
38  for(int i=0;i<NMass;i++){
39  sMedia[i]=0.;
40  }
41  //---------------Inizia-------------------
42  for(int i=0;i<NSegn;i++){
43  int m=0;//indice di passo
44  if( (i%1000)==0 )
45  printf("Processo il segnale numero %d di %d\n",i,NSegn);
46  if(Casuale()<=(MediaSu)/(MediaGiu)){
47  Livello = 1;//Livello di partenza
48  Temp = POS(mSu->Gaussiano((MediaSu+IncrSu),(ScartoSu+IncrSu)));//Fase iniziale (m=0)
49  Fase=Casuale()*(MediaSu+IncrSu);
50  }
51  else{
52  Livello=0;
53  Temp = POS(mGiu->Gaussiano(MediaGiu+IncrGiu,ScartoGiu+IncrGiu));
54  Fase=Casuale()*(MediaGiu+IncrGiu);
55  }// Primo periodo
56  for(int l=0;Fase+Passo*(double)l<Temp;l++){
57  if(i == 0) st[m] = Livello;
58  sMedia[m]+=(double)Livello;
59  m++;
60  }//inizia l'altro periodo
61  for(int j=1;m<NMass;j++){
62  Livello = !Livello;
63  if(Livello){
64  Temp= POS(mSu->Gaussiano(MediaSu+IncrSu,ScartoSu+IncrSu));
65  }
66  else if(!Livello){
67  Temp = POS(mGiu->Gaussiano(MediaGiu+IncrGiu,ScartoGiu+IncrGiu));
68  }
69  for(int l=0;Passo*(double)l<Temp;l++){
70  // printf("Livello %d\n",Livello);
71  if(i == 0) st[m] = Livello;
72  sMedia[m]+=(double)Livello;
73  m++;
74  if(m>=NMass)break;
75  }
76  }
77  IncrSu += Incr*(MediaSu)/(MediaGiu);
78  IncrGiu += Incr;
79  }
80  char *Comando;
81  char *Nome;
82  char *Cartella;
83  Comando = new char[50];
84  Cartella = new char[50];
85  Nome = new char[50];
86  // sprintf(Cartella,"%.0fk%dp%di%.0fm%.0fs",(double)(NSegn/1000),Periodi,Inter,Media,Scarto);
87  // sprintf(Comando,"mkdir %s",Cartella);
88  // system(Comando);
89  sprintf(Cartella,".");
90  sprintf(Nome,"%s/Segnale.dat",Cartella);
91  if((SEGNALE = fopen(Nome,"w"))==0)
92  printf("Non s'apre %s, Permessi?\n",Nome);
93  sprintf(Nome,"%s/MediaSegnali.dat",Cartella);
94  if((MEDIA = fopen(Nome,"w"))==0)
95  printf("Non s'apre %s, Permessi?\n",Nome);
96  for(int i=0;i<NMass;i++){
97  fprintf(SEGNALE,"%d\n",st[i]);
98  if(i>(int)(MediaGiu/Passo)) fprintf(MEDIA,"%g\n",sMedia[i]);
99  }
100  fclose(SEGNALE);
101  fclose(MEDIA);
102  return 1;
103 }
104 Variabili::~Variabili(){
105  delete st;
106  delete sMedia;
107 }
108 void Variabili::Cambia(char *cosa,int n){
109  if (n > 0){
110  if(!strcmp(cosa,"num"))
111  NSegn = n;
112  else if(!strcmp(cosa,"per")){
113  Periodi = n;
114  }
115  }
116 }
117 void Variabili::Cambia(char *cosa,double x){
118  if(x>0){
119  if(!strcmp(cosa,"mSu") )
120  MediaSu = x;
121  else if(!strcmp(cosa,"sSu") )
122  ScartoSu = x;
123  else if(!strcmp(cosa,"mGiu") )
124  MediaGiu = x;
125  else if(!strcmp(cosa,"sGiu") )
126  ScartoGiu = x;
127  else if(!strcmp(cosa,"pas") )
128  Passo = x;
129  }
130  if(!strcmp(cosa,"incr") )
131  Incr = x;
132 }
bool InizializzaGaussiano(double Scarto, int N)
Initialize the Gaussian number generator.
Matematica()
Constructor.
Definition: Matematica.cpp:43
double Casuale()
Random uniform number.
double Gaussiano(double Media, double Scarto)
Gaussian random number.