Allink  v0.1
VarSegnali.cpp
00001 #include "VarSegnali.h"
00002 Variabili::Variabili(int nSegn,int nPeriodi,double xMediaSu,double xScartoSu,double xMediaGiu,double xScartoGiu,double xPasso,double xIncr){
00003   NSegn = nSegn;
00004   Periodi = nPeriodi;
00005   Passo = xPasso;
00006   MediaSu = xMediaSu;
00007   ScartoSu = xScartoSu;
00008   MediaGiu = xMediaGiu;
00009   ScartoGiu = xScartoGiu;
00010   Incr = xIncr;
00011   NMass = (int)((double)Periodi/(double)Passo);
00012   sMedia = new double[NMass];
00013   st = new bool[NMass];
00014   mSu = new Matematica();
00015   mGiu = new Matematica();
00016 }
00017 bool Variabili::Simula(){
00018   double Fase=0.;
00019   bool Livello=0;
00020   double Delta=0;
00021   double IncrSu=0.;
00022   double IncrGiu=0.;
00023   //------------------Per le volte successive------------
00024   if(NMass != (int)((double)Periodi/(double)Passo)){
00025     NMass = (int)((double)Periodi/(double)Passo);
00026     delete sMedia;
00027     delete st;
00028     sMedia = new double[NMass];
00029     st = new bool[NMass];
00030   }
00031   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",
00032     NSegn,NMass,Periodi,Passo,MediaSu,ScartoSu,MediaGiu,ScartoGiu,Incr);
00033   if(!mSu->InizializzaGaussiano(ScartoSu,(int)(MediaSu/Passo)) )
00034     return 0;
00035   if(!mGiu->InizializzaGaussiano(ScartoGiu,(int)(MediaGiu/Passo)) )
00036     return 0;
00037   double Temp=0.;
00038   for(int i=0;i<NMass;i++){
00039     sMedia[i]=0.;
00040   }
00041   //---------------Inizia-------------------
00042   for(int i=0;i<NSegn;i++){
00043     int m=0;//indice di passo
00044     if( (i%1000)==0 )
00045       printf("Processo il segnale numero %d di %d\n",i,NSegn);
00046     if(Casuale()<=(MediaSu)/(MediaGiu)){
00047       Livello = 1;//Livello di partenza
00048       Temp = POS(mSu->Gaussiano((MediaSu+IncrSu),(ScartoSu+IncrSu)));//Fase iniziale (m=0)
00049       Fase=Casuale()*(MediaSu+IncrSu);
00050     }
00051     else{
00052       Livello=0;
00053       Temp = POS(mGiu->Gaussiano(MediaGiu+IncrGiu,ScartoGiu+IncrGiu));
00054       Fase=Casuale()*(MediaGiu+IncrGiu);
00055     }// Primo periodo
00056     for(int l=0;Fase+Passo*(double)l<Temp;l++){
00057       if(i == 0) st[m] = Livello;
00058       sMedia[m]+=(double)Livello;
00059       m++;
00060     }//inizia l'altro periodo
00061     for(int j=1;m<NMass;j++){
00062       Livello = !Livello;
00063       if(Livello){
00064    Temp= POS(mSu->Gaussiano(MediaSu+IncrSu,ScartoSu+IncrSu));
00065       }
00066       else if(!Livello){
00067    Temp = POS(mGiu->Gaussiano(MediaGiu+IncrGiu,ScartoGiu+IncrGiu));
00068       }
00069       for(int l=0;Passo*(double)l<Temp;l++){
00070    // printf("Livello %d\n",Livello);
00071    if(i == 0) st[m] = Livello;
00072    sMedia[m]+=(double)Livello;
00073    m++;
00074    if(m>=NMass)break;
00075       }
00076     }
00077     IncrSu += Incr*(MediaSu)/(MediaGiu);
00078     IncrGiu += Incr;
00079   }
00080   char *Comando;
00081   char *Nome;
00082   char *Cartella;
00083   Comando = new char[50];
00084   Cartella = new char[50];
00085   Nome = new char[50];
00086   //   sprintf(Cartella,"%.0fk%dp%di%.0fm%.0fs",(double)(NSegn/1000),Periodi,Inter,Media,Scarto);
00087   //   sprintf(Comando,"mkdir %s",Cartella);
00088   //   system(Comando);
00089   sprintf(Cartella,".");
00090   sprintf(Nome,"%s/Segnale.dat",Cartella);
00091   if((SEGNALE = fopen(Nome,"w"))==0)
00092     printf("Non s'apre %s, Permessi?\n",Nome);
00093   sprintf(Nome,"%s/MediaSegnali.dat",Cartella);
00094   if((MEDIA = fopen(Nome,"w"))==0)
00095     printf("Non s'apre %s, Permessi?\n",Nome);
00096   for(int i=0;i<NMass;i++){
00097     fprintf(SEGNALE,"%d\n",st[i]);
00098     if(i>(int)(MediaGiu/Passo)) fprintf(MEDIA,"%g\n",sMedia[i]);
00099   }
00100   fclose(SEGNALE);
00101   fclose(MEDIA);
00102   return 1;
00103 }
00104 Variabili::~Variabili(){
00105   delete st;
00106   delete sMedia;
00107 }
00108 void Variabili::Cambia(char *cosa,int n){
00109   if (n > 0){
00110     if(!strcmp(cosa,"num"))
00111       NSegn = n;
00112     else if(!strcmp(cosa,"per")){
00113       Periodi = n;
00114     }
00115   }
00116 }
00117 void Variabili::Cambia(char *cosa,double x){
00118   if(x>0){
00119     if(!strcmp(cosa,"mSu") )
00120       MediaSu = x;
00121     else if(!strcmp(cosa,"sSu") )
00122       ScartoSu = x;
00123     else if(!strcmp(cosa,"mGiu") )
00124       MediaGiu = x;
00125     else if(!strcmp(cosa,"sGiu") )
00126       ScartoGiu = x;
00127     else if(!strcmp(cosa,"pas") )
00128       Passo = x;
00129   }
00130   if(!strcmp(cosa,"incr") )
00131     Incr = x;
00132 }