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

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

Ajout la possibilite de preserver la composante continue de Fourier ds ApplyLobeK2D , Reza 30/06/2010

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