Elaboradar  0.1
 Tutto Classi Namespace File Funzioni Variabili Tipi enumerati (enum) Gruppi
dbz.cpp
1 #include "dbz.h"
2 #include "volume.h"
3 
4 //#define aMP 316.
5 //#define bMP 1.5
6 #define aMP_conv 500.0
7 #define bMP_conv 1.5
8 #define aMP_strat 250.
9 #define bMP_strat 1.5
10 #define aMP_SNOW 400.0
11 #define bMP_SNOW 2.0
12 #define aMP_class 200.
13 #define bMP_class 1.6
14 
15 #define THRES_ATT 0 /* minimo valore di Z in dBZ per calcolare att rate */
16 
17 namespace radarelab {
18 namespace algo {
19 
20 using namespace std;
21 
22 DBZ::DBZ(const Volume<double>& volume)
23 {
24  // --- ricavo il mese x definizione first_level e aMP bMP ---------
25  time_t Time = volume.load_info->acq_date;
26  struct tm* tempo = gmtime(&Time);
27  init(tempo->tm_mon+1, volume[0].cell_size);
28 }
29 
30 DBZ::DBZ(int month, double base_cell_size)
31 {
32  init(month, base_cell_size);
33 }
34 
35 void DBZ::init(int month, double base_cell_size)
36 {
37  this->base_cell_size = base_cell_size;
38 
39  if (month > 4 && month < 10)
40  {
41  aMP = aMP_conv;
42  bMP = bMP_conv;
43  }
44  else
45  {
46  aMP = aMP_strat;
47  bMP = bMP_strat;
48  }
49 }
50 
51 double DBZ::attenuation(unsigned char DBZbyte, double PIA) /* Doviak,Zrnic,1984 for rain as reported in cost 717 final document*/
52 {
53  double Zhh,att_rate,R;/* PIA diventa att_tot devo decidere infatti se PIA sarà 3d percio' temp. uso nomi diversi*/
54  double att_tot;
55 
56  //---ricevo in ingresso il dato e l'attenuazione fino quel punto
57  //---la formula recita che l'attenuazione è pari una funzione di Z reale (quindi corretta dell'attenuazione precedente). ovviamente devo avere un segnale per correggere.
58  //--------- CALCOL
59  att_tot=PIA;
60  Zhh= (BYTEtoZ(DBZbyte));
61  if (10*log10(Zhh) > THRES_ATT )
62  {
63  Zhh=pow(10., (log10(Zhh)+ 0.1*att_tot));
64  R=pow((Zhh/aMP),(1.0/bMP));
65  att_rate=0.0018*pow(R,1.05);
66  // TODO: to compute scan by scan?
67  att_tot=att_tot+2.*att_rate*0.001 * base_cell_size;
68  if (att_tot>BYTEtoDB(254)) att_tot=BYTEtoDB(254);
69  }
70  return att_tot;
71 }
72 double DBZ::attenuation(double DBZvalue, double PIA) /* Doviak,Zrnic,1984 for rain as reported in cost 717 final document*/
73 {
74  double Zhh,att_rate,R;/* PIA diventa att_tot devo decidere infatti se PIA sarà 3d percio' temp. uso nomi diversi*/
75  double att_tot;
76 
77  //---ricevo in ingresso il dato e l'attenuazione fino quel punto
78  //---la formula recita che l'attenuazione è pari una funzione di Z reale (quindi corretta dell'attenuazione precedente). ovviamente devo avere un segnale per correggere.
79  //--------- CALCOL
80  att_tot=PIA;
81  Zhh=(DBZtoZ(DBZvalue));
82  if (DBZvalue > THRES_ATT )
83  {
84  //Zhh=pow(10., (log10(Zhh)+ 0.1*att_tot));
85  Zhh=DBZtoZ(DBZvalue+ att_tot);
86  R=pow((Zhh/aMP),(1.0/bMP));
87  att_rate=0.0018*pow(R,1.05);
88  // TODO: to compute scan by scan?
89  att_tot=att_tot+2.*att_rate*0.001 * base_cell_size;
90  if (att_tot>BYTEtoDB(254)) att_tot=BYTEtoDB(254);
91  }
92  return att_tot;
93 }
94 
95 double DBZ::RtoDBZ(double rain) const
96 {
97  return RtoDBZ(rain, aMP, bMP);
98 }
99 
100 double DBZ::DBZtoR(double dbz) const
101 {
102  return DBZtoR(dbz, aMP, bMP);
103 }
104 
105 double DBZ::DBZ_snow(double dbz) const
106 {
107  return RtoDBZ(DBZtoR(dbz, aMP_SNOW, bMP_SNOW), aMP_class, bMP_class);
108 }
109 
110 double DBZ::DBZ_conv(double dbz) const
111 {
112  return RtoDBZ(DBZtoR(dbz, aMP_conv, bMP_conv), aMP_class, bMP_class);
113 }
114 
115 double DBZ::RtoDBZ_class(double R) const
116 {
117  return RtoDBZ(R, aMP_class, bMP_class);
118 }
119 
120 double DBZ::DBZ_to_mp_func(double sample) const
121 {
122  return DBZtoR(sample, aMP, bMP);
123 }
124 
125 double DBZ::BYTEtoZ(unsigned char byte)
126 {
127  const double gain = 80. / 255.;
128  const double offset = -20.;
129  static bool precomputed = false;
130  static double Z[256];
131 
132  if (!precomputed)
133  {
134  for (unsigned i=0; i < 256; ++i)
135  Z[i] = pow(10., (i * gain + offset) * 0.1);
136  precomputed = true;
137  }
138 
139  return Z[byte];
140 }
141 
142 }
143 }
Definisce le principali strutture che contengono i dati.
double attenuation(unsigned char DBZbyte, double PIA)
funzione che calcola l&#39;attenuazione totale
Definition: dbz.cpp:51
static double BYTEtoZ(unsigned char byte)
funzione che converte byte in Z
Definition: dbz.cpp:125