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

Last change on this file since 3797 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
RevLine 
[3787]1
2#include "lobe.h"
3#include "radutil.h"
4#include "randfmt.h"
5typedef FMTRandGen RandomGenerator ;
6
7
[3789]8#include "fftwserver.h"
9#include "matharr.h"
[3787]10#include "ctimer.h"
11
12
13/* --Methode-- */
[3797]14BeamEffect::BeamEffect(Four2DResponse& resp, bool preservefreq0)
15 : fresp_(resp), preservefreq0_(preservefreq0)
[3787]16// resp doit avoir sa longueur d'onde de reference en metres
17{
18}
19
[3788]20
21
[3787]22/* --Methode-- */
[3788]23void BeamEffect::ApplyLobe3D(TArray< TF >& a, double dx, double dy, double f0, double df)
24// dx, dy en radioans, f0, df en MHz
[3787]25{
[3788]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());
[3789]41 // cout << " DEBUG*" << kz << " lambda=" << conv.getLambda() << " lambda_ratio_=" << fresp_.lambda_ratio_ << endl;
[3788]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;
[3787]45 }
[3789]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;
[3787]52 return;
53}
54
55/* --Methode-- */
[3788]56void BeamEffect::Correct2RefLobe(Four2DResponse& rep, TArray< TF >& a, double dx, double dy, double f0, double df)
[3787]57// dx, dy en radioans, f0, df en MHz
58{
[3788]59 Timer tm("BeamEffect::Correct2RefLobe");
[3787]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);
[3788]73 fresp_.setLambda(conv.getLambda());
[3789]74 Four2DRespRatio rratio(rep, fresp_);
[3788]75 ApplyLobeK2D(rratio, fourAmp, dkx, dky);
[3787]76 ffts.FFTBackward(fourAmp, slice, true);
[3788]77 if (kz%20==0) cout << "BeamEffect::Correct2RefLobe() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
[3787]78 }
[3789]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;
[3787]85 return;
86}
87
88/* --Methode-- */
[3788]89void BeamEffect::ApplyLobeK2D(Four2DResponse& rep, TArray< complex<TF> >& fourAmp, double dkx, double dky)
90{
[3797]91 complex<TF> cf0=fourAmp(0,0);
[3788]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 }
[3797]100 if (preservefreq0_) fourAmp(0, 0)=cf0;
[3788]101 return;
102}
103
104/* --Methode-- */
[3787]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.