source: Sophya/trunk/Cosmo/RadioBeam/lobe.cc@ 3788

Last change on this file since 3788 was 3788, checked in by ansari, 15 years ago

Ajout classe de soustraction d'avant plans, Reza 25/06/2010

File size: 3.7 KB
Line 
1
2#include "lobe.h"
3#include "radutil.h"
4#include "randfmt.h"
5typedef FMTRandGen RandomGenerator ;
6
7
8#include "fftwserver.h"
9#include "ctimer.h"
10
11
12/* --Methode-- */
13BeamEffect::BeamEffect(Four2DResponse& resp)
14 : fresp_(resp)
15// resp doit avoir sa longueur d'onde de reference en metres
16{
17}
18
19
20
21/* --Methode-- */
22void BeamEffect::ApplyLobe3D(TArray< TF >& a, double dx, double dy, double f0, double df)
23// dx, dy en radioans, f0, df en MHz
24{
25 Timer tm("BeamEffect::ApplyLobe3D");
26 FFTWServer ffts(true);
27 ffts.setNormalize(true);
28
29 H21Conversions conv;
30
31 TArray< complex<TF> > fourAmp;
32 double dkx = DeuxPI/(double)a.SizeX()/dx;
33 double dky = DeuxPI/(double)a.SizeY()/dy;
34
35 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
36 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
37 ffts.FFTForward(slice, fourAmp);
38 conv.setFrequency(f0+kz*df);
39 fresp_.setLambda(conv.getLambda());
40 ApplyLobeK2D(fresp_, fourAmp, dkx, dky);
41 ffts.FFTBackward(fourAmp, slice, true);
42 if (kz%20==0) cout << "BeamEffect::ApplyLobe3D() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
43 }
44 return;
45}
46
47/* --Methode-- */
48void BeamEffect::Correct2RefLobe(Four2DResponse& rep, TArray< TF >& a, double dx, double dy, double f0, double df)
49// dx, dy en radioans, f0, df en MHz
50{
51 Timer tm("BeamEffect::Correct2RefLobe");
52 FFTWServer ffts(true);
53 ffts.setNormalize(true);
54
55 H21Conversions conv;
56
57 TArray< complex<TF> > fourAmp;
58 double dkx = DeuxPI/(double)a.SizeX()/dx;
59 double dky = DeuxPI/(double)a.SizeY()/dy;
60
61 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
62 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
63 ffts.FFTForward(slice, fourAmp);
64 conv.setFrequency(f0+kz*df);
65 fresp_.setLambda(conv.getLambda());
66 Four2DRespRatio rratio(fresp_, rep);
67 ApplyLobeK2D(rratio, fourAmp, dkx, dky);
68 ffts.FFTBackward(fourAmp, slice, true);
69 if (kz%20==0) cout << "BeamEffect::Correct2RefLobe() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
70 }
71 return;
72}
73
74/* --Methode-- */
75void BeamEffect::ApplyLobeK2D(Four2DResponse& rep, TArray< complex<TF> >& fourAmp, double dkx, double dky)
76// dx, dy en radians, lambda en metres
77{
78 double kxx, kyy;
79 for(sa_size_t ky=0; ky<fourAmp.SizeY(); ky++) {
80 kyy = (ky>fourAmp.SizeY()/2) ? -(double)(fourAmp.SizeY()-ky)*dky : (double)ky*dky;
81 for(sa_size_t kx=0; kx<fourAmp.SizeX(); kx++) {
82 kxx=(double)kx*dkx;
83 fourAmp(kx, ky) *= complex<TF>(rep(kxx, kyy), 0.);
84 }
85 }
86 return;
87}
88
89/* --Methode-- */
90TArray< TF > BeamEffect::ReSample(TArray< TF >& a, double xfac, double yfac, double zfac)
91{
92 Timer tm("BeamEffect::ReSample");
93
94 sa_size_t szx = a.SizeX()*xfac;
95 sa_size_t szy = a.SizeY()*yfac;
96 sa_size_t szz = a.SizeZ()*zfac;
97
98 TArray<TF> rsa(szx, szy, szz);
99 for(sa_size_t kz=0; kz<rsa.SizeZ(); kz++) {
100 sa_size_t kza=kz/zfac;
101 if ((kza<0)||(kza>=a.SizeZ())) continue;
102 for(sa_size_t ky=0; ky<rsa.SizeY(); ky++) {
103 sa_size_t kya=ky/yfac;
104 if ((kya<0)||(kya>=a.SizeY())) continue;
105 for(sa_size_t kx=0; kx<rsa.SizeX(); kx++) {
106 sa_size_t kxa=kx/xfac;
107 if ((kxa<0)||(kxa>=a.SizeX())) continue;
108 rsa(kx,ky,kz)=a(kxa,kya,kza);
109 }
110 }
111 }
112 return rsa;
113}
114
115
116/* --Methode-- */
117void BeamEffect::AddNoise(TArray< TF >& a, double pixsignoise, bool fgcmsig)
118{
119 cout << "BeamEffect::AddNoise() PixelSigmaNoise=" << pixsignoise << endl;
120 RandomGenerator rg;
121 for(sa_size_t kz=0; kz<a.SizeZ(); kz++)
122 for(sa_size_t ky=0; ky<a.SizeY(); ky++)
123 for(sa_size_t kx=0; kx<a.SizeX(); kx++)
124 a(kx,ky,kz) += rg.Gaussian(pixsignoise);
125 if (fgcmsig) {
126 double mean, sigma;
127 MeanSigma(a, mean, sigma);
128 cout << "BeamEffect::AddNoise()-done, Mean=" << mean << " Sigma=" << sigma << endl;
129 }
130 return;
131}
Note: See TracBrowser for help on using the repository browser.