| [3160] | 1 | #ifndef MULTICYL_H | 
|---|
|  | 2 | #define MULTICYL_H | 
|---|
|  | 3 |  | 
|---|
|  | 4 | #include "machdefs.h" | 
|---|
|  | 5 | #include "sopnamsp.h" | 
|---|
|  | 6 | #include "mbeamcyl.h" | 
|---|
|  | 7 |  | 
|---|
|  | 8 | /* | 
|---|
|  | 9 | Projet BAORadio / HSHS | 
|---|
|  | 10 | Programme de simulation pour reconstruction de lobe radio. | 
|---|
|  | 11 | Reconstruction de lobe a partir de plusieurs cylindres | 
|---|
|  | 12 |  | 
|---|
|  | 13 | R. Ansari - LAL      Jan 2007 | 
|---|
|  | 14 |  | 
|---|
|  | 15 | Note : On travaille ds un systeme sans dimension | 
|---|
|  | 16 | unite de temps = 1 = temps d'echantillonnage (f_echant = 1) | 
|---|
|  | 17 | vitesse de propagation (c) = 1 | 
|---|
|  | 18 | */ | 
|---|
|  | 19 |  | 
|---|
|  | 20 |  | 
|---|
|  | 21 | //----------------------------------------------------------------------- | 
|---|
|  | 22 | //--- Classe de reconstruction de plan source correspondant a un cylindre | 
|---|
|  | 23 | class MultiCylinders { | 
|---|
|  | 24 | public : | 
|---|
|  | 25 | // nr = nb de recepteurs | 
|---|
|  | 26 | // ns = nb d'echantillons en temps de chaque paquet | 
|---|
| [3163] | 27 | //   nr = 256 -> resol_ang ~ pi/256 = 0.01 rad ~ 40' | 
|---|
|  | 28 | //   longueur @ f=2 ~ 64 (256*lambda/2 = 256*0.25) | 
|---|
| [3160] | 29 | MultiCylinders(int nr=256, int ns=1024); | 
|---|
| [3192] | 30 | MultiCylinders(char* filename); | 
|---|
| [3160] | 31 | ~MultiCylinders(); | 
|---|
|  | 32 |  | 
|---|
|  | 33 | // Niveau de print de debug | 
|---|
| [3192] | 34 | inline void SetPrintLevel(int prl=0) { PrtLev_=prl; } | 
|---|
| [3160] | 35 |  | 
|---|
| [3192] | 36 | // Ajout d'un cylindre, en position posX, posY | 
|---|
| [3191] | 37 | inline int AddCylinder(double posx, double posy) | 
|---|
| [3192] | 38 | {  mCyl_.push_back( new MultiBeamCyl(NR_, NS_, posx, posy) ); return mCyl_.size(); } | 
|---|
| [3160] | 39 |  | 
|---|
|  | 40 | MultiBeamCyl & GetCylinder(int i); | 
|---|
|  | 41 |  | 
|---|
|  | 42 | // Specification de la frequence de base f0 et espacement des recepteurs | 
|---|
|  | 43 | inline void SetBaseFreqDa(double f0=2., double a=0.25) | 
|---|
| [3192] | 44 | {  freq0_ = f0;   Da_ = a;  } | 
|---|
| [3160] | 45 |  | 
|---|
|  | 46 | // frequences reduites (entre 0 ... 0.5) , angle en radian, amp ~ 1 | 
|---|
|  | 47 | void SetSources(BRSourceGen* brs, bool ad=true); | 
|---|
|  | 48 | inline void SetSources(BRSourceGen& brs) | 
|---|
|  | 49 | { SetSources(&brs, false); } | 
|---|
|  | 50 |  | 
|---|
|  | 51 | // Definition du sigma du bruit gaussien sur les echantillons | 
|---|
| [3192] | 52 | inline void SetNoiseSigma(double sig=0.) {  signoise_ = sig; } | 
|---|
| [3160] | 53 | // Definition du sigma du jitter d'horloge (typ 0.01) | 
|---|
| [3192] | 54 | inline void SetTimeJitter(double tjit=0.) { timejitter_ = tjit; } | 
|---|
| [3160] | 55 | // Definition du sigma des offsets d'horloge entre recepteurs (typ 0.02) | 
|---|
| [3192] | 56 | inline void SetTimeOffsetSigma(double tsig=0.) { toffsig_ = tsig; } | 
|---|
| [3160] | 57 |  | 
|---|
|  | 58 | // Definition du gain et sigma de fluctuations de gain | 
|---|
|  | 59 | // nzerogain: nb de recepteurs (choisis au hasard) avec gain mis a zero | 
|---|
|  | 60 | inline void SetGains(double g=1., double sigg=0., int nzerogain=0) | 
|---|
| [3192] | 61 | {  gain_=g;  siggain_=sigg;  ngainzero_ = nzerogain; } | 
|---|
| [3160] | 62 |  | 
|---|
|  | 63 |  | 
|---|
|  | 64 | // Fait la configuration des cylindres, et reconstruit le plan source | 
|---|
|  | 65 | // pour chaque cylindre | 
|---|
|  | 66 | void ReconstructCylinderPlaneS(bool fgzerocentre=true); | 
|---|
|  | 67 |  | 
|---|
|  | 68 | // Reconstruction de la boite 3D des sources | 
|---|
|  | 69 | // - halfny : nb de bin en angY = 2*halfny+1 | 
|---|
| [3163] | 70 | // - stepangy : pas en angle Y (radian) | 
|---|
|  | 71 | // NOTE: Cette methode appelle ReconstructCylinderPlaneS(true); | 
|---|
|  | 72 | // La resolution doit etre <= resol en angX --> ~ 1 deg ~ pi/ | 
|---|
|  | 73 | // @f = 2 , lambda = 0.5 ===> posY <~ lambda/(2 sin resol) | 
|---|
|  | 74 | //   ===> posY < ~ 20 | 
|---|
| [3192] | 75 | // void ReconstructSourceBox(int halfny=10, double stepangy=M_PI/300); | 
|---|
|  | 76 | void ReconstructSourceBox(int halfny, double stepangy, int ny, double stepangx); | 
|---|
| [3160] | 77 |  | 
|---|
|  | 78 |  | 
|---|
|  | 79 | // Pour recuperer une tranche reconstruite angX, angY | 
|---|
|  | 80 | // avec la moyenne des modules entre kfmin <= k (selon z) <= kfmax | 
|---|
|  | 81 | TMatrix< r_4 > getRecXYSlice(int kfmin, int kfmax); | 
|---|
| [3192] | 82 | TMatrix< r_4 > getRecYXSlice(int kfmin, int kfmax); | 
|---|
| [3160] | 83 |  | 
|---|
|  | 84 | // Acces a la boite 3D de sources reconstruite | 
|---|
| [3192] | 85 | inline TArray< complex<r_4> > & getRecSrcBox() { return cmplx_srcbox_; } | 
|---|
| [3160] | 86 |  | 
|---|
|  | 87 | // Configure chaque cylindre a partir des parametres de la classe | 
|---|
|  | 88 | // est appele automatiquement par ReconstructCylinderPlaneS | 
|---|
|  | 89 | void ConfigureCylinders(); | 
|---|
|  | 90 |  | 
|---|
| [3192] | 91 | private: | 
|---|
| [3160] | 92 | //-------------- Variables membres ------------ | 
|---|
| [3192] | 93 | int NR_, NS_;  // nb recepteurs, nb d'echantillons ds chaque paquet | 
|---|
| [3160] | 94 |  | 
|---|
| [3192] | 95 | int PrtLev_;   // Niveau de print de debug | 
|---|
| [3160] | 96 |  | 
|---|
| [3192] | 97 | double Da_; // distance entre recepteurs | 
|---|
|  | 98 | double freq0_;  // frequence de base (freqvrai=f+freq0) | 
|---|
| [3160] | 99 |  | 
|---|
| [3192] | 100 | double timejitter_; // le sigma du jitter en temps des coups d'horloge | 
|---|
|  | 101 | double toffsig_;    // sigma des offsets en temps | 
|---|
| [3160] | 102 |  | 
|---|
| [3192] | 103 | BRSourceGen* src_;  // Les sources | 
|---|
|  | 104 | bool adfg_; // if true, delete src | 
|---|
| [3160] | 105 |  | 
|---|
| [3192] | 106 | double signoise_; // sigma du bruit additif (bruit ampli ... ) | 
|---|
|  | 107 | double gain_, siggain_; | 
|---|
|  | 108 | int ngainzero_; | 
|---|
| [3160] | 109 |  | 
|---|
| [3192] | 110 | vector<MultiBeamCyl *> mCyl_;  // Les differents cylindres | 
|---|
| [3160] | 111 |  | 
|---|
| [3192] | 112 | TArray< complex<r_4> > cmplx_srcbox_; // boite3D des sources (angX,Y,freq) reconstruit | 
|---|
| [3160] | 113 | }; | 
|---|
|  | 114 |  | 
|---|
|  | 115 |  | 
|---|
|  | 116 | #endif | 
|---|