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(const char* filename);
|
---|
31 | ~MultiCylinders();
|
---|
32 |
|
---|
33 | // Niveau de print de debug
|
---|
34 | inline void SetPrintLevel(int prl=0) { PrtLev_=prl; }
|
---|
35 |
|
---|
36 | // Ajout d'un cylindre, en position posX, posY
|
---|
37 | inline int AddCylinder(double posx, double posy)
|
---|
38 | { mCyl_.push_back( new MultiBeamCyl(NR_, NS_, posx, posy) ); return mCyl_.size(); }
|
---|
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)
|
---|
44 | { freq0_ = f0; Da_ = a; }
|
---|
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
|
---|
52 | inline void SetNoiseSigma(double sig=0.) { signoise_ = sig; }
|
---|
53 | // Definition du sigma du jitter d'horloge (typ 0.01)
|
---|
54 | inline void SetTimeJitter(double tjit=0.) { timejitter_ = tjit; }
|
---|
55 | // Definition du sigma des offsets d'horloge entre recepteurs (typ 0.02)
|
---|
56 | inline void SetTimeOffsetSigma(double tsig=0.) { toffsig_ = tsig; }
|
---|
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)
|
---|
61 | { gain_=g; siggain_=sigg; ngainzero_ = nzerogain; }
|
---|
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
|
---|
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
|
---|
75 | // void ReconstructSourceBox(int halfny=10, double stepangy=M_PI/300);
|
---|
76 | void ReconstructSourceBox(int halfny, double stepangy, int ny, double stepangx);
|
---|
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);
|
---|
82 | TMatrix< r_4 > getRecYXSlice(int kfmin, int kfmax);
|
---|
83 |
|
---|
84 | // Acces a la boite 3D de sources reconstruite
|
---|
85 | inline TArray< complex<r_4> > & getRecSrcBox() { return cmplx_srcbox_; }
|
---|
86 |
|
---|
87 | // Configure chaque cylindre a partir des parametres de la classe
|
---|
88 | // est appele automatiquement par ReconstructCylinderPlaneS
|
---|
89 | void ConfigureCylinders();
|
---|
90 |
|
---|
91 | private:
|
---|
92 | //-------------- Variables membres ------------
|
---|
93 | int NR_, NS_; // nb recepteurs, nb d'echantillons ds chaque paquet
|
---|
94 |
|
---|
95 | int PrtLev_; // Niveau de print de debug
|
---|
96 |
|
---|
97 | double Da_; // distance entre recepteurs
|
---|
98 | double freq0_; // frequence de base (freqvrai=f+freq0)
|
---|
99 |
|
---|
100 | double timejitter_; // le sigma du jitter en temps des coups d'horloge
|
---|
101 | double toffsig_; // sigma des offsets en temps
|
---|
102 |
|
---|
103 | BRSourceGen* src_; // Les sources
|
---|
104 | bool adfg_; // if true, delete src
|
---|
105 |
|
---|
106 | double signoise_; // sigma du bruit additif (bruit ampli ... )
|
---|
107 | double gain_, siggain_;
|
---|
108 | int ngainzero_;
|
---|
109 |
|
---|
110 | vector<MultiBeamCyl *> mCyl_; // Les differents cylindres
|
---|
111 |
|
---|
112 | TArray< complex<r_4> > cmplx_srcbox_; // boite3D des sources (angX,Y,freq) reconstruit
|
---|
113 | };
|
---|
114 |
|
---|
115 |
|
---|
116 | #endif
|
---|