| 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
 | 
|---|
| 27 |   //   nr = 256 -> resol_ang ~ pi/256 = 0.01 rad ~ 40'
 | 
|---|
| 28 |   //   longueur @ f=2 ~ 64 (256*lambda/2 = 256*0.25)
 | 
|---|
| 29 |  MultiCylinders(int nr=256, int ns=1024);
 | 
|---|
| 30 |  ~MultiCylinders();
 | 
|---|
| 31 | 
 | 
|---|
| 32 |  // Niveau de print de debug
 | 
|---|
| 33 |  inline void SetPrintLevel(int prl=0) { PrtLev=prl; }
 | 
|---|
| 34 | 
 | 
|---|
| 35 |  // Ajout d'un cylindre, en position posY
 | 
|---|
| 36 |  inline int AddCylinder(double posy)
 | 
|---|
| 37 |    {  mCyl.push_back( new MultiBeamCyl(NR, NS, posy) ); return mCyl.size(); }
 | 
|---|
| 38 | 
 | 
|---|
| 39 |  MultiBeamCyl & GetCylinder(int i);
 | 
|---|
| 40 | 
 | 
|---|
| 41 |  // Specification de la frequence de base f0 et espacement des recepteurs
 | 
|---|
| 42 |  inline void SetBaseFreqDa(double f0=2., double a=0.25) 
 | 
|---|
| 43 |    {  freq0 = f0;   Da = a;  }
 | 
|---|
| 44 | 
 | 
|---|
| 45 |  // frequences reduites (entre 0 ... 0.5) , angle en radian, amp ~ 1
 | 
|---|
| 46 |  void SetSources(BRSourceGen* brs, bool ad=true);
 | 
|---|
| 47 |  inline void SetSources(BRSourceGen& brs)
 | 
|---|
| 48 |    { SetSources(&brs, false); }
 | 
|---|
| 49 | 
 | 
|---|
| 50 |  // Definition du sigma du bruit gaussien sur les echantillons
 | 
|---|
| 51 |  inline void SetNoiseSigma(double sig=0.) {  signoise = sig; }
 | 
|---|
| 52 |  // Definition du sigma du jitter d'horloge (typ 0.01)
 | 
|---|
| 53 |  inline void SetTimeJitter(double tjit=0.) { timejitter = tjit; } 
 | 
|---|
| 54 |  // Definition du sigma des offsets d'horloge entre recepteurs (typ 0.02)
 | 
|---|
| 55 |  inline void SetTimeOffsetSigma(double tsig=0.) { toffsig = tsig; }
 | 
|---|
| 56 | 
 | 
|---|
| 57 |  // Definition du gain et sigma de fluctuations de gain 
 | 
|---|
| 58 |  // nzerogain: nb de recepteurs (choisis au hasard) avec gain mis a zero
 | 
|---|
| 59 |  inline void SetGains(double g=1., double sigg=0., int nzerogain=0)
 | 
|---|
| 60 |    {  gain=g;  siggain=sigg;  ngainzero = nzerogain; }
 | 
|---|
| 61 | 
 | 
|---|
| 62 | 
 | 
|---|
| 63 |  // Fait la configuration des cylindres, et reconstruit le plan source
 | 
|---|
| 64 |  // pour chaque cylindre
 | 
|---|
| 65 |  void ReconstructCylinderPlaneS(bool fgzerocentre=true);
 | 
|---|
| 66 | 
 | 
|---|
| 67 |  // Reconstruction de la boite 3D des sources 
 | 
|---|
| 68 |  // - halfny : nb de bin en angY = 2*halfny+1 
 | 
|---|
| 69 |  // - stepangy : pas en angle Y (radian) 
 | 
|---|
| 70 |  // NOTE: Cette methode appelle ReconstructCylinderPlaneS(true);
 | 
|---|
| 71 |  // La resolution doit etre <= resol en angX --> ~ 1 deg ~ pi/
 | 
|---|
| 72 |  // @f = 2 , lambda = 0.5 ===> posY <~ lambda/(2 sin resol) 
 | 
|---|
| 73 |  //   ===> posY < ~ 20   
 | 
|---|
| 74 |  void ReconstructSourceBox(int halfny=10, double stepangy=M_PI/300);
 | 
|---|
| 75 | 
 | 
|---|
| 76 | 
 | 
|---|
| 77 |  // Pour recuperer une tranche reconstruite angX, angY 
 | 
|---|
| 78 |  // avec la moyenne des modules entre kfmin <= k (selon z) <= kfmax 
 | 
|---|
| 79 |  TMatrix< r_4 > getRecXYSlice(int kfmin, int kfmax);
 | 
|---|
| 80 | 
 | 
|---|
| 81 |  // Acces a la boite 3D de sources reconstruite
 | 
|---|
| 82 |  inline TArray< complex<r_4> > & getRecSrcBox() { return cmplx_srcbox; }
 | 
|---|
| 83 | 
 | 
|---|
| 84 |  // Configure chaque cylindre a partir des parametres de la classe 
 | 
|---|
| 85 |  // est appele automatiquement par ReconstructCylinderPlaneS
 | 
|---|
| 86 |  void ConfigureCylinders();
 | 
|---|
| 87 | 
 | 
|---|
| 88 |  //-------------- Variables membres ------------ 
 | 
|---|
| 89 |  int NR, NS;  // nb recepteurs, nb d'echantillons ds chaque paquet
 | 
|---|
| 90 | 
 | 
|---|
| 91 |  int PrtLev;   // Niveau de print de debug
 | 
|---|
| 92 | 
 | 
|---|
| 93 |  double Da; // distance entre recepteurs
 | 
|---|
| 94 |  double freq0;  // frequence de base (freqvrai=f+freq0)
 | 
|---|
| 95 |  
 | 
|---|
| 96 |  double timejitter; // le sigma du jitter en temps des coups d'horloge
 | 
|---|
| 97 |  double toffsig;    // sigma des offsets en temps
 | 
|---|
| 98 |  
 | 
|---|
| 99 |  BRSourceGen* src;  // Les sources
 | 
|---|
| 100 |  bool adfg; // if true, delete src 
 | 
|---|
| 101 | 
 | 
|---|
| 102 |  double signoise; // sigma du bruit additif (bruit ampli ... )
 | 
|---|
| 103 |  double gain, siggain;
 | 
|---|
| 104 |  int ngainzero;
 | 
|---|
| 105 | 
 | 
|---|
| 106 |  vector<MultiBeamCyl *> mCyl;  // Les differents cylindres 
 | 
|---|
| 107 | 
 | 
|---|
| 108 |  TArray< complex<r_4> > cmplx_srcbox; // boite3D des sources (angX,Y,freq) reconstruit
 | 
|---|
| 109 |  };
 | 
|---|
| 110 | 
 | 
|---|
| 111 | 
 | 
|---|
| 112 | #endif
 | 
|---|