20static const double AMPLITUDE = 0.9;
29void Point::add_sample(
double sample)
31 if (sample <= MINVAL_DB)
return;
40 Z_bckgr = Z_bckgr / npoints;
42 if (Z_bckgr > 0) bckgr = 10 * (log10(Z_bckgr));
46 convective_radius = 1.;
47 else if (bckgr >= 25. && bckgr < 30.)
48 convective_radius = 2.;
49 else if (bckgr >= 30. && bckgr < 35.)
50 convective_radius = 3.;
51 else if (bckgr >= 35. && bckgr < 40.)
52 convective_radius = 4.;
54 convective_radius = 5.;
59CalcoloSteiner::CalcoloSteiner(
60 const Volume<double>& volume,
61 const volume::ElevFin<double>& elev_fin,
64 : volume(volume), elev_fin(elev_fin), max_bin(max_bin), size_cell(volume.scan(0).cell_size),
65 conv_STEINER(Matrix2D<unsigned char>::Constant(volume.beam_count, max_bin, MISSING))
67 using namespace steiner;
69 logging_category = log4c_category_get(
"radar.vpr");
73 for (
unsigned i=0; i < volume.beam_count; ++i)
74 for (
unsigned j=0; j < max_bin; ++j)
76 if (j < volume.scan(0).beam_size && volume.scan(0).get(i, j) > MINVAL_DB)
77 lista_bckg.push_back(Point(i, j));
80void CalcoloSteiner::calcolo_background()
86 using namespace steiner;
88 if (lista_bckg.size() < 2)
95 unsigned delta_nr = round(STEINER_RADIUS * 1000. / size_cell);
96 LOG_DEBUG(
"delta_n range per analisi Steiner = %u --- dimensione lista_bckg %d", delta_nr,lista_bckg.size());
98 for (vector<Point>::iterator i = lista_bckg.begin(); i != lista_bckg.end(); ++i)
101 int kmin = i->range - delta_nr;
102 unsigned kmax = min(i->range + delta_nr, max_bin);
107 unsigned delta_naz=ceil(STEINER_RADIUS/((i->range * size_cell/1000. + size_cell/2000.)/(AMPLITUDE*DTOR)));
108 if (delta_naz > volume.beam_count / 2)
109 delta_naz = volume.beam_count / 2;
111 int jmin = i->azimut - delta_naz;
112 int jmax = i->azimut + delta_naz;
114 for (
int j = jmin; j < jmax; ++j)
115 for (
unsigned k = kmin; k < kmax; ++k)
116 i->add_sample(elev_fin.db_at_elev_preci((j + volume.beam_count) % volume.beam_count, k));
121 for (
unsigned j=0 ; j<volume.beam_count/2 ; j++)
122 for (
unsigned k=0 ; k<kmax ; k++)
123 i->add_sample(elev_fin.db_at_elev_preci(j, k));
125 for (
unsigned j= volume.beam_count/2 ; j<volume.beam_count ; j++)
126 for (
int k=0 ; k<-kmin ; k++)
127 i->add_sample(elev_fin.db_at_elev_preci(j, k));
133void CalcoloSteiner::ingrasso_nuclei(
float cr,
int ja,
int kr)
135 int dr=(int)(cr*1000./size_cell);
140 int daz=ceil(cr/((kr*size_cell/1000.+size_cell/2000.)/(AMPLITUDE*DTOR)));
142 unsigned jmax=ja+daz;
144 LOG_DEBUG(
"dr cr kmin kmax %d %f %d %d %d %d", dr,cr, kmin,kmax,jmin,jmax);
147 if (kmax > max_bin) kmax = max_bin;
150 jmin=volume.beam_count-jmin%volume.beam_count;
151 for (
unsigned j=jmin; j< volume.beam_count ; j++) {
152 for (
unsigned k=kmin ; k<kmax ; k++) {
153 conv_STEINER(j, k)=CONV_VAL;
156 LOG_DEBUG(
"jmin %d", jmin);
161 if (jmax>=volume.beam_count) {
162 jmax=jmax%volume.beam_count;
163 for (
unsigned j=0; j<jmax ; j++) {
164 for (
unsigned k=kmin; k<kmax ; k++) {
165 conv_STEINER(j, k)=CONV_VAL;
168 LOG_DEBUG(
"jmax %d", jmax);
169 jmax=volume.beam_count;
171 for (
unsigned j=jmin; j<jmax ; j++) {
172 for (
unsigned k=kmin; k<kmax ; k++) {
173 conv_STEINER(j%volume.beam_count, k)=CONV_VAL;
179 for (
unsigned j=0 ; j<volume.beam_count/2 ; j++)
180 for (
unsigned k=0 ; k<kmax ; k++){
181 conv_STEINER(j, k)=CONV_VAL;
183 for (
unsigned j= volume.beam_count/2 ; j<volume.beam_count ; j++)
184 for (
unsigned k=0 ; k < (unsigned)-kmin ; k++){
185 conv_STEINER(j, k)=CONV_VAL;
188 LOG_DEBUG (
"Finita ingrasso nuclei");
192void CalcoloSteiner::classifico_STEINER()
194 using namespace steiner;
196 for (vector<Point>::const_iterator i = lista_bckg.begin(); i != lista_bckg.end(); ++i)
200 if (j < 0 || k < 0)
continue;
202 double db = elev_fin.db_at_elev_preci(j, k);
204 float diff_bckgr = db - i->bckgr;
207 (i->bckgr < 0 && diff_bckgr > 10) ||
208 (i->bckgr < 42.43 && i->bckgr > 0 && diff_bckgr > 10. - i->bckgr * i->bckgr / 180.) ||
209 (i->bckgr > 42.43 && diff_bckgr > 0))
212 conv_STEINER(j, k) = CONV_VAL;
215 float cr = i->convective_radius;
216 LOG_DEBUG(
" %f cr", cr);
217 ingrasso_nuclei(cr, j, k);
static unsigned char DBtoBYTE(double DB, double gain=80./255., double offset=-20.)
funzione che converte dB in valore intero tra 0 e 255
static double BYTEtoZ(unsigned char byte)
funzione che converte byte in Z