| 1 | #include "multicyl.h" | 
|---|
| 2 | #include "fftpserver.h" | 
|---|
| 3 | #include "vector3d.h" | 
|---|
| 4 | #include "matharr.h" | 
|---|
| 5 | #include "srandgen.h" | 
|---|
| 6 | #include "ctimer.h" | 
|---|
| 7 | #include "resusage.h" | 
|---|
| 8 |  | 
|---|
| 9 |  | 
|---|
| 10 | //================================================= | 
|---|
| 11 |  | 
|---|
| 12 | MultiCylinders::MultiCylinders(int nr, int ns) | 
|---|
| 13 | { | 
|---|
| 14 | NR = nr; | 
|---|
| 15 | NS = ns; | 
|---|
| 16 |  | 
|---|
| 17 | SetPrintLevel(0); | 
|---|
| 18 |  | 
|---|
| 19 | SetBaseFreqDa(2., 0.25); | 
|---|
| 20 | SetNoiseSigma(0.); | 
|---|
| 21 | SetTimeJitter(0.); | 
|---|
| 22 | SetTimeOffsetSigma(0.); | 
|---|
| 23 | SetGains(1., 0., 0); | 
|---|
| 24 | adfg = false; src = NULL; | 
|---|
| 25 | SetSources(new BRSourceGen, true); | 
|---|
| 26 | } | 
|---|
| 27 |  | 
|---|
| 28 | MultiCylinders::~MultiCylinders() | 
|---|
| 29 | { | 
|---|
| 30 | if (adfg && src) delete src; | 
|---|
| 31 | for(int k=0; k<mCyl.size(); k++) delete mCyl[k]; | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | MultiBeamCyl& MultiCylinders::GetCylinder(int k) | 
|---|
| 35 | { | 
|---|
| 36 | if ((k < 0) || (k >= mCyl.size())) | 
|---|
| 37 | throw RangeCheckError("MultiCylinders::GetCylinder(k) k<0 OR k>=NCyl"); | 
|---|
| 38 | return (*mCyl[k]); | 
|---|
| 39 | } | 
|---|
| 40 |  | 
|---|
| 41 | void MultiCylinders::SetSources(BRSourceGen* brs, bool ad) | 
|---|
| 42 | { | 
|---|
| 43 | if (brs == NULL) return; | 
|---|
| 44 | if (adfg && src) delete src; | 
|---|
| 45 | src = brs;  adfg=ad; | 
|---|
| 46 | } | 
|---|
| 47 |  | 
|---|
| 48 |  | 
|---|
| 49 | void MultiCylinders::ConfigureCylinders() | 
|---|
| 50 | { | 
|---|
| 51 | cout << " MultiCylinders::ConfigureCylinders() with NCyl= " << mCyl.size() << endl; | 
|---|
| 52 | for(int k=0; k<mCyl.size(); k++) { | 
|---|
| 53 | mCyl[k]->SetPrintLevel(PrtLev); | 
|---|
| 54 | mCyl[k]->SetBaseFreqDa(freq0, Da); | 
|---|
| 55 | mCyl[k]->SetNoiseSigma(signoise); | 
|---|
| 56 | mCyl[k]->SetTimeJitter(timejitter); | 
|---|
| 57 | mCyl[k]->SetTimeOffsetSigma(toffsig); | 
|---|
| 58 | mCyl[k]->SetGains(gain, siggain, ngainzero); | 
|---|
| 59 | mCyl[k]->SetSources(src, false); | 
|---|
| 60 | } | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 |  | 
|---|
| 64 | void MultiCylinders::ReconstructCylinderPlaneS(bool fgzerocentre) | 
|---|
| 65 | { | 
|---|
| 66 | Timer tm("RecCylPlaneS"); | 
|---|
| 67 | ResourceUsage resu; | 
|---|
| 68 | cout << " MultiCylinders::ReconstructCylinderPlaneS()/Info - NCyl= " << mCyl.size() | 
|---|
| 69 | << " MemSize=" << resu.getMemorySize() << " kb" << endl; | 
|---|
| 70 | ConfigureCylinders(); | 
|---|
| 71 |  | 
|---|
| 72 | char buff[128]; | 
|---|
| 73 | for(int k=0; k<mCyl.size(); k++) { | 
|---|
| 74 | cout << "---- Cyl[" << k << "] Calling MultiBeamCyl.ReconstructSourcePlane() ..." << endl; | 
|---|
| 75 | mCyl[k]->ReconstructSourcePlane(fgzerocentre); | 
|---|
| 76 | sprintf(buff,"Cyl[%d].RecSrcPlane()",k); | 
|---|
| 77 | tm.Split(buff); | 
|---|
| 78 | } | 
|---|
| 79 | resu.Update(); | 
|---|
| 80 | cout << " MultiCylinders::ReconstructCylinderPlaneS()/Info - Done " | 
|---|
| 81 | << " MemSize=" << resu.getMemorySize() << " kb" << endl; | 
|---|
| 82 | } | 
|---|
| 83 |  | 
|---|
| 84 | void MultiCylinders::ReconstructSourceBox(int halfny, double stepangy) | 
|---|
| 85 | { | 
|---|
| 86 | ReconstructCylinderPlaneS(true); | 
|---|
| 87 | TMatrix< complex<r_4> > & mtx = GetCylinder(0).getRecSrcPlane(); | 
|---|
| 88 | // boite 3D X:angX, Y:angY , Z: freq | 
|---|
| 89 | sa_size_t sz[5] = {0,0,0,0,0}; | 
|---|
| 90 | //  int nx=mtx.NCols(); // uncomment to go back to nxbin = nantenna | 
|---|
| 91 | int nx=256; | 
|---|
| 92 | sz[0] = nx; | 
|---|
| 93 | sz[1] = halfny*2+1; | 
|---|
| 94 | sz[2] = mtx.NRows(); | 
|---|
| 95 | TArray< complex<r_4> > & box = getRecSrcBox(); | 
|---|
| 96 | box.ReSize(3, sz); | 
|---|
| 97 | //  box = complex< r_4 >( 0.f, 0.f ); | 
|---|
| 98 | cout << " MultiCylinders::ReconstructSourceBox(" << halfny << "," << stepangy | 
|---|
| 99 | << "=" << Angle(stepangy).ToArcMin() << " ) srcbox:" << endl; | 
|---|
| 100 | Timer tm("RecSrcBox"); | 
|---|
| 101 | box.Show(cout); | 
|---|
| 102 |  | 
|---|
| 103 |  | 
|---|
| 104 | int pmod = mtx.NRows()/10; | 
|---|
| 105 |  | 
|---|
| 106 | double fstep = 1.0/(double)NS;  // pas en frequence, attention, on a vire la composante continu | 
|---|
| 107 | for(int kf=0; kf<mtx.NRows(); kf++) { // Loop over frequencies | 
|---|
| 108 | double frq = (double)(kf+1.)*fstep + freq0;  // + 1 car f=0 a ete vire | 
|---|
| 109 |  | 
|---|
| 110 | for(int lc=0; lc<mCyl.size(); lc++) {  // Loop over cylinders | 
|---|
| 111 | MultiBeamCyl& cyl = GetCylinder(lc); | 
|---|
| 112 |  | 
|---|
| 113 | TMatrix< complex<r_4> > & recp = cyl.getRecSrcPlane(); | 
|---|
| 114 |  | 
|---|
| 115 | double facl = - 2*M_PI*frq*cyl.getCylinderYPos();  // attention au signe - | 
|---|
| 116 | //      double facl_x = - 2*M_PI*cyl.getCylinderXPos()/cyl.Da/(double)cyl.NR; | 
|---|
| 117 | double facl_x = - 2*M_PI*cyl.getCylinderXPos()/cyl.Da; | 
|---|
| 118 | double dphi; | 
|---|
| 119 | complex< r_4 > phasefactor; | 
|---|
| 120 | int jyy = 0; | 
|---|
| 121 | for(int jy=-halfny; jy<=halfny; jy++) {  // Loop over Y angular steps | 
|---|
| 122 | for(int ix=0; ix<nx; ix++) {  // Loop over AngX directions | 
|---|
| 123 | double dphi = facl * sin( (double)jy*stepangy ) | 
|---|
| 124 | + facl_x*(double(ix)/double(nx)-1./2.); | 
|---|
| 125 | phasefactor = complex< r_4 > ((r_4) cos(dphi) , (r_4) sin(dphi)); | 
|---|
| 126 | // sur recp : index ligne -> frequence  ,    index colonne -> angX , | 
|---|
| 127 | int ixx=(int)(ix*(double)cyl.NR/double(nx)); | 
|---|
| 128 | box(ix, jyy, kf) += recp(kf, ixx)*phasefactor; | 
|---|
| 129 | }  // | 
|---|
| 130 | jyy++; | 
|---|
| 131 | } // End of Loop over Y angles | 
|---|
| 132 | } // End of loop over cylinders | 
|---|
| 133 | tm.Nop(); | 
|---|
| 134 | if ( (PrtLev>0) && (kf%pmod == 0) ) | 
|---|
| 135 | cout << " OK box(angx,angy, freq=kf) done for kf=" << kf | 
|---|
| 136 | << " / Max_kf=" << mtx.NRows() << endl; | 
|---|
| 137 | } // End of loop over over frequencies | 
|---|
| 138 |  | 
|---|
| 139 | cout << " MultiCylinders::ReconstructSourceBox() done " << endl; | 
|---|
| 140 | } | 
|---|
| 141 |  | 
|---|
| 142 | inline float myZmodule(complex<r_4>& z) | 
|---|
| 143 | { | 
|---|
| 144 | return (float)sqrt((double)(z.real()*z.real()+z.imag()*z.imag())); | 
|---|
| 145 | } | 
|---|
| 146 |  | 
|---|
| 147 | TMatrix< r_4 >  MultiCylinders::getRecXYSlice(int kfmin, int kfmax) | 
|---|
| 148 | { | 
|---|
| 149 | TArray< complex<r_4> > & box = getRecSrcBox(); | 
|---|
| 150 | if ((kfmin < 0) || (kfmin >=  box.SizeZ()) || (kfmax < kfmin) || (kfmax >=  box.SizeZ()) ) | 
|---|
| 151 | throw RangeCheckError("MultiCylinders::getRecXYSlice(kfmin, kfmax)"); | 
|---|
| 152 | TMatrix< r_4> rmtx(box.SizeY(), box.SizeX()); | 
|---|
| 153 | for(int kf=kfmin; kf<=kfmax; kf++) { | 
|---|
| 154 | for(int jy=0; jy<box.SizeY(); jy++) | 
|---|
| 155 | for(int ix=0; ix<box.SizeX(); ix++) | 
|---|
| 156 | rmtx(jy, ix) += myZmodule(box(ix, jy, kf)); | 
|---|
| 157 | } | 
|---|
| 158 | return(rmtx); | 
|---|
| 159 | } | 
|---|